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使用减少
- 数据增强和权重衰减成为主要正则化手段
- 但在小数据场景仍很有价值