前几天突然有了一个很有趣的想法,假如能与一年前刚入门深度学习的我进行交流,那么此时的我会有什么经验想分享给过去的我呢?想到入门深度学习以来踩的各种坑以及经历过的迷茫,我决定写一篇文章,从过来人(入门一年?)的角度说一下对新手的一些建议。由于我的水平有限,所以文章肯定会有遗漏与错误之处,望各位大佬轻拍。
常见问题解答(FAQ)
问:网上好多深度学习入门教程啊,该选择哪个呢?
答:随便在 Google 上搜一下“深度学习入门”,就能找到不少高质量的回答以及学习资源分享。我并不想在这推荐什么学习资源,因为在这方面的好文章太多了,我只想强调一点:无论你选择了哪个入门教程(书籍),都请专注于该教程,不要总是被五花八门的教程扰乱自己,任何教程都是殊途同归的,学成后的效果总是一致的。其实最关键的是需要有一个明确的目标,我会在正文突出学习目标,当你在学习时只需关注如何达成学习目标即可。问:我的数学/英语水平低,会不会难以入门?
答:其实不必那么担心。在我看来,入门深度学习对数学并没有太高的要求,入门阶段只需要知道导数与积分,矩阵等几个概念即可;至于英语,我只能说即使是天天翻阅英语文档的程序员也不见得能熟练地使用英语,想学习深度学习,能记住英语术语即可。如果一定要说入门有什么要求的话,我觉得能使用 Google 查找资料和不畏惧英语阅读这两点是必需的,当然,还需要一点编程能力。问:学习深度学习需要懂编程吗?
答:实战部分需要(可能有些教程在讲解理论时也会贴一段 Python 代码),但是要求不高。目前(2019 年)学术界的主流编程语言依然是 Python,假如你有编程基础,那么只需花 3 天时间学习 Python 基础语法即可,深度学习并不需要 Python 的高级语法知识;如果没有编程基础,请先老老实实地找个 Python 入门教程学习,不必担心难以学习,Python 作为一门小学生都能学会的编程语言,相信你用半个月到一个月的时间足以学会它的基础语法。
理论
首先,回答一个问题:你是为了什么而决定学习深度学习呢?是需要与老师做深度学习相关的科研项目?开发软件项目时需要用到深度学习?还是觉得近几年深度学习很火,想学习一下?如果只是软件项目中需要深度学习,那么可以考虑直接使用腾讯等大厂提供的 API,这些 API 可以实现图片分类等许多实用的功能。对于我来说,我是在跟着老师做计算机视觉(CV)科研项目时开始学习深度学习的,此前并没有相关经验。在这种情况下如何学习一个新的技术呢?完全可以根据学习技术的三部曲:WHAT、HOW、WHY中提到的 WHAT、HOW、WHY 这三个步骤进行学习,不过要注意的一点是在深度学习中想达到 WHY 这一步非常困难(学到后面就会发现神经网络基本是一个黑盒,所以训练模型也被戏称为炼丹)。先说下如何知道 WHAT 吧,想要知道 WHAT,你就必须知道深度学习中常见的名词的含义,例如卷积、梯度下降、神经网络、前向传播、反向传播等,最重要的是,知道神经网络的训练流程是怎样的。这一步比较简单,我推荐观看吴恩达的Deep Learning Specialization系列视频,上面有 5 门课程,每门课程都安排了 4 周的学习时间,但实际上我们不必全部看完,只需观看课程 1、2 即可,凡是需要写代码的练习全部跳过,因为我们只需要了解概念,等下我会说明如何进行实战练习。跳过课程 3 是因为入门阶段可以无视机器学习。准备进入计算机视觉(CV)领域的请另外看课程 4 的第一周的视频,了解卷积神经网络(CNN)的概念;准备进入自然语言处理(NLP)领域的请另外观看课程 5 的第一周的视频,了解循环神经网络(RNN)的概念。(PS:因为好奇而学习深度学习,不知道 CV 和 NLP 是干什么的?先去查下这两个领域有什么应用吧,看看哪些是你感兴趣的或者未来工作可能会用到的)
除了吴恩达的深度学习系列视频,你也可以通过看书完成这一步,只不过我没有仔细看过深度学习入门的书籍,所以不做推荐。无论如何,在这一个阶段,你必须对深度学习有整体的认识。检验是否达成这一目标的方法是回答一个问题:深度学习中的训练是怎么一回事?尝试用尽可能少的专业术语进行简短的描述,思考出答案后与我的回答进行对比看看。
对于上面的问题,我的回答就是构建一个神经网络,不断输入数据与标签,其根据数据与标签之间的对应关系调整自己的参数以令输出与标签一致(只限于监督学习)。说到这里,你可能会问:“诶?那么反向传播的实现这类问题呢?”。这已经是属于 HOW 这一范畴的问题了,你如果能清楚知道这类问题的答案那当然是一件非常好的事情,不过只记得大概的描述也没关系,知道 WHAT 以后,我们就已经可以使用深度学习框架进行实战了,只不过若是想要继续发展,请一定要花时间了解神经网络的实现细节,程序员可以不了解使用的技术的细节,但搞科研的必须了解细节。说了这么多关于了解概念的经验,接下来该说下肯定有不少人关注的实战部分了,对于 IT 行业的人来说,这部分会比较轻松。
实战
首先,我们先来聊点与编程有关的东西。想要进行实战,那么必须懂得 Python 基础语法,只是用 Python 如何实现在理论教程中吹了那么久的神经网络呢?先选择一个深度学习框架吧,我推荐选择 Keras 或者 Pytorch,这两个在目前是主流,而且简单易用(都 9102 年了,Tensorflow 该让位给 Keras 了)。为什么我推荐先学习使用深度学习框架而不是按照一些教程所说的先使用 Numpy 等库实现一个简单神经网络的训练呢?原因很简单,理论部分中,我已经说过在入门阶段只需对神经网络有一个整体的认识即可,实战必须与理论相结合,在理论学习中没有完全搞清楚实现细节,在实战部分通过不使用框架实现神经网络就可以弄清楚细节了吗?很难。当然,如果你很牛,在理论部分已经搞清楚细节了,例如前向/反向传播的具体过程,那么可以先使用 Numpy 等库实现一个简单神经网络。对于大多数人而言,在入门阶段,只需要掌握大概即可,以后还有很多时间了解细节呢。为什么只选择一个框架呢?未来的实战肯定不可能只使用一个框架,甚至有可能需要自己实现框架,但是,在入门阶段,一个足够了,框架隐藏了实现细节,让我们能够专注于神经网络的架构(在这里是优点),而且,在学会使用一个框架后,再学习另一个框架会事半功倍。
选好框架后,快来选择一个经典的模型上车吧。以我所在的计算机视觉领域举例来说,经典的模型包括 LeNet 5、AlexNet、VGG 等,各个框架都自带了这些经典模型(Pytorch 的在 torchvision 中),先根据官方文档提供的 demo 实际训练一下模型,看一下 CNN 在图片分类上的效果(选择图片分类任务是因为目前该领域最成熟),这里提供 Pytorch 的一个demo。稍微了解了训练流程后,接下来便应该读使用的 demo 中创建神经网络的代码了,例如可以看 Pytorch 官方的VGG模型实现代码。应该如何阅读这部分的代码呢?我建议与原论文或原论文的解析文章进行对照,将模型结构图与模型代码联系起来,因为以后很有可能需要根据模型结构图与描述使用框架构建对应的模型,或者根据模型代码深入理解模型结构,强烈建议在入门阶段便开始锻炼这方面的能力,这与刚入门编程时敲很多代码以熟悉语法和编程有点相似,不同的是:在编程领域这是为了熟悉从现实抽象出来的问题与代码之间的联系,而在这里是为了熟悉模型整体架构与构建出的模型代码之间的联系。当然,急着应用深度学习到实际项目的话可以放低一点要求,知道如何修改现有模型代码的输入层与输出层就可以了。假如觉得代码太长,不够直观,那么直接输出模型结构看看(Pytorch):
import torchvision.models as models
model = models.vgg16()
print(model)
Keras 也可以进行这个操作,使用 model.summary()即可。先不理会 demo 的其它部分代码,好好消化构建模型的方法,这是我觉得入门阶段最适合的方案,因为我觉得入门阶段就接触核心向的东西(深度学习比较简单,所以能在起始阶段便接触偏核心的问题,其它领域不一定喔)能避免以后可能遇到的不少弯路,假如重来一遍,我也不知道这样是不是能保证一切顺利。虽然我在上文当中都是以计算机视觉举例,不过相信想学习 NLP 的读者也可以从中举一反三,知道该如何通过实战进行入门。
下一步?
我们直击重点的入门教程算是结束了,虽然我在开头说过自己踩了不少坑,但是写完这篇文章后发现好像并没有怎么提到自己踩过的坑,我知道很多人会问接下来该干什么?在这里我真的可以说一说下一步该干什么。还记得上面的实战部分并没有提到关于读取数据等方面的内容吗,在日后的实战当中,读取数据并输入神经网络其实也是一个重要的部分,除非你确定以后只需使用主流的公开数据集,不然这部分知识就是必需的。接下来你可以先尝试在自己已能成功运行的 demo 上更换负责读取数据集的代码(更换后的代码不应该使用框架提供的常见数据集的 API,如读取 Imagenet 的 API),让模型使用另一个数据集进行训练完成相同的任务(如图片分类),这部分工作可能会花上几天时间,但是完成以后你应该就能真正理解如何向神经网络中输入数据了,除此以外,你有可能会顺便了解到一些数据预处理的简单操作,在实战当中,使用的数据集与模型的原作者使用的数据集总是不同,无论如何,一定要参考原作者的数据预处理步骤,不然有可能出现很大的指标差异。
弄完了上面提到的东西,接下来真的可以说是海阔天空了,接下来的路就是无数个分叉口,入门后的你可以尝试使用神经网络做一个简单的实战项目,例如:用户上传图片,服务器返回分类结果(早已有大厂提供这个 API 了);也可以找老师开始下一步的科研;当然也可以继续自学,只不过需要自己把握学习方向了。总之,未来就在脚下,祝各位在炼丹的路上一切顺利。