过拟合是训练神经网络中常见的问题,本文讨论了产生过拟合的原因,如何发现过拟合,以及简单的解决方法。
发现过拟合问题
在训练神经网络时,我们常常有训练集、测试集和验证集三种数据集。
有时候我们会发现,训练出来的神经网络在训练集上表现很好(准确率很高),但在测试集上的准确率比较差。这种现象一般被认为是过拟合,也就是过度学习了训练集上的特征,导致泛化能力较差。
hold out 方法
那么如何发现是否存在过拟合方法呢?一种简单的思路就是把训练集分为训练集和验证集,其中训练集用来训练数据,验证集用来检测准确率。
我们在每个迭代期的最后都计算在验证集上的分类准确率,一旦分类准确率已经饱和,就停止训练。这个策略被称为提前停止。
示例
以MNIST数据集为例,这里使用1000个样本作为训练集,迭代周期为400,使用交叉熵代价函数,随机梯度下降,我们可以画出其损失值与准确率。
训练集上的损失值和准确率:
验证集上的损失值和准确率:
对比测试集与验证集的准确率:
可以发现:训练集上的损失值越来越小,正确率已经达到了100%,而验证集上的损失会突然增大,正确率没有提升。这就产生了过拟合问题。
增大训练量
一个最直观,也是最有效的方式就是增大训练量。有了足够的训练数据,就算是一个规模很大的网络也不太容易过拟合。
例如,如果我们将MNIST的训练数据增大到50000(扩大了50倍),则可以发现训练集和测试集的正确率差距不大,且一直在增加(这里只迭代了30次):
但很不幸,一般来说,训练数据时有限的,这种方法不太实际。
人为扩展训练数据
当我们缺乏训练数据时,可以使用一种巧妙的方式人为构造数据。
例如,对于MNIST手写数字数据集,我们可以将每幅图像左右旋转15°。这应该还是被识别成同样的数字,但对于我们的神经网络来说(像素级),这就是完全不同的输入。
因此,将这些样本加入到训练数据中很可能帮助我们的网络学习更多如何分类数字。
这个想法很强大并且已经被广泛应用了,更多讨论可以查看这篇论文。
再举个例子,当我们训练神经网络进行语音识别时,我们可以对这些语音随机加上一些噪音–加速或减速。
规范化(regularization)
除了增大训练样本,另一种能减轻过拟合的方法是降低网络的规模。但往往大规模的神经网络有更强的潜力,因此我们想使用另外的技术。
规范化是神经网络中常用的方法,虽然没有足够的理论,但规范化的神经网络往往能够比非规范化的泛化能力更强。
一般来说,我们只需要对 w w 进行规范化,而几乎不对 进行规范化。
L2规范化
学习规则
最常用的规范化手段,也称为权重衰减(weight decay)。
L2规范化的想法是增加一个额外的项到代价函数上,这个项被称为规范化项。例如,对于规范化的交叉熵:
对于其他形式的代价函数,都可以写成: