大权重初始化为何会引发神经网络的梯度消失问题
嘿,这个问题问得特别到位——刚接触梯度消失的同学几乎都会有和你一样的误解,咱们把这个逻辑掰碎了说清楚:
首先,得先回忆下Sigmoid和Tanh这两个激活函数的核心特性:
- Sigmoid的输出范围是(0,1),它的导数公式是
σ'(x) = σ(x) * (1 - σ(x))。当输入x的绝对值很大时(比如x>5或者x<-5),σ(x)会趋近于1或0,这时候导数会趋近于0。 - Tanh的输出范围是(-1,1),导数是
1 - tanh²(x),同样的,当输入|x|很大时,tanh(x)趋近于1或-1,导数也会趋近于0。
这两个激活函数的这个区域咱们叫「饱和区」——一旦输入进入这个区域,激活函数的导数就会变得极小,几乎等于0。
那大权重初始化怎么和这个扯上关系的呢?
假设神经元的加权输入是 z = w·x + b,如果咱们把权重w初始化得太大(哪怕是你提到的[0,1)范围,如果输入x的尺度不小,比如x的均值是10,那w=0.9的话z=9,直接就进饱和区了),z的绝对值会变得很大,这时候Sigmoid/Tanh就会进入饱和区,输出要么接近1/1,要么接近0/-1,对应的导数就几乎是0。
而反向传播的时候,梯度的计算是要乘以激活函数的导数的。如果每一层的激活导数都趋近于0,那梯度从输出层往输入层传递的过程中,会被不断乘以这些极小的数,传到前面的层时,梯度就几乎消失了——这就是咱们说的梯度消失问题。
至于你之前的误解:你以为梯度消失是小权重或者激活输出小导致的,其实是把因果搞反了一点——激活输出小的时候导数确实小,但激活输出接近1的时候导数也小啊!大权重的问题在于,它会直接把神经元的输入推到饱和区,不管输出是靠近0还是1,导数都会变得极小,这才是关键。
举个实际的例子:
假设输入x=1,权重w初始化得很大,比如w=10,那z=10*1=10,Sigmoid(z)≈0.99995,对应的导数≈0.00005,几乎就是0。这时候反向传播到这个权重的梯度会乘以这个极小的导数,结果梯度值变得微乎其微,权重更新的时候几乎没变化,训练自然就慢下来了。
反过来,如果用合适的小权重初始化,比如w=0.1,z=0.1*1=0.1,Sigmoid(z)=0.52498,导数≈0.2493,这个值很合理,梯度传递的时候不会被过度衰减,训练就能正常进行。
备注:内容来源于stack exchange,提问作者Arun Negi




