第八部分 · 学习就是优化
梯度下降:沿着坡一步步走到底
我们有了最快下坡的方向 −∇L,也能高效地把它算出来。可"知道往哪走"不等于"会走"。一步迈多大?冲过头会发散,挪太慢要等到天荒地老。把方向变成一条真正走得到谷底的路线,这条规则叫梯度下降。
留下的问题:梯度只告诉我们方向(−∇L 是最快下坡)和陡度。可它没说一步该迈多大。梯度本身只是"此刻的局部坡度",沿它直冲并不能一步到谷底;走多大、走多少步、会不会冲过头,都还没回答。
本课新增:梯度下降——一条朴素到极致的更新规则:"站在当前参数,朝 −∇L 迈一小步,到了新位置重新算梯度,再迈一步,如此反复。"那"一小步"的大小由学习率 η 控制:太大震荡甚至发散,太小慢如蜗牛。再补上随机梯度下降(SGD)让它在海量数据上跑得起来,和动量让它走得更稳更快。这就是几乎所有神经网络训练的内核。
从"方向"到"路线":一步一步地走
梯度给的是局部信息——只在当前这一点告诉你最陡下坡朝哪。地形是弯的,沿当前方向直冲很快就会"偏"。聪明的办法不是一口气冲到底,而是走小步、勤回头:迈一小步到新位置,重新算那里的梯度(方向可能已经变了),再迈一小步。像在浓雾里下山,看不见全貌,但每一步都摸清脚下哪边更低,然后朝那边挪一点。只要每步都让海拔下降,反复迭代,就能一路摸到谷底附近。
这把"找最低点"这个一蹴而就办不到的难题,拆成了一连串简单的小步。每一步只需要当前点的梯度——而梯度,上一课已经能高效算出来了。整套思路就是:
更新规则:w ← w − η·∇L
把上面那句话写成一行公式,就是整个深度学习训练的心脏:
逐字拆开:沿哪个方向由 −∇L 决定(下坡最快);迈多大由 η 和该点坡度共同决定——坡越陡(梯度越长)这一步迈得越远,接近谷底时坡变缓、步子自然变小,慢慢停下来。这是个很美的自适应性质:它会自己"踩刹车"。
用第 25 课的例子 L(w)=w²(∇L=2w)走两步,取 η=0.1、起点 w=5:第一步 w ← 5 − 0.1×(2×5) = 5 − 1 = 4;第二步 w ← 4 − 0.1×8 = 3.2;再下去 2.56、2.048……一路朝最低点 w=0 收敛,且越靠近走得越慢。下面的小实验把这个过程画在损失曲面上:拖动学习率滑块,亲眼看它太大怎么发散、太小怎么龟速、刚好怎么稳稳滑到谷底。
学习率 η:这一步的成败全在它
更新规则只有一个旋钮,却最难调,它就是学习率 η。三种典型情形:
- η 太小:每步挪一丁点,方向虽对,却要走成千上万步才接近谷底——训练慢到不可接受,还容易半路被卡住。
- η 太大:一步迈过了头,冲到对面坡上比原来还高,下一步又冲回来——在谷底两侧来回横跳。再大一点,每次跳得比上次更远,损失越来越大直至发散(数值爆炸成 NaN)。
- η 刚好:每步都实实在在下降,平滑地滑向谷底。这个"刚好"的范围和地形的陡峭程度(二阶曲率,即第 25 课提过的海森)有关,实践中要靠试。
所以训练里第一个要调、也最值得调的超参数,往往就是学习率。现代做法还会让它随训练逐渐变小(学习率衰减):开头大步快速接近,后期小步精细收敛——大步找方向、小步抠细节。
随机梯度下降(SGD):别每步都看全部数据
有个现实问题:损失是在全部训练数据上定义的。若每走一步都要把几百万、上亿条数据全过一遍才算出一个梯度,一步就慢得离谱。随机梯度下降(SGD)的妙招是:每步只随机抽一小批数据(mini-batch),用这小批估出一个近似梯度就立刻更新。
反直觉的是,这点噪声不全是坏事:它像给小球加了点随机抖动,有机会把它从浅坑里抖出来,反而帮上忙。"全量精确但极慢"换成"小批带噪但飞快",是深度学习能在海量数据上训练的关键工程权衡。你在 gpt_mini 看到的 batch、step,正是这件事。
动量:给下坡的小球加上惯性
纯 SGD 在"细长山谷"里会犯一个毛病:沿陡的那个方向来回横跳,沿平缓的谷底方向却挪得很慢,整体走成一条低效的"之"字形。动量借用物理直觉来治它:不只看当前这一步的梯度,还累积过去的方向,像一个真有质量、有惯性的小球——
效果就像让小球真的从坡上滚下来:一致的方向越滚越快,左右乱晃则被惯性熨平。在上面的小实验里勾上"动量",能看到它在同样学习率下更稳、更快地冲向谷底。Adam 等现代优化器,本质上是在动量之上再做更聪明的自适应步长,但内核仍是这条"沿 −∇L 走、带点惯性"的规则。
它会停在哪?——埋下凸性的伏笔
梯度下降何时停?当梯度 ∇L ≈ 0 时,更新量趋近于零,它就"走不动"了——停在一个各方向都平的点。可第 25 课的最后一个误解早已警告过:梯度为零的点不一定是全局最低,可能是局部极小,甚至马鞍点。这就引出一个让人不安的问题:
这个问题的答案,要靠地形的一类特殊形状——凸。当损失是凸的(像一个标准的碗,只有一个谷),局部最优就是全局最优,梯度下降必到真底。下一课正是研究这件事。
常见误解
- "学习率越大学得越快。" 只在一个范围内成立。超过临界值,步子迈过头会横跳,再大就发散(损失飙升成 NaN)——不是更快,是直接崩。快与稳之间有个甜区,得调。
- "梯度下降一定能找到全局最优。" 不一定。它只保证沿坡局部下降,可能卡在局部极小或马鞍。只有损失是凸的才有全局保证——下一课的主题。神经网络的损失通常非凸,靠 SGD 的噪声、动量和好的初始化才训练得好。
- "SGD 比全量梯度下降更不准,所以更差。" 单步看确实更"歪",但它便宜得多,同样时间能走多得多的步,整体反而又快又好;而且那点噪声还能帮忙逃出浅坑。这是工程上的明智权衡。
- "梯度为零就到了最低点。" 梯度为零只意味着各方向都平——可能是谷底,也可能是山顶或马鞍。要分清得看二阶曲率(海森),或者干脆要求损失是凸的。