文章出处: Michael Nielsen的《Neural Network and Deep Learning》,本节译者:朱小虎 、张广宇。
目录
1、使用神经网络识别手写数字
2、反向传播算法是如何工作的
3、改进神经网络的学习方法
- 改进神经网络的学习方式
- 交叉熵损失函数
- 使用交叉熵损失来分类MNIST数字集
- 交叉熵意味着什么?它从哪里来?
- Softmax
- 过拟合和正则化
- 正则化
- 为什么正则化能够降低过拟合?
- 其他正则化技术
- 参数初始化
- 重温手写数字识别:代码
- 如何选择神经网络的超参数
- 其他技术
4、神经网络能够计算任意函数的视觉证明
5、为什么深度神经网络的训练是困难的
6、深度学习
除了 L2 外还有很多规范化技术。实际上,正是由于数量众多,我这里也不会将所有的都列举出来。在本节,我简要地给出三种减轻过度拟合的其他的方法:L1 规范化、弃权(Dropout)和人为增加训练样本。我们不会像上面介绍得那么深入。其实,目的只是想让读者熟悉这些主要的思想,然后来体会一下规范化技术的多样性。
L1 规范化 这个方法是在未规范化的代价函数上加上一个权重绝对值的和:
(95)
凭直觉地看,这和 L2 规范化相似,惩罚大的权重,倾向于让网络优先选择小的权重。当然,L1 规范化和 L2 规范化并不相同,所以我们不应该期望从 L1 规范化得到完全同样的行为。让我们来试着理解使用 L1 规范化训练的网络和 L2 规范化训练的网络所不同的行为。
首先,我们会研究一下代价函数的偏导数。对公式(95)求导我们有:
(96)
其中 就是 的正负号,即 是正数时为 ,而 为负数时为。使用这个表达式,我们可以轻易地对反向传播进行修改从而使用基于 L1 规范化的随机梯度下降进行学习。对 L1 规范化的网络进行更新的规则就是
(97)
其中和往常一样,我们可以用一个minibatch的均值来估计 。对比 L2 规范化的更新规则(参见方程(93))
(98)
在两种情形下,规范化的效果就是缩小权重。这符合我们的直觉,两种规范化都惩罚大的权重。但权重缩小的方式不同。在 L1 规范化中,权重通过一个常量向 进行缩小。在 L2规范化中,权重通过一个和 成比例的量进行缩小的。所以,当一个特定的权重绝对值 很大时,L1 规范化的权重缩小得远比 L2 规范化要小得多。相反,当一个特定的权重绝对值 很小时,L1 规范化的权重缩小得要比 L2 规范化大得多。最终的结果就是:L1 规范化倾向于聚集网络的权重在相对少量的高重要度连接上,而其他权重就会被驱使向 接近。
我在上面的讨论中其实忽略了一个问题~——~在 的时候,偏导数 未定义。原因在于函数 在 时有个“直角”,事实上,导数是不存在的。不过也没有关系。我们下面要做的就是应用通常的(无规范化的)随机梯度下降的规则在 处。这应该不会有什么问题,凭直觉地看,规范化的效果就是缩小权重,显然,不能对一个已经是 的权重进行缩小了。更准确地说,我们将会使用方程(96) 和(97) 并约定 。这样就给出了一种细致又紧凑的规则来进行采用 L1 规范化的随机梯度下降学习。
弃权(Dropout)是一种相当激进的技术。和 L1、L2 规范化不同,弃权技术并不依赖对代价函数的修改。而是,在弃权中,我们改变了网络本身。在介绍它为什么能工作,以及所得到的结果前,让我描述一下弃权基本的工作机制。
假设我们尝试训练一个网络:
特别地,假设我们有一个训练数据 和 对应的目标输出 。通常我们会通过在网络中前向传播 ,然后进行反向传播来确定对梯度的贡献。使用弃权技术,这个过程就改了。我们会从随机(临时)地删除网络中的一半的隐藏神经元开始,同时让输入层和输出层的神经元保持不变。在此之后,我们会得到最终如下线条所示的网络。注意那些被弃权的神经元,即那些临时被删除的神经元,用虚圈表示在图中:
我们前向传播输入 ,通过修改后的网络,然后反向传播结果,同样通过这个修改后的网络。在一个minibatch(小批量)的若干样本上进行这些步骤后,我们对有关的权重和偏置进行更新。然后重复这个过程,首先重置弃权的神经元,然后选择一个新的随机的隐藏神经元的子集进行删除,估计对一个不同的minibatch的梯度,然后更新权重和偏置。
通过不断地重复,我们的网络会学到一个权重和偏置的集合。当然,这些权重和偏置也是在一半的隐藏神经元被弃权的情形下学到的。当我们实际运行整个网络时,是指两倍的隐藏神经元将会被激活。为了补偿这个,我们将从隐藏神经元出去的权重减半。
这个弃权过程可能看起来奇怪,像是临时安排的。为什么我们会指望这样的方法能够进行规范化呢?为了解释所发生的事,我希望你停下来想一下没有标准(没有弃权)的训练方式。特别地,想象一下我们训练几个不同的神经网络,都使用同一个训练数据。当然,网络可能不是从同一初始状态开始的,最终的结果也会有一些差异。出现这种情况时,我们可以使用一些平均或者投票的方式来确定接受哪个输出。例如,如果我们训练了五个网络,其中三个把一个数字分类成 “3”,那很可能它就是“3”。另外两个可能就犯了错误。这种平均的方式通常是一种强大(尽管代价昂贵)的方式来减轻过度拟合。原因在于不同的网络可能会以不同的方式过度拟合,平均法可能会帮助我们消除那样的过度拟合。
那么这和弃权有什么关系呢?启发式地看,当我们弃权掉不同的神经元集合时,有点像我们在训练不同的神经网络。所以,弃权过程就如同大量不同网络的效果的平均那样。不同的网络会以不同的方式过度拟合了,所以,弃权过的网络的效果会减轻过度拟合。
一个相关的启发式解释在早期使用这项技术的论文中曾经给出1:“因为神经元不能依赖其他神经元特定的存在,这个技术其实减少了复杂的互适应的神经元。所以,强制要学习那些在神经元的不同随机子集中更加健壮的特征。” 换言之,如果我们将我们的神经网络看做一个进行预测的模型的话,我们就可以将弃权看做是一种确保模型对于一部分证据丢失健壮的方式。这样看来,弃权和 L1、L2 规范化也是有相似之处的,这也倾向于更小的权重,最后让网络对丢失个体连接的场景更加健壮。
当然,弃权技术的真正衡量是它已经在提升神经网络性能上应用得相当成功。原始论文2介绍了将其应用于很多不同任务的技术。对我们来说,特别感兴趣的是他们应用弃权在 MNIST 数字分类上,使用了一个和我们之前介绍的那种普通的前向神经网络。这篇论文提及到当前最好的结果是在测试集上取得了 98.4% 的准确率。他们使用弃权和 L2 规范化的组合将其提高到了 98.7%。类似重要的结果在其他不同的任务上也取得了一定的成效,包括图像和语音识别、自然语言处理。弃权技术在训练大规模深度网络时尤其有用,这样的网络中过度拟合问题经常特别突出。
人为扩展训练数据:我们前面看到了 MNIST 分类准确率在我们使用 1,000 幅训练图像时候下降到了 80% 中间的准确率。这种情况并不奇怪,因为更少的训练数据意味着我们的网络接触更少的人类手写的数字中的变化。让我们训练 30 个隐藏神经元的网络,使用不同的训练数据集,来看看性能的变化情况。我们使用mini batch大小为 ,learning rate为 ,规范化参数是 ,交叉熵代价函数。我们在全部训练数据集合上训练 30 个epochs,然后会随着训练数据量的下降而成比例增加epochs的数量。为了确保权重衰减因子在训练数据集上相同,我们会在全部训练集上使用规范化参数为 ,然后在使用更小的训练集的时候成比例地降低 值3。
如你所见,分类准确率在使用更多的训练数据时提升了很大。根据这个趋势的话,提升会随着更多的数据而不断增加。当然,在训练的后期我们看到学习过程已经接近饱和状态。然而,如果我们使用对数作为横坐标的话,可以重画此图如下:
这看起来到了后面结束的地方,增加仍旧明显。这表明如果我们使用大量更多的训练数据~——~不妨设百万或者十亿级的手写样本,而不是仅仅 50,000个~——~那么,我们可能会得到更好的性能,即使是用这样的简单网络。
获取更多的训练样本其实是很好的想法。不幸的是,这个方法代价很大,在实践中常常是很难达到的。不过,还有一种方法能够获得类似的效果,那就是人为扩展训练数据。假设我们使用一个 5 的 MNIST 训练图像
将其进行旋转,比如说 :
这还是会被设别为同样的数字的。但是在像素层级这和任何一幅在 MNIST 训练数据中的图像都不相同。所以将这样的样本加入到训练数据中是很可能帮助我们的网络学会更多如何分类数字。而且,显然我们不限于只增加这幅图像。我们可以在\emph{所有的} MNIST训练样本上通过\emph{很多}小的旋转扩展训练数据,然后使用扩展后的训练数据来提升我们网络的性能。
这个想法非常强大并且已经被广泛应用了。让我们从一篇论文Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis (作者为 Patrice Simard, Dave Steinkraus, 和 John Platt ,2003 )看看一些结果,这篇论文中,作者在 MNIST 上使用了几个这种想法的变化方式。其中一种他们考虑的网络结构其实和我们已经使用过的类似~——~一个拥有 800 个隐藏元的前馈神经网络,使用了交叉熵代价函数。在标准的 MNIST 训练数据上运行这个网络,得到了 98.4% 的分类准确率。他们不只旋转,还转换和扭曲图像来扩展训练数据。通过在这个扩展后的数据集上的训练,他们提升到了 98.9% 的准确率。然后还在“弹性扭曲”的数据上进行了实验,这是一种特殊的为了模仿手部肌肉的随机抖动的图像扭曲方法。通过使用弹性扭曲扩展的数据,他们最终达到了 99.3% 的分类准确率。他们通过展示训练数据的所有类型的变化形式来扩展网络的经验。
这个想法的变化形式也可以用在提升手写数字识别之外不同学习任务上的性能。一般就是通过应用反映真实世界变化的操作来扩展训练数据。找到这些方法其实并不困难。例如,你要构建一个神经网络来进行语音识别。我们人类甚至可以在有背景噪声的情况下识别语音。所以你可以通过增加背景噪声来扩展你的训练数据。我们同样能够对其进行加速和减速来获得相应的扩展数据。所以这是另外的一些扩展训练数据的方法。这些技术并不总是有用~——~例如,其实与其在数据中加入噪声,倒不如先对数据进行噪声的清理,这样可能更加有效。当然,记住可以进行数据的扩展,寻求应用的机会还是相当有价值的一件事。
练习
关于大数据和其对分类准确率的影响的题外话: 让我们再看看神经网络准确率随着训练集大小变化的情况:
假设我们使用别的机器学习技术来分类数字,而不是神经网络。例如,让我们试试使用支持向量机(SVM),我们在第一章已经简要介绍过它。正如第一章中的情况,不要担心你熟不熟悉 SVM,我们不进行深入的讨论。我们使用scikit-learn 库 ( http://scikit-learn.org/stable/) 提供的 SVM 替换神经网络。下面是 SVM 模型的性能随着训练数据集的大小变化的情况,我也画出了神经网络的结果来方便对比4。
可能第一件让你吃惊的是神经网络在每个训练规模下性能都超过了 SVM。这很好,尽管你对细节和原理可能不太了解,因为我们只是直接从 scikit-learn 中直接调用了这个方法,而对神经网络已经深入讲解了很多。更加微妙和有趣的现象其实是如果我们训练 SVM 使用50,000 幅图像,那么实际上它的准确率(94.48%)已经能够超过我们使用 5,000 幅图像的神经网络的准确率(93.24%)。换言之,更多的训练数据可以补偿不同的机器学习算法的差距。
还有更加有趣的现象也出现了。假设我们试着用两种机器学习算法去解决问题,算法 A 和算法 B。有时候出现,算法 A 在一个训练集合上超过算法 B,却在另一个训练集上弱于算法 B。上面我们并没有看到这个情况~——~因为这要求两幅图有交叉的点~——~这里并没有5。对“算法 A 是不是要比算法 B 好?”正确的反应应该是“你在使用什么训练集合?”
在进行开发时或者在读研究论文时,这都是需要记住的事情。很多论文聚焦在寻找新的技巧来给出标准数据集上更好的性能。“我们的超赞的技术在标准测试集 Y 上给出了百分之 X的性能提升。”这是通常的研究声明。这样的声明通常比较有趣,不过也必须被理解为仅仅在特定的训练数据集上的应用效果。那些给出基准数据集的人们会拥有更大的研究经费支持,这样能够获得更好的训练数据。所以,很可能他们由于超赞的技术的性能提升其实在更大的数据集合上就丧失了。
换言之,人们标榜的提升可能就是历史的偶然。所以需要记住的特别是在实际应用中,我们想要的是更好的算法\emph{和}更好的训练数据。寻找更好的算法很好,不过需要确保你在此过程中,没有放弃对更多更好的数据的追求。
问题
•(研究问题) 我们的机器学习算法在⾮常⼤的数据集上如何进⾏?对任何给定的算法,其实去定义⼀个随着训练数据规模变化的渐近的性能是⼀种很⾃然的尝试。⼀种简单粗暴的⽅法就是简单地进⾏上⾯图中的趋势分析,然后将图像推进到⽆穷⼤。⽽对此想法的反驳是曲线本⾝会给出不同的渐近性能。你能够找到拟合某些特定类别曲线的理论上的验证⽅法吗?如果可以,⽐较不同的机器学习算法的渐近性能。
总结:
我们现在已经介绍完了过度拟合和规范化。当然,我们会重回这个问题。正如我已经提过了几次,过度拟合是神经网络中一个重要的问题,尤其是计算机越来越强大,我们有训练更大的网络的能力时。我们有迫切的需要来开发出强大的规范化技术来减轻过度拟合,而这也是当前研究的极其活跃的领域。
[1] ImageNet Classification with Deep Convolutional Neural Networks,作者为Alex Krizhevsky,Ilya Sutskever,和Geoffrey Hinton (2012)。
[2] Improving neural networks by preventing co-adaptation of feature detectors,作者为Geoffrey Hinton,NitishSrivastava,Alex Krizhevsky,Ilya Sutskever,和Ruslan Salakhutdinov(2012)。注意这篇论文讨论了许多细微之处,这些我在这个简要的介绍里敷衍地带过了。
[3] 这个以及下两个图形由程序more_data.py 生成
[4]这个图形由程序 more_data.py 生成(和上面几个图形⼀样)。
[5] 显著的例子参⻅Scaling to very very large corpora for natural language disambiguation,作者为Michele Banko 和Eric Brill (2001)。
本文来源于哈工大SCIR