这个问题非常重要,我会用严格、学术、逻辑缜密的方式系统解释,内容会尽可能详细。


神经网络训练中参数初始化为什么需要取很小的值?

1. 神经网络训练的基本前提

在神经网络中,我们优化的是参数(权重 和偏置 ),使得网络能最小化一个损失函数 ,其中 表示所有参数集合。训练通常基于梯度下降或其变种。

而初始化是训练的起点

  • 若初始点选择不合理,会导致训练过程异常,比如:

    • 梯度消失或爆炸

    • 网络输出异常大或异常小

    • 学习收敛非常慢

    • 局部最优、饱和等问题

因此,初始化策略的合理性,直接决定了训练是否能顺利进行。


2. 为什么不能取太大?(数学推导)

考虑一层最简单的神经网络:

y=σ(wx+b)y = \sigma(wx + b)

其中, 是激活函数,比如 ReLU、Sigmoid、Tanh 等。

设输入 是均值为 0、方差为 1 的标准正态分布。我们关心输出 的分布。

如果 非常大,比如

  • 也会非常大。

  • 对于非线性激活函数(如 Sigmoid、Tanh):

    • 这些函数对极大或极小的输入,输出趋于饱和区(Sigmoid趋近于1或0;Tanh趋近于1或-1)。

    • 在饱和区,,梯度几乎消失。

  • 对于 ReLU:

    • 若初值偏正,ReLU还好;但若偏负,ReLU输出全是0,网络“死掉”。

因此,如果初始化过大,会出现:

  • 梯度消失(saturated activation)

  • 学习停滞

  • 参数更新微弱或几乎停止


3. 为什么不能取太小?

如果权重初始得过小,比如接近

  • 则每一层的输出变化也极小。

  • 这样一来,信号逐层传递时不断衰减

  • 训练初期几乎感受不到误差信号,更新步长极小。

特别地,在深层网络中,微小的数值经过多次线性或非线性变换,会迅速衰减到接近0,导致梯度消失,也是一种训练困难。


4. 理想的初始化思路

为了保证网络在训练初期:

  • 每一层的输出分布稳定(不过大不过小)

  • 每一层的梯度分布稳定(避免消失或爆炸)

需要让:

  • 前向传播中,输出的方差不会因为层数增加而爆炸或消失。

  • 反向传播中,梯度的方差也不会因为层数增加而爆炸或消失。

这就是后续很多初始化方法(如 Xavier 初始化、He 初始化)背后的核心动机。

4.1 从输出方差推导

考虑一层线性变换:

h=wxh = w x

假设 独立, 零均值、单位方差。则:

Var(h)=Var(w)×Var(x)\text{Var}(h) = \text{Var}(w) \times \text{Var}(x)

如果我们希望 大致一致,那么应该有:

Var(w)=1fan_in\text{Var}(w) = \frac{1}{\text{fan_in}}

其中 \text{fan_in} 是输入节点个数。

进一步,若我们使用激活函数,如 ReLU,它会把一半输入截断成0,方差变为一半。因此 He 初始化推导得:

Var(w)=2fan_in\text{Var}(w) = \frac{2}{\text{fan_in}}

这解释了为什么实际初始化中,我们通常根据输入大小来缩放权重的标准差,使得一开始每一层的输出不会失控。

4.2 具体举例

  • Xavier初始化(Glorot Initialization):

    • 用于 Sigmoid、Tanh

    • 权重取自均值为0,方差为 \frac{2}{\text{fan_in} + \text{fan_out}} 的分布。

  • He初始化(Kaiming Initialization):

    • 用于 ReLU

    • 权重取自均值为0,方差为 \frac{2}{\text{fan_in}} 的分布。


5. 为什么经常看到初值 左右?

虽然理论推导建议按 \text{fan_in} 来动态设置初值大小,但在一些简单模型或早期设计中,人们经验上发现:

  • 设置为 0.1 级别

  • 能保证不会一开始太大导致梯度爆炸,也不会太小导致信号消失

  • 在很多浅层网络、低复杂度任务中(如简单分类), 是一个经验上比较稳妥的折中选择

但实际上,随着网络变深,规模变大,这种“固定常数初始化”方法已经逐渐被上面提到的Xavier初始化He初始化所取代。


总结

角度如果初值太大如果初值太小
正向传播激活饱和,输出爆炸或全部相同信号快速衰减,信息丢失
反向传播梯度爆炸或消失梯度消失
训练表现不收敛、发散训练极慢,难以学习
解决方案合理控制初值,依据fan-in/fan-out动态设定
  • 初始化值小,是为了避免一开始就饱和、爆炸,保证稳定传播;

  • 但也不能过小,否则训练信号难以穿越网络;

  • 正确的初始化遵循方差守恒原则,如 Xavier 和 He 初始化;

  • 常见的 “0.1” 是早期浅层网络中的经验值。


如果你希望,我还可以进一步推导:

  • 深层网络中方差如何逐层累积

  • 从梯度反向传播角度更细致推导合理初始化

  • 不同激活函数下的专门初始化策略(如 GELU,Swish)

要不要我继续?要的话,请告诉我。