机器学习入门(4):梯度下降
梯度下降:模型到底是怎么把参数调对的
前面几篇已经讲了三件事:
第一,模型本质上是在根据数据找规律。
第二,不管是线性回归还是逻辑回归,模型里都有参数。
第三,模型预测得准不准,要靠损失函数来衡量。
那接下来就会有一个很自然的问题:
模型明明一开始什么都不会,它到底是怎么一步一步把参数调对的?
答案就是这篇要讲的东西:梯度下降(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=1∑n(yi−y^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−η∂w∂L
这个式子看上去有点硬,但拆开看其实不难。
www
这是当前参数。
比如在线性回归里,www 可以理解成直线的斜率。
LLL
这是损失函数。
比如均方误差,或者分类里的交叉熵。
∂L∂w\frac{\partial L}{\partial w}∂w∂L
这表示:
如果参数 www 变化一点点,损失 LLL 会怎么变。
你不用现在就深究“偏导数”这三个字,先把它理解成一个信号就行:
- 如果这个值是正的,说明当前往右走可能会让损失变大
- 如果这个值是负的,说明当前往右走可能会让损失变小
η\etaη
这个叫学习率(learning rate)。
你可以把它理解成“每一步走多大”。
所以整个公式翻译成人话就是:
当前参数 = 旧参数 - 学习率 × 当前应该调整的方向和幅度
也就是说:
- 方向由梯度决定
- 步子有多大由学习率决定
5. 为什么一定要减,不是加
这里很多人第一次看公式时都会有点别扭。
为什么是:
w:=w−η∂L∂w w := w - \eta \frac{\partial L}{\partial w} w:=w−η∂w∂L
而不是加呢?
原因很简单:
因为梯度表示的是“损失上升最快的方向”。
我们现在想做的不是上山,而是下山,所以要朝反方向走。
举个特别简单的例子。
假设当前某个位置的梯度是正数,说明如果你继续往正方向走,损失会继续变大。
那你想让损失变小,就应该往负方向走,也就是“减”。
反过来,如果梯度是负数,那减去一个负数,其实等于加。
这时候参数就会自动朝另一个方向走。
所以你会发现,这个公式看起来固定,其实方向是会根据梯度自动调整的。
6. 学习率到底是什么,为什么它很重要
很多人第一次接触梯度下降时,会觉得梯度最重要。
其实在实际理解里,学习率也非常关键。
因为就算你知道该往哪边走,如果每次走的步子不合适,训练效果一样会很差。
学习率太大
如果步子迈得太大,可能会发生什么?
你本来是在往山谷走,但每次一步跨太远,结果直接从山谷一侧跳到另一侧,又跳回来,再跳过去。
最后就会在最低点附近来回震荡,甚至越来越偏。
也就是说:
学习率太大,模型可能根本收敛不了。
学习率太小
如果学习率特别小,每一步都挪一点点,也会有问题。
虽然方向没错,但走得太慢了。
本来几十步能走到的位置,可能要几千步。
也就是说:
学习率太小,训练会非常慢。
合适的学习率
理想情况是:
- 每一步都朝着让损失变小的方向走
- 不要震荡得太厉害
- 也不要慢得像蜗牛
所以学习率可以理解成一句很朴素的话:
知道往哪走还不够,还得知道一步迈多大。
7. 先看一个最简单的例子,不碰复杂模型
为了让梯度下降更容易理解,我们先不急着上机器学习模型。
先看一个很简单的函数:
L(w)=(w−3)2 L(w) = (w - 3)^2 L(w)=(w−3)2
这个函数的最低点其实很明显。
因为只有当 w=3w=3w=3 的时候,(w−3)2(w-3)^2(w−3)2 才最小,也就是 0。
所以我们的目标就是:
通过梯度下降,让 www 从一个随便的初始值,慢慢逼近 3。
这个函数的梯度是:
dLdw=2(w−3) \frac{dL}{dw} = 2(w - 3) dwdL=2(w−3)
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(0−3)=−6
更新后:
w=0−0.1×(−6)=0.6 w = 0 - 0.1 \times (-6) = 0.6 w=0−0.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.6−3)=−4.8
更新后:
w=0.6−0.1×(−4.8)=1.08 w = 0.6 - 0.1 \times (-4.8) = 1.08 w=0.6−0.1×(−4.8)=1.08
参数继续往 3 靠近。
后面每更新一次,www 都会越来越接近 3,损失也会越来越小。
这就是梯度下降最本质的过程:
不是一下子猜中最优解,而是一步一步往更好的方向逼近。
10. 为什么它不会一步直接走到最优解
这其实和前面说的学习率有关。
每次更新,模型只看当前这个位置附近的信息,然后往更优的方向走一步。
它并不知道“全局答案”在哪里。
所以梯度下降更像是:
边走边修正。
这也是为什么训练模型通常要跑很多轮,而不是一步到位。
你可以把它理解成:
- 当前预测一下
- 发现错了
- 改一点
- 再预测一下
- 再改一点
这个过程会持续很多次,直到损失基本降不下去了。
11. 梯度下降和机器学习模型到底是什么关系
如果前面只看函数例子,你可能会觉得这更像数学练习。
那它和机器学习有什么关系?
关系非常直接。
在线性回归里,模型可能是:
y^=wx+b \hat{y} = wx + b y^=wx+b
这里的参数是 www 和 bbb。
训练时,模型会根据预测结果和真实值之间的差距,计算损失,比如 MSE。
然后再通过梯度下降,不断更新 www 和 bbb,让损失越来越小。
在逻辑回归里也一样。
只不过模型变成了概率输出,损失函数通常变成交叉熵。
但本质没变:
- 先预测
- 再算损失
- 再求梯度
- 再更新参数
所以你会发现,不管模型长什么样,训练过程的核心套路都差不多。
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} ∂w1∂L,∂w2∂L,∂b∂L
然后分别更新:
w1:=w1−η∂L∂w1 w_1 := w_1 - \eta \frac{\partial L}{\partial w_1} w1:=w1−η∂w1∂L
w2:=w2−η∂L∂w2 w_2 := w_2 - \eta \frac{\partial L}{\partial w_2} w2:=w2−η∂w2∂L
b:=b−η∂L∂b b := b - \eta \frac{\partial L}{\partial b} b:=b−η∂b∂L
你可以把它理解成:
每个参数都有自己该走的方向和步子,梯度下降会让所有参数一起朝着让损失变小的方向移动。
如果只有一个参数,损失函数像是一条曲线;
如果有两个参数,损失函数更像是一个曲面;
如果参数更多,它就变成了更高维空间里的“地形”。
虽然我们已经没法直接画出来了,但本质上仍然是在做同一件事:
从当前位置出发,往更低的地方走。
所以高维参数的梯度下降,并不是一种完全不同的方法,而只是把“单参数更新”推广到了“多参数同时更新”。
13. 梯度下降是不是一定能找到最好的结果
这个问题要分开看。
在简单问题里
像前面那个 L(w)=(w−3)2L(w) = (w-3)^2L(w)=(w−3)2,它的形状比较规则,最低点也很明确。
这种情况下,梯度下降通常很容易收敛到最优解。
在复杂问题里
尤其是参数很多、模型很复杂的时候,损失函数的形状可能会非常复杂。
它可能不止一个低点,还可能有很多弯弯绕绕的区域。
这时候梯度下降未必总能到达“全局最优”,但它通常仍然能找到一个足够好的解。
在机器学习里,很多时候这已经够用了。
你现在先不用把注意力放在“全局最优”“局部最优”这些更复杂的话题上。
先把最核心的事记住:
梯度下降的任务,不是魔法般直接找到答案,而是持续让模型变得更好。
14. 一个很容易忽略的点:训练不是“学知识”,而是“调参数”
很多人刚开始学机器学习,会把“训练模型”想得很拟人,好像模型真的在理解什么。
但从梯度下降这个角度看,训练其实非常朴素:
训练就是不断修改参数。
只不过这些参数一旦调得合适,模型就会呈现出“好像学会了规律”的效果。
所以你以后再听到这些词:
- 模型训练
- 参数优化
- 优化器
- 反向传播
你都可以先把它们落回一个最基本的事实:
核心就是想办法把参数调到更合适的位置。
15. 用一句话把整个过程串起来
梯度下降做的事情,其实可以压缩成一句话:
根据损失函数告诉我的错误信息,沿着让损失变小的方向,一步一步更新参数。
这句话如果你真的理解了,后面很多内容都会顺很多。
比如你以后学:
- 神经网络
- 反向传播
- Adam 优化器
- 深度学习训练过程
本质上都还是围绕这件事展开,只是模型更复杂、参数更多而已。
16. 总结
梯度下降这个名字听起来很技术,但它的核心并不神秘。
它做的事情其实很简单:
- 先用当前参数做预测
- 看预测错了多少
- 算出参数该往哪边改
- 再改一点
- 重复很多次
最后让损失越来越小,模型越来越准。
所以如果你问我,机器学习训练过程里最关键的一步是什么,我会说不是某个特定算法,而是这个思路:
模型并不是一开始就知道答案,而是在不断试错里把参数慢慢调对。
这就是梯度下降最重要的意义。
梯度下降的目标,是让损失函数不断变小。
梯度告诉我们,参数应该往哪个方向改。
学习率决定每次改多大。
训练模型的过程,本质上就是不断更新参数。
不管是线性回归、逻辑回归,还是后面的神经网络,背后都离不开这个思路。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)