正则化之 Dropout
1、Dropout概念
开篇明义,dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络
如图所示,所谓的dropout,就是把某些神经元丢弃,相当于权值为0,然后进行模型的训练。
这里需要注意的是:在测试集测试时,所有权重需要乘以 1-drop_prob ,这是因为,我们需要保证训练集和测试集的数据尺度相同,举个例子,如果全连接层的前一层共有100个神经元,则对这一层的某个神经元,相当于有100个权值
w
i
w_i
wi乘上100个
x
i
x_i
xi,如果我们假设每一个
w
i
x
i
w_ix_i
wixi的尺度为1,则利用dropout后,有30%的神经元失活,则这个神经元的尺度就从100降到了70,这是在训练的时候使用dropout的情况,但是在测试集是,并没有神经元失活,即所有的神经元都是激活的状态,这个时候,我们需要对每个权值都乘上 1-drop_prob ,也就是70%,使得测试模型时的训练尺度也为70。
2、Pytorch
中的Dropout
Pytorch
中实现 dropout 操作是采用 nn.Dropout
这个层进行实现,nn.Dropout
继承了_DropoutNd
,而_DropoutNd
又继承了Module
类
class Dropout(_DropoutNd):
def forward(self, input):
return F.dropout(input, self.p, self.training, self.inplace)
# >>>>>> _DropoutNd <<<<<< #
class _DropoutNd(Module):
__constants__ = ['p', 'inplace']
def __init__(self, p=0.5, inplace=False):
super(_DropoutNd, self).__init__()
if p < 0 or p > 1:
raise ValueError("dropout probability has to be between 0 and 1, "
"but got {}".format(p))
self.p = p
self.inplace = inplace
def extra_repr(self):
return 'p={}, inplace={}'.format(self.p, self.inplace)
可以看出,一共有两个参数:
p
:失活概率,默认为0.5inplace
如下图所示,红色为不失活的情况,出现了过拟合,而蓝色虚线是drop_out=0.5的情况,有效地减小了过拟合的现象
如下图所示,作图为没有 dropout 时的权值分布,右图为 dropout=0.5 时的权值分布,可以看出使用dropout 后,权值分布更集中,范围更小,相当于起到了一个 weight decay 的效果。
3、Pytorch
中 Dropout
的实现细节
Pytorch
中实现Dropout
时,在训练时将权重均乘以
1
−
p
1-p
1−p,即除以
1
−
p
1-p
1−p,这样在测试时美酒不需要进行尺度的缩放,本质上与前面讲到的在测试时进行缩放是一样的道理。