梯度下降与优化器
用已经算出的梯度更新参数:学习率、Mini-batch、动量、Adam 与 AdamW。
更新一步,损失反而涨了
上一课已经算出了参数梯度。本课使用它们来更新水果机器:梯度描述方向与敏感度,学习率控制尺度,优化器决定怎样利用历史信息。这里的训练台继续沿用原案例,不改变已有操作。
回忆一下:梯度 ∇L 指出最陡的上坡方向,朝它的反方向迈步就是下坡。写成更新公式:
听上去万无一失,可真迈一步就翻车。为了把账算清楚,我们盯住其中一个权重 , 把「 取不同值时、损失有多大」画成一条山谷曲线。假设这台机器的损失随 变化恰好长这样:
这是一条开口向上的抛物线,谷底在 (那里损失为 0),离谷底越远、损失越大。 训练要做的就是把 一步步挪向谷底。现在机器的权重停在 ,先算它此刻的损失——把 0.5 代进去:
再算梯度(也就是这条曲线在 处的斜率)。对 求导 (第 08 课的法则:平方求导、再乘内层那项的导数 1)得 ,代入 :
负号说明「往右( 变大)是下坡」。按更新公式 迈一步:
这一步把 从 0.5 直接甩到了 12.5。它到底落到山谷的哪儿?再把 12.5 代回损失:
损失从 24 不降反升、飙到了 96!方向其实没错(确实朝着下坡迈), 问题出在步子:一步迈了整整 12,直接飞过谷底(),冲到对面更高的山坡上。 看来「方向对」不等于「走得到谷底」——还得管住步幅。把刚才这一步画到那条山谷曲线上,就一目了然:
学习率 α:步子迈多大
加入学习率后,更新公式变为:
通常是 0.001 到 0.1 之间的一个小数。但选多大,是整个训练过程中最重要也最棘手的决定:
学习率调度随训练改变步长: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—— 每次算出的梯度不是真正的全量梯度,有一定噪声。
Mini-batch 梯度带有采样噪声,能降低每次更新成本,也可能影响优化路径和泛化;它不保证跳出局部极小值,全批量方法也并非必然更差。
一个 epoch 是扫完整个训练集一遍。完整训练通常需要几十到几百个 epoch, 每个 epoch 里有「数据集大小 / B」次参数更新。
还不够好:峡谷地形与 Adam
Mini-batch SGD 还有一个麻烦:在「峡谷地形」(某方向坡度很陡、另一方向很平缓)里, 参数会沿陡峭方向来回震荡,沿平缓方向却走得极慢。
修补:加入动量(Momentum)——给更新加入惯性, 用历史梯度的加权平均代替单步梯度:
90% 保留上一步的方向,10% 接受新梯度。陡峭方向的来回震荡相互抵消, 平缓方向的梯度逐步积累速度——轨迹更平滑,收敛更快。
Adam 维护梯度的一阶矩与平方梯度的二阶矩,并作偏差修正。更新用一阶矩除以二阶矩平方根加 ε,不是简单依据参数更新频率分配学习率。
Adam 的 α=0.001、β₁=0.9、β₂=0.999 是常见起点,不是所有任务的保证。大模型训练仍需选择学习率与调度。AdamW 将权重衰减与 Adam 的自适应梯度更新解耦;第 19 课会解释它与正则化的关系。
batch、step、epoch:三种计数不要混
batch 是一次送入计算的数据块;step 通常指一次优化器参数更新;epoch 是遍历训练集一轮。1000 个样本、batch size=64,不丢尾批时一轮有 ceil(1000/64)=16 个 batch;如果每个 batch 更新一次,就有 16 个 step。
梯度累积会让多个 micro-batch 对应一个 optimizer step。每个 step 通常清空旧梯度 → 前向 → 损失 → 反向 → 更新,有意累积时才保留前面 micro-batch 的梯度。
第 18 课将回到第一次更新之前:初始权重和信号尺度是否让这个循环学得动?
总结
梯度告诉方向,学习率 α 控制步长。 全量太慢,单样本太抖,Mini-batch 折中。Adam 把动量和自适应学习率合二为一, 是现代深度学习训练的事实标准。
💡 用大白话梳理:这一课的核心直觉
- 学习率 α:控制每次更新步长;太大震荡,太小极慢。
- 全批量 GD:每次使用整个训练集;大数据下代价高,小问题中仍可以使用。
- Mini-batch SGD:每次用 B 个样本估算梯度,速度和精度的折中。
- 动量:用历史梯度加权平均,平滑轨迹,加速收敛。
- Adam / AdamW:自适应梯度更新;AdamW 解耦权重衰减,仍需验证超参数。
学习小测验
动动脑筋:核心直觉小测验(选出你的答案后点击「提交」,即可查看生动通俗的详细解析)
18 参数初始化与训练稳定性
打破神经元的对称性,控制激活与梯度的尺度,让网络有机会学得动。