这是我参与11月更文挑战的第9天
神经网络的拟合能力依赖大量的参数调节(最先进的深度神经⽹络包含百万级或者⼗亿级的参数),因此可能产生过度拟合问题。为了改进神经网络,需要⼀种检测过度拟合的技术,缓解过度训练。
提前中止训练
通过跟踪测试数据集合上的准确率随训练变化,可以发现一个简单缓解过拟合的方法就是:当发现测试数据上的准确率不再明显提升时,就停止训练。
观察 MNIST 数据集可以发现其中有三个数据集:training_data、test_data和validation_Data。而在之前的学习中只用过training_data和test_data,实际上validation_Data的作用就是用来缓解过拟合。
为什么用validation_Data而不是test_data?
想一下训练的过程实际上就是学习超参数的过程,如果用test_data来缓解过拟合training_data可能导致,最后学习出来的超参数对test_data过拟合了,因此使用一个第三方数据集validation_Data是一种更好的选择,这种⽅法有时候被称为 hold out ⽅法,即validation_Data是从数据集中被“拿出”的一部分。
增加训练样本量
最好的降低过度拟合的⽅式之⼀其实就是增加训练样本的量。有了⾜够的训练数据,就算是⼀个规模⾮常⼤的⽹络也不⼤容易过度拟合,但是这种方法的实现难度在于现实中存在这种大量标记数据的可能性很低,人工标记数据的成本也很可怕。
数据规范化
规范化方法也是一种能有效缓解训练过拟合的方法,⼀种最为常⽤的规范化⼿段 ——权重衰减(weight decay)或者 L2 规范化。
L2规范化的核心思想在于添加一个额外的项在代价函数上,称为规范化项,一个添加了规范化项的交叉熵代价函数如下所示:
显然 是添加的规范化项,其中 称为规范化参数, 表示训练集大小。
代价函数添加规范化项的一般形式可以写作( 表示原始的代价函数):
注意到规范化项中并没有偏置,也就是说它不会影响偏置的变化,对 求两个参数的偏导:
根据梯度下降的规则,得到两个参数的调整公式:
显然 的调整没有变化
必然是一个正数,也就是说通过 令 的变化变小了,而 变小的程度由 的大小决定。(这也是称为权重衰减的原因),从公式中也可以看出 变大时会影响正则化项的调整,因此在训练数据集规模较大时应适当增大 的值。
为什么规范化能够帮助减轻过度拟合
从一个简单例子中解释原理,对于如下图所示的数据集:
构建一个模型来拟合数据,显然这么简单的数据不需要神经网络这么强大的武器,选择用一个多项式来拟合。图中有10个点,完全拟合得到一个9阶多项式: ,该多项式的图像如下所示:
但是使用一个简单线性模型 同样可以得到不错的效果,如下所示:
现在需要思考的是:哪个模型才是我们想要的拟合模型?
用这两个模型来预测某个新样本,预测结果显然会有很大的差距,这里也需要引入一种直觉性的解释,奥卡姆剃刀原理,简单理解就是:对同一个问题,如果有多种理论可以同时解释,选择相信假设较少较弱的,直到有不能解释的现象或者问题出现。
但显然这个理论并不是一直有效的,确定两种解释中哪个更加简单其实是⼀件相当微妙的⼯作,对模型真正的测试不是简单性,⽽是它在新场景中对新的活动中的预测能⼒。
总而言之,规范化的神经⽹络常常能够⽐⾮规范化的泛化能⼒更强,这只是⼀种实验事实(empirical fact)。
其他规范化技术
L1规范化
公式:
为了观察L1规范化的作用,对 求偏导得到:
函数根据 的正负值返回对应数值, 、 、 。
的更新方程为:
可以发现 的值为一个常数,也就是说L1规范化通过让 减去一个常数来缩小 的变化值,而在L2规范化中则通过让 乘以 来等比例缩小 的值,二者的区别在于当 的值很大时L2规范化的作用会更明显, 的值很小时L1规范化的作用会更明显。最终的结果就是:L1规范化倾向于聚集⽹络的权重在相对少量的⾼重要度连接上,相对的其他权重会变得更小。(特殊情况就是 时不会进行权重缩小)
Dropout
和 L1、L2 规范化不同,Dropout技术不修改代价函数,其原理就是在每次迭代是前向传播中以一定的概率(如p=0.5)让将一部分神经元隐藏(代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0),这样可以使模型泛化性更强。
Dropout的原理相当于对于不同的数据集用不同结构的网络训练,然后取他们的平均值,不同的网络可能产生不同的过拟合而Dropout方法中可以通过拟合的相互抵消了减低过拟合的影响,此外这种方法中权值的更新不再依赖于有固定关系的隐含节点的共同作用,迫使网络去学习更加有适用性的特征。