导数与梯度:"学习"的数学定义
"训练神经网络" 的本质就是导数。把这个词搞懂,AI 的训练流程在你眼里就再不神秘了。
回到 L1-02 末尾的问题:矩阵 里的数是从哪儿来的?
答案:训练。
更细一点:通过”梯度下降”调出来的。
这一篇我们把”梯度”彻底讲明白。读完你会发现,它只是”哪边是下坡”的数学说法。
第一站:什么是导数
让我们用一个例子。你在开车,速度仪表盘显示当前 60 km/h。
这个数字 60 是什么?它是**“距离对时间的导数”**——
“再过 1 秒,我会前进 60/3600 km”
导数就是变化率。它回答的问题是:
“自变量增加一点点,因变量增加多少?”
数学上写作:
别被这个公式吓住,它就是说” 增加 时, 增加了多少,再除以 “——一个比值。
一些直觉
- 函数 ,在 处的导数 = 6(因为 )。意思: 从 3 增加一点点, 大约增加 6 倍那么多。
- 函数 (常数),导数 = 0。意思: 怎么动, 都不变。
- 函数 ,导数 = 3。意思: 增加 1, 增加 3。
几何意义
导数 = 函数图像在该点的”切线斜率”
向上的切线 → 正导数(值在增加) 向下的切线 → 负导数(值在减少) 水平的切线 → 零导数(局部极大或极小)
导数 = 0 是最优点。 我们要找一个函数的最小值,等价于找让”导数 = 0”的点。 这是接下来”梯度下降”的核心思路。
第二站:什么是梯度
如果一个函数只有一个输入(比如 ),它的”导数”就是一个数。
但 AI 里的函数,往往有几百万、几十亿个输入。比如一个神经网络的损失函数:
——GPT-3 的 1750 亿参数都是它的”输入”。
对这种函数,我们怎么定义”导数”?
答:对每一个参数分别求导,得到的一组数叫梯度(gradient)。
梯度的每个分量告诉你:“如果只调这一个参数,损失会怎么变。”
梯度本身是一个向量。
一个图形化的直觉
想象你站在一片山地里。你脚下的高度 = 损失函数的值。你身处的位置(经纬度)= 模型参数。
梯度 = “山的最陡上坡方向”。
如果你想找最低点(损失最小),你应该沿着梯度反方向走——这就叫”梯度下降”。
每一步:
- 是步长(也叫”学习率”)
- 是当前位置的梯度
- 负号表示”反方向”——朝下坡走
这就是几乎所有 AI 训练的核心算法。
第三站:链式法则
但神经网络不是 这么简单。它是层层嵌套的——
输入 经过第一层 ,再经过 ,再经过 ——这就是”3 层神经网络”。
现在问题来了:怎么对这个嵌套函数求导?
答案:链式法则。这是高中数学就教过的概念,但绝大多数人没意识到它有多重要。
翻译过来:每一层”对输入的影响” = 每一层自己导数的连乘。
反向传播(Backprop)
如果你从最后一层开始,一层一层往回算导数——这个过程就叫反向传播。
它是神经网络训练的核心算法。1986 年由 Hinton 等人推广(详见 L0-02 AI 简史)。
关键洞察:链式法则让我们不需要”硬刚”整个网络的导数——可以一层一层、机械地、便宜地算出来。
这就是为什么 100 层、1000 层的网络仍然能训——靠链式法则。
一个完整的例子
让我们用最简单的例子走完整个流程。
任务:给定数据点 ,找一条直线 拟合它们。
我们要找的就是参数 。
直觉答案:(数据看起来 y ≈ 2x + 1,简化后大概)。
机器怎么学:
1. 定义损失函数
意思:用我们的 预测,和实际值差多少的平方和。越小说明拟合越好。
代入数据:
2. 求导
3. 梯度下降
随便初始化 ,学习率 :
| 步数 | 梯度 | 新 | |
|---|---|---|---|
| 0 | 0.00 | ||
| 1 | 3.40 | ||
| 2 | 2.04 | ||
| 3 | 2.58 | ||
| 4 | 2.37 | … 越来越接近 0 | ≈ |
| ⋯ | |||
| 收敛 | 梯度 ≈ 0 | 找到最优 |
这就是梯度下降的全过程——从一个随机起点出发,不断沿梯度反方向走,直到梯度 = 0。
用 NumPy 跑一遍
import numpy as np
# 数据
X = np.array([1, 2, 3])
y = np.array([3, 5, 7])
# 初始化参数和学习率
w = 0.0
lr = 0.05
# 训练循环
for step in range(50):
# 1. 前向:预测
y_pred = w * X
# 2. 算损失(仅用于打印观察)
loss = np.mean((y_pred - y) ** 2)
# 3. 算梯度(dL/dw)
grad = 2 * np.mean((y_pred - y) * X)
# 4. 梯度下降更新
w = w - lr * grad
if step % 10 == 0:
print(f"step {step}: w={w:.4f}, loss={loss:.4f}, grad={grad:.4f}")
print(f"\n最终 w = {w:.4f}")
跑一下,你会看到 从 0 一路逼近 2.43。这就是机器”学”出来的。
真正神经网络的训练
真实神经网络比这个例子复杂得多:
- 参数不是 1 个,是几千亿个
- 损失函数不是平方误差,是交叉熵(下一篇讲)
- 不是用全部数据算梯度,是用 mini-batch
- 不只是简单梯度下降,是 Adam / Momentum 等(详见 L2-09 优化器深度解析)
但核心思路完全一样:
- 前向:用当前参数算预测
- 算损失
- 反向:用链式法则算梯度
- 用梯度更新参数
- 重复几百万次
“训练”听起来很玄——但本质就是重复做四件事直到收敛。 机器学到的不是”知识”,是一组让损失最小的数。
想”看见”它
👀 打开梯度下降登山者可视化 —— 点击地图任意位置设起点,看 SGD / Momentum / Adam 三条轨迹同时下山。
一句话总结
导数告诉你”哪个方向能更好”,梯度下降让你”朝那个方向走一步”。
重复几百万次,机器就学会了。
下一篇:《概率与最大似然:为什么机器学习是个概率问题》
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。