一年深度学习之路

建议
作者

Sylvain Gugger

发布日期

2019年1月2日

我2018年的新年愿望是进入深度学习领域。我在2017年10月偶然发现了fast.ai这个网站,此前我读了一篇《纽约时报》的文章,其中描述了能够训练深度学习模型的人才短缺。说它改变了我的生活听起来有点老套,但我几乎无法想象,一年后,我竟然会在幕后帮助准备这门课程的下一版本。因此,在这篇文章中,我将简单讲述我个人进入深度学习的历程,并分享一些我认为六个月前对我来说可能会有用的建议。

使用神经网络将埃菲尔铁塔添加到画作中的示例

我是谁,我来自哪里?

我的背景主要是数学。我拥有法国大学的硕士学位;我曾开始攻读博士学位,但六个月后因感到过于沮丧而停止了,之后在巴黎教了七年本科生。我是一个自学成才的程序员,我的父亲在我13岁时就很有先见之明地把一本“Basic”入门书放在我手中。

我丈夫被调到纽约市,所以我三年半前搬到了那里,变成了一个半家庭主夫、半法国一家出版社的教科书作者。当我第一次接触fast.ai时,我很好奇围绕着人工智能的大肆宣传究竟是怎么回事,我想知道我是否能够理解那些似乎只有少数天才才能接触到的东西。

我必须承认,我差点就没有开始这门课程;它声称只需一年编程经验和高中数学基础就能向任何人解释深度学习,这在我听来非常可疑,我当时在想这会不会完全是骗人的(剧透警告:不是)。不过,我还是决定尝试一下;我那时刚写完最新的书,而趁我小儿子们午睡时每周抽出七小时来学习这门课程似乎也不算太多。

尽管我开始第一版MOOC时在数学上有明显优势,但我对那些我称之为技术宅的东西感到非常头疼。我是Windows用户,以前从未使用过终端。设置花了了我将近一周的时间,最终我才能够训练我自己的猫狗分类器。每次不得不在终端中运行命令时,我都觉得像是某种折磨(这一点现在也没怎么变!)。

如果你刚入门这个领域,并且在某个部分(或全部)感到困难,请记住没有人一开始就轻松。总会有你不懂的东西,那会是一个挑战,但如果你坚持下去,你就会克服它。随着时间的推移,它会变得更容易,至少会容易一点点……我至今仍需要别人帮助我解决一半的bash命令,而且在第一节课期间弄坏了文档和课程网站两次。幸运的是,当时大家都忙着看Jeremy,没人注意到。

深度学习需要高等数学吗?

简短的回答是否定的。详细的回答也是否定的,任何告诉你反话的人都只是想吓唬你。在深度学习的一些理论研究领域,你可能需要高等数学,但这个领域容得下所有人。

要在实践中训练模型,你只需要三样东西:对导数有一个概念,知道误差函数中的对数(log)和指数(exp),以及知道什么是矩阵乘积。你可以在很短的时间内通过大量的在线资源学到这些。在课程中,Jeremy推荐使用可汗学院学习导数、对数和指数,使用3Blue1Brown学习矩阵乘积。

在我看来,唯一真正需要掌握(或者至少要尽可能熟悉)的与数学相关的(它介于数学和代码之间)是广播机制(broadcasting)

如果你是认真的,打造你自己的训练营

在我完成课程第一部分之后,我明确了我想在这个领域工作(因此有了那个好愿望)。我考虑过各种承诺能把我变成数据科学家的训练营,但需要支付高昂的学费。我在网上找到了足够的推荐信让我有点害怕,所以幸运的是我很快放弃了这个想法。

网上的免费(或廉价)资源足以教你所需的一切,所以只要你有自律性,你就可以打造自己的训练营。当然,其中最好的资源是fast.ai提供的课程(不过我现在在那里工作,可能有点偏见;))。

我原以为我不会被选中参加课程第二部分第二版的国际研究员项目,所以当收到录取邮件时我有点措手不及。我订了一个联合办公空间,以便远离家里一个婴儿和一个蹒跚学步的孩子带来的喧嚣,仓促请了一大群临时保姆直到找到一位固定保姆,然后每天朝九晚五,加上晚上,全身心投入课程材料。我原想学习其他MOOCs,但由于Jeremy在论坛上留下了各种挑战,加上那里活跃的社区,我根本没有时间去别处看看。

尽管这门课程的初衷是让学生每周花七小时做作业,但内容绝对够你花更多时间,尤其是在第二部分。如果你认真考虑转行做深度学习,你应该在这七周内全力以赴学习这门课。如果经济/家庭条件允许,飞到旧金山参加线下课程,并每天去USF的学习小组。如果不能,在你的城市寻找其他也在学习这门课的人(或者组建你自己的小组)。无论如何,请在论坛上保持活跃,不仅仅是在遇到bug时提问,也要帮助别人解决代码问题。

展示你的能力

我很害羞,而且讨厌社交。见过我本人的人都知道我简直不会闲聊。幸运的是,你可以在安全的电脑后面用很多方式向潜在雇主推销自己。以下是一些可能有帮助的方法:

  1. 制作你自己的项目来展示你学到的东西。在转向另一个项目之前,一定要彻底完善一个项目。就我而言,我先是重现了Leslie Smith论文中的超收敛,然后是深度绘画风格协调论文。
  2. 写一个博客来解释你学到的东西。不必是复杂的新研究文章,即使你认为已经有成千上万篇类似的文章,也可以从模型的基础知识开始。仅仅尝试解释你以为自己已经理解的东西,你就会学到很多。
  3. 为与深度学习相关的开源项目做出贡献(比如fastai库)。
  4. 参加Kaggle竞赛(还在我的待办事项清单上,也许这将是我的2019年愿望;))。
  5. 注册一个Twitter账号,向人们讲述以上所有内容。

我感到非常惊讶和惊喜的是,课程还没结束我就收到了好几个工作机会。后来,Jeremy提到他打算完全重构这个库,我主动提出帮忙。事情就这样发展下去,他成功地从AWS获得了赞助,让我成为了fast.ai的一名研究科学家。

幕后

在我看来,学习总共有三个阶段。首先你抽象地理解某事,然后你能解释它,最终你能真正做到它。这就是为什么检查你是否能独立地重写课程中看到的那些代码是如此重要。

就深度学习而言,对我来说,学习课程是第一阶段;写博客文章、Jupyter Notebook或在论坛上回答问题是第二阶段;与Jeremy一起从头重构库是第三阶段。

在过去几个月里,我学到的东西甚至比我在学习课程期间还要多。其中有些内容是我之前有点过快抛弃的……很多是通过在Jeremy的指导下重构代码片段,直到我们达到你今天所看到的结果。构建一个完全集成的框架意味着你必须实现所有内容,所以你需要掌握过程中的每一个部分。

总而言之,这是我人生中学习最多的一年。我将永远感谢Rachel和Jeremy创建了这个了不起的课程,我也非常自豪能为其添砖加瓦。