Dropout/zh

    From Marovi AI
    This page is a translated version of the page Dropout and the translation is 100% complete.
    Other languages:
    Article
    Topic area Deep Learning
    Difficulty Intermediate
    Prerequisites Neural Networks, Overfitting and Regularization

    Dropout(随机失活)是一种用于神经网络的正则化技术,在每个训练步骤中随机将一部分神经元的激活值置为零。Srivastava 等人(2014)提出了该方法,dropout 是深度学习中防止过拟合最广泛使用的方法之一。

    动机:协同适应

    在大型神经网络中,神经元可能会形成复杂的协同适应模式——只有在特定其他神经元存在时才能正常工作的神经元组。这种紧密耦合使网络变得脆弱且容易过拟合,因为学到的特征依赖于训练数据的特定特性,而不是捕获稳健的、通用的模式。

    Dropout 通过迫使每个神经元学习与许多不同随机子集的其他神经元协同工作时仍然有用的特征,从而打破这些协同适应。

    Dropout 算法

    训练阶段

    在每个训练步骤中,dropout 层中的每个神经元独立地以概率 $ p $保留概率)被保留,或以概率 $ 1 - p $ 被置为零。形式上,对于具有激活向量 $ \mathbf{h} $ 的层:

    $ r_j \sim \mathrm{Bernoulli}(p) $
    $ \tilde{h}_j = r_j \cdot h_j $

    其中 $ r_j $ 是为每个神经元 $ j $ 独立抽取的二值掩码。对于隐藏层,典型的保留概率为 $ p = 0.5 $;对于输入层,则为 $ p = 0.8 $ 或更高。

    每个训练步骤实际上是在训练一个从完整架构中采样得到的不同的“稀疏化”子网络。对于 $ n $ 个神经元,存在 $ 2^n $ 个可能的子网络,从而形成一个隐式的集成。

    推理阶段:反向 dropout

    在推理时,所有神经元都处于激活状态,因此每个神经元的期望输出相对于训练时会按因子 $ p $ 缩放。有两种方法可以解决这一问题:

    • 标准 dropout:在测试时将所有权重乘以 $ p $
    • 反向 dropout(更常用):在训练期间,将保留的激活值除以 $ p $
    $ \tilde{h}_j = \frac{r_j \cdot h_j}{p} $

    反向 dropout 确保在训练期间 $ \tilde{h}_j $ 的期望值等于 $ h_j $,因此推理时无需任何调整。这是 PyTorch 和 TensorFlow 等框架中的默认实现。

    理论解释

    集成视角

    Dropout 可以视为在训练一个具有大量权重共享的、规模指数级庞大的子网络集成。在测试时,使用带缩放权重的完整网络可以近似所有 $ 2^n $ 个子网络预测的几何平均。这种集成平均降低了方差并改善了泛化能力。

    贝叶斯解释

    Gal 和 Ghahramani(2016)证明,在每个权重层之前应用 dropout 的神经网络在数学上等价于深度高斯过程的近似。在测试时执行 dropout(蒙特卡洛 dropout)会产生一个预测分布,从而提供模型不确定性的实用估计。

    Dropout 的变体

    变体 描述 典型应用
    标准 dropout 丢弃单个神经元 全连接层
    空间 dropout 丢弃整个特征图(通道) 卷积网络
    DropConnect 丢弃单个权重而非神经元 密集层
    变分 dropout 学习每个神经元/权重的 dropout 率 贝叶斯深度学习
    DropBlock 丢弃特征图的连续区域 卷积网络
    Alpha dropout 保持自归一化特性(用于 SELU 激活) 自归一化网络

    空间 dropout(Tompson 等,2015)对于卷积网络尤为重要。在卷积特征图上应用标准 dropout 效果不佳,因为相邻的激活值高度相关;丢弃单个像素仍会留下冗余的空间信息。空间 dropout 则丢弃整个通道,迫使网络使用多样化的特征表示。

    实用指南

    • 放置位置:在全连接层中,应在激活函数之后应用 dropout。在 Transformer 中,dropout 应用于注意力权重以及前馈子层之后。
    • 比率选择:隐藏层从 $ p = 0.5 $ 开始。对参数较少的层使用更高的保留率(较低的 dropout)。对于更大的模型或较小的数据集,增加 dropout。
    • 与 BatchNorm 的交互:同时使用 dropout 和 Batch Normalization 需要谨慎,因为 dropout 引入的方差可能会破坏批统计量的稳定性。常见做法是仅在最后一个批归一化层之后应用 dropout。
    • 调度 dropout:某些训练方案在训练过程中从不使用 dropout 开始并逐渐提高比率,或反之亦然。

    对训练的影响

    Dropout 通常会增加训练损失并减慢收敛速度,因为每一步的有效模型容量都降低了。然而,它会缩小训练性能与验证性能之间的差距,从而带来更好的泛化能力。如果训练损失已经很高(欠拟合),则应减少或移除 dropout。

    参见

    参考文献

    • Srivastava, N. et al. (2014). "Dropout: A Simple Way to Prevent Neural Networks from Overfitting". Journal of Machine Learning Research 15(56):1929–1958.
    • Gal, Y. and Ghahramani, Z. (2016). "Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning". ICML.
    • Tompson, J. et al. (2015). "Efficient Object Localization Using Convolutional Networks". CVPR.
    • Wan, L. et al. (2013). "Regularization of Neural Networks using DropConnect". ICML.
    • Ghiasi, G., Lin, T.-Y. and Le, Q. V. (2018). "DropBlock: A regularization method for convolutional networks". NeurIPS.