训练一个识别图片的模型时,你发现误差下降得很慢,于是把“学习率”调大。开始似乎快了一些,继续调大后,误差却上下跳动,甚至越来越高。
既然模型每一步都根据误差进行修正,为什么更用力地改,反而可能改坏?问题在于:知道当前位置该朝哪个方向调整,并不等于知道沿这个方向走多远都合适。
先分清方向与步长
模型训练通常先把预测与训练目标之间的差别写成一个数,叫作损失。参数决定模型怎样作出预测,训练过程则通过调整参数,尝试降低损失。
梯度描述损失对各个参数的局部变化率。对于可微的损失,沿负梯度作足够小的移动,在梯度非零时可以降低损失;但梯度只反映当前位置附近的信息,不能保证一次大幅移动后仍然更好。
最基本的梯度下降,可以写成“新参数 = 旧参数 − 学习率 × 当前梯度”。学习率是控制调整幅度的系数。实际一步有多大,还取决于梯度有多大,不能只看学习率这个数字。《动手学深度学习》的梯度下降章节解释了这一更新规则,以及过小步长造成缓慢进展、过大步长可能导致发散的原因。
一个参数,就能看出四种结果
下面是纯教学算例,不是真实神经网络的训练记录。设模型只有一个参数 w,损失为 L(w) = (w − 3)² / 2。最低点显然在 w = 3,此时损失为零;梯度是 w − 3。
从 w = 0 出发,先看学习率为 0.5 的情况。第一次更新得到 0 − 0.5 × (0 − 3) = 1.5,之后依次是 2.25、2.625。每一步都更接近 3,距离不断减半。
若学习率只有 0.01,第一步只能到 0.03,离 3 仍然很远。它没有走错方向,却需要更多次更新。步长过小的代价,主要体现在取得同等进展所需的计算上。
把学习率改成 1.5,参数依次变成 0、4.5、2.25、3.375。它反复跨过最低点,但距离仍然减半,损失也持续下降。因此,跨过目标或参数来回变号,本身并不等于训练失败,要看偏离的幅度是否缩小。
学习率为 2 时,参数在 0 和 6 之间往返;两处损失都为 4.5,始终没有进展。再增加到 2.5,参数变成 0、7.5、−3.75、13.125,离最低点越来越远。每一步都用了当前位置的负梯度,结果仍然发散。
为什么局部正确,合起来仍然走偏
在这个算例中,把更新式整理一下,就得到“新参数 − 3 = (1 − 学习率) × (旧参数 − 3)”。也就是说,每次更新都把与最低点的偏差乘以同一个系数。
系数的绝对值小于 1,偏差就逐渐缩小;等于 1,偏差不缩小;大于 1,偏差就会放大。因此,对这个特定损失、固定学习率和精确梯度,从非最优位置出发,收敛条件是学习率大于 0 且小于 2。这里的 2 来自损失函数本身,不能当作训练 AI 的通用阈值。
例如,若把损失整体乘以 10,最低点仍在 3,但梯度也乘以 10,同样的学习率就会产生十倍的更新。可见,不同任务之间只比较“我用了 0.01、你用了 0.1”,往往缺少必要背景。
真实模型有很多参数,不同方向的弯曲程度也不同。某个步长在变化平缓的方向显得保守,在变化陡峭的方向却可能过大。一个简单的碗状函数能解释风险,但不足以给复杂网络提供统一的最佳数值。
训练曲线抖动,不一定只怪学习率
实际训练往往每次抽取一小批样本计算梯度,而不是每一步都处理整个训练集。换一批样本,估计出的方向和损失就可能变化。《动手学深度学习》的小批量章节说明了用一批样本的平均梯度进行更新,以及这种估计的统计性质。
因此,训练曲线中的一次上跳,不能单独证明学习率太大。即使整体正在改善,不同批次之间也会有波动;反过来,持续增长、长期不改善或出现异常数值,则需要进一步检查,而不能都归结为“正常随机性”。
斯坦福 CS231n 的训练笔记建议观察损失、训练与验证表现,以及参数更新相对参数本身的大小。比较不同学习率时,应尽量保持数据划分、模型和其他设置一致,并看一段训练过程,而不是只挑一个好看的点。
缩小学习率也不是万能办法。梯度计算错误、数据处理问题或不合适的损失设计,都可能让训练不顺利。选择步长,需要与检查这些环节一起进行。
损失降下来了,还要问学会了什么
即使优化过程顺利,训练样本上的损失不断降低,也不保证新样本上的表现同时改善。《Deep Learning》第八章明确区分了机器学习训练与纯粹的函数最小化:我们降低训练目标,是希望改善模型面对未见数据时的表现,两者不能直接画等号。
验证集提供训练样本之外的检验,但它也必须符合实际要解决的问题。若反复根据同一验证集挑选方案,也要保留独立的最终评估,避免把挑选过程中的好运当成稳定能力。
学习率解决的是“根据当前信号改多少”的问题。读懂一次调整,既要看方向,也要看幅度、随后的变化和独立检验。还有一个更早的问题:系统收到的纠错信息,是否已经把错在哪里讲清楚?

发表回复