Type: concept
Confidence: 0.95
Created: 2026-04-18
Updated: 2026-04-25
Tags: 机器学习深度学习正则化

Dropout(随机失活)

概述 (50-200字符)

Dropout 是一种神经网络正则化技术,训练时以概率 p 随机将神经元输出置零,迫使每个神经元学习更鲁棒、独立的特征表示,有效防止过拟合(Overfitting),由Geoffrey E. Hinton团队于 2014 年正式提出。

关键内容 (≥300字符, 用双链)

  1. 核心机制与数学形式化:训练时每个神经元以概率 p(通常 0.5)被随机置零,即 ỹ^(l) = r^(l) ⊙ y^(l),其中 r_j^(l) ~ Bernoulli(1-p)。测试时所有神经元开启,权重乘以保留概率 (1-p) 以保证期望值不变。现代实现采用 Inverted Dropout:训练时直接除以 (1-p),测试时无需任何调整,只需切换 model.eval() 即可。
  2. 数学公式
  3. 训练时ỹ^(l) = r^(l) ⊙ y^(l),其中 r_j^(l) ~ Bernoulli(1-p)
  4. 测试时w_test = w_train × (1 - p) (或现代版本:训练时 x = x * mask / (1 - p),测试时无缩放)
  5. 集成学习视角Dropout 等价于同时训练指数级数量(2^N)的子网络并做集成。每次前向传播随机生成一个"薄"子网络,所有子网络共享参数但只有参与的子集被更新。测试时的权重缩放近似于对所有子网络取几何平均,这是 Dropout 强大泛化能力的理论基础。
  6. 代码实现
import torch
import torch.nn as nn

class MyDropout(nn.Module):
    def __init__(self, p=0.5):
        """
        p: 丢弃概率(被置零的概率)
        注意:论文中 p 有时指"保留概率",不同库定义不同!
        PyTorch 的 nn.Dropout(p) 中 p 是丢弃概率
        """
        super().__init__()
        assert 0 <= p < 1
        self.p = p

    def forward(self, x):
        if not self.training:          # 推理模式:直接返回
            return x

        if self.p == 0:
            return x

        # 生成 Bernoulli 掩码(保留概率 = 1-p)
        keep_prob = 1 - self.p
        mask = torch.bernoulli(torch.full_like(x, keep_prob))

        # Inverted Dropout:训练时缩放
        return x * mask / keep_prob
  1. 减少共适应(Co-adaptation):没有 Dropout 时,神经元会相互依赖来修正错误("共谋"),导致单个神经元无法独立工作。Dropout 强制每个神经元学习更鲁棒、更独立的特征——"你不能依赖你的邻居,因为它随时可能消失"。Geoffrey E. Hinton用有性生殖作类比:基因随机混合比完全复制更能防止"寄生基因"传播。
  2. 变体与应用场景Spatial Dropout 随机置零整个特征图通道(适用于 CNN);DropConnect 随机置零权重而非神经元;MC Dropout(蒙特卡洛 Dropout) 测试时保持 Dropout 开启以估计预测不确定性(Gal & Ghahramani 2016 证明等价于贝叶斯近似推断);DropPath(Stochastic Depth) 随机跳过整个残差块(ResNet、ViT);Attention Dropout 对注意力权重做 DropoutTransformer)。尽管Batch Normalization在卷积网络中承担了部分正则化作用,Dropout 在全连接层、Transformer强化学习贝叶斯估计和小数据集场景中仍不可替代。
  3. 最佳实践:丢弃率推荐 - 全连接层 0.5,卷积层 0.1-0.3,输出层不用。常见误区包括忘记切换 model.eval()、对小数据集用过大丢弃率、在批归一化后加 Dropout 等。

来源

相关