文章

31 神经网络中的随机初始化(Random Initialization)

31 神经网络中的随机初始化(Random Initialization)

一、为什么不能将权重初始化为零?

  在逻辑回归(Logistic Regression)中,将权重 $\mathbf{w}$ 初始化为零是可以接受的。
但在神经网络中,如果将所有权重初始化为零,会导致一个严重问题:对称性问题(Symmetry Problem)

1. 对称性问题的产生

  考虑一个简单的神经网络结构:

  • 输入特征数:$n^{(0)} = 2$
  • 隐藏层单元数:$n^{(1)} = 2$
  • 输出层:1 个单元(例如用于二分类)

  权重矩阵和偏置初始化为:

\[\mathbf{W}^{[1]} = \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix}, \quad \mathbf{b}^{[1]} = \begin{bmatrix} 0 \\ 0 \end{bmatrix}\]

  前向传播计算隐藏层激活值:

\[z_1^{[1]} = \mathbf{W}^{[1]}_{1,:} \mathbf{x} + b_1^{[1]} = 0 \\ z_2^{[1]} = \mathbf{W}^{[1]}_{2,:} \mathbf{x} + b_2^{[1]} = 0 \\ \Rightarrow a_1^{[1]} = a_2^{[1]} = g(z) = g(0)\]

  → 两个隐藏单元输出完全相同!

2. 反向传播时的问题

  由于两个隐藏单元完全对称(即它们对输出的影响相同),反向传播时的梯度也完全相同:

\[\frac{\partial \mathcal{L}}{\partial W_{11}^{[1]}} = \frac{\partial \mathcal{L}}{\partial W_{21}^{[1]}} \\ \frac{\partial \mathcal{L}}{\partial W_{12}^{[1]}} = \frac{\partial \mathcal{L}}{\partial W_{22}^{[1]}}\]

  因此,每次参数更新后:

\[\mathbf{W}^{[1]} := \mathbf{W}^{[1]} - \alpha \cdot d\mathbf{W}^{[1]}\]

  仍然保持两行完全相同。

🔁 归纳法可证明:无论训练多少轮,所有隐藏单元始终计算完全相同的函数

3. 后果

  • 多个隐藏单元等价于只有一个隐藏单元
  • 网络表达能力严重受限
  • 无法学习复杂的特征表示

二、解决方案:随机初始化(Random Initialization)

  为了打破对称性,必须将权重 随机初始化为小的非零值

1. 具体做法(以 Python / NumPy 为例)

1
2
3
4
5
W1 = np.random.randn(n1, n0) * 0.01   # (2, 2)
b1 = np.zeros((n1, 1))                # (2, 1)

W2 = np.random.randn(n2, n1) * 0.01   # (1, 2)
b2 = np.zeros((n2, 1))                # (1, 1)

  其中:

  • np.random.randn 生成标准正态分布(均值 0,方差 1)的随机数
  • 乘以 0.01 是为了缩放到很小的范围

✅ 偏置项 $\mathbf{b}$ 可以安全地初始化为 0,因为只要 $\mathbf{W}$ 不同,就能打破对称性。


三、为什么要用“很小”的随机数?(如 0.01)

  这与激活函数的性质密切相关,尤其是 Sigmoidtanh

1. 激活函数饱和区问题

  • Sigmoid 函数:$\sigma(z) = \frac{1}{1 + e^{-z}}$
  • Tanh 函数:$\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$
  当 $z$ 很大时(如 $z > 5$ 或 $z < -5$),函数进入饱和区,导数接近 0:
\[\sigma'(z) = \sigma(z)(1 - \sigma(z)) \approx 0 \quad \text{当 } |z| \gg 0\]

2. 权重过大 → $z$ 过大 → 梯度消失

  前向传播中:

\[z^{[1]} = \mathbf{W}^{[1]} \mathbf{x} + \mathbf{b}^{[1]}\]

  若 $\mathbf{W}^{[1]}$ 初始值很大(如 100),即使 $\mathbf{x}$ 是普通输入(如 [-1, 1]),$z$ 也可能达到 ±100,导致激活函数饱和。

  → 反向传播时梯度极小 → 学习速度极慢(甚至停滞)

3. 小权重的好处

  • 使初始 $z^{[l]}$ 接近 0
  • 激活函数工作在线性区域附近(导数较大)
  • 梯度下降能有效更新参数

四、不同网络深度下的初始化策略

网络类型推荐初始化方式说明
浅层网络(1~2 层)np.random.randn(...) * 0.010.01 通常足够
深层网络(>5 层)Xavier / He 初始化需根据激活函数调整缩放因子(后续课程讲解)

⚠️ 注意:如果网络中没有使用 Sigmoid/tanh(例如全用 ReLU),对大权重的敏感度较低,但仍建议小随机初始化以保证稳定性。


五、关键结论总结

  1. 不能将神经网络权重初始化为 0 → 会导致所有隐藏单元对称,丧失表达能力。
  2. 必须使用随机初始化 → 打破对称性,让不同神经元学习不同特征。
  3. 初始化值应较小(如 ×0.01) → 避免激活函数饱和,保证梯度有效传播。
  4. 偏置项可初始化为 0 → 不会引起对称性问题。
  5. 深层网络需更精细的初始化策略(如 Xavier、He),将在后续课程介绍。

六、公式速查表(KaTeX)

  • 前向传播:

    \[z^{[l]} = \mathbf{W}^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g^{[l]}(z^{[l]})\]
  • Sigmoid 导数:

    \[\sigma'(z) = \sigma(z)(1 - \sigma(z))\]
  • 随机初始化(浅层网络):

    \[\mathbf{W}^{[l]} \sim \mathcal{N}(0, 1) \times 0.01, \quad \mathbf{b}^{[l]} = \mathbf{0}\]

  希望这份总结能帮助你扎实掌握神经网络随机初始化的核心思想!如果你正在实现自己的神经网络,务必记住:永远不要用全零初始化权重!

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