这个问题非常重要,我会用严格、学术、逻辑缜密的方式系统解释,内容会尽可能详细。
神经网络训练中参数初始化为什么需要取很小的值?
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)
要不要我继续?要的话,请告诉我。