图书前言

前言

作为《跟我一起学机器学习》的姊妹篇,两年之后《跟我一起学深度学习》一书也终于出版了。北宋大家张载有言: “为天地立心,为生民立命,为往圣继绝学,为万世开太平。”这两部著作虽然没有这样的宏伟愿景,但在它们的编写过程中我们自始至终都秉持着“为往圣继绝学”的想法在进行。

作为机器学习方向的一个重要分支,深度学习在近年来的发展可谓大放异彩。随着深度学习技术的不断发展,与之相关的技术应用已经深入渗透到了我们日常生活的方方面面,从医疗保健、金融服务到零售,以及从交通再到智能助理、智能家居等,尤其是在以GPT为代表的大语言模型出现以后,深度学习技术的影子更是无处不在。如今,利用ChatGPT来作为日常生产力工具更是成为一种共识。例如在本书的成文过程中ChatGPT就为我们提供了不少的灵感和启示,部分内容也是在ChatGPT的辅助下完成的,而这在10年乃至5年前都是难以想象的。也正因如此,对于这些热门应用背后技术的探索便逐渐成为计算机行业及高校所追捧的对象,但对于绝大多数初学者来讲,想要跨入深度学习这一领域依旧存在着较高的门槛,所以一本“数+形”结合、动机原理并重、细致考究的入门图书就显得十分必要了。

尽管目前市面上已经存在着大量类似图书,但现有图书的不足之处在于往往太过高估了学生的学习能力。首先,这类图书往往都只是罗列了一堆名词概念、抽象晦涩的数学公式或是枯燥冗长的代码,而这对于初学者或是数学基础比较薄弱的学生来讲是极为糟糕的,作为过来人我们对此深有体会; 其次,这类图书在介绍各个算法时仅仅做到了知其然而不知其所以然,并没有介绍每个算法模型出现的背景和动机,仿佛它们都是一个个从天而降的独立个体,彼此之间毫无前因后果的联系; 最后,对于算法原理或实现的细节之处并没有充分把握,往往会一笔带过,而这就导致了初学者总有一种似是而非、朦朦胧胧的感觉。

“数无形时少直觉,形少数时难入微,数形结合百般好”,这是本书在编写过程中所遵循的第一大原则。在学习深度学习相关内容的过程中,如果只看论文,则只能了解到算法模型的整体思想而无法精确刻画其中的细节之处; 如果只看代码,则会发现均是各种矩阵之间的四则运算,并不知道其中的含义。因此,本书在写作之初就始终秉持着要以“数+形”结合的方式来介绍每个算法模型,即先通过图示直观地来介绍模型的整体思想和原理,再通过实际的数学计算过程或代码来刻画其中的细节和模糊之处。用图形去形像化,用代码去唯一化,真正做到“数+形”结合,让各位读者能够真正地做到看得懂、学得会、写得出。为了将各个算法的建模原理表述清楚,本书使用了近400幅示意插图。

为了直观地感受卷积操作的计算过程,我们绘制了全部4种情况下的卷积计算示意图; 为了厘清GoogLeNet中各个网络层的参数及输出信息,我们重新绘制了更加详细的网络结构图并全方位地进行了标记; 为了讲清楚多头注意力中“多头”的概念,我们完整绘制了整个注意力机制的计算流程图; 为了讲清楚BERT模型的预训练任务和4大经典下游任务的构建原理,我们对于每个任务模型和数据集构建流程都进行了图例绘制; 为了介绍百川大模型内部的原理机制,我们又根据官方开源的代码绘制了其网络结构图,以便读者从第一眼就能把握其整体的技术架构; 为了讲清楚大模型对话场景中的KeyValue缓存机制,我们根据Transformers框架中的实现代码绘制了对应原理图。这样的图示还有很多,因为我们始终相信,能够用眼睛看到的一定是最直观、最容易理解的。

“知其然,更要知其所以然”,这是本书在编写过程中所遵循的第二大原则。任何一个算法的提出都不会是凭空捏造或无中生有的,它要么是为了解决新场景下的问题,要么是为了对已有算法模型进行改进,因此明白一个算法模型背后的动机就显得格外重要了。一方面我们能更好地理解作者的想法及与其他算法模型之间的联系; 另一方面也可以学习如何去讲好一个故事,所以我们不仅需要知道一项技术的原理,还需要知道为什么出现了这种技术、它的动机是什么、它需要解决什么样的问题等。这样才更有利于我们了解整个技术的发展脉络并形成一个合理的思考方向。

因此,本书在行文过程中对于每个算法模型的介绍都遵循了“动机+原理”的方式进行,即先梳理其提出时的背景动机,然后介绍其具体的实现原理,而不是直愣愣地开始就某个算法模型进行介绍,以至于前后衔接生硬。这也将使各位读者不仅能学会一个算法的原理和使用方法,同时还能知道它所提出的契机,养成这样的思维习惯对于一些读者后续的论文写作也是百利而无一害的。

“如履薄冰,有理有据”,这是本书在编写过程中所遵循的第三大原则。在本书签订出版合同之初我们就预留了充分的时间,约定15个月交稿,计划12个月完稿,而实际上14个月就完成了,目的就是能在一个轻松的氛围下完成写作。不过如果再算上之前在理解Transformer(2021年3—8月)和BERT(2021年8月—2022年4月)这两个模型所花费的13个月时间,整本书总共历经了27个月,所以我们也时常告诫自己切莫心急浮躁、切莫急功近利、切莫误人子弟,要为我们写下的每一句话、每个字负责。同时,在本书的编写过程中对于每个重要细节的把握我们也会进行多方求证,力争在理解上不会出现太大偏差。对于同一个模型的实现过程我们通常会参考不同框架中的实现源码,例如参考TensorFlow、PyTorch、Transformers及论文作者的实现等,然后根据这些代码整理出一份保留核心逻辑且适合初学者学习的示例代码。

例如在介绍BERT模型的实现过程时,先后阅读了GoogleResearch、PyTorch和Transformers框架中的相关实现过程; 为了弄清楚fastText模型中关于中文Ngram的构建方式,我们在官方开源项目的dictionary.cc文件中找到了佐证; 为了画出ELMo模型的真实结构图,我们在官方的Allennlp库中见到了答案; 为了弄清楚大语言模型对话场景中模型在推理时的具体解码过程,我们历经几番周折终于在Transformer库的generation/utils.py模块中找到了示例,甚至就连GPT这个简称的来历我们也都细致地进行了考究,而这些本可以一笔带过。

对于GPT这个简称的来历,它到底应该是Generative PreTraining的缩写,还是Generative Pretraining Transformer的缩写,我们也曾反复思考过很多次。此时有读者可能会说: 这还用想?当然是后者,因为GPT用到的是Transformer中解码器的部分。可当时我们并不这样认为。首先GPT表示生成式预训练模型Generative PreTraining也并无不可,因为它的确是第1个大规模语料下的生成式预训练模型; 其次GPT1的论文中并没有明确交代T的代指,甚至全文中根本没有出现GPT这一缩写,反而从标题Improving Language Understanding by Generative PreTraining来看它更符合是Generative PreTraining的缩写; 最后,我们检索OpenAI 官网的所有论文和内容后,仍没有明确发现GPT的来由,但对于这件事的疑惑并没有停止。在我们写作GPT2的相关内容时意外发现了论文的第二作者 Jeffrey Wu 的 GitHub账户。在浏览他的所有项目时我们意外发现了一个名为minGPT的工程,其简介中赫然写到一句描述: A minimal PyTorch reimplementation of the OpenAI GPT(Generative Pretrained Transformer)training,到这里总算是找到了官方对于GPT简称的认证。

当然,上面提到的细节之处本书中还有很多,读者可以在阅读学习的过程中自行慢慢体会。本书的目的只有一个,那就是所有的坑都让我们先来踩,所有的错都先让我们来犯,各位读者只需跟随本书的足迹一步一步踏入深度学习的大门。不过遗憾的是,这本书也只能刚好带领各位读者进入深度学习的大门,至于怎么将这些技术用得更好、用得更出色还需要各位读者在实际使用中进行反复锤炼。

扫描目录上方的二维码可下载本书配套资源。

致谢

首先感谢清华大学出版社赵佳霓编辑的耐心指点,以及对本书出版的推动。其次感谢在本书中所引用文献的作者,没有你们的付出也不会有本书的出版。如果说我们看得比别人更远一些,那只是因为我们站在了巨人的肩膀上。在本书的写作过程中从《动手学深度学习》《神经网络与深度学习》,以及斯坦福大学的CS224N和CS231N中获得了不少灵感,在此特意向李沐老师和邱锡鹏老师及相关作者表示感谢,感谢这些深度学习领域中的巨人。同时我们也要感谢我们的家人在身后默默地支持我们。最后要感谢我自己,感谢那个曾经无数次想要放弃但依旧坚持下来的自己。

写好一本书不容易,写好一本能让初学者读懂且有所裨益的书更不容易。由于我们才学和资历尚浅,书中难免存在着这样或那样目前尚未发现的错误,因此还请各位读者海涵与见谅。同时,也欢迎各位同行前辈对本拙作不吝指教。在今后的岁月里,我们也将不遗余力地持续去打磨这两本书中的内容,力争以最直观、最简洁和最有新意的语言将各个算法的原理与实现呈现在各位读者面前,继续秉持着“为往圣继绝学”的初心。

王成

2024年12月于上海