前言

2004 年高三毕业的那个暑假,我去拜访了即将加入的上海交通大学的 ACM-ICPC(ACM 国际大学生程序设计竞赛)队。因为在此之前只接触过一个月编程,入队预选赛也是碰巧通过,所以领队俞勇老师在我走前给了一本《算法导论》让我好好读一读。开学后他问我读得怎么样,我甚是得意的说,感觉挺容易,一个月不到就看完了。其实也没完全说大话,我高中参加过数学竞赛,习惯了绕脑筋的数学题后再来读逻辑更为简单的算法题确实感觉很顺畅。俞老师很惊讶:那好啊,参加队内比赛吧。

事实上是,了解一个算法只是第一步,不通过大量的练习很难在短时间内正确将它实现出来。这跟数学很是不同。因为数学的主要困难在解题,而将解写下来则容易很多。所以很长时间里我在队内比赛都是垫底。虽然算法都懂,但老是调不出代码的异常。

2006 年夏天我进入吕宝粮老师实验室,研究方向是通过机器学习来从人的脑电波里进行识别思维信号。我是通过自学《模式识别和机器学习》和《统计学习基础》来入门。我对这两本书深深着迷,很长时间内都醉心于对书中的公式进行反复推倒。之后又着迷于读各类论文。结果到 2008 年临近本科毕业才觉得理论够了,可以开始动手做实验来写论文了。可惜的是,即使有很多想法和理论,但就是调不出所要的模型精度,直到两年后才上路,知道如何做实验。

从这两个经历中我学到重要一点:计算机科学是动手的学科,没有足够的动手能力难以取得很好的成果。如果算法能力对应一台机器的内存大小,动手能力则是机器的 CPU 的频率。内存决定了能跑多么复杂的程序,CPU 则决定你能多快的完成它,两者都不能缺。

在吸取了这个教训后,后面的博士阶段似乎要顺利许多。为了研究能有效处理大量训练样本的机器学习算法,我选择了分布式系统作为博士研究方向之一;为了更好理解深度学习,我参与了 Apache MXNet 项目的开发。大量的实践不仅保证稳定的产出,同时也启发了很多新的思路。

博士毕业后我加入了亚马逊云计算部门,旨在让更多的人能更容易的使用深度学习。工作中我接触了很多年轻的学生和工程师,他们渴望了解深度学习并希望将它应用到工作和研究中去。我被经常问到如何学习深度学习,我发现我所知道的教材要么过于学院派(例如关注数学上的算法描述),要么过于实践(例如介绍某个深度学习框架如何使用),而我理想中的教材是能很好的权衡算法和实践。

2017 年 9 月的某个晚上,我突然萌发了自己来动手做一个教程的冲动,希望大家能少走我走过的弯路。我想为每一个算法创建一个 Jupyter 记事本,首先数学上描述它,然后提供它的实现,并最后给出在真实数据上使用的例子。不论是算法还是实践,大家都可以各取其需。

开始的时候,我修改了 Zack 给 Apache MXNet 写的教程,翻译成中文,然后每周六在将门创投的直播间给大家讲它们。很快 Zack 的内容用光了,就只能自己动手写新的。幸运的是随后 Aston 加入了这个项目并接手了大部分工作。这个每周的线上讲课持续了 5 个月,期间近 3 千名同学参与了讨论,贡献了近 5 千多个有价值的讨论。特别是其中几个参加比赛实战的练习很受欢迎。

这个课程的受欢迎程度出乎我们的意料。我们猜也许更多的人会对这个结合算法和实践的教程感兴趣。于是在之后的 7 个月里我们几乎重写了每一个小节来改善它们的准确性和易读性。这个项目一开始的时候我们便将所有的材料公开在网上,允许大家随意下载和传播。但我们也觉得出版成纸质书也许能让更多人来知道它,至少我个人更喜欢纸质书,所以我们拜托了人民邮电出版社来负责出版。我们的初衷是让更多人更容易地使用深度学习,因此为了让大家能够便利地获取这些资源,我们在网上保留了免费版本,并且通过不收取出版稿费来降低纸质书的价格。

诚然,将算法、公式、图片、代码和样例统一进一本适合阅读的书,而且又是一系列有交互式体验的记事本,是对我们极大的挑战。难免有很多疏忽的地方,敬请大家原谅,并希望你能通过每一节后面的二维码向我们反映问题。

最后,附上陆游的一句诗作为勉励:

纸上得来终觉浅,绝知此事要躬行。

李沐(2018 年 9 月)