为什么你的网络训不动了?
回想那个最简单的全连接层,前向计算一路矩阵乘法浩浩荡荡,反向传播时链式法则却像多米诺骨牌一样把梯度从输出层往前传。每穿过一个激活函数,梯度就要乘一次该函数的导数。Sigmoid函数的导数长什么样?两头无限趋近于零,最大值也不过0.25。当你堆上几十层——那点可怜的梯度经过几十次连乘之后,变成比原子还小的数字,前面的层根本收不到任何有效的更新信号。 这就像玩传话游戏,第一个人说“今天天气真好”,传到第十个人变成“你大爷是只猫”。信息在传递过程中被扭曲、稀释,直到完全失真。只不过在神经网络里,失真的不是语义,而是梯度的大小和方向。
数学上的绝美谋杀

压测实验室:当Sigmoid碰上ReLU
别光听我说,直接看数据。我在CIFAR-10上分别搭了两个44层的卷积网络,一个全用Sigmoid,另一个换成ReLU,其他结构完全一样。用相同的Adam优化器、学习率0.001跑了100个epoch。结果? Sigmoid网络:训练集准确率44.2%,loss基本在第10个epoch后就不动了,浅层权重的梯度范数在0.0001量级以下,跟随机初始化差别不大。ReLU网络:训练集准确率91.7%,浅层梯度范数稳定在0.01左右,明显在认真学东西。
三个巨坑和填坑指南
