不能全零或相同初始化权重,否则会导致对称性崩溃、所有神经元同步更新且输出相同;标准差过大引发梯度消失,过小导致表现力受限;Xavier适用于Sigmoid/Tanh,He(Kaiming)专为ReLU设计,需严格匹配激活函数。

不随机初始化权重,模型根本学不动——所有神经元会同步更新、永远输出相同结果,梯度也全为零。
全零或相同权重会导致对称性崩溃
多层感知机里,如果某一层所有权重都设成 0 或同一个数(比如 0.5),正向传播时每个神经元接收的加权和完全一样,激活值也一样;反向传播时算出的梯度也完全一样。下一次更新后,它们还是相等。相当于整层只在用一个神经元工作。
- 哪怕你定义了 128 个隐藏单元,实际起作用的只有 1 个
-
np.random.randn(128, 784) * 0.01这类调用就是为了打破这种对称性 - 偏置项可以初始化为
0,但权重绝不能
标准差太小或太大直接引发梯度消失/爆炸
用 np.random.randn 初始化时,若标准差选错,前向信号或反向梯度会在深层网络中指数级衰减或膨胀。比如 sigmoid 激活下,权重方差过大 → 输入 z 很大 → sigmoid 输出接近 1 → 导数接近 0 → 梯度消失。
- 标准差为
1:五层 sigmoid 网络中,第 5 层激活值几乎全堆在 0 或 1 附近 - 标准差为
0.01:前几层激活值太小,训练缓慢 - 更稳妥的做法是按输入/输出维度动态缩放,比如 Xavier 用
np.sqrt(6 / (fan_in + fan_out))
不同激活函数需要匹配不同的初始化策略
ReLU 不吃 sigmoid 那套初始化。它在负半轴导数为 0,如果初始权重太小,大量神经元会永久“死亡”(输出恒为 0,梯度恒为 0);太大又容易爆炸。He 初始化专为 ReLU 设计,方差设为 2 / fan_in。
立即学习“Python免费学习笔记(深入)”;
- sigmoid/tanh:优先用
xavier_uniform_或xavier_normal_ - ReLU 及其变体(LeakyReLU、PReLU):用
kaiming_uniform_或kaiming_normal_,并指定nonlinearity='relu' - PyTorch 中要跳过 bias 和 1D 参数(如 BatchNorm 的
weight),只初始化 >1 维的weight
真正容易被忽略的是:初始化不是“设一次就完事”。它必须和你的激活函数、网络深度、甚至 batch size 搭配着看——换掉激活函数却沿用旧初始化,可能让模型收敛变慢一倍,或者干脆卡死在某个 plateau 上。


















