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)
这与激活函数的性质密切相关,尤其是 Sigmoid 和 tanh。
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: |
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.01 | 0.01 通常足够 |
| 深层网络(>5 层) | Xavier / He 初始化 | 需根据激活函数调整缩放因子(后续课程讲解) |
⚠️ 注意:如果网络中没有使用 Sigmoid/tanh(例如全用 ReLU),对大权重的敏感度较低,但仍建议小随机初始化以保证稳定性。
五、关键结论总结
- 不能将神经网络权重初始化为 0 → 会导致所有隐藏单元对称,丧失表达能力。
- 必须使用随机初始化 → 打破对称性,让不同神经元学习不同特征。
- 初始化值应较小(如 ×0.01) → 避免激活函数饱和,保证梯度有效传播。
- 偏置项可初始化为 0 → 不会引起对称性问题。
- 深层网络需更精细的初始化策略(如 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 进行授权