1. 问题导入
假设你设计了一个预测房价的模型,刚开始模型的预测结果与真实房价相差巨大。我们如何让计算机自动、智能地调整模型内部的参数(如权重 w 和偏置 b),使得预测误差越来越小?
计算机没有人类的直观灵感,但微积分赋予了模型“蒙眼下山”的能力:
- 损失函数 (Loss Function):画出了一座表示误差大小的“山谷”,谷底代表误差最小的理想状态;
- 导数与梯度:告诉模型此时此刻站在山坡的哪里、向哪个方向迈步下降最快;
- 梯度下降法 (Gradient Descent):引导模型一步步迈向最底部的山谷,自动寻找最优参数。
2. 学习目标
完成本章学习后,你将能够:
- 理解导数 (Derivative) 的几何含义(曲线切线斜率与变化率方向);
- 理解偏导数 (Partial Derivative) 与多维梯度 (Gradient) 向量的物理含义;
- 掌握损失函数 (Loss Function) 的“山谷地形”几何直觉;
- 掌握梯度下降法参数更新公式 wnew=wold−α⋅gradient;
- 理解学习率 α (Learning Rate) 大小对参数收敛过程的影响。
3. 导数 (Derivative):切线斜率与变化方向
在几何上,一个函数 y=f(x) 在某一点 x0 处的导数 f′(x0),代表了函数曲线在该点切线的斜率 (Slope)。
- 斜率 >0(正斜率):说明 x 增加时,y 也会增加(向右看在爬坡上升);
- 斜率 =0(零斜率):说明到达了曲线的极小值谷底或极大值山顶(水平切线);
- 斜率 <0(负斜率):说明 x 增加时,y 会减少(向右看在下坡下降)。
简单的二次函数 f(x)=x2 的导数公式为:
f′(x)=2x
已知函数 f(x)=x2,其导数 f′(x)=2x:
- 当 x=3 时,导数 f′(3)=2×3=6>0(斜率为正数,说明往右走 f(x) 会变大);
- 当 x=−2 时,导数 f′(−2)=2×(−2)=−4<0(斜率为负数,说明往右走 f(x) 会变小);
- 当 x=0 时,导数 f′(0)=2×0=0(斜率为零,说明到达极小值谷底)。
4. 偏导数与多维梯度 (Gradient Vector)
在现实的 AI 模型中,损失函数往往由成百上千个参数共同决定(如 L(w1,w2,b))。
4.1 偏导数 (Partial Derivative)
偏导数 df/dw1 的直觉非常简单:当有多个变量时,假设其他变量(如 w2,b)全部保持冻结不动,只观察 w1 变化时对整体误差产生的改变。
4.2 梯度向量 (Gradient Vector)
将多维函数对各个自变量的偏导数打包组合成一个向量,就得到了梯度向量 ∇f:
∇f=[∂w1∂f,∂w2∂f,…,∂wn∂f]
在多维空间中,梯度向量 ∇f 永远指向函数增长最快(最陡峭)的方向。
因此,它的反方向(加上负号 −∇f)就永远指向函数下降最快(最陡峭)的方向!
已知二元函数 f(x,y)=3x2+2xy+y2,计算其偏导数与在点 (1,2) 处的梯度:
- 求对 x 的偏导数(将 y 当作常数):
∂x∂f=∂x∂(3x2)+∂x∂(2xy)+0=6x+2y
- 求对 y 的偏导数(将 x 当作常数):
∂y∂f=0+∂y∂(2xy)+∂y∂(y2)=2x+2y
- 计算在点 (1,2) 处的梯度向量 ∇f(1,2):
∇f(1,2)=[6(1)+2(2),2(1)+2(2)]T=[10,6]T
- 结论与最陡下山方向:
- 在点 (1,2) 处,函数增长最快方向为 ∇f=[10,6]T;
- 最陡下山方向为反梯度 −∇f=[−10,−6]T。
5. 梯度下降法 (Gradient Descent) 与下山比喻
5.1 下山比喻 (Mountain Descent Analogy)
想象一下:你被蒙上双眼置身于一座大雾笼罩的山上(山的高度代表误差 Loss),你的目标是走到最底部的山谷(Loss 最小点)。
因为看不见远方,你只能用脚感受此时此刻脚下地面最陡峭的倾斜方向(计算梯度),然后向倾斜的相反方向迈出一步。重复这个过程,你就能一步步抵达谷底。
5.2 梯度下降更新公式
新参数 wnew=旧参数 wold−α⋅∂w∂L
其中:
- ∂w∂L:当前位置的梯度;
- α (alpha) / 学习率 (Learning Rate):用来控制每次下山迈出的步幅大小。
已知损失函数 L(w)=(w−3)2+5,其梯度公式为 dwdL=2(w−3)。假设初始位置 w0=5.0,学习率 α=0.1:
第 1 次迭代更新:
- 计算当前梯度:grad0=2(5.0−3)=4.0;
- 更新参数:w1=w0−α×grad0=5.0−0.1×4.0=4.6;
- 参数 w 从 5.0→4.6(成功向谷底 w=3 靠近了第一步!)。
第 2 次迭代更新:
- 计算新的梯度:grad1=2(4.6−3)=3.2;
- 更新参数:w2=w1−α×grad1=4.6−0.1×3.2=4.28;
- 参数 w 从 4.6→4.28(继续向谷底 w=3 平稳靠拢!)。
5.3 学习率 α 对下山过程的影响
学习率 α 是机器学习中最核心的超参数:
|
| 学习率太小 (α=0.05) | 下山步幅极微小,像乌龟爬行 | 训练速度极慢,需要迭代成千上万次 |
| 学习率适中 (α=0.20) | 每次步幅合理,平稳迈向山谷 | 迅速且稳定地收敛到最低点 |
| 学习率过大 (α=0.70) | 一步跨度太大,直接跨过了谷底 | 在山谷两端来回剧烈震荡,无法完美下山 |
| 学习率极高 (α≥1.10) | 越跳越远,直接飞出山谷 | 数值暴涨爆炸,导致 Loss 变为 NaN 崩溃 |
微积分切线与梯度下山演练导数与梯度下降步幅交互实验室
曲线 f(x)=x2+1 当前点切线斜率 谷底最小值点 (0, 1) 实时导数与状态监控
斜率 > 0 (正斜率,向右在爬坡)
1. 调整学习率
α=0.2,连续点击下山,观察平稳收敛;
2. 将
α 调大至
0.70,点击下山,观察点在左右山坡来回震荡跳跃;
3. 将
α 调大至
1.10,点击下山,体验 Loss 越跳越大飞出山谷的现象!
6.5 补充练习:先感受斜率,再记公式
开始时不必从极限定义入手。把 f′(x) 理解为:向右挪动一小步时,损失倾向于上升还是下降,以及变化有多快。梯度下降所做的事,就是朝这个方向的反方向走一步。
用两个相邻点估计斜率
对于 f(x)=(x−3)2,取 x=5、小步长 h=0.1:
估计斜率=hf(5+h)−f(5)
先分别算出两个函数值。结果应接近精确导数 2(5−3)=4。这个过程把学校数学中的变化率,连接到了模型训练中的梯度。
写一个三行迭代台账
从 w0=5 出发,使用 L(w)=(w−3)2 和学习率 α=0.1。先手算再运行代码:
- 第 0 行:当前 w、梯度 2(w−3)、更新后的 w。
- 第 1 行:用新的 w 重复一次。
- 第 2 行:检查损失是否继续减小。
若损失反而增大,先减小 α,不要先怀疑更新公式。这是训练模型时最重要的第一条排错习惯。
python
def loss(w):
return (w - 3) ** 2
w, learning_rate = 5.0, 0.1
for step in range(3):
gradient = 2 * (w - 3)
print(step, "w=", round(w, 3), "损失=", round(loss(w), 3), "梯度=", round(gradient, 3))
w = w - learning_rate * gradient
6. 动手实战:纯 Python 手写梯度下降寻找最小值
请在下方的代码块中,点击 “运行代码”,体验如何用十几行 Python 代码找到二次函数 f(x)=(x−3)2+5 的最小值点 x=3:
# 1. 定义目标损失函数 f(x) = (x - 3)^2 + 5
def loss_function(x):
return (x - 3) ** 2 + 5
# 2. 导数公式 f'(x) = 2 * (x - 3)
def get_gradient(x):
return 2 * (x - 3)
# 3. 梯度下降参数配置
x = 10.0 # 随机初始位置 (离最小值 x=3 很远)
learning_rate = 0.2 # 学习率 (步幅)
epochs = 15 # 迭代步数
print(f"起始初始位置: x = {x:.4f}, 初始 Loss = {loss_function(x):.4f}\n")
for step in range(1, epochs + 1):
grad = get_gradient(x) # 计算梯度
x = x - learning_rate * grad # 梯度下降更新公式
current_loss = loss_function(x) # 计算新的 Loss
print(f"Step {step:2d} | 梯度 grad = {grad:7.4f} | 更新后 x = {x:6.4f} | Loss = {current_loss:6.4f}")
print(f"\n最终优化结果: x 趋近于 {x:.4f} (理论最小值 x = 3)")
7. 常见错误排查 (Troubleshooting)
|
Loss 变成 inf 或 NaN 爆炸崩溃 | 学习率 α 设置得过大,导致梯度更新步幅过大震荡飞出山谷 | 将学习率缩小 10 倍(如从 0.1 调小为 0.01 或 0.001) |
| Loss 下降极其缓慢或长时间没有变化 | 学习率 α 设置得过于微小,或者梯度在平坦区域趋近于 0 | 适当增大学习率,或者检查损失函数导数计算是否正确 |
| 无法找到全局极小值 | 损失函数存在多个局部山谷 (Local Minima),卡在了局部凹坑中 | 引入动量 (Momentum) 优化器或使用随机梯度下降 (SGD) |
8. 本节检查清单 (Checklist)
9. 课后互动自测
02. 微积分直觉:导数与梯度下降 课后互动自测
共 4 道精选测试题 · 答题进度已自动保存
单选题
在梯度下降公式 w_new = w_old - alpha * grad 中,为什么在梯度 grad 前面必须加上减号“-”?
10. 下一步
恭喜你掌握了导数与梯度下降的几何直觉!
下一步我们将学习 ,用直观视角理解数据分布、不确定性与分类概率!
11. 参考资料
- —— 全网最优质的微积分直觉可视化动画教程。
- —— 谷歌官方 ML 下山比喻指引。