防止过拟合的方法
1,损失函数加上w的L2 范数。
损失函数加上w的L2 范数。相应的,梯度也会变大,假如说用梯度下降算法的话,w会减少的多一些。来 惩罚数值过大的w。
grads['W' + str(idx)] = self.layers['Affine' + str(idx)].dW + self.weight_decay_lambda * self.layers['Affine' + str(idx)].W
2, Dropout
随机删除一部分神经元,
如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情 况下,我们经常会使用
Dropout
方法。
训练时,每传递一次数据,就会随机选择要删除的神经元。
然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出, 要乘上训练时的删除比例后再输出。
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
return x * self.mask
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask
补充一下:
机器学习中经常使用集成学习。
所谓集成学习,就是让多个模型单独进行学习,
推理时再取多个模型的输出的平均值。用神经网络的语境来说,
比如,准备 5个结构相同(或者类似)的网络,分别进行学习,
测试时,以这 5个网络的输出的平均值作为答案。
实验告诉我们,通过进行集成学习,神经网络的识别精度可以提高好几个百分点。
这个集成学习与 Dropout有密切的关系。
这是因为可以将 Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。
并且,推理时,通过对神经元的输出乘以删除比例(比如,0.5等),可以取得模型的平均值。也就是说,可以理解成,Dropout将集成学习的效果(模拟地)通过一个网络实现了。
Dropout为什么要乘以删除神经元的比例
为了保证神经元输出激活值的期望值与不使用dropout时一致,我们结合概率论的知识来具体看一下:假设一个神经元的输出激活值为a,在不使用dropout的情况下,其输出期望值为a,如果使用了dropout,神经元就可能有保留和关闭两种状态,把它看作一个离散型随机变量,它就符合概率论中的0-1分布,其输出激活值的期望变为 p*a+(1-p)*0=pa,此时若要保持期望和不使用dropout时一致,就要除以 p。
————————————————
版权声明:本文为CSDN博主「飘啊飘啊飘啊飘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qbyqby7628/article/details/103449196)
————————————————
版权声明:本文为CSDN博主「飘啊飘啊飘啊飘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qbyqby7628/article/details/103449196)