跳转至

P2-6.3 梯度下降(gradient descent)的直觉

Section ID: P2-6.3 Version: v2026.07.20

在 P2-6.1 中,我们把最优化看成寻找更好值的问题;在 P2-6.2 中,我们又看到了怎样把模型的错误变成一个叫作 损失(loss) 的数字。现在问题变得更具体了。

一旦出现了一个想要减少的数字,我们就必须继续问:模型的值到底该怎么改?

梯度下降(gradient descent) 就是对这个问题的代表性回答。名字听起来很难,但核心很简单。

这里会重新整理 梯度下降(gradient descent)梯度(gradient)学习率(learning rate)更新(update)重复(iteration)。如果说 6.2 是在读损失与目标函数,那么现在这一节就是在整理:为了让那个值下降,参数到底怎样一点点地移动。

这里并不是要严格推导梯度下降公式,而是把重点放在:阅读那种为了减少损失、反复一点点改值的方法。如果在这里先抓住梯度方向、反方向移动、学习率的角色,那么以后即使出现反向传播(backpropagation)与优化器(optimizer),也能先理解为什么需要那样的计算。

回到 6.1 和 6.2 的共同场景

继续保留前一节的数据。

学生 学习时间 x 实际分数 y
A 1 55
B 2 65
C 3 80
D 4 90

然后,先把当前的候选直线设成 \(\hat{y} = 8x + 45\)。这条直线会把学生 C、D 的分数预测得偏低一些。现在梯度下降的问题就是:如果想让这个损失下降,a 和 b 应该朝哪个方向移动、又该移动多少?

也就是说,Chapter 6 的三节可以被读成下面这一条完整流程。

  1. 6.1:我们必须比较候选直线。
  2. 6.2:比较标准就是损失。
  3. 6.3:让候选朝着损失下降的方向一点点移动。

也就是说,我们先看当前这个位置上,损失朝哪个方向会变大,然后朝反方向小幅移动,再重新看损失,并不断重复。

如果先把它放到损失曲线上看,梯度下降就是一种方法:从当前位置出发,不断用小步朝损失更低的方向移动。

梯度下降在损失曲线上用小步朝更低损失移动的流程

如果把这种移动读成一个学习循环,就像下面这样。

flowchart TD
  A["当前参数"]
  B["梯度方向<br/>损失增大的方向"]
  C["学习率<br/>步长"]
  D["更新后的参数"]
  E["重新计算损失"]

  A --> B
  B --> C
  C --> D
  D --> E
  E --> A

核心判断标准:梯度下降(gradient descent)的直觉

  • 能把 梯度下降(gradient descent) 解释成一种为了降低损失而不断重复的小步移动方法。
  • 能说明 梯度(gradient) 是当前位置的方向信息。
  • 能说明为什么要朝梯度的反方向移动。
  • 能把 学习率(learning rate) 解释成一次移动多少的值。
  • 能用入门层次说明梯度下降的局限和需要注意的地方。

三个判断标准

标准 为什么重要 这里需要的理解层次
梯度下降是在重复小步朝损失下降的一边移动 它说明学习不是一次跳到答案,而是反复调整。 理解它是“反复一点点移动”的结构。
必须朝梯度的反方向移动 因为梯度告诉我们的是损失增加的方向,所以目标必须反着读。 只要能说明为什么叫作 descent 就足够。
学习率决定一次迈多大步 即使方向正确,如果步幅不对,学习也会摇晃或变慢。 抓住把学习率读成“步子大小”的感觉。

“下山”比喻很有用,但并不完整

梯度下降经常用“从山上往下走”来说明。站在高处,看看周围坡度,再一点点往更低的方向走。

这个比喻非常适合第一次理解。可以把当前位置看成当前模型参数,把高度看成损失值,把往下走的方向看成损失下降的方向。

但如果太相信这个比喻,也会产生误解。实际模型学习里,我们并不是一眼看见整座山的完整地图。我们只是在当前位置附近读方向,稍微动一下,然后再重新确认。

所以梯度下降不是一种一下跳到答案的方法,而是一种利用当前信息去一点点改善的重复方法。

在学习时间-分数这个例子里也是一样。如果当前这条直线整体上把学生 C、D 的分数预测得偏低,那么我们不是一下点出完美直线,而是反复去确认:如果把斜率 a 稍微调大一点,损失会不会下降?如果把截距 b 稍微调一下,会不会更好?

梯度告诉我们“往上升”的方向

梯度(gradient) 和这样一种方向有关:在当前位置,函数值增长最快的方向。放到损失函数(loss function)上来读,梯度方向就是损失会变大的方向。

而在 AI 学习里,我们通常想让损失下降。所以我们不会沿着梯度指向的方向走,而是沿着它的反方向走。梯度方向是损失会升高的一边,而梯度的反方向则是损失会下降的一边。

这就是 descent 这个词的核心。我们会计算 gradient,但目的不是往上爬,而是往下走。

对读者来说,重要的解释是这样的:如果当前这条直线整体上把分数预测得偏低,那么为了减少损失,通常就需要朝着把预测值抬高的方向去动。真正的计算里,梯度会把这种方向信息用数字给出来。

必须只移动一点点

即使知道了损失下降的方向,也不代表可以一下跳很远。当前位置上的梯度,只是当前位置附近的信息。如果移动太大,就可能不是去到更低的地方,而是直接跨过去。

所以梯度下降需要 学习率(learning rate)。学习率就是决定一次移动多少的值。学习率太小,移动会太慢;如果合适,损失就可能稳定下降;如果太大,就可能越过好位置,或者让损失不断摇摆。

这里把学习率理解成 步子大小。方向知道了,但如果步子太大或太小,学习都会变得困难。

例如,如果把斜率 a 一次调得太大,学生 D 那边的误差也许会变小,但学生 A、B 那边反而会被调过头。反过来,如果一次只改得非常少,即使知道损失下降的方向,改善速度也会非常慢。学习率就是用来决定这个步幅的。

在工作里,到底是什么被一点点改动

如果只把梯度下降想成 修改 AI 模型内部数字的方法,它会显得很远。从工作视角看,它更像这样:先定目标,用当前设置产出结果,再把结果有多糟用数字表示出来,然后朝着让这个数字下降的方向稍微改一下设置,再重新检查。

这套结构可以用不同工作场景来想。

工作场景 想减少什么 一点点改什么 梯度下降式视角
广告文案推荐 点击太少、转化太低 文案候选分数、曝光顺序 反复调整哪些表达能带来更好结果
商品推荐 给用户推荐了他不感兴趣的商品 商品权重、用户偏好表示 看着推荐损失去调整用户与商品表示
需求预测 实际销量与预测销量的差距 季节性、价格、活动影响的权重 朝着让预测误差下降的方向调整模型值
缺陷检测 把正常产品判成缺陷、或漏掉缺陷 传感器值的重要度、判断边界 小步移动标准,让错误判断减少
配送时间预测 实际到达时间与预测到达时间的差距 距离、时间段、交通变量的影响 朝着让误差下降的方向调整变量影响力

这里最重要的一点是:人并不是把所有业务规则一条条写完再塞进去。人负责设定目标、数据与损失,而模型会通过重复计算去调整自己的内部值。像 "下雨就多加 10 分钟" 这种直接写规则的方式,更接近规则式方法;而模型根据损失,从数据里调整下雨、距离、时间段、车流量等因素的影响,则更接近学习式方法。

这个例子并不是说梯度下降会自动解决一切业务问题。业务里还需要数据质量、目标设定、成本、安全、可解释性等条件一起存在。梯度下降回答的是其中一个计算问题:为了减少给定的损失,数值到底应该怎样变化?

更新公式是把“移动结构”压缩写出来

梯度下降通常会写成类似下面的公式。

\[ \theta_{\text{new}} = \theta_{\text{old}} - \eta \nabla J(\theta) \]

乍一看它很复杂,但读法其实很简单。

符号 入门意义
\(\theta\) 模型会调整的参数(parameter)
\(J(\theta)\) 我们想要减少的目标函数(objective function)
\(\nabla J(\theta)\) 当前位置上损失会变大的方向信息
\(\eta\) 学习率(learning rate),一次移动的大小
\(-\eta \nabla J(\theta)\) 朝着损失下降的一边小幅移动的量

这里不是要推导这个式子,而是去读它在说的结构。也就是说,把它读成:从当前参数出发,按学习率大小,朝梯度反方向小幅移动。

如果用共同场景来读,\(\theta\) 就是这条直线的 ab,而 \(J(\theta)\) 是在四个学生整体上算出来的平均损失。这个公式本质上就是把一句话压缩写出来:看当前直线有多不贴合数据,然后朝更贴合数据的那条直线方向小幅移动。

为什么重复看起来像“学习”

梯度下降会不断重复同样的事情。

  1. 用当前参数做预测。
  2. 计算损失。
  3. 计算梯度。
  4. 把参数改一点。
  5. 再预测一次。

这种重复,就是它看起来像 训练(training) 核心流程的原因。与其说模型自己“理解了概念”,不如说它是在沿着让损失下降的方向调整内部值。

读者在这里需要真正理解的关键,是 人把正确直线直接写出来模型看着损失一点点改直线 之间的区别。前者更接近把规则直接写进去,而后者更接近根据数据和损失去学习。

这里重要的是,模型并不会直接收到 正确规则。模型是用当前参数做预测,看损失,再利用方向信息去调整参数。直接写正确规则的做法更接近规则式方法,而沿着让损失下降的方向去改参数,则更接近学习式方法的基本流程。

用案例来看

案例 1. 一个不靠固定规则定价、而是不断微调的推荐系统

假设某个在线服务在调整商品推荐顺序。人可能会先写出一些规则,例如 如果和最近看过的商品相似,就提高分数如果是打折商品,就多展示

但真实点击和购买反应并没有那么简单。对某些用户来说,品牌比折扣更重要;对另一些用户来说,季节性可能比最近行为更重要。如果让人把所有组合都写成规则,很快就会变得极其复杂。

从梯度下降的视角看,模型先给出推荐分数,再把它和真实反应之间的差距算成损失,然后朝着损失下降的方向一点点调内部权重。之所以不一次大改,而是反复小步移动,是因为我们当前看到的方向信息,只在当前位置附近才比较可信。

这个案例能让我们把梯度下降读成 一种看反应、再一点点调标准的重复过程,而不是 一节专门拿来背公式的内容。同时,它也展示了:如果学习率太大,推荐结果会摇晃;如果学习率太小,改善速度又会过慢。

它并不总能保证完美答案

梯度下降很强大,但它不是一种会自动保证完美答案的方法。

结果会受到很多条件影响。

条件 为什么重要
起始位置(initialization) 从哪里出发,会影响路径
学习率(learning rate) 太小会慢,太大会不稳定
损失函数形状(loss landscape) 可能有谷底、平坦区、多个较低位置
数据(data) 损失是从数据里算出来的,所以会受数据质量影响
重复次数(iterations) 太少学得不够,太多又可能过拟合

这也和 6.1 里说过的 最优并不等于完美 连上了。梯度下降是在给定标准和条件内朝更好方向移动的方法。它不会自动解决所有现实条件。

检查清单

  • 能把梯度下降(gradient descent)解释成一种为了降低损失而重复移动的方法。
  • 能说明梯度(gradient)和当前位置上损失增加的方向有关。
  • 能说明为了降低损失,为什么要朝梯度反方向移动。
  • 能把学习率(learning rate)解释成一次移动的大小。
  • 能把梯度下降更新公式读成“从当前值出发,朝梯度反方向小步移动”的结构。
  • 能说明梯度下降会受到起始位置、学习率、损失函数形状、数据、重复次数的影响。
  • 能把“减少损失”与参数实际如何变化连接起来说明。
  • 能区分梯度方向和反方向移动,并说明为什么两者都需要被分开理解。

来源与参考资料

  • Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, Chapter 8: Optimization for Training Deep Models, MIT Press, 2016, 确认日期: 2026-07-20。用于支撑深度学习最优化中成本函数、参数、基于梯度的移动、梯度下降与学习率角色的说明。
  • Stephen Boyd, Lieven Vandenberghe, Convex Optimization, Cambridge University Press, 2004, 确认日期: 2026-07-20。作为在数学最优化语境中确认最优化问题与基于梯度的重复移动的辅助依据。