第 3 步 · 训练稳了才能做深
Dropout 与 BatchNormDropout & BatchNorm
随机"关掉"一半神经元反而更强?深度网络两大训练神器
13 分钟
阅读 + 实操
3 个
交互演示
中级
难度
Dropout 与 BatchNorm · 交互演示
Dropout p0.30
训练步0
决策边界对比(双月数据 · 同初始权重 · 实时训练中)
无 Dropout
有 Dropout · p=0.30
Dropout 过程示意(灰点 = 本步被随机丢弃的隐藏神经元)
训练时每处理一个样本就重新随机生成一次掩码 —— 每个样本实际上都在训练一个不同的"子网络"。暂停时掩码静止。
BatchNorm 示意:第 1 隐藏层激活前 z 的分布(橙 = 原始,蓝 = BN 归一化后)
为什么学这步?
网络做深后,过拟合与分布漂移接踵而来。Dropout 靠随机关神经元做隐式集成,BatchNorm 靠拉回分布让深层不再漂移——两把把网络做深的工程利器。
📌 发生了什么
- Dropout 训练时随机关神经元
- 相当于指数级子网络集成
- BatchNorm 把激活拉回均值 0 方差 1
⚠️ 常见陷阱
- Dropout p 太大会欠拟合
- 推理时不能再 Dropout
- BN 训练用批量、推理用滑动平均
✅ 本章小结
- Dropout 隐式集成抗过拟合
- Inverted Dropout 训练放大推理不丢
- BatchNorm 稳定层间分布
📐 Dropout 与 BatchNorm 的数学
两种正则化手段从不同角度稳定训练:Dropout 随机失活防共适应,BatchNorm 归一化激活分布。
Dropout 训练时按概率 p 随机置零神经元,并对存活神经元缩放 1/(1−p) 以保持期望不变;测试时不失活。
BatchNorm 对每个 mini-batch 计算均值 μ_B 与方差 σ²_B,将激活归一化到零均值单位方差,再通过可学习的 γ、β 恢复表达能力。
归一化使各层输入分布稳定,降低内部协变量偏移,允许更大的学习率、加速收敛。
🎛 Dropout 率对比
Dropout 率 p 决定失活比例,过高欠拟合,过低无正则效果。
| Dropout 率 | 表现 | 结果 |
|---|---|---|
| p = 0.2 | 仅失活少量神经元 | 正则较弱 |
| p = 0.5 | 半数失活,经典设定 | 推荐 |
| p = 0.8 | 大量失活,容量不足 | 欠拟合 |
💡 全连接层常用 p=0.5,卷积层更低(0.1~0.3);测试时不 dropout,缩放已在训练时完成。
💻 Dropout 与 BatchNorm 实现
前向传播中的 Dropout 与 BatchNorm Python 实现:
# Dropout 前向(训练时)
def dropout_forward(a, p, is_training):
if not is_training: return a # 测试时直接返回
mask = (np.random.rand(len(a)) < (1 - p)).astype(float)
return a * mask / (1 - p) # 缩放保持期望
# BatchNorm 前向(训练时)
def batch_norm_forward(x, gamma, beta, eps):
mu = np.mean(x)
v2 = np.var(x)
x_hat = (x - mu) / np.sqrt(v2 + eps)
return gamma * x_hat + beta
📚 参考文献与延伸阅读
- Srivastava et al. (2014), Dropout: A Simple Way to Prevent Neural Networks from Overfitting, JMLR — Dropout 原始论文
- Ioffe & Szegedy (2015), Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, ICML — BatchNorm 原始论文
- Goodfellow, Bengio & Courville, Deep Learning (2016), §7.12 Dropout + §8.7 Batch Normalization
- arXiv:1502.03167 — Batch Normalization — BatchNorm 论文预印本
📝 课后练习
检验你的理解——答对为止