Dropout:训练时随机失活,抑制过拟合

Dropout(随机失活) 是训练时以比率 (p) 随机把激活置零、推理时关掉随机的正则手段。它不是可学习的「更新权重」,也不是推理温度。Srivastava et al.(2014)提出时,目的是打破神经元共适应(co-adaptation),使网络不能依赖某一条固定通路。

段末注释:共适应指若干单元总是一起激活、单独拿出来就不工作;Dropout 强迫表示分散到多条路径。后文 (p) 表示被置零的概率。

系列导读5050.大模型-算法要点-0
插图5050.大模型-算法要点/algo-fig01~02*.png


1. 作用

层面 Dropout 在干什么
正则 减小对训练集捷径的依赖,缓解过拟合
隐式集成 每个 batch 看到一张随机子网,近似「许多瘦网络投票」
残差上的剂量 加在子层输出 (\Delta) 上,削弱本层更新、保留残差主干

替代 weight decay,也替代数据增强。数据极大、每个样本几乎只见一次时(现代 LLM 预训练),过拟合压力下降,许多模型把 (p) 收到 0


2. 功能 / 机制

2.1 训练开、推理关

社区默认实现是 PyTorch nn.Dropout反向 Dropout(inverted dropout):训练时置零后还要除以 (1-p),使期望与推理一致。

[
\tilde{\mathbf{x}} =
\begin{cases}
\dfrac{\mathbf{m}\odot\mathbf{x}}{1-p}, & \text{train},; m_i\sim\mathrm{Bernoulli}(1-p)\[0.6em]
\mathbf{x}, & \text{eval / 推理}
\end{cases}
]

model.train() 才丢单元;model.eval()(或 training=False)必须关掉,否则同一输入会抖。

图 1 训练:约 \(p\) 的单元休眠;推理:全员在岗

2.2 加在增量上,不加在残差主干上

Transformer / ProteinMPNN 的典型写法是 子层输出再 Dropout,再残差相加

[
\mathbf{h}\leftarrow \mathrm{Norm}\big(\mathbf{h}+\mathrm{Dropout}(\Delta)\big)
]

(\Delta) 来自 Attention 或 FFN(或 MPNN 的消息聚合)。主干 (\mathbf{h}) 不被随机掐断,网络才叠得深。

图 2 Dropout 只打在 \(\Delta\) 上,skip 仍完整

2.3 和「更新权重」的区别

Dropout 的 (p) MLP / Attention 的 (W)
谁设 超参,写死或扫 反向传播学习
训练 随机掩码,每次不同 按梯度更新
推理 默认关闭 照常使用

3. 默认经验值

经验随数据重复次数模型位置变,没有全局最优。下表是可复述的社区默认,不是调参保证。

场景 常见 (p) 备注
早期 MLP 隐层(2014 论文) 0.5 输入层约 0.2;对现代残差网过大
原版 Transformer / BERT / GPT-2 / T5 0.1 Attention、残差、embedding 常同一档
大模型预训练(LLaMA 等) 0 数据近单遍,Dropout 易欠拟合
小数据微调、图模型、ProteinMPNN 0.1 过拟合更明显
LoRA / PEFT 0.05–0.1 只打在低秩适配器上
残差 / 注意力上试探上限 (\le 0.3) 再大常直接伤验证集

加大 (p):验证远好于训练、数据少、宽度大。
减小或置 0:预训练 loss 降不动、生成变钝、数据已远超「多 epoch 重复」。

HuggingFace 常见字段:hidden_dropout_probattention_probs_dropout_prob(BERT 系);resid_pdropattn_pdropembd_pdrop(GPT-2 系)。PEFT:lora_dropout


4. 整体应用

4.1 架构里插在哪

位置 名字 作用对象
Attention 权重 attention dropout softmax 后的 (A_{ij})
子层输出 residual / hidden dropout (\Delta_{\mathrm{attn}})、(\Delta_{\mathrm{ffn}})
词嵌入 embedding dropout token 向量
深度残差(视觉更多) DropPath / Stochastic Depth 整条残差支路

设计时先问:这是元素级噪声还是整层跳过。后者是 DropPath,不是 nn.Dropout

4.2 训练脚本

  • 模块写进网络后,只要 model.train() 就会生效。
  • 与 weight decay、label smoothing 可叠加,调 (p) 时先看验证过拟合再动。
  • 混合精度下 Dropout 仍按 mask 乘,一般不必改 (p)。

4.3 推理与少见例外

  • 默认:服务、评测、确定性解码一律 eval(),(p) 不参与。
  • MC Dropout:故意保持 train 模式多次前向,用输出方差估不确定度。这是主动要随机,不是漏关 eval。大模型在线服务几乎不用。

5. 使用案例

5.1 BERT / GPT-2:经典 (p=0.1)

BERT 预训练与微调都写 dropout 0.1(全层)。GPT-2 配置默认 resid_pdrop = attn_pdrop = embd_pdrop = 0.1。适合「中等语料、会多 epoch 扫」的 Encoder / 早期 Decoder。

5.2 LLaMA 系预训练:关掉

LLaMA 论文不报 Dropout;后续单 epoch 预训练实验(如 Drop Dropout on Single-Epoch LM Pretraining)也支持 (p=0) 更强。数据几乎不重复时,随机掐通路主要在制造噪声,不是正则。

5.3 ProteinMPNN:残差增量上 (p=0.1)

官方 EncLayer / DecLayer

1
2
h_V = norm(h_V + dropout(dh))   # dh = 聚合消息或 FFN 增量
h_E = norm(h_E + dropout(dE)) # 仅 Encoder 边更新

默认 dropout=0.1。图模型样本少于网页语料,0.1 仍是稳妥剂量;它参与推理时的氨基酸采样温度。

5.4 LoRA 微调

lora_dropout=0.1(或 0.05)只作用在低秩支路。底座已冻结、适配器参数少,中等 (p) 比改底座 hidden_dropout_prob 更常见。

5.5 踩坑

  1. 推理忘了 eval() → logits 抖动,像温度被偷偷打开。
  2. 把 (p=0.5) 直接套进 Transformer 残差 → 欠拟合。
  3. 把 Dropout 当成「指定更新权重」——权重是 (W);(p) 只决定本次哪些激活被看见。

6. 易混对照

名称 差在哪
Weight decay 惩罚 (|W|^2),确定性;Dropout 惩罚的是激活通路
DropPath 随机丢掉整条残差支,不是逐元素
Label smoothing 改监督分布,不改前向掩码
Temperature 推理时拉平/锐化 softmax,全程确定性(给定种子)

参考

  • Srivastava et al., Dropout: A Simple Way to Prevent Neural Networks from Overfitting, JMLR 2014.
  • Vaswani et al., Attention Is All You Need(残差 Dropout (P_{\mathrm{drop}}=0.1)).
  • Devlin et al., BERT;Radford et al., GPT-2;Touvron et al., LLaMA.
  • 实现:PyTorch torch.nn.Dropout;HuggingFace *pdrop / *_dropout_prob
  • 结构对照:ProteinMPNN EncLayer 残差 Dropout。
-------------本文结束感谢您的阅读-------------