2026年10月8日

08 梯度下降:调整参数

LLM

梯度下降是整个机器学习的"发动机"。前面说的"训练就是调整参数",具体怎么调,靠的就是它。

一个比喻

想象你被蒙住眼睛,站在一片起伏的山地上,目标是走到山谷最低点。你看不到地形全貌,只能用脚感受脚下的坡度。最合理的策略是:感受哪个方向最陡峭地往下,就朝那个方向迈一小步,然后重新感受,再迈一步。 重复下去,最终会走到一个低点。

对应到机器学习中:

  • 你的位置 = 模型当前的参数值
  • 海拔高度 = 损失(loss),也就是模型预测有多不准
  • 脚下的坡度 = 梯度
  • 迈出的步子大小 = 学习率(learning rate)
  • 山谷最低点 = 损失最小、预测最准的那组参数

含义:拆开这个词

梯度(gradient)是一个数学概念,指函数在某一点上上升最快的方向及其陡峭程度。对一个参数来说,它就是导数:参数稍微增加一点,损失会增加多少。对多个参数来说,就是由每个参数的偏导数组成的向量。

下降(descent)指朝梯度的反方向走。既然梯度指向损失增加最快的方向,那反过来走,损失就减少得最快。

意义:为什么需要它

训练的目标是找到让损失最小的参数。如果函数简单,可以直接用数学公式解出最优值,吴恩达课程里讲线性回归时提过的"正规方程"就是这种做法。但神经网络的损失函数极其复杂,不可能用公式直接求解,更何况参数有上千亿个。

梯度下降的意义在于,它不需要知道全局地形,只需要在当前位置计算出局部坡度,就能一步步逼近更好的参数。这让训练任意复杂、任意规模的模型成为可能。

实现:一个最小的例子

用最简单的模型 y = w × x,只有一个参数 w。假设只有一条数据:x = 2,真实的 y = 6(显然 w 应该是 3)。

损失函数用平方误差:loss = (w × x − y)²

对 w 求导得到梯度:gradient = 2 × (w × x − y) × x

更新规则就是梯度下降的核心公式:

w_新 = w_旧 − 学习率 × 梯度

设初始 w = 0,学习率 = 0.05,手动走几步:

  • 第 1 步:预测 0,梯度 = 2 × (0 − 6) × 2 = −24,w = 0 − 0.05 × (−24) = 1.2
  • 第 2 步:预测 2.4,梯度 = 2 × (2.4 − 6) × 2 = −14.4,w = 1.2 + 0.72 = 1.92
  • 第 3 步:预测 3.84,梯度 = −8.64,w = 2.352
  • ……几十步后,w 会非常接近 3

注意梯度的变化:离目标越远,梯度越大,步子越大;越接近目标,梯度越小,步子自动变小。用代码写出来也只有几行:

w, lr = 0.0, 0.05
x, y = 2.0, 6.0
for step in range(50):
    pred = w * x
    grad = 2 * (pred - y) * x
    w = w - lr * grad
print(w)  # 接近 3.0

从这个例子到大模型

真实训练和这个例子原理完全相同,只是在三个方面放大了:

参数从 1 个变成千亿个。 每个参数都需要算出自己的梯度。神经网络有很多层,手动求导不现实,于是有了反向传播(backpropagation):先正向算出预测和损失,再从输出层往回,用链式法则逐层算出每个参数的梯度。现在 PyTorch 等框架会自动完成这一步,你只需要定义模型和损失函数。

数据从 1 条变成海量。 每走一步都用全部数据算梯度太慢,所以实践中每次随机取一小批数据(mini-batch)计算梯度,叫小批量随机梯度下降。梯度会有些噪声,但速度快得多,而且噪声反而有助于跳出不太好的低点。

更新规则更聪明。 现在大模型训练普遍使用 Adam 等优化器,在基础公式上加入"动量"(参考之前几步的方向,减少来回震荡)和"自适应学习率"(为每个参数单独调整步长)。

学习率为什么这么关键

学习率决定了每一步迈多大。太小,训练极其缓慢;太大,可能一步跨过谷底,在两侧来回震荡甚至越来越远,损失不降反升。你可以把上面代码里的学习率改成 0.3 试试,w 会发散。

这也解释了之前讲 fine-tuning 时提到的"微调要用较小的学习率":模型已经站在一个很好的位置上,你只想在附近微调,如果步子太大,就会把预训练学到的东西"踩坏",这正是微调后模型丧失通用能力的原因之一。