过拟合 是指只能拟合训练数据,但不能很好的拟合不包括训练数据在内的数据。用正则化来抑制过拟合,正则化有两种方法:权值衰减和Dropout。
(1)发生过拟合的原因:
——权重参数取值过大
——模型拥有大量的参数,表现力强
——训练数据少
(2)权值衰减
将上式加入到损失函数中,λ是控制正则化强度的超参数,λ越大对大的权重施加的惩罚就越重。
(3)Dropout
当网络模型变得复杂,用权值衰减就很难对付,这时可以使用Dropout方法。Dropout方法是一种在学习过程中随机删除神经元的方法,训练时每传递一次数据就会随机选择要删除的神经元,然后测试时会传递所有的神经元信号,但是对于各神经元的输出,要乘上训练时的删除比例后再输出。
class Dropout:
"""
http://arxiv.org/abs/1207.0580
"""
def __init__(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = None
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
# np.random.rand(*x.shape)随机生成和x一样的数组,数值在0-1之间;
# 把数组的每一个值与self.dropout_ratio相比,大于的地方为True,小于的地方为False
return x * self.mask
# 保留了数组x,Ture位置上的数没变,False位置上的数变为0
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask