dropout

原理和作用

在训练阶段对于加入dropout层的每个神经元以概率p断开,预测阶段神经元都保持连接但要给dropout层输出乘以1-pDropout相当于给神经网络加入了噪声,使其不能过度依赖某些特征可以减少模型的过拟合。加入dropout后原来的神经网络可以看成多个子网络的bagging模型。

 

python代码实现

class Dropout:
    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
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)
        
    def backward(self, dout):
        return dout * self.mask

 

dropout应该加在激活函数前还是激活函数后?

加在激活函数之前

当把 Dropout 层放置在激活函数之前时,会在神经元的加权和(即线性变换的输出)上随机丢弃一些神经元。

优点

  • 正则化输入:Dropout 会随机屏蔽部分输入信号,这有助于减少神经元之间的共适应性,从而增强模型的泛化能力。在激活函数之前应用 Dropout,能让模型在不同的输入组合下学习到更鲁棒的特征表示。
  • 符合生物学原理:从生物学角度来看,神经元在接收到信号后,会先进行整合,然后才决定是否激活。Dropout 在激活函数前应用,模拟了神经元在整合信号阶段的随机丢弃机制。

缺点

  • 激活函数的非线性特性受限:由于 Dropout 会随机丢弃一些神经元的输出,激活函数接收到的输入会变得稀疏,这可能会限制激活函数的非线性表达能力。

加在激活函数之后

将 Dropout 层放在激活函数之后,意味着在神经元激活后随机丢弃一些神经元的输出。

优点

  • 保留激活函数的非线性特性:激活函数可以充分发挥其非线性变换的作用,将输入信号映射到一个更复杂的特征空间。Dropout 在这个非线性变换之后应用,能在保留特征多样性的同时进行正则化。
  • 减少梯度消失问题:在某些情况下,激活函数后的输出可能具有更稳定的分布,Dropout 可以帮助减少梯度在反向传播过程中的消失问题。

缺点

  • 可能导致过拟合风险增加:如果激活函数的输出值较大,Dropout 可能无法有效地对模型进行正则化,从而增加过拟合的风险。

选择建议

  • 一般情况:在大多数深度学习任务中,将 Dropout 层放在激活函数之后是比较常见的做法,因为这样可以更好地保留激活函数的非线性特性,同时也能在一定程度上实现正则化。
  • 特殊情况:如果模型出现过拟合,且激活函数的输出值较大,可以尝试将 Dropout 层放在激活函数之前,以增强正则化效果。此外,对于一些对输入信号的稀疏性较为敏感的模型,在激活函数之前应用 Dropout 可能会取得更好的效果。
posted @ 2019-06-24 21:34  AI_Engineer  阅读(484)  评论(0)    收藏  举报