Dropout

Dropout是一种简单但有效的正则化技术,通过在训练时随机"丢弃"神经元来防止过拟合。它已成为深度学习中的标准组件。

学习难度:入门·阅读时间:约8分钟

什么是Dropout

问题背景

深度神经网络容易过拟合:

  • 参数量大,模型容量高
  • 神经元之间形成复杂的共适应
  • 对训练数据"记忆"而非学习

Dropout的基本思想

训练时随机"关闭"一部分神经元:

  • 每次前向传播随机丢弃一些神经元
  • 强制网络学习更加鲁棒的特征
  • 相当于训练了多个子网络的集成

历史

2014年,Srivastava等人提出了Dropout,迅速成为深度学习的标准技术。

工作原理

训练阶段

对每一层,以概率p随机将神经元输出设为0:

y = x × mask, mask ~ Bernoulli(1-p)

推理阶段

使用全部神经元,但输出乘以(1-p):

  • 保持期望输出一致
  • 相当于多个子网络的平均

示例

假设Dropout率p=0.5:

  • 训练时:每个神经元有50%概率被丢弃
  • 推理时:所有神经元参与,输出乘以0.5

实现细节

Inverted Dropout

现代框架使用的实现方式:

  • 训练时:丢弃并放大剩余输出 × 1/(1-p)
  • 推理时:直接使用,无需缩放

这样推理阶段更高效。

典型Dropout率

层类型推荐Dropout率
全连接层0.5
卷积层0.1 ~ 0.25
循环层0.2 ~ 0.5(非循环连接)
Transformer注意力0.1

为什么有效

集成学习视角

Dropout相当于训练了指数级数量的子网络:

  • 每个样本对应一个不同的子网络
  • 推理时相当于多个子网络的平均
  • 类似于模型集成的效果

破坏共适应

防止神经元之间形成过度依赖:

  • 每个神经元不能依赖特定的其他神经元
  • 必须学习更加鲁棒的特征
  • 每个神经元都要"有用"

噪声注入

Dropout可以看作是一种噪声注入:

  • 增加模型的鲁棒性
  • 类似于数据增强

变体

DropConnect

随机丢弃权重而非神经元输出:

  • 更细粒度的正则化
  • 计算成本更高

Spatial Dropout

用于卷积网络,丢弃整个特征图:

  • 比丢弃单个像素更有效
  • 保留空间相关性

DropBlock

丢弃连续区域的特征:

  • 在CNN中效果更好
  • 强制学习更鲁棒的特征

最佳实践

使用建议

  • 全连接层后面经常使用Dropout
  • Dropout率不需要太大(通常0.1-0.5)
  • 不要在输出层使用
  • 与BatchNorm配合使用时注意顺序

与BatchNorm的关系

Dropout和BatchNorm配合时的注意事项:

  • 两者有类似的效果(注入噪声)
  • 现代网络有时只用BatchNorm,不用Dropout
  • Transformer中两者都会使用

现代趋势

随着正则化技术的发展:

  • 大模型训练中Dropout使用减少
  • 数据增强和权重衰减成为主要正则化手段
  • 但在小数据场景仍很有价值
----