01 核心原理(大白话版)

你做了一锅汤,觉得不够好喝,想改进配方。你可以调整盐的用量——多了太咸,少了没味。怎么找到刚好的量?

一个笨方法:试一点,尝一下,感觉往哪边调更好,就往那边调一点点,再尝,再调……反复几次,越来越接近最好喝的配方。

梯度下降就是这个过程的数学版:把"好不好喝"换成"损失函数",把"往哪边调"换成"梯度方向",把"调一点点"换成"学习率"。

只有三件事

1
算当前有多差(损失函数)

用一个数字衡量模型现在预测得有多烂。这个数字就叫"损失值",我们想让它越小越好。

2
算往哪边调(梯度)

梯度告诉你:参数往哪个方向调,损失会上升最快。那反过来,往反方向调,损失就下降最快。

3
调一小步(学习率)

不能步子太大——一下跨过最低点就麻烦了。用学习率控制每次只调一小步,慢慢逼近最优解。

反复执行这三步,损失值会越来越小,模型越来越准。停下来的时机:梯度接近零(已经在谷底了),或者达到设定的最大迭代次数。

学习率:步子大小是关键

步子太大

像下山时迈大步,一脚踩空到对面山坡,反复横跳永远到不了谷底,损失值震荡甚至越来越大。

步子太小

像蚂蚁挪窝,方向没错但慢得离谱,要迭代几万次才能收敛,实际中根本耗不起。

实践中学习率通常从 0.01 开始试,根据损失曲线再调整。

一步步构建梯度下降

光说不练没用,我们来从零把代码搭出来。

第一步 先定义我们要优化的函数

用一个二次函数 f(x) = ax² + bx + c 模拟"损失函数"——它有一个最低点,我们的目标就是找到它。

第二步 加上循环,让它"跑起来"

有了函数还不够,我们需要反复迭代。先不管方向对不对,随便让 x 动起来看看:

问题很明显:x + 1 是盲目乱走,不知道该往哪边走才能让 f(x) 变小。

第三步 加入导数,让它知道该往哪走

导数(梯度)告诉我们函数在当前点的"坡度"和"方向"。沿负梯度方向走,就是在下坡:

我们已经得到梯度下降的核心雏形。加上收敛判断、可视化就是完整版——看下面的完整代码。

02 代码

03 学术性讲解

梯度下降算法是机器学习中最基础的优化算法。无论是线性回归、神经网络还是深度学习,都离不开梯度下降的身影。它的核心思想非常简单:像下山一样,每一步都往最陡的下坡方向走,直到到达山谷

什么是梯度?

梯度可以理解为当前位置最陡的上升方向。想象你站在一个山谷的斜坡上,梯度指向的是让高度增加最快的方向(往高处走)。

x y 谷底(最低点) P(x,y) 梯度方向 负梯度方向 负梯度方向指向谷底最陡下降方向
关键点:梯度是一个向量,它指向函数值增加最快的方向。

为什么要沿负梯度方向走?

假设你在山上迷路了,想要尽快下山。最直觉的做法就是:每一步都往最陡的下坡方向走。这正是梯度下降的核心思想!

起点 收敛点 每一步都沿 负梯度方向 逐渐逼近最低点
形象比喻:想象你蒙着眼睛在一个山坡上,只能用脚感觉坡度。每一步都往脚感觉最陡的下坡方向走,最终你会到达一个山谷——这就是局部最低点。

学习率:每一步走多远

学习率(Learning Rate)控制着每一步走的长度。它是梯度下降中最重要的超参数之一。

学习率过大

震荡发散
  • 步子太大,容易越过最低点
  • 可能导致震荡发散,永远无法收敛
  • 损失值会在最低点附近来回跳动

学习率适中

平稳下降
  • 步子适中,能够稳步下降
  • 可以到达局部或全局最低点
  • 这是我们想要的效果

学习率过小

下降太慢
  • 步子太小,下降非常缓慢
  • 需要大量迭代才能收敛
  • 容易陷入局部最优
参数更新公式:
θ = θ - α × ∇J(θ)

其中 α 是学习率,∇J(θ) 是梯度。学习率一般选择 0.001、0.01、0.1 等。

如何判断收敛?

梯度下降需要在某个时刻停下来,否则会无限运行下去。常见的收敛判断标准有:

1. 设置迭代次数

最简单的做法是设置一个固定的迭代次数。缺点是需要反复尝试找到合适的值。

# 设置 1000 次迭代 for i in range(1000): gradient_descent_step()

2. 损失值变化小于阈值

当两次迭代之间的损失值变化很小时,认为已经收敛。

# 当损失值变化小于 0.0001 时停止 if abs(loss_prev - loss_curr) < 0.0001: break

3. 梯度模长小于阈值

当梯度接近于零时,说明已经到达最低点附近。

# 当梯度范数小于 0.0001 时停止 if np.linalg.norm(gradient) < 0.0001: break

核心要点回顾

目标

找到损失函数的最小值,即模型最优解

方向

沿负梯度方向,即最陡下降方向前进

步长

由学习率控制每一步移动的距离

停止

梯度接近零或达到最大迭代次数

损失曲面 3D 可视化

下图展示了你正在优化的损失函数 J(w, b) = sin(w)·cos(b) + w²/8 + b²/8 的曲面形状。高处(暖色)表示损失值大,低处(冷色)表示损失值小。