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)必须关掉,否则同一输入会抖。

2.2 加在增量上,不加在残差主干上
Transformer / ProteinMPNN 的典型写法是 子层输出再 Dropout,再残差相加:
[
\mathbf{h}\leftarrow \mathrm{Norm}\big(\mathbf{h}+\mathrm{Dropout}(\Delta)\big)
]
(\Delta) 来自 Attention 或 FFN(或 MPNN 的消息聚合)。主干 (\mathbf{h}) 不被随机掐断,网络才叠得深。

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_prob、attention_probs_dropout_prob(BERT 系);resid_pdrop、attn_pdrop、embd_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 | h_V = norm(h_V + dropout(dh)) # dh = 聚合消息或 FFN 增量 |
默认 dropout=0.1。图模型样本少于网页语料,0.1 仍是稳妥剂量;它不参与推理时的氨基酸采样温度。
5.4 LoRA 微调
lora_dropout=0.1(或 0.05)只作用在低秩支路。底座已冻结、适配器参数少,中等 (p) 比改底座 hidden_dropout_prob 更常见。
5.5 踩坑
- 推理忘了
eval()→ logits 抖动,像温度被偷偷打开。 - 把 (p=0.5) 直接套进 Transformer 残差 → 欠拟合。
- 把 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。