吴恩达的网课 deeplearning.ai 到底适不适合自己呢?
快来看看学员 Thomas 怎么说的!
AI 科技评论按:本文的作者是 Thomas Treml,是一名具有社会学背景的数据科学自由职业者。他在 Medium 上分享了自己学习 deeplearning.ai 课程的经历与感想。由 AI 科技评论进行编译。
最近我刚刚完成了 Andrew Ng(吴恩达)在 Coursera 上的 deeplearning.ai 的专业化课程,所以我想与大家分享一下我在学习这套课程中的想法以及经验。我之前发现由 Arvind N 撰写的关于前三堂课程的回顾非常有用,尤其是帮助了我下定决心开始学习这门课程,所以我希望我所撰写的这篇回顾也能对其他人有所帮助。
实话实说在学习了这五堂课之后我感到获益良多。课程内容结构合理,并且对于那些只有一点点矩阵代数知识的人而言也非常友好。然后你必须具备有 Python 编码的经验,哪怕只有一点点。课程里大多数的编程任务都设置得恰到好处。除了它们富有启发性的特性之外,尝试去解决这些问题的过程也是相当令人享受。最后,在我看来,学习这门专业化课程是你开始深入探索深度学习各个领域分支的一条绝佳途径。并且在学习完该课程之后,你将能够找到自己想在深度学习中继续深入研究的方向。
首先我必须承认,在学习这门课程之前,我对神经网络一直保持着怀疑的态度。因为我具有传统机器学习的知识背景,所以我一度不相信像神经网络这种将一些函数(神经元)组合在一起的黑盒模型(无法进行单独的训练与评估),能够超过一个经过精心调整和认真评估验证过的模型。而另一方面,深度学习与人工智能的火爆现象也让我对此更加疑虑重重。
尽管如此,我却认真对待和考虑着每一位和我提起深度学习的朋友的建议,尤其是 Shoaib Burq 在苏黎世举行的 Apache Spark 聚会上的一次演讲,那次演讲是我一个很重要的转折点。那之后,也就是去年,我决定要对深度学习进行一探究竟以解心中疑惑。首先,我开始观看一些视频、阅读博客以及跟着一些教程学习。不幸的是,这些尝试证明了我之前的假设——即深度学习背后的数学机理对我而言过于高深。尽管我深深地喜欢应用数学进行实践,但是当涉及到求导推理和抽象理论的时候,我却是一个十足的门外汉。
当我第一次听说了 deeplearning.ai 专业化课程时我非常地兴奋。因为在之前的其它课程学习中,我已经意识到了 Coursera 平台的学习方式非常适合我。然后从 Andrew Ng 的第一个大型开放式网络课程(Massive Open Online Course, MOOC)的视频中,我了解到他是一位机器学习领域的好讲师。但是由于当时课程任务采用的编程语言是 Octave,所以那时我并没能完成那个课程上的任务。所以在了解到该课程任务现在采用了 Python 实现编程(这是我的主要编程语言)之后,我最终确信,该系列课程将能带领我系统化学习深度学习。
但首先,我没有足够的时间来完成课程作业。
当我在去年年中遭遇(尽管不严重但是却很麻烦)了身体健康问题之后,情况发生了转变。当我感觉身体好一些之后,我最终下定决心参加第一门课程。通常情况下,我只在一门特定的课程中参加一个我想学习的特定主题,观看视频并快速完成作业。但是这一次,我决定要坚持从头学到尾,并且循序渐进。我期望关于认知挑战主题的工作可以帮助我尽快康复。然后完成那些编程任务也是我回归编程和日常工作的一个好机会。事实上,在刚开始的头几周里出于身体健康原因,我被限制了只能在显示器面前呆上非常短的时间。所以我不得不把作业打印出来,在纸上将它们解决了,之后再上网将这些答案录入提交。此外,在刚开始时一个令人意想不到的积极的副作用发生了。在前三个课程中有一些可选的视频,在这些视频里 Andrew 分别采访了那些深度学习领域的英雄(Hinton、Bengio 和 Karpathy 等)。这些视频不仅内容丰富,而且对我来说非常具有激励性,尤其是 Ian Goodfellow 的视频。
在专业层面上,当你对这个主题相当陌生时,你可以通过学习 deeplearning.ai 而获取到很多的知识。首先也是最重要的是,你学到了关于神经网络的基本概念,在简单的序列模型中一个前向传播是如何进行的,以及什么是反向传播等等。我曾经多次看到过并且听说过神经网络的这些基本构建块。但是 Andrew Ng 所给出的定义和介绍却是最清晰和最系统的。所以我认为这套课程是一个学习这些基础的非常有效的途径,并且比我之前学习过的那些教程、博客以及演讲都来的有价值。
作为一个侧面说明,第一堂课就立即证明了我之前的假设是错误的——即深度学习所涉及的数学知识对我而言过于高深。事实上,课程中大多数的概念都在我上学期间或者学习期间有接触过——而我并没有硕士文凭,所以不要让那些公式中看起来很精致的希腊字母吓到了。你所要具备的基础知识只是知道一点点如何计算矩阵代数,懂得通过偏导来计算梯度,懂得基本的线性回归模型以及梯度下降法,而剩下的其它知识 Andrew 都会教你的。
正如你在其它许多技术资料中接触到一样,你将在第一堂介绍课中学习到深度学习中的神经网络结构在生物模型中并没有对应物。神经元中的信号处理机制与深度学习中神经网络的功能(先是线性计算然后通过激活函数引入非线性)非常不一样。
对新手们而言非常有用的一点是去学习深度学习项目的不同方法。比如是采用预训练模型进行迁移学习还是采用一种端到端的学习方法。此外数据增强的概念至少在方法论层面得到了解决。
在更高级的课程中,你将接触到图像识别(课程4)和序列模型(课程5)。这两节课介绍了卷积神经网络(CNN)和递归神经网络(RNN)最常见的变体。而我认为这是专业化的一个主要优势,你可以学习到各种最先进的模型和方法。尽管它可能无法让你成为深度学习的专家,但是你将认识到你可以进一步专注于该领域哪一个分支。
另外我发现对加深课程理解非常有用的是,通过 François Chollet 编写的书籍《深度学习与 Python》 来补充课程作业部分缺失的知识。这本书中缺失的技术方法论基础在课程讲座中得到了很好的解释。另一方面,那些在本课程中提到但是却没有在作业中得到广泛实施的深度学习项目,这些内容在本书中也有更详细的介绍。特别是数据预处理部分在本课程的编程任务中明显缺失。你可以在第二个以及第四个 MOOC 中获取关于如何使用深度学习框架(Tensorflow 和 Keras)的教程,但是显而易见的是,这本由 Keras 创建者编写的书将教你如何更深入地实现深度学习模型。
接下来我将逐一介绍你可以期待从这五门课程中学习到什么,以及一些与课程作业有关的个人经验。最后,我还将总结一下一些个人想法。
该课程将向你介绍神经网络的基本构建模块。你将学习到 Logistic 回归、损失函数、激活函数以及梯度下降法(随机梯度下降法和小批量梯度下降法)是如何工作的。同时还将快速介绍如何使用 Python 的 Numpy 库进行矩阵代数计算。
对一张猫的图像进行分类预测
该课程的主要任务是进行概览式简介。Andrew Ng 是一位出色的讲师,即便是那些数学基础较差的同学应该也能很好地理解上课所讲的内容。
在这次作业中,你将首先采用单个感知机实现一个二元分类任务,然后升级为一个多层感知机来实现相同的任务目标,最后一项作业则是通过 Numpy 编码实现一个深度神经网络。尤其是这两个图像分类任务在某种意义上具有启发性和回报性,因为你将最终实现一个喵咪分类器。正如你在上图看到的那样,它能够判断一张图像上是否有猫存在。
正如标题所示,在本课程中,你将学习如何微调深度神经网络。这几节课程解决了最常见的问题,比如过拟合和梯度消失/爆炸。你将学习到如何找到合适的权重初始化、使用 dropouts 技术、正则化以及归一化操作。当然,还将学习到不同的优化算法变体都是如何进行工作的,以及该为自己的问题选择哪一种优化算法最为恰当。
对我而言,本课程最有用的一个知识是采用随机值来调整超参数,而不是通过一种更加结构化的方法。事实证明,在定义的空间和正确的尺度上选取随机值比使用网格搜索更加有效,如果你从事过传统的机器学习,你应该对网格搜索非常熟悉。
这次课程的任务则有点枯燥,我猜这是因为他们有必须处理的内容。但是每一个作业都大有裨益——特别是关于优化方法的作业。作为奖励,你将在课程结束时获得有关如何使用 Tensorflow 的教程,这对后续课程即将进行的作业而言非常有用。
这次课程绝对是一只黑天鹅。由于它被设计成为期两周的课程学习,我期望在前两个入门课程和之后的关于 CNN 和 RNN 的高级课程之间有一个快速的填充。此外,我本来认为我非常习惯于构建机器学习项目。但是事实证明,这对我来说是最有价值的课程。
在本课程中,你将学习开发深度学习模型的优良实践方法。对于大多数机器学习从业者而言,应该会对将数据集分解成训练、校验和测试三分部分这种操作感到熟悉。在开始项目之前,我们必须确认我们所要优化的指标。而且,你应该针对人类层次误差(Human-Level-Error, HLE)分别量化模型执行域的贝叶斯最优误差(Bayes-Optimal-Error, BOE)。这是一个重要的步骤,而我之前却一直没有意识到(通常情况下,我将性能与基准模型进行了比较——这一点同样重要)。当你必须评估模型性能时,你当然会将校验误差与 BOE(或 HLE)和训练误差进行比较。因此,你可以将可避免偏差(BOE 与训练误差)和模型方差(训练误差与校验误差)进行比较。而这两者哪一个更大,将决定了你应该采取什么样的策略来进一步提高性能。例如,如果方差存在问题,你可以尝试获取更多的数据、引入正则项或者尝试一种全新的不同的方法(例如,替代架构或不同的超参数搜索方法)。
你还可以学习到创建项目的不同策略以及迁移学习与端到端学习的详细内容。
由于我对计算机视觉不太感兴趣,至少在我参加这次课程之前,我对计算机视觉这块内容的期待并没有太高。但是事实证明,这成为了我整个系列课程中最具有教育意义的一门课程。
在本课程中,你将主要学习 CNN 以及它是如何被应用于计算机视觉任务的。从课程视频中,你可以了解 CNN 的构建模块以及它们是如何能够变换张量的。有些视频也专门介绍了残差网络(Residual Network, ResNet)和 Inception 架构。
基于 YOLO 的动物检测
我另外找到了一些有关 YOLO 算法的精彩视频。YOLO 的基本功能在课程中被非常好地可视化了出来,这些都让我耳目一新,也让我意识到了物体检测原来也可以是一件令人愉快的工作。但是光建立一个性能优秀而复杂的模型有时候还不够,因为很显然,预测的速度也是一项非常重要的指标。
这应该是该系列课程的五个任务中最具有教育意义的一个,在这里你需要实现一个低层次抽象 CNN 架构。然后选做部分的编码实现反向传播,加深了我对这种反向学习过程的理解。
人脸识别中有两个任务。在这个主题下的课程和作业,给了我们一次很好的机会来认识 deeplearning.ai的团队成员们——至少能见识到他们的照片。因为他们的照片被用来作为验证用的图像。
神经风格转换
这里还有一个与艺术有关的任务,这就是神经风格转换(Neural Style Transfer)。基本上,你必须通过 Tensorflow 实现 Gatys 等人在 2015 年的论文中所提出的架构。除了课程的要求之外,我还用这个模型自娱自乐了一会,并且得到了一些既有趣又恐怖的结果。当你浏览中间记录的结果时,你可以看到模型是如何学习并在每次迭代中将样式应用到输入图像之上的。曾经有那么一瞬间我觉得就像科学怪人一般,因为我的模型从源图像的眼睛区域进行了学习,并将该特征应用到了输入图像的人脸中,所以它一不小心就成了 DeepFake。
这是本系列最后一堂课,也是我认为最难的一部分。这里你将学到 RNN、门控重复单元(Gated Recurrent Unit, GRU)和长短时记忆(Long Short-Term Memory, LSTM)的基本概念,以及它们的双向实现。虽然对我而言,实现专业化的理解和使用这些模型是我的最终目标,但是我依然觉得这些内容难以掌握。这可能是因为里边复杂的概念,比如时间反向传播(Back propagation through time)、词嵌入向量(Word embeddings)或者束搜索(Beam search)。而且我认为,这些较难的主题应该划分成四周时间进行学习会更好,而不是现在的三周。
另一方面,本次课程的测验和编程作业都显得非常简单。你将学习如何构建 RNN,该 RNN 能够从字符序列中学习以生成新的相似内容。例如,你必须编写一个模型来为恐龙起名字。LSTMs 在各种各样的任务中都能发挥作用。你构建一个能以莎士比亚风格写诗的模型,只要给定一个序列作为开始。然后在另外一个项目中,你可以再次变得富有艺术性。你必须构建一个 LSTM,使它学习爵士乐音乐库中的音乐模式,之后再使用这个模型来生成一个新的爵士即兴创作。我的结果听起来是这样的,虽然差强人意,但是它听起来至少还是有点爵士的感觉。然后接下来这个又是需要 LSTM,这次你需要把 LSTM 与一个嵌入层进行结合,这个模型可以检测输入序列的语义情绪,并在句尾添加最合适的表情符号。
通过词嵌入和 LSTM 实现自动添加表情
很棒的是,你在第二周学习的不仅是关于词嵌入,还有词嵌入中所包含的社会偏见问题。而最重要的是,你将学习如何以三步走的方式来解决这个问题:识别(Identify)——抵消(Neutralize)——均衡(Equalize)。最后,一个非常有教育意义的任务是最后的一个编程作业。你可以构建一个触发器单词检测器(Trigger Word Detector),正如你唤醒 Amazon Echo 和 Google Home 设备那样。我郑重承诺,我的模型比 Google 智能助理更了解我,并且它还有一个更加愉快的唤醒词汇。
最后,我想说的是,如果你对深度学习相对陌生,你将可以从这个专业化课程中学到很多知识。如果你已经对神经网络有了一定的了解,那么可以跳过前两门课程。如果你对图像识别和序列模型也非常熟悉了,那么建议你仅参加「构建机器学习项目」这个课程。
另一方面,要清楚地知道自己属于哪一种学习类型。如果你是一个严格的动手实践派,这种专业化课程可能并不适合你,你应该去寻找其它更合适的课程。据说,fast.ai 提供了更丰富的动手操作体验。另外,如果你只对理论化的东西感兴趣,而对实际动手实现不感兴趣,那么你可能也不会对该课程感到满意——那么我建议你选修当地大学所开设的一些相关课程。也许你只是对深度学习的某一特定领域感兴趣,那么对你来说也可能存在其它更合适的课程。比如说,如果你只想了解自动驾驶,那么在 Udacity 上注册不提供学位证书的「自动驾驶汽车」课程可能来的更有效率。尽管在 deeplearning.ai 的第三课中也介绍了自动驾驶,但是这些内容过于皮毛,而且缺乏实践指导。但是,如果你更重视全面的介绍,并且希望将它与深度学习的各个领域的实践经验结合起来,那么我肯定会推荐 deeplearning.ai。
学习这个专业化课程可能不仅仅只是你进入深度学习领域的第一步。我会说,其中的每一门课程都引领着你朝着正确的方向迈出了一步,所以你最终总共迈出了五步。尽管如此,我也很清楚,那就是这样也还不足以帮助你在人工智能领域追求更长远的职业发展。我认为该系列课程帮你构建起了对该领域的一个基本理解。但是进一步说,你必须持之以恒进行实践,最后还可以考虑阅读更多有关于深度学习变体方法论的背景知识(例如在课程中提到的更高级的论文)。但是通过这门课程的学习,你可以开始以系统化的方式进入该领域——这是非常有价值的,尤其是当前深度学习领域存在着如此纷繁众多的分支。
如果你想获得关于 deeplearning.ai 专业化课程的更多资讯,并且还想知道其他人的观点(与我相似):我推荐你去观看 Christoph Bonitz 关于他参加该系列 MOOC 经历的演讲。你可以在这里观看录像视频。
最重要的是,我绝不会后悔把时间花在 Coursera 的专业课上。因为我的大部分期待都已经得到了满足,并且我在专业化层面上学习到了非常多知识。完成所有的课程包括选修部分,这也是一个不错的选择。我非常感谢 Andrew Ng 鼓励我们去阅读论文,以便于能在特定主题上深入探索。因此,你将从 MOOC 的课堂中获得一份精选的阅读列表,我认为这也是非常有用的。
最后,我对于这门专业化课程给出的关键要点是:现在我完全相信深度学习方法和它的强大功能。它的主要优势在于对大量数据的扩展性以及对相似任务泛化能力,而这些可能是传统机器学习模型不具备的能力。所以,我想感谢 Andrew Ng,感谢整个 deeplearning.ai 团队,感谢 Coursera 提供了如此有价值的内容。而且我绝对期待,不久的将来这门专业课可能会迎来第六门课程——关于深度强化学习的话题!
声明:作者并不隶属于 deeplearning.ai、Coursera 或其它 MOOC 供应商。这是作者在 2017-11 至 2018-02 期间撰写的关于自己参加这次课程的个人经历体验。此外,本博客提到课程内容不具有普遍的参考意义,因为官方的课程设置在将来可能发生变化。
联系客服