目录
机器学习的问题中, 过拟合是一个很常见的问题。过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。机
器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模型可以进行正确的识别。我们可以制作复杂的、表现力强的模型,但是相应地,抑制过拟合的技巧也很重要。
1 过拟合
发生过拟合的原因,主要有以下两个。
• 模型拥有大量参数、表现力强。
• 训练数据少
这里,我们故意满足这两个条件,制造过拟合现象。为此,要从MNIST数据集原本的60000个训练数据中只选定300个,并且,为了增加网络的复杂度,使用7层网络(每层有100个神经元,激活函数为ReLU)。(代码就不上传了,不便操作)
首先是用于读入数据的代码
接着是进行训练的代码。按epoch分别算出所有训练数据和所有测试数据的识别精度。
train_acc_list和test_acc_list中以epoch为单位(看完了所有训练数据的单位)保存识别精度。现在,我们将这些列表(train_acc_list、 test_acc_list)绘成图,结果如下图
训练数据(train)和测试数据(test)的识别精度的变化
过了 100 个 epoch 左右后,用训练数据测量到的识别精度几乎都为100%。但是,对于测试数据,离100%的识别精度还有较大的差距。如此大的识别精度差距,是只拟合了训练数据的结果。从图中可知,模型对训练时没有使用的一般数据(测试数据)拟合得不是很好。
2 L2范数的权值衰减
权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。
神经网络的学习目的是减小损失函数的值。这时,例如为损失函数加上权重的平方范数(L2范数)。这样一来,就可以抑制权重变大。用符号表示的话,如果将权重记为W,L2范数的权值衰减就是,然后将这个加到损失函数上。这里,λ是控制正则化强度的超参数。 λ设置得越大,对大的权重施加的惩罚就越重。此外,开头的1/2是用于将的求导结果变成的调整常量。
现在我们来进行实验。对于刚刚进行的实验,应用λ = 0.1的权值衰减,结果如下图
使用了权值衰减的训练数据(train)和测试数据(test)的识别精度的变化
虽然训练数据的识别精度和测试数据的识别精度之间有差距,但是与没有使用权值衰减的结果相比,差距变小了。这说明过拟合受到了抑制。此外,还要注意,训练数据的识别精度没有达到100%(1.0)。
3 Dropout
作为抑制过拟合的方法,前面我们介绍了为损失函数加上权重的L2范数的权值衰减方法。该方法可以简单地实现,在某种程度上能够抑制过拟合。
但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用Dropout方法。
Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递,
如下图所示。训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。
左边是一般的神经网络,右边是应用了Dropout的网络。 Dropout通过随机选择并删除神经元,停止向前传递信号
下面我们来实现Dropout。这里的实现重视易理解性。不过,因为训练时如果进行恰当的计算的话,正向传播时单纯地传递数据就可以了(不用乘
以删除比例),所以深度学习的框架中进行了这样的实现。
这里的要点是,每次正向传播时, self.mask中都会以 False的形式保存要删除的神经元。 self.mask会随机生成和 x形状相同的数组,并将值比
dropout_ratio大的元素设为True。反向传播时的行为和ReLU相同。也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;正向传播时没有传递信号的神经元,反向传播时信号将停在那里。Dropout的实验和前面的实验一样,使用7层网络(每层有100个神经元,激活函数为ReLU),一个使用Dropout,另一个不使用Dropout,实验的结果如下图所示
左边没有使用Dropout,右边使用了Dropout(dropout_rate=0.15)
通过使用Dropout,训练数据和测试数据的识别精度的差距变小了。并且,训练数据也没有到达100%的识别精度。像这样,通过使用Dropout,即便是表现力强的网络,也可以抑制过拟合。