作者:Ryan Shrott
来源:机器之心
本文长度为2500字,建议阅读5分钟
本文作者是加拿大国家银行首席分析师Ryan Shrott,完成了迄今为止(2017 年 10 月 25 日)吴恩达在 Coursera 上发布的所有深度学习课程,并为我们提供了课程解读。
目前 Coursera 上可用的课程中,有三门课非常值得关注:
1. 神经网络与深度学习(Neural Networks and Deep Learning)
2. 改进深度神经网络:调整超参数、正则化与优化(Improving Deep Neural Networks: Hyperparamater tuning, Regularization and Optimization)
3. 结构化机器学习项目(Structuring Machine Learning Projects)
我发现这三门课非常重要,过程当中,我们可以从吴恩达教授那里获得很多有用的知识。吴恩达在教学语言上做得很好,解释概念清晰明了。例如,吴恩达明确指出监督学习并没有超出多维曲线拟合过程的范畴,而对于这种方法的其他理解方式,如对人类神经系统的模拟,实际上并不严谨。
学习这些课程的基础知识要求不多,只要求你事先掌握一些线性代数,以及 Python 基础编程知识。在我看来,你也需要了解向量计算来理解优化过程的内在知识。但如果你不关心内部运作方式,并只希望了解高级层面上的内容,那就尽管跳过微积分的部分。
第 1 课:为什么深度学习如此热门?
现在人类产生的 90% 数据是在最近 2 年内被收集的。深度神经网络(DNN)能够利用体量巨大的数据。因此,DNN 超越了较小的网络和传统学习算法。
规模是如何推动 DNN 性能的
此外,算法上的创新也使得 DNN 的训练速度变得更快。例如,从 Sigmoid 激活函数改为 RELU 激活函数对梯度下降等任务的优化过程产生了巨大影响。这些算法的改进使得研究人员可以更快地遍历灵感→ 代码→ 经验的开发循环,从而带来更多的创新。
深度学习开发循环
第 2 课:深度学习中的向量化
在开始这门课之前,我并不知道神经网络可以在没有任何明确循环语句的情况下被实现(除了层之间的)。吴恩达点明了 Python 中向量化编程设计的重要性。课程附带的作业引导你进行向量化的编程,同时这些方法也可以很快迁移到你自己的项目中。
第 3 课:深入了解 DNN
前几门课实际上在引导你使用 NumPy 从头开始实现前向和反向传播。通过这种方法,我更加深入了解了高级深度学习框架(如 TensorFlow 和 Keras)的工作原理。吴恩达解释了计算图背后的想法,从而让我们了解了 TensorFlow 如何实现「神奇优化」的。
第 4 课:为什么需要深度?
在这一节中,吴恩达深入解释了 DNN 的层概念。例如,对于面部识别系统,他向我们解释了先处理的层是用于处理面部边界的,其后的层用于将这些边界识别为面部组件(如鼻子、眼睛、嘴等),再其后的层会将这些组件整合到一起识别人的身份。他还解释了电路理论(circuit theory)的思想——存在一个函数,需要来自隐藏单元指数式的数字来适应浅网络的数据。可以通过添加有限数量的附加层来简化指数问题。
第 5 课:处理偏差和方差的工具
吴恩达解释了研究者识别和处理偏差方差相关问题的步骤。下图诠释了一种解决这些问题的系统性方法。
解决偏差和方差问题的方法
他还解决了偏差和方差之间的「权衡」(tradeoff)。他认为在现在这个深度学习的时代,我们拥有独立解决每个问题的工具,而使权衡不再存在。
第 6 课:正则化
为什么向成本函数添加惩罚项会降低方差?在上这门课之前我的理解是它使权重矩阵接近于零,从而产生一个更「线性」的函数。吴恩达给出了另外一种和 tanh 激活函数相关的解释,即较小的权重矩阵生成较小的输出,使得输出围绕在 tanh 函数线性区域的中心。
tanh 激活函数
他还给出了 dropout 的有趣解释。之前我认为 dropout 在每次迭代中消灭随机神经元,就像越小的网络线性程度就越强一样。但是吴恩达的解释是从单个神经元的角度来看待生命(life)。
单个神经元的角度
由于 dropout 随机消灭连接,这促使神经元向父系神经元中更加均匀地扩展权重。通过扩展权重,它可以减少权重的 L2 范数(squared norm)。他还解释了 dropout 是 L2 正则化的自适应形式,两种方法效果相近。
第 7 课:归一化为何有效?
吴恩达展示了为什么归一化可以通过绘制等高线图的方式加速优化步骤。他详细讲解了在归一化和非归一化等高线图上进行梯度下降所需要的迭代次数变化,即相同优化算法没经过归一化操作会需要更多的迭代数。
第 8 课:初始化的重要性
吴恩达表示不使用参数初始化可能导致梯度消失或爆炸。他展示了多个步骤来解决这些问题。基本原则是确保每一层的权重矩阵的方差都近似为 1。他还讨论了 tanh 激活函数的 Xavier 初始化。
第 9 课:为什么使用小批量梯度下降?
吴恩达使用等高线图解释了使用小批量和大批量训练之间的权衡。基本原则是较大的批量每次迭代会变慢,较小的批量可以加快迭代过程,但是无法保证同样的收敛效果。最佳方法就是在二者之间进行权衡,使得训练过程比一次性处理整个数据集要快,又能利用向量化技术的优势。
第 10 课:高级优化技术的直观理解
吴恩达解释了合适使用动量(momentum)和 RMSprop 等技术限制梯度下降逼近极小值的路径。他还用球滚下山的例子生动地解释了这一过程。他把这些方法结合起来来解释著名的 Adam 优化。
第 11 课:基本的 TensorFlow 后端理解
吴恩达不仅解释了如何使用 TensorFlow 实现神经网络,同时还讲解了在优化过程中出现的后端进程。有一个家庭作业就是鼓励我们使用 TensorFlow 实现 dropout 和 L2 正则化,这加强了我对后端过程的理解。
第 12 课:正交化
吴恩达还讨论了机器学习策略中正则化的重要性。其基本思想是,我们希望实现并控制影响算法性能的因素,即一次只控制一个影响性能的因素。例如为了解决偏差问题,我们可以使用更大的网络或更鲁棒的优化技术,我们希望这些控制只影响偏差而不会影响其它如泛化等问题。缺少正交化控制的案例是过早停止了算法的最优化过程,因为这样会同时影响模型的偏差和方差。
第 13 课:单数值评估度量的重要性
吴恩达强调了选择单数值评估度量(single number evaluation metric)的重要性,它可以允许我们评估算法。如果目标改变,我们应该在模型开发过程中仅更改评估度量。吴恩达给我们讲解了一个使用猫分类应用识别色情图片的案例。
第 14 课:测试和开发集的分布
通常我们会假设测试集与开发集(dev sets)的分布相同,这就确保了我们在迭代过程中朝向正确的目标优化。这同样意味着如果你决定纠正测试集中错误的标注数据,那么你需要在开发集中纠正错误标注的数据。
第 15 课:处理不同的训练和测试/开发分布
吴恩达介绍了为什么我们对训练和测试/开发集没有相同的分布这一问题感兴趣。因为我们希望根据实际关心的样本来计算评估度量。例如我们可能希望使用和训练问题无关的的样本进行训练,但我们并不希望算法使用这些样本进行评估,这就令我们的算法可以在更多的数据上进行训练。经验上,这种方法可以在许多案例上产生非常好的效果。缺点是可能我们的训练和测试/开发集有不同的分布,这个问题的通常解决办法是,可以留出一小部分训练集,并确定训练集的泛化性能。然后我们可以比较这些误差率与实际的开发误差,并计算一个「数据误匹配」的度量标准。吴恩达还解释了解决这些数据误匹配问题的方法,例如人工数据合成。
第 16 课:训练集/开发集/测试集大小
在深度学习时代,训练集/开发集/测试集的分隔方法也发生了巨大的改变。之前,我只知道较普遍的 60/20/20 分隔。吴恩达强调,对于一个非常大的数据集,应该使用 98/1/1 甚至 99/0.5/0.5 的分隔。这是因为开发集合测试集只要足够大能保证模型处于团队设定的置信区间即可。如果你使用 1 千万个训练样本,那么 10 万样本(即数据集的 1%)就足够保证开发集和/或测试集的置信区间了。
第 17 课:近似贝叶斯最优误差
吴恩达解释了在某些应用中人类级别的性能如何作为贝叶斯误差的替代。例如,在视觉和听觉识别任务中,人类级别的误差通常很接近贝叶斯误差,可以用于量化模型中可避免偏差。如果没有诸如贝叶斯误差这样的基准测试,理解网络中的方差和可避免的偏差问题是很困难的。
第 18 课:误差分析
吴恩达介绍了一种能显著提高算法性能的有效性的误差分析技术。基本想法是手工标注错误分类的样本,集中精力处理对错误分类数据影响最大的误差。
猫识别 App 误差分析
例如,在猫识别中吴恩达认为模糊的图像最容易导致误差。这种敏感性分析可以令人看到在降低总体误差的过程中,你花费的精力到底有多值得。还有一种可能是,修复模糊图像是很费力的任务,而其它的误差更容易理解和修复。敏感性分析和近似操作都将作为决策过程的因素。
第 19 课:什么时候使用迁移学习?
迁移学习允许将一个模型的知识迁移到另一个。例如,你可以将一个猫识别 app 中的图像识别知识迁移到放射诊断中去。实现迁移学习需要用更多的数据重训练网络的最后几个层,以用于相似的应用领域。其思想基础是网络的低层的隐藏单元拥有更加广阔的应用范围,即对具体的任务类型不敏感。总之,当任务之间拥有相同的输入特征,并且需要学习的任务拥有比需要训练的任务多得多的数据的时候,迁移学习是可行的。
第 20 课:什么时候使用多任务学习?
多任务学习迫使单个神经网络同时学习多个任务(和每一个任务都配置单独的神经网络相反)。吴恩达解释道,当任务集合通过共享低级特征获得学习增益,以及每一个任务的数据量规模相似的时候,这种方法能工作得很好。
第 21 课:什么时候用端到端的深度学习?
端到端的深度学习需要多层处理并将它们组合到单个神经网络中,这使得数据能在没有人工设计步骤引进偏差的前提下自主进行优化过程。另一方面,这个方法需要非常多的数据,有可能排除潜在的手工设计成分。
结论:
吴恩达的深度学习课程使我对深度学习模型的开发过程有了基本的直观理解,以上我解释过的课程只不过是这个课程中展示资料的一部分。即使完成了课程你也还不能称为深度学习专家,而我唯一的不满是课程的作业布置太简单了。
原文链接:
https://medium.com/towards-data-science/deep-learning-specialization-by-andrew-ng-21-lessons-learned-15ffaaef627c