深度之眼Pytorch框架训练营第四期——正则化之 Dropout

正则化之 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.5
  • inplace
    如下图所示,红色为不失活的情况,出现了过拟合,而蓝色虚线是drop_out=0.5的情况,有效地减小了过拟合的现象

在这里插入图片描述

如下图所示,作图为没有 dropout 时的权值分布,右图为 dropout=0.5 时的权值分布,可以看出使用dropout 后,权值分布更集中,范围更小,相当于起到了一个 weight decay 的效果。

在这里插入图片描述

3、PytorchDropout 的实现细节

Pytorch中实现Dropout时,在训练时将权重均乘以 1 − p 1-p 1p,即除以 1 − p 1-p 1p,这样在测试时美酒不需要进行尺度的缩放,本质上与前面讲到的在测试时进行缩放是一样的道理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值