让深网络练得动:梯度消失与批量归一化
约 10 分钟
传话游戏的尽头
第一章留过一个悬念:层数一多,训练信号就传不动。现在把原因说透。反向传播靠连乘传梯度,几十个 0.5 连乘,结果是 ,白话就是——传到第一层时,调整信号只剩百万分之一,浅层权重几乎不动了。这就是梯度消失:深层网络的前半截像被冻结,怎么练都没反应。
救星一:换激活函数
老激活函数 sigmoid 的导数最大只有 0.25,层一多连乘必死;ReLU(第一章那位「正能量闸门」)在正区间导数恒为 1,信号穿过它不缩水——这就是为什么 2012 年后 ReLU 一统隐藏层。深网络能练起来,一半功劳在它。
救星二:批量归一化
另一个大发明是批量归一化(Batch Normalization,2015 年提出):每层的输出先「校准」成均值为 0、方差为 1 的标准分布,再送进下一层。像每层楼之间装一个稳压器,不管楼上电压怎么波动,楼下永远拿到稳定输入。效果是训练又快又稳,学习率可以开大,过拟合还顺带减轻。《动手学深度学习》在「现代卷积神经网络」一章专门讲它。
常见误区
梯度消失不是「层数多所以慢」,而是信号在传播中指数级衰减;也别以为有了这两招就万事大吉——网络深到一定程度照样崩,下一讲的 ResNet 才是终极答案。
练一练:心算 0.5 连乘 10 次大约是多少?再说说这对深网络意味着什么。
小纸条
心算 0.5 连乘 10 次的结果,并解释它对深层网络训练的启发。
登录 后可看答案