课程库 › AI 主线 › 阶段项目与数学直觉 › 第 5 课
数学直觉二:导数与梯度 —— "学习"的数学本质
普通课约 55 分钟
本课导读
U0.2 讲过:训练神经网络 = "用损失打分 + 梯度下降调权重",当时的类比是浓雾中下山。今天补上最后一块直觉:导数(脚下的坡度)和梯度下降(顺着坡走)到底是什么——并且不满足于比喻,用二十行代码亲手把山下了。学完这课,"学习率""收敛""调参"这些阶段 2 的词汇会提前对你脱敏。照旧:直觉课,无证明、无公式推导。预计 55 分钟。
观看要点
- ▸导数不是「瞬间速度」的魔法,而是「间隔取小之后的变化率」——和下文 slope 函数同一件事
- ▸几何画面:曲线上一点的切线斜率——正负与陡缓一目了然
- ▸进阶加看:同作者《深度学习》第 2 集「梯度下降」,把本课的下山接到真实神经网络上(U0.2 延伸阅读有链接)
看不了视频?文字讲义已覆盖全部内容,直接往下读即可。
导数:脚下的坡度
一个函数就是一座山的轮廓。比如 y = (x - 3)² + 2——一条开口向上的碗形曲线,最低点在 x=3。导数回答一个问题:站在某个 x 上,脚下的坡有多陡、朝哪边斜?
不用公式,用"挪一小步看变化"就能算出来:
读输出,三个规律一目了然:
- x < 3 时坡度是负数:往右走会下坡(谷底在右边)
- x > 3 时坡度是正数:往左走会下坡(谷底在左边)
- x = 3 处坡度 ≈ 0:平地——谷底的标志就是坡度为零
这就是导数的全部直觉:某一点的导数 = 该点的坡度,符号指出下坡方向,大小说明有多陡。slope 函数里"挪一小步看变化"的算法叫数值求导——真实框架用更聪明的算法(自动微分),但直觉一模一样。
梯度下降:闭着眼下山
现在把 U0.2 的比喻变成算法。浓雾里看不见谷底,但每一步都能感知脚下坡度——策略就三句话:
- 站定,测坡度(算导数)
- 朝坡度的反方向挪一小步(坡度为正往左、为负往右——总之往低处)
- 重复,直到坡度接近零(到谷底了)
"挪多大步"由学习率(learning rate)控制。上代码,亲手下山:
看输出的节奏:开始坡陡(坡度绝对值大),一步迈得远;越接近谷底坡越缓,步子自动变小;最后在 3 附近稳稳停住——这个"稳稳停住",术语叫收敛(converge)。
核心就一行:x = x - lr * g。把 x 换成神经网络的几十亿个权重、把 f 换成损失函数,这行代码就是深度学习训练的心跳——每训练一步,所有权重同时做一次"朝坡度反方向挪一小步"。梯度(gradient)这个词,就是"几十亿个方向上的坡度"的总称。
学习率:步子的艺术
lr 是阶段 2 你会亲手调的第一个"超参数"。它为什么难调?亲手试三种:
三条轨迹三种命运:
- lr=0.02(太小):方向对但步子碎,15 步还没到谷底——训练太慢,费时费电
- lr=0.1(合适):干脆利落,几步收敛
- lr=0.95(太大):一步迈过谷底、再迈回来——在两侧反复横跳,勉强靠近;再大一点就会越跳越远(发散)
提示
类比记忆:学习率是下山的步幅——步子太小天黑都到不了,步子太大一步跨过谷底摔到对面坡上。阶段 2 调参时你会想起这张图:loss 降得慢 → lr 可能太小;loss 上蹿下跳 → lr 多半太大。这已经是实战经验了。
收网:三个单元的知识合龙
U0.2 的故事现在全部落地:
| U0.2 的说法(比喻) | 本课的对应(可运行) |
|---|---|
| 损失:给模型表现打分 | 函数 f(x):当前位置的"高度" |
| 浓雾下山 | 循环里的每一步 |
| 感知脚下坡度 | slope(x):导数 |
| 朝低处微调权重 | x = x - lr * g |
| 训练到模型"学会" | 坡度趋零,收敛于谷底 |
差别只在规模:你今天调的是一个 x,GPT 们调的是几千亿个——但每一个参数走的都是你刚写的那行代码。数学直觉两课到此收官:数据是向量矩阵,学习是梯度下降——带着这两句话进阶段 2,你不会迷路。
✍️ 练习
练习 1:换座山
把函数换成 f(x) = (x + 2)² + 5(谷底在 x=-2)。从 x=4 出发下山 20 步,验证能停在 -2 附近。
✅ 参考答案
def f(x):
return (x + 2) ** 2 + 5
def slope(x, h=0.0001):
return (f(x + h) - f(x)) / h
x = 4.0
for step in range(20):
x = x - 0.1 * slope(x)
print(f"停在 x={x:.4f}(谷底 -2),高度 {f(x):.4f}(谷底高度 5)")
算法一字未改,换座山照样下——通用性正是梯度下降统治机器学习的原因:不管损失函数长什么样,"测坡度、反方向挪"都能走。
练习 2:亲手制造一次"发散"
用本课的 descend 函数试 lr=1.05,打印轨迹——观察 x 如何一步比一步离谱。然后回答:如果阶段 2 训练时 loss 越来越大,你的第一反应是什么?
✅ 参考答案
def f(x):
return (x - 3) ** 2 + 2
def slope(x, h=0.0001):
return (f(x + h) - f(x)) / h
x = 0.0
for step in range(1, 11):
x = x - 1.05 * slope(x)
print(f"第 {step:2d} 步:x={x:10.2f},高度 {f(x):14.2f}")
每步都跨过谷底摔到更高的对面坡上,越弹越远——发散。阶段 2 看到 loss 不降反升,第一反应:调小学习率。你已经提前拥有这条实战直觉了。
练习 3:可视化你的下山路(挑战)
把下山轨迹画在山的轮廓上:先画曲线 f(x)(x 取 -1 到 7 的一串点),再把 lr=0.1 从 x=0 出发的每一步 (x, f(x)) 用圆点标出来——亲眼看小球滚进谷底。
✅ 参考答案
import matplotlib.pyplot as plt
def f(x):
return (x - 3) ** 2 + 2
def slope(x, h=0.0001):
return (f(x + h) - f(x)) / h
xs = [i * 0.1 for i in range(-10, 71)]
ys = [f(x) for x in xs]
x = 0.0
px, py = [x], [f(x)]
for _ in range(15):
x = x - 0.1 * slope(x)
px.append(x)
py.append(f(x))
fig, ax = plt.subplots(figsize=(6.5, 3.5))
ax.plot(xs, ys, label="山的轮廓 f(x)")
ax.scatter(px, py, color="#e8734a", zorder=3, label="下山轨迹")
ax.set_title("梯度下降:小球滚进谷底")
ax.set_xlabel("x")
ax.set_ylabel("f(x)")
ax.legend()
这张图值得存进笔记——它是你对"机器学习到底在干什么"的第一份亲手证据。
📝 随堂测验
1. 某一点的导数,最贴地的理解是?
2. 谷底(最低点)处的导数有什么特征?
3. 梯度下降每一步的核心动作 x = x - lr * g 在做什么?
4. 学习率太大(如 lr=1.05)会发生什么?
5. “你调一个 x,GPT 调几千亿个参数”——两者的关系是?
本课小结
- 导数 = 脚下的坡度(符号定方向、大小定陡缓);谷底的标志是坡度≈0(收敛)
- 梯度下降 = 测坡度 + 反方向挪步:
x = x - lr * g一行是深度学习的心跳 - 学习率 = 步幅:太小磨蹭、太大发散——loss 上蹿先调小 lr(实战直觉 +1)
- U0.2 的浓雾下山,今天亲手走完;规模换成几千亿参数,原理一字不改
最后一课:阶段 1 里程碑测验——25 题 + 一道综合实操,给这两个月的功夫盖章。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…