06 Dropout 正则化
06 Dropout 正则化
1. 核心思想
Dropout 是一种在训练阶段随机“关闭”神经网络中一部分神经元的正则化技术,以减少过拟合。其本质是:
对每个训练样本,临时从网络中移除一部分神经元(连同其连接),从而训练一个“稀疏”的子网络;不同样本对应不同的子网络,最终模型相当于对大量子网络的集成。
2. Inverted Dropout 实现步骤(推荐方法)
设当前处理第 $l$ 层,保留概率为 $\mathrm{keep_prob}$(例如 0.8)。
(1) 生成 dropout 掩码
创建与激活值 $a^{[l]}$ 同维度的随机二值掩码 $d^{[l]}$:
\[d^{[l]} = \begin{cases} 1, & \text{概率为 } \mathrm{keep\_prob} \\ 0, & \text{概率为 } 1 - \mathrm{keep\_prob} \end{cases}\]在代码中通常通过:
1
d3 = (np.random.rand(*a3.shape) < keep_prob)
(2) 应用 dropout 并缩放(Inverted Scaling)
对激活值进行逐元素相乘并除以 $\mathrm{keep_prob}$:
\[a^{[l]} := \frac{a^{[l]} \odot d^{[l]}}{\mathrm{keep\_prob}}\]其中 $\odot$ 表示逐元素(Hadamard)乘积。
✅ 关键作用:保持 $a^{[l]}$ 的期望值在 dropout 前后不变。
例如,若 $\mathrm{keep_prob} = 0.8$,平均有 20% 神经元被置零,剩余值放大 $1/0.8 = 1.25$ 倍,使整体期望不变。
3. 训练 vs 测试行为
| 阶段 | 是否使用 Dropout | 操作 |
|---|---|---|
| 训练 | ✅ 是 | 对每个样本/批次随机生成 $d^{[l]}$,应用上述公式 |
| 测试 | ❌ 否 | 使用完整网络,不做任何 dropout 或缩放 |
💡 由于训练时已通过 Inverted Dropout 补偿了期望,测试时可直接前向传播,无需调整权重或激活值。
4. 为什么有效?(直观理解)
- 防止共适应(co-adaptation):神经元无法依赖其他特定神经元,被迫学习更鲁棒的特征。
- 隐式模型集成:每次迭代训练一个随机子网络,整体效果近似于集成多个模型。
- 类似 Bagging:通过引入随机性提升泛化能力。
5. 超参数建议
- 隐藏层:$\mathrm{keep_prob} = 0.5 \sim 0.8$
- 输入层:可设更高(如 0.9 或 1.0),因为输入通常不应被过度丢弃
- 输出层:通常不使用 Dropout
6. 注意事项
- 每次前向传播(包括同一 epoch 内的不同 batch)都必须重新采样 $d^{[l]}$。
- 不要将同一个 $d^{[l]}$ 用于多个样本或多次迭代。
- 不要在测试时启用 Dropout,否则会引入不必要的预测噪声。
7. 公式汇总
Dropout 掩码生成:
\[d_i^{[l]} \sim \mathrm{Bernoulli}(\mathrm{keep\_prob})\]激活值更新(Inverted Dropout):
\[a^{[l]} \leftarrow \frac{a^{[l]} \odot d^{[l]}}{\mathrm{keep\_prob}}\]测试时前向传播(无 dropout):
\[z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g(z^{[l]})\]
本文由作者按照 CC BY 4.0 进行授权