2-Dropout 与随机正则

1. Dropout 的直观思想

1.1 过拟合的本质

过拟合发生在模型记住了训练数据的”噪声”而非学习到可泛化的模式。具体表现为:

  • 训练 loss 持续下降,验证 loss 在某个点后开始上升
  • 模型在训练集上的表现远优于验证集
  • 参数量远大于数据量时更容易发生(“大模型小数据”)

缓解过拟合的手段可分为两类:显式正则化(在损失函数中加入约束项,如 L2 正则化)和随机正则化(在模型结构或优化过程中引入随机性,使得模型在多个”随机子模型”之间共享参数,从而隐式约束模型容量)。Dropout 属于后者。

1.2 Dropout 的核心思想

Dropout 的直觉是:训练时随机”丢弃”部分神经元,使网络在每次更新时只参与一个”瘦身后的子网络”,从而防止任何单个神经元对特定特征的过度依赖。由于每次丢弃的位置不同,训练相当于同时训练了指数级数量的不同子网络

推理时使用完整网络,但每个神经元的输出需要乘以保留概率(),以保持与训练时期望输出相同的数学期望——这就是 inverted dropout 的缩放原理。


2. Dropout 的数学定义

2.1 Bernoulli 掩码

设第 层的激活值为 ,Dropout 以概率 生成一个二值掩码向量

即每个神经元以概率 保留,以概率 被丢弃。

带 Dropout 的前向传播为:

2.2 训练 vs 推理

训练时:对每个 mini-batch 独立采样掩码 ,仅对活跃神经元执行参数更新。

推理时(inverted dropout):不使用随机掩码,而是将完整网络的输出缩放

因此,为使推理时的期望与训练时相同,需要在推理时做缩放:

另一种等价的做法是训练时对激活做缩放(scale training),而推理时不做任何修改——但这会导致训练和推理的目标不一致(训练时激活值偏小,推理时偏大),inverted dropout(推理时缩放)是标准做法

2.3 为什么需要缩放

若推理时不缩放,则每个激活的期望值为原始值的 倍,网络输出的尺度与训练时不同,导致性能下降。inverted dropout 使得推理时网络结构与训练时完全相同(不改变网络结构),只是输出值做了统一的期望归一化。

这与 BatchNorm 在训练/推理时的处理思路一致——都是让推理时的期望与训练时的期望对齐。


3. 从三个角度看 Dropout 的工作原理

3.1 视角一:隐式模型集成(Bayes 视角)

训练时,每个 dropout 掩码定义了一个不同的子网络 。由于掩码是 Bernoulli 分布,总共可能的子网络数为 (对所有层),但由于 dropout 是按层独立采样的,实际的不同子网络数量是这些掩码组合的子集。

对数似然损失在 Bernoulli 掩码分布下的期望为:

直接优化这个期望等价于在所有子网络上做贝叶斯模型平均(Bayes Model Averaging, BMA)。这意味着 Dropout 实际上是在指数级子网络空间上的平均预测,而不是训练一个单一的大网络。

定性结论:Dropout 让模型”集体决策”而非”个体记忆”,从而防止对特定训练样本的过度记忆。

3.2 视角二:稀疏特征学习的防止

没有 Dropout 时,神经网络可能学习到”某个神经元专门检测某类特征”的表示。这种表示的问题在于:

  • 该神经元一旦失效(输入分布变化),整个网络功能受损
  • 特征之间的相关性被固定在少数神经元上,泛化能力差

Dropout 强制每个神经元不依赖自身的存在来完成任务——因为任何一次前向传播中它都可能被丢弃。这意味着每个神经元必须学会与随机选择的同伴神经元合作,形成更鲁棒的特征表示。

直觉:Dropout 迫使网络学习到”冗余表示”——即使部分神经元失效,剩余神经元仍能维持基本功能。

3.3 视角三:隐式 L2 正则化

对 Dropout 训练后的模型做分析,发现其效果近似于对权重施加 L2 正则化。Gal & Ghahramani (2015) 的分析指出:

对于单层线性网络 加 Dropout,负对数似然期望关于 dropout 分布为:

其中 为学习率)。这表明 Dropout 的隐式正则化效应等价于在损失函数中加入与权重矩阵谱范数相关的惩罚项。

更直观的理解:Dropout 相当于在每次更新时对权重做了轻微的”丢弃”,使得权重在训练过程中不会无限制增长,从而约束了模型的有效容量。


4. Dropout 在不同架构中的使用差异

4.1 MLP(多层感知机)

MLP 是 Dropout 的原始应用场景。在全连接层之间添加 Dropout:

MLP 中使用 Dropout 的经验规则:

  • Dropout rate :通常在 之间; 是针对大型 MLP 的经验默认值
  • 位置:通常在激活函数之后(全连接层 → 激活 → Dropout)
  • 不使用 Dropout 的位置:输入层( 不应被丢弃)、输出层(预测本身已经是一个概率分布)

4.2 CNN(卷积神经网络)

在 CNN 中使用 Dropout 的效果通常不如 MLP,原因在于:CNN 的特征是空间相关的,丢弃单个像素或单个通道会破坏这种空间结构,效果有限。

CNN 中 Dropout 的常见使用方式:

  • Spatial Dropout(用于 Dropout2d):不是沿 channel 维度丢弃,而是丢弃整个通道 。当 dropout rate 高时,这比标准 Dropout 更稳定
  • Dropout2d(Channel-wise Dropout):以概率 随机丢弃整个特征图(channel),使网络在缺少某些特征图时仍能工作
  • Dropout at 1×1 conv:在 卷积层之后使用标准 Dropout(因为 卷积本质上等价于 MLP 沿通道维度)

经验:ResNet 等现代 CNN 通常不使用 Dropout(ResNet 原始论文不使用 Dropout),而是依靠 Skip Connection 的正则化效应和 BatchNorm 的隐式正则化来控制过拟合。

4.3 RNN(循环神经网络)

RNN 对 Dropout 的使用有特殊要求,因为 RNN 的循环连接使得 Dropout 的随机性会在时间步上累积放大:

  • 标准 Dropout in RNN:在时间步之间传递的状态上做 Dropout 会导致时间步之间的信息流动变得不稳定
  • Recurrent Dropout:在隐藏状态 上使用 Dropout,但掩码在所有时间步上保持一致(variational RNN dropout)。这是为了保持循环连接的时间一致性

Variational RNN Dropout 的做法:在每个时间步 ,使用同一个二值掩码 (而非 Bernoulli 独立采样)来 dropout 隐藏状态:

这保证了循环连接的信息流在不同时间步的一致性,否则不同时间步的掩码差异会导致”记忆断裂”。

4.4 Transformer

Transformer 中有三种不同类型的 Dropout,需要明确区分:

类型作用位置说明
Attention DropoutSoftmax 之后的 attention 权重上 做 Dropout, 通常为
Hidden Dropout / FFN DropoutFFN 的两个线性层后 的输出做 Dropout
Embedding Dropout输入 Embedding 后对词向量做整体 Dropout(丢弃整个词向量), 通常为

为什么大模型训练中 Dropout 使用减少

GPT-3、LLaMA 等大语言模型在预训练阶段不使用 Dropout(或 dropout rate ),原因:

  1. 大数据集弥补正则化:预训练语料规模极大(万亿 token),过拟合风险本身就低,不需要 Dropout
  2. Dropout 的随机性会干扰语言建模学习:语言模型的 token 级预测需要连续的表示流,Dropout 的随机掩码可能干扰 token 间依赖关系的精确学习
  3. 其他正则化手段更有效:LLM 预训练中 Label Smoothing、Weight Decay、随机掩码(BERT style)已经提供了足够的正则化
  4. Inference 的一致性:大模型推理时希望能得到确定性输出,随机性干扰推理效果

但 Dropout 在微调时仍会使用:因为微调数据集通常很小(几千到几万条),此时 Dropout 的正则化效应是必要的,通常


5. Stochastic Depth 与 DropPath

5.1 Stochastic Depth 的思想

Stochastic Depth(随机深度,Huang et al., 2016)是 Dropout 在残差块维度上的推广:在训练 ResNet 时,随机跳过某些残差块,直接传递恒等映射:

Missing \end{cases}\mathbf{y} = \mathbf{x} + \begin{cases} \mathcal{F}(\mathbf{x}) & \text{with prob } 1-p_{\text{block}} \\ \mathbf{x} & \text{with prob } p_{\text{block}} end{cases}

与 Dropout 的区别在于:Dropout 丢弃的是单个神经元,Stochastic Depth 丢弃的是整个残差块。这相当于在训练时随机选择一个较浅的网络进行前向传播,而推理时使用完整深度的网络。

5.2 DropPath

DropPath 是 Stochastic Depth 在 PyTorch 中的实现名称,形式完全相同。在 timm 库中:

def drop_path(x, drop_prob: float = 0., training: bool = False):
    if drop_prob == 0. or not training:
        return x
    keep_prob = 1 - drop_prob
    shape = (x.shape[0],) + (1,) * (x.ndim - 1)
    random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device)
    random_tensor.floor_()
    output = x.div(keep_prob) * random_tensor
    return output

关键:与 Dropout 的 inverted scaling 相同,DropPath 在训练时对输出做了 的缩放,确保推理时期望一致。

5.3 Stochastic Depth 的正则化效果

Stochastic Depth 的正则化效果比 Dropout 更强,因为它丢弃的是非线性路径(残差块),而不仅仅是单个神经元。深层 ResNet 中,靠后的残差块对整体性能的贡献相对较小,随机跳过这些块可以让靠前的块学到更丰富的特征,同时防止深层网络的过拟合。

经验配置(每个残差块被跳过的概率),随着网络深度增加,Skip Connection 的优势更明显。


6. 其他随机正则化方法

6.1 Label Noise(标签噪声)

Label noise 的做法是以概率 将训练样本的标签随机替换为其他类别(通常替换为均匀分布的随机标签):

Misplaced &\tilde{y}_i = begin{cases} y_i & \text{with prob } 1-\epsilon \\ \text{uniform random label} & \text{with prob } \epsilon end{cases}

数学解释:Label noise 相当于在标签上注入 ** symmetric noise**,使得模型对噪声标签的预测不会过度自信。这在理论上等价于对损失函数引入对抗鲁棒性提升(类似 Tikhonov 正则化)。

实际应用:Label Smoothing 是 Label noise 的软版本(hard label → soft label);在标签噪声较大的场景(如网络爬取数据)中使用 label noise 可以提升泛化能力。

6.2 Data Augmentation(数据增强)

Data augmentation 通过对输入 应用随机变换(裁剪、翻转、颜色扰动)来扩大有效训练集。对比学习(如 SimCLR、CLIP)将数据增强定义为”正样本构造”,从而将无标注数据的结构信息转化为监督信号。

Data augmentation 与 Dropout 的关系:两者都是向数据或模型引入随机性来防止过拟合,但 augmentation 是输入级别的随机,Dropout 是网络级别的随机

6.3 Dropout 与 BatchNorm 的交互

Dropout 与 BatchNorm 一起使用时有一个重要的交互效应

  • Dropout 在激活上引入随机掩码,使每个 batch 的激活方差依赖于随机状态
  • BatchNorm 在该 batch 上计算均值和方差,这些统计量本身具有方差(当 batch size 小时更显著)
  • Dropout 的随机性叠加 BatchNorm 的统计量方差,使得训练过程中的激活分布更加不稳定

经验上的发现:在 BatchNorm 之后使用 Dropout 可能导致训练不稳定(尤其小 batch 时)。这是因为 BatchNorm 假设各 batch 的统计量来自相同分布,而 Dropout 打破了这种一致性。

实际建议:若有 BatchNorm,尽量将 Dropout 放在 BatchNorm 之前(即 Conv → Dropout → BN → Activation),而非之后。

6.4 Dropout 与 LayerNorm / RMSNorm 的交互

LayerNorm 和 RMSNorm 是在每个样本内部计算统计量的,与 batch 完全无关,不受 Dropout 的随机掩码影响。这意味着 Dropout 与 LayerNorm/RMSNorm 没有交互问题,可以在任意顺序下使用。

但需注意:若 Dropout rate 过高,LayerNorm 的输入方差会随 Dropout 掩码变化而变化,导致归一化后的表示方差不稳定。经验上,Dropout rate 时需谨慎使用。


7. 工程实践

7.1 训练与推理的开启/关闭

PyTorch 中的实现

model.train()  # 训练模式:Dropout 开启
model.eval()  # 推理模式:Dropout 关闭(自动不使用掩码)

Inverted Dropout 的自动处理:PyTorch 的 nn.Dropout(p) 在推理时自动将 training=False,输出不再经过 Dropout(不缩放),因为推理时期望已经是完整网络。

常见错误

  • 忘记切换到 eval 模式:推理时若仍在 train 模式,输出会因 Dropout 掩码而随机变化,导致推理结果不稳定
  • 在 train 模式下做滑动平均评估:验证集评估应在 eval 模式下进行

7.2 Dropout Rate 如何选择

场景推荐 Dropout Rate说明
大型 MLP / Deep NN经验默认值;若数据集小可降至
中等 MLP参数量中等时
CNN(若使用)(Spatial Dropout)CNN 对 Dropout 不敏感
Transformer hidden states(微调)/ (预训练)通常不启用或极低
RNN(variational dropout)注意使用 variational 版本
极小数据集(< 1K) 或更高 + 配合 early stopping正则化强度需求最大
大数据集(> 1M)数据量足够时 Dropout 作用减弱

判断方法

  • 若训练 loss 持续下降但验证 loss 停滞或上升 → 可能有轻微过拟合,加 Dropout
  • 若验证 loss 远高于训练 loss 且差距随训练扩大 → 明显过拟合,增大 Dropout rate
  • 若训练 loss 本身就下降缓慢 → Dropout 过大,导致欠拟合

7.3 如何判断是否过拟合、是否应该加 Dropout

诊断流程

  1. 记录训练和验证 loss 曲线:每天记录一次,绘制在同一个图上
  2. Gap 分析:若 gap(train loss - val loss)> 某个阈值(如 0.5 for loss < 2)且持续扩大 → 过拟合
  3. 早停 + Dropout:先启用 early stopping;若 gap 仍然大,加 Dropout
  4. 逐步调整:从 开始,逐步增加到 ,同时监控验证 loss,找到最优

Dropout 不是万能的:若过拟合的根本原因是数据不足(训练样本太少),Dropout 只能缓解而不能解决。此时应优先收集更多数据,或使用数据增强手段扩大有效训练集。


8. 常见误区

误区 1:Dropout 可以解决所有过拟合问题

错误:认为只要加了 Dropout,模型就不会过拟合。

真相:Dropout 是正则化手段之一,不是万能药。若数据量本身严重不足,或模型容量远超数据量(如 100 层网络用 1000 条样本训练),Dropout 只能延缓过拟合,无法从根本上解决。正确的做法是:增加数据、降低模型容量、使用数据增强。

误区 2:Dropout rate 越高越好

错误:认为 dropout rate 会比 更防过拟合。

真相 过高会导致每次前向传播中活跃神经元过少,网络容量被过度压缩,训练 loss 无法收敛。Dropout 本质上是在”训练一个比原始网络小得多的子网络”, 过大会让这个子网络太小,无法学习复杂函数。经验上 时通常会导致训练困难。

误区 3:推理时使用 Dropout 掩码来获取不确定性

错误:在推理时多次调用同一输入,每次使用不同的 Dropout 掩码,取平均来估计预测不确定性。

真相:这种做法在理论上可行(Monte Carlo Dropout),但效率低下。更重要的是,这种”不确定性”其实混淆了两种不确定性:模型不确定性(可通过 Bayesian 方法更好地建模)和数据不确定性。若只是想要预测结果,直接用 eval 模式(无 Dropout)更稳定。

误区 4:Transformer 中所有层都需要相同的 Dropout rate

错误:在所有 FFN 层和 Attention 层使用相同的

真相:不同层的 Dropout rate 可以不同。经验上,深层比浅层使用更低的 Dropout rate(或完全不 Dropout)是更优的配置。原因是深层的表示更抽象、更稳定,不需要 Dropout 的正则化;而浅层负责捕获基础特征,更需要正则化防止过拟合。

误区 5:BatchNorm 和 Dropout 可以任意顺序组合

错误:随意将 BatchNorm 和 Dropout 堆叠,认为两者是正交的。

真相:如前所述,在 BatchNorm 之后使用 Dropout 可能导致训练不稳定(尤其小 batch 时)。建议顺序:Conv → Dropout → BatchNorm → Activation


9. 不同任务下的使用建议

9.1 视觉分类(CNN)

场景Dropout 配置说明
标准 ResNet(ImageNet)通常不用 DropoutSkip Connection + BatchNorm 已足够
小数据集(CIFAR-10)Dropout in FC head, head 的全连接层需要正则化
目标检测(YOLO/FCOS)GroupNorm 替换 BatchNorm + batch size 小时用 GroupNorm
Small CNN(参数量小)(全连接层)若有明显过拟合

9.2 NLP / Transformer

场景Dropout 配置说明
BERT / GPT 预训练(不使用 Dropout)大数据量,正则化来自其他手段
BERT 微调(分类)hidden dropout ,attn dropout 微调数据少,需要正则化
RoBERTa 微调attention dropout ,hidden dropout RoBERTa 的配置
LLM 推理(eval 模式)确保确定性输出
LoRA / Adapter 微调不使用 Dropout(或极低 低 rank 参数量,正则化需求低

9.3 生成模型

场景Dropout 配置说明
VAE(Encoder/Decoder)(各层)隐变量的正则化
GAN(Discriminator)Discriminator 容易过拟合真实样本
StyleGAN不使用 Dropout(InstanceNorm 替代 BN)风格迁移不需要 BatchNorm

9.4 强化学习

场景Dropout 配置说明
PPO / A3C通常不用 DropoutRL 中价值函数 baseline 已经很正则化
离线 RL(Offline RL)(actor 网络)防止策略过度拟合

10. Dropout 与其他正则化手段的综合对比

方法类型随机性来源作用层次适用场景主要局限
Dropout随机掩码Bernoulli 掩码神经元MLP、Embedding小 batch + BN 时不稳定
DropPath / Stochastic Depth随机路径残差块跳跃残差块ResNet、EfficientNet仅残差架构
Label Noise标签扰动随机翻转标签标签有标注的数据集需要噪声比例调优
Label Smoothing标签软化硬标签 → 软标签标签分类任务不适用于非分类任务
Data Augmentation输入变换随机裁剪/翻转/颜色输入视觉、NLP对增强质量敏感
Weight Decay显式正则化无随机性权重通用需调
Mixup / CutMix样本混合随机插值样本视觉分类可能模糊类别边界