文章

11 深度神经网络的权重初始化(Weight Initialization for Deep Networks)

11 深度神经网络的权重初始化(Weight Initialization for Deep Networks)

🧠 课程核心目标

  解决深度神经网络训练中的 梯度消失(vanishing gradients)梯度爆炸(exploding gradients) 问题。
虽然权重初始化不能完全消除该问题,但合理的初始化策略能显著缓解,从而提升训练稳定性和收敛速度。


🔍 1. 单神经元示例分析

  考虑一个单神经元模型:

  • 输入:$x_1, x_2, \dots, x_n$(共 $n$ 个特征)
  • 权重:$w_1, w_2, \dots, w_n$
  • 偏置设为 0(简化分析):$b = 0$
  • 线性组合:

    \[z = \sum_{i=1}^{n} w_i x_i = \mathbf{w}^\top \mathbf{x}\]
  • 激活输出:$a = g(z)$

⚠️ 问题

  若 $w_i$ 初始化过大 → $z$ 过大 → 激活函数饱和(如 sigmoid/tanh)→ 梯度接近 0(梯度消失
若 $w_i$ 初始化过小 → $z$ 接近 0 → 梯度极小 → 学习缓慢
若层数很深,误差会逐层放大或缩小 → 梯度爆炸/消失

✅ 直觉解决方案

  • $z$ 是 $n$ 项之和,因此每项 $w_i x_i$ 应“小一点”,避免总和过大或过小。
  • 若输入 $x_i$ 满足:$\mathbb{E}[x_i] \approx 0$,$\mathrm{Var}(x_i) \approx 1$
  • 则希望:$\mathrm{Var}(z) \approx 1$

  由于:

\[\mathrm{Var}(z) = \mathrm{Var}\left( \sum_{i=1}^n w_i x_i \right) = \sum_{i=1}^n \mathrm{Var}(w_i x_i) = \sum_{i=1}^n \mathrm{Var}(w_i) \cdot \mathrm{Var}(x_i)\]

  若 $w_i \sim \mathcal{N}(0, \sigma^2)$,且 $\mathrm{Var}(x_i) = 1$,则:

\[\mathrm{Var}(z) = n \cdot \sigma^2\]

  令 $\mathrm{Var}(z) = 1$ ⇒ $\sigma^2 = \frac{1}{n}$


📐 2. 推广到深度网络

  对于第 $l$ 层(layer $l$):

  • 输入来自前一层的激活值:$\mathbf{a}^{[l-1]} \in \mathbb{R}^{n^{[l-1]}}$
  • 权重矩阵:$\mathbf{W}^{[l]} \in \mathbb{R}^{n^{[l]} \times n^{[l-1]}}$
  • 初始化建议:

    \[\mathbf{W}^{[l]} = \texttt{np.random.randn}(n^{[l]}, n^{[l-1]}) \times \sqrt{\frac{k}{n^{[l-1]}}}\]

    其中 $k$ 取决于激活函数类型。


🧪 3. 不同激活函数对应的初始化策略

(1) ReLU 激活函数(最常用)

  • 推荐使用 He 初始化(He Initialization)

    \[\mathbf{W}^{[l]} \sim \mathcal{N}\left(0, \frac{2}{n^{[l-1]}}\right)\]

    即:

    \[\mathbf{W}^{[l]} = \texttt{np.random.randn}(\cdots) \times \sqrt{\frac{2}{n^{[l-1]}}}\]

💡 理由:ReLU 会使一半神经元输出为 0,有效方差减半,因此需将方差加倍以补偿。


(2) Tanh / Sigmoid 激活函数

  • 推荐使用 Xavier 初始化(Glorot Initialization)

    \[\mathbf{W}^{[l]} \sim \mathcal{N}\left(0, \frac{1}{n^{[l-1]}}\right)\]

    即:

    \[\mathbf{W}^{[l]} = \texttt{np.random.randn}(\cdots) \times \sqrt{\frac{1}{n^{[l-1]}}}\]

📚 由 Xavier Glorot & Yoshua Bengio (2010) 提出,适用于对称激活函数(如 tanh)。


(3) 其他变体(较少用)

  • Yoshua Bengio 团队提出更复杂的初始化(如考虑前后层维度平均):

    \[\mathbf{W}^{[l]} \sim \mathcal{N}\left(0, \frac{2}{n^{[l-1]} + n^{[l]}}\right)\]

    但在实践中,He 初始化(ReLU)和 Xavier 初始化(tanh)已足够有效


⚙️ 4. 实践建议与超参数调优

  • 默认选择

    • 使用 ReLU → 用 He 初始化($\sqrt{2 / n^{[l-1]}}$)
    • 使用 Tanh → 用 Xavier 初始化($\sqrt{1 / n^{[l-1]}}$)
  • 可调超参数

    • 可引入缩放因子 $\alpha$:

      \[\mathbf{W}^{[l]} = \texttt{np.random.randn}(\cdots) \times \alpha \cdot \sqrt{\frac{2}{n^{[l-1]}}}\]
    • 将 $\alpha$ 作为超参数进行微调(但通常影响较小)

  • 优先级:权重初始化重要,但不如学习率、网络结构、批量大小等关键,属于“第二梯队”调参项。


✅ 总结:为什么有效?

  合理初始化使每一层的 输入和输出保持相似的尺度(scale) ,从而:

  • 防止 $z^{[l]}$ 过大或过小
  • 保持激活值在非饱和区
  • 使梯度在反向传播中既不爆炸也不消失
  • 显著提升深度网络的可训练性

📘 公式速查表

激活函数初始化方差初始化代码(Python)
ReLU$\displaystyle \frac{2}{n^{[l-1]}}$np.random.randn(...) * np.sqrt(2 / n_prev)
Tanh$\displaystyle \frac{1}{n^{[l-1]}}$np.random.randn(...) * np.sqrt(1 / n_prev)

  其中 $n^{[l-1]}$ 表示第 $l-1$ 层的神经元数量(即当前层的输入维度)。

本文由作者按照 CC BY 4.0 进行授权