梯度下降与学习率

蒙着眼,一步一步下山。沿最陡的下坡走,学习率决定这一步迈多大。

交互实验
选择地形
同一起点,换个学习率再试

损失地形

起伏的山地
越低,损失越小
模型当前参数下山轨迹拖动旋转 · 滚轮缩放 · 点击换起点
此刻

损失曲线

每一步之后,小球有多高
走出第一步,看看损失怎样变化

下山的三个关键

  1. 损失是一片地形参数每取一组值,模型就有一个「错多少」,画出来是山和谷
  2. 摸坡度,往下走看不见全貌,只知道脚下哪边最陡,就朝那边挪一步
  3. 步子大小是学习率太小走不到,太大跳过头,一步一步直到坡度为零

留意这些现象

  • 学习率太大会发散切到「光滑的长谷」拧到 0.3,小球在谷两边越跳越高,训练曲线冲天
  • 坡度为零不一定是谷底从 p2 出发它停在局部极小值,从 p1 出发才到全局最小值:起点决定命运
  • 惯性能冲过小坑从 p2 出发勾上「带惯性」,它冲过局部极小值到了全局最小值,这就是动量法

训练就是蒙着眼下山:学习率是步子,太小走不到,太大跳出去;坡度为零的地方不一定是谷底。

文字版:梯度下降与学习率在做什么

训练模型就是蒙着眼下山:参数取不同的值,模型就有不同的「错多少」,把这个错误画出来就是一片地形。你看不见全貌,只知道脚下哪边最陡,就朝那边挪一步。步子迈多大,由学习率决定。

画面上正在发生什么

小球的位置是当前的参数组合,高度是损失。按「走一步」,它朝脚下最陡的下坡方向挪动,右边的损失曲线跟着往下掉一格。把学习率从 0.08 调到 0.3,再切到「光滑的长谷」:小球会在谷的两侧越跳越高,损失曲线直接冲天——这就是发散。不是模型不行,是步子迈过了头。

另一个现象更关键:从起点 P2 出发,小球停在一个小坑里就不动了,因为那里坡度确实是零;从 P1 出发才走到真正的最低处。坡度为零的地方不一定是谷底。勾上「带惯性动量」再从 P2 试一次,它借着惯性冲过了那个小坑。

什么时候它会骗你

  • 损失不降,可能是步子太小而不是学不会。学习率太小时损失曲线几乎是水平的,看起来和「模型没有能力」一模一样。判断方法是把学习率加大一个数量级再看,曲线动起来就说明只是走得太慢。
  • 起点决定终点。同一个地形、同一个学习率,换个起点就可能落进不同的坑。这就是为什么神经网络的初始化方式是个真问题,也是为什么同样的代码跑两次结果会不同。
  • 这里是两个参数,真实模型是几百万个。二维地形能画出来,是因为只有两个参数。真实网络的参数空间维度极高,那里的「局部极小值」形态和低维直觉差别很大——高维空间中更常见的障碍是鞍点而非小坑。

常见问题

学习率该怎么设?
没有通用值,但有通用做法:从一个较大的值开始,按数量级往下试(如 0.1、0.01、0.001),看损失曲线。震荡或上升说明太大,几乎不动说明太小。实践中常配合学习率衰减:开始时步子大以快速接近,后期减小以精细收敛。
动量法解决了什么问题?
它把上一步的方向按一定比例带进这一步,产生惯性。好处有两个:在狭长的谷里能抑制左右横跳、加快沿谷底方向的前进;遇到浅的局部极小值时能借惯性冲过去。代价是接近谷底时可能收不住脚而冲过头。
批量梯度下降、随机梯度下降、小批量,区别在哪?
区别只在每次更新用多少样本算梯度。全部样本(批量)方向最准但每步很慢;单个样本(随机)每步极快但方向噪声大;小批量取折中,也是现在的标准做法——噪声本身还有帮助跳出局部极小的副作用。

本页地形为教学构造的二维损失函数,每一步的位置和损失由页面实时计算。

作者与维护:覃秉丰 · 关于覃秉丰 · 引用本页讲解

继续学习