梯度下降与优化器
知道了往哪边走是下坡,一步该迈多大?
更新一步,损失反而涨了
上一课,那台猜水果的机器终于有了损失——知道自己每次猜得有多差。这一课就来干正事: 调参数把损失降下去,也就是真正地训练它。用的就是第 5 课《梯度》学过的蒙眼下山。
回忆一下:梯度 ∇L 指出最陡的上坡方向,朝它的反方向迈步就是下坡。写成更新公式:
听上去万无一失,可真迈一步就翻车。为了把账算清楚,我们盯住其中一个权重 , 把「 取不同值时、损失有多大」画成一条山谷曲线。假设这台机器的损失随 变化恰好长这样:
这是一条开口向上的抛物线,谷底在 (那里损失为 0),离谷底越远、损失越大。 训练要做的就是把 一步步挪向谷底。现在机器的权重停在 ,先算它此刻的损失——把 0.5 代进去:
再算梯度(也就是这条曲线在 处的斜率)。对 求导 (第 5 课的法则:平方求导、再乘内层那项的导数 1)得 ,代入 :
负号说明「往右( 变大)是下坡」。按更新公式 迈一步:
这一步把 从 0.5 直接甩到了 12.5。它到底落到山谷的哪儿?再把 12.5 代回损失:
损失从 24 不降反升、飙到了 96!方向其实没错(确实朝着下坡迈), 问题出在步子:一步迈了整整 12,直接飞过谷底(),冲到对面更高的山坡上。 看来「方向对」不等于「走得到谷底」——还得管住步幅。把刚才这一步画到那条山谷曲线上,就一目了然:
学习率 α:步子迈多大
加入学习率后,更新公式变为:
通常是 0.001 到 0.1 之间的一个小数。但选多大,是整个训练过程中最重要也最棘手的决定:
实践中用学习率调度(LR scheduling):训练初期用较大的学习率快速接近最优区域, 后期逐渐降低——如余弦退火(cosine annealing)或线性预热(linear warmup)。
光说不练没感觉。下面把那台猜水果的机器缩到只看「颜色」一个特征(这样整台机器和每一步都看得清清楚楚), 给它 8 个已知答案的水果当训练数据,让你亲手一步步训练它:
盯着 、 和损失这三个数字跳动,你看到的就是训练的全部秘密: 算梯度 → 朝反方向挪一小步 → 重复。几亿个参数的大模型,做的也只是同一件事,只是数字更多。
但学习率还不是最大的问题。有一个更基本的困难正在等着我们。
另一个问题:梯度算在哪些数据上?
目前为止,∇L 是基于所有训练样本的平均损失算出来的。 更新一次参数,需要把整个训练集都喂给网络跑一遍。 GPT-3 的训练集有 3000 亿个 token——每次更新参数前要扫完 3000 亿条数据, 一天下来可能只更新几次,这显然行不通。
假设你有 10 亿条训练数据,每条数据做一次前向传播需要 1ms, 那仅仅算一次梯度就需要 10 亿 ms = 277 小时。 更新一次参数就要等 11 天——这完全没有实用价值。
Mini-batch SGD:用噪声换速度
每次从训练集随机抽取 B 条样本(一个 batch),计算这 B 条的平均梯度,更新一次参数。 B 通常是 32、64、128——随 GPU 显存大小调整。
这叫 Mini-batch 随机梯度下降。「随机」指的是每次随机抽取一个 batch—— 每次算出的梯度不是真正的全量梯度,有一定噪声。
噪声有时反而有好处:它帮助模型跳出「小坑」(局部最小值), 找到泛化能力更好的参数区域。纯全量梯度太精确,反而更容易陷入局部最优。
一个 epoch 是扫完整个训练集一遍。完整训练通常需要几十到几百个 epoch, 每个 epoch 里有「数据集大小 / B」次参数更新。
还不够好:峡谷地形与 Adam
Mini-batch SGD 还有一个麻烦:在「峡谷地形」(某方向坡度很陡、另一方向很平缓)里, 参数会沿陡峭方向来回震荡,沿平缓方向却走得极慢。
修补:加入动量(Momentum)——给更新加入惯性, 用历史梯度的加权平均代替单步梯度:
90% 保留上一步的方向,10% 接受新梯度。陡峭方向的来回震荡相互抵消, 平缓方向的梯度逐步积累速度——轨迹更平滑,收敛更快。
现代训练几乎都用 Adam(Adaptive Moment Estimation): 在动量的基础上,还为每个参数维护一个自适应的学习率—— 更新频繁的参数自动降低学习率,稀疏参数自动提高。
Adam 的默认参数(α=0.001, β₁=0.9, β₂=0.999)在绝大多数任务上开箱即用, 不需要精细调节。Transformer 几乎清一色用 Adam 或其变种 AdamW。
总结
梯度告诉方向,学习率 α 控制步长。 全量太慢,单样本太抖,Mini-batch 折中。Adam 把动量和自适应学习率合二为一, 是现代深度学习训练的事实标准。
这一课你亲手发现了
- 学习率 α:控制每次更新步长;太大震荡,太小极慢。
- 全批量 GD:梯度精确但每步代价极高,不可行。
- Mini-batch SGD:每次用 B 个样本估算梯度,速度和精度的折中。
- 动量:用历史梯度加权平均,平滑轨迹,加速收敛。
- Adam:动量 + 自适应学习率;开箱即用,现代训练标配。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
反向传播
有了 Adam,但梯度怎么算?对几亿个参数逐个试探需要几亿次前向传播——肯定有更好的办法。