文章

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 进行授权