梯度下降:模型到底是怎么把参数调对的

前面几篇已经讲了三件事:

第一,模型本质上是在根据数据找规律。
第二,不管是线性回归还是逻辑回归,模型里都有参数。
第三,模型预测得准不准,要靠损失函数来衡量。

那接下来就会有一个很自然的问题:

模型明明一开始什么都不会,它到底是怎么一步一步把参数调对的?

答案就是这篇要讲的东西:梯度下降(Gradient Descent)

这个名字听起来比较高级,但它真正的核心思路其实很朴素:

模型先看看自己错了多少,再决定参数该往哪个方向改。


1. 先别急着看公式,先想一个下山的问题

假设你现在站在一座山上,周围全是雾,你看不到整座山的全貌。
你唯一知道的是:你想去山谷,也就是最低点。

这时候你会怎么做?

最自然的做法就是:

  • 先看看脚下附近哪边更低
  • 然后朝更低的方向走一小步
  • 走完以后再看一次
  • 再继续朝更低的方向走

如果你一直这样走,大概率就会慢慢靠近山谷。

这其实就是梯度下降最核心的直觉:

损失函数就像一座山,模型训练的目标就是不断往更低的地方走。

  • 山越高,说明损失越大,模型越不准
  • 山越低,说明损失越小,模型越准

而参数更新的过程,本质上就是在“下山”。


2. 梯度下降到底在优化什么

前一篇说过,模型训练的目标不是随便调参数,而是让损失函数尽可能小

比如在线性回归里,损失函数可以是均方误差:

MSE=1n∑i=1n(yi−y^i)2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

这里你不用重新盯着公式看太久,只需要抓住重点:

损失函数是一个会随着参数变化而变化的值。

比如模型里有一个参数 www,那不同的 www 会对应不同的损失:

  • w=1w=1w=1,损失可能很大
  • w=2w=2w=2,损失可能变小
  • w=3w=3w=3,损失可能更小
  • w=10w=10w=10,损失可能又变大

所以训练模型,本质上就是在找:

哪一组参数,能让损失函数最小。

这件事说白了就是:

不停试着改参数,并且朝着“损失变小”的方向去改。


3. 那“梯度”到底是什么

“梯度”这个词听起来很数学,但先不用把它想得太复杂。

你可以先把它理解成:

当前位置上,损失增加得最快的方向。

既然梯度表示“往上升最快的方向”,那我们想让损失变小,就应该往它的反方向走。

所以梯度下降这个名字其实很好理解:

  • 梯度:告诉你哪里是“往上”
  • 下降:那我们就往反方向走

如果把它说得更直白一点:

梯度负责告诉模型:参数往哪边改,会让结果更好。


4. 参数更新到底是怎么发生的

梯度下降最经典的更新公式是:

w:=w−η∂L∂w w := w - \eta \frac{\partial L}{\partial w} w:=wηwL

这个式子看上去有点硬,但拆开看其实不难。

www

这是当前参数。
比如在线性回归里,www 可以理解成直线的斜率。

LLL

这是损失函数。
比如均方误差,或者分类里的交叉熵。

∂L∂w\frac{\partial L}{\partial w}wL

这表示:
如果参数 www 变化一点点,损失 LLL 会怎么变。

你不用现在就深究“偏导数”这三个字,先把它理解成一个信号就行:

  • 如果这个值是正的,说明当前往右走可能会让损失变大
  • 如果这个值是负的,说明当前往右走可能会让损失变小

η\etaη

这个叫学习率(learning rate)
你可以把它理解成“每一步走多大”。

所以整个公式翻译成人话就是:

当前参数 = 旧参数 - 学习率 × 当前应该调整的方向和幅度

也就是说:

  • 方向由梯度决定
  • 步子有多大由学习率决定

5. 为什么一定要减,不是加

这里很多人第一次看公式时都会有点别扭。

为什么是:

w:=w−η∂L∂w w := w - \eta \frac{\partial L}{\partial w} w:=wηwL

而不是加呢?

原因很简单:

因为梯度表示的是“损失上升最快的方向”。
我们现在想做的不是上山,而是下山,所以要朝反方向走。

举个特别简单的例子。

假设当前某个位置的梯度是正数,说明如果你继续往正方向走,损失会继续变大。
那你想让损失变小,就应该往负方向走,也就是“减”。

反过来,如果梯度是负数,那减去一个负数,其实等于加。
这时候参数就会自动朝另一个方向走。

所以你会发现,这个公式看起来固定,其实方向是会根据梯度自动调整的。


6. 学习率到底是什么,为什么它很重要

很多人第一次接触梯度下降时,会觉得梯度最重要。
其实在实际理解里,学习率也非常关键。

因为就算你知道该往哪边走,如果每次走的步子不合适,训练效果一样会很差。

学习率太大

如果步子迈得太大,可能会发生什么?

你本来是在往山谷走,但每次一步跨太远,结果直接从山谷一侧跳到另一侧,又跳回来,再跳过去。
最后就会在最低点附近来回震荡,甚至越来越偏。

也就是说:

学习率太大,模型可能根本收敛不了。

学习率太小

如果学习率特别小,每一步都挪一点点,也会有问题。

虽然方向没错,但走得太慢了。
本来几十步能走到的位置,可能要几千步。

也就是说:

学习率太小,训练会非常慢。

合适的学习率

理想情况是:

  • 每一步都朝着让损失变小的方向走
  • 不要震荡得太厉害
  • 也不要慢得像蜗牛

所以学习率可以理解成一句很朴素的话:

知道往哪走还不够,还得知道一步迈多大。


7. 先看一个最简单的例子,不碰复杂模型

为了让梯度下降更容易理解,我们先不急着上机器学习模型。
先看一个很简单的函数:

L(w)=(w−3)2 L(w) = (w - 3)^2 L(w)=(w3)2

这个函数的最低点其实很明显。
因为只有当 w=3w=3w=3 的时候,(w−3)2(w-3)^2(w3)2 才最小,也就是 0。

所以我们的目标就是:
通过梯度下降,让 www 从一个随便的初始值,慢慢逼近 3。

这个函数的梯度是:

dLdw=2(w−3) \frac{dL}{dw} = 2(w - 3) dwdL=2(w3)


8. 用 Python 看看参数是怎么一步步靠近正确值的

下面直接看代码:

w = 0.0          # 参数初始值
lr = 0.1         # 学习率
epochs = 20      # 更新次数

for i in range(epochs):
    loss = (w - 3) ** 2
    grad = 2 * (w - 3)
    w = w - lr * grad
    
    print(f"第{i+1}次更新: w={w:.4f}, loss={loss:.4f}")

这段代码只有几行,但很适合理解梯度下降。

初始值

w = 0.0

一开始参数是 0。
而我们知道最优值其实是 3,所以它现在离目标还很远。

损失

loss = (w - 3) ** 2

当前参数离 3 越远,损失越大。

梯度

grad = 2 * (w - 3)

这个梯度会告诉我们:现在参数应该朝哪边改。

更新

w = w - lr * grad

这就是梯度下降最核心的一步。


9. 这段代码运行时,发生了什么

假设一开始 w=0w=0w=0

那么:

grad=2(0−3)=−6 grad = 2(0-3) = -6 grad=2(03)=6

更新后:

w=0−0.1×(−6)=0.6 w = 0 - 0.1 \times (-6) = 0.6 w=00.1×(6)=0.6

你会发现,参数从 0 变成了 0.6。
也就是说,它开始往 3 靠近了。

再来一次:

grad=2(0.6−3)=−4.8 grad = 2(0.6-3) = -4.8 grad=2(0.63)=4.8

更新后:

w=0.6−0.1×(−4.8)=1.08 w = 0.6 - 0.1 \times (-4.8) = 1.08 w=0.60.1×(4.8)=1.08

参数继续往 3 靠近。

后面每更新一次,www 都会越来越接近 3,损失也会越来越小。

这就是梯度下降最本质的过程:

不是一下子猜中最优解,而是一步一步往更好的方向逼近。


10. 为什么它不会一步直接走到最优解

这其实和前面说的学习率有关。

每次更新,模型只看当前这个位置附近的信息,然后往更优的方向走一步。
它并不知道“全局答案”在哪里。

所以梯度下降更像是:

边走边修正。

这也是为什么训练模型通常要跑很多轮,而不是一步到位。

你可以把它理解成:

  • 当前预测一下
  • 发现错了
  • 改一点
  • 再预测一下
  • 再改一点

这个过程会持续很多次,直到损失基本降不下去了。


11. 梯度下降和机器学习模型到底是什么关系

如果前面只看函数例子,你可能会觉得这更像数学练习。
那它和机器学习有什么关系?

关系非常直接。

在线性回归里,模型可能是:

y^=wx+b \hat{y} = wx + b y^=wx+b

这里的参数是 wwwbbb
训练时,模型会根据预测结果和真实值之间的差距,计算损失,比如 MSE。
然后再通过梯度下降,不断更新 wwwbbb,让损失越来越小。

在逻辑回归里也一样。
只不过模型变成了概率输出,损失函数通常变成交叉熵。
但本质没变:

  • 先预测
  • 再算损失
  • 再求梯度
  • 再更新参数

所以你会发现,不管模型长什么样,训练过程的核心套路都差不多。


12. 如果参数不止一个怎么办

前面的例子里只有一个参数 www,所以很好理解。
但真实模型里通常不止一个参数。

比如一个简单一点的线性模型就可能长这样:

y^=w1x1+w2x2+b \hat{y} = w_1x_1 + w_2x_2 + b y^=w1x1+w2x2+b

这里就已经有三个参数了:

  • w1w_1w1
  • w2w_2w2
  • bbb

如果特征更多,参数还会继续增加。
到了更复杂的模型里,参数可能是几百个、几万个,甚至更多。

那这种情况下怎么做梯度下降?

思路其实没变,只是从“改一个参数”变成了“同时改很多个参数”。

也就是说,模型会分别计算每个参数对应的梯度,比如:

∂L∂w1,∂L∂w2,∂L∂b \frac{\partial L}{\partial w_1}, \quad \frac{\partial L}{\partial w_2}, \quad \frac{\partial L}{\partial b} w1L,w2L,bL

然后分别更新:

w1:=w1−η∂L∂w1 w_1 := w_1 - \eta \frac{\partial L}{\partial w_1} w1:=w1ηw1L

w2:=w2−η∂L∂w2 w_2 := w_2 - \eta \frac{\partial L}{\partial w_2} w2:=w2ηw2L

b:=b−η∂L∂b b := b - \eta \frac{\partial L}{\partial b} b:=bηbL

你可以把它理解成:

每个参数都有自己该走的方向和步子,梯度下降会让所有参数一起朝着让损失变小的方向移动。

如果只有一个参数,损失函数像是一条曲线;
如果有两个参数,损失函数更像是一个曲面;
如果参数更多,它就变成了更高维空间里的“地形”。

虽然我们已经没法直接画出来了,但本质上仍然是在做同一件事:

从当前位置出发,往更低的地方走。

所以高维参数的梯度下降,并不是一种完全不同的方法,而只是把“单参数更新”推广到了“多参数同时更新”。


13. 梯度下降是不是一定能找到最好的结果

这个问题要分开看。

在简单问题里

像前面那个 L(w)=(w−3)2L(w) = (w-3)^2L(w)=(w3)2,它的形状比较规则,最低点也很明确。
这种情况下,梯度下降通常很容易收敛到最优解。

在复杂问题里

尤其是参数很多、模型很复杂的时候,损失函数的形状可能会非常复杂。
它可能不止一个低点,还可能有很多弯弯绕绕的区域。

这时候梯度下降未必总能到达“全局最优”,但它通常仍然能找到一个足够好的解。
在机器学习里,很多时候这已经够用了。

你现在先不用把注意力放在“全局最优”“局部最优”这些更复杂的话题上。
先把最核心的事记住:

梯度下降的任务,不是魔法般直接找到答案,而是持续让模型变得更好。


14. 一个很容易忽略的点:训练不是“学知识”,而是“调参数”

很多人刚开始学机器学习,会把“训练模型”想得很拟人,好像模型真的在理解什么。

但从梯度下降这个角度看,训练其实非常朴素:

训练就是不断修改参数。

只不过这些参数一旦调得合适,模型就会呈现出“好像学会了规律”的效果。

所以你以后再听到这些词:

  • 模型训练
  • 参数优化
  • 优化器
  • 反向传播

你都可以先把它们落回一个最基本的事实:

核心就是想办法把参数调到更合适的位置。


15. 用一句话把整个过程串起来

梯度下降做的事情,其实可以压缩成一句话:

根据损失函数告诉我的错误信息,沿着让损失变小的方向,一步一步更新参数。

这句话如果你真的理解了,后面很多内容都会顺很多。

比如你以后学:

  • 神经网络
  • 反向传播
  • Adam 优化器
  • 深度学习训练过程

本质上都还是围绕这件事展开,只是模型更复杂、参数更多而已。


16. 总结

梯度下降这个名字听起来很技术,但它的核心并不神秘。

它做的事情其实很简单:

  • 先用当前参数做预测
  • 看预测错了多少
  • 算出参数该往哪边改
  • 再改一点
  • 重复很多次

最后让损失越来越小,模型越来越准。

所以如果你问我,机器学习训练过程里最关键的一步是什么,我会说不是某个特定算法,而是这个思路:

模型并不是一开始就知道答案,而是在不断试错里把参数慢慢调对。

这就是梯度下降最重要的意义。


梯度下降的目标,是让损失函数不断变小。

梯度告诉我们,参数应该往哪个方向改。

学习率决定每次改多大。

训练模型的过程,本质上就是不断更新参数。

不管是线性回归、逻辑回归,还是后面的神经网络,背后都离不开这个思路。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐