HelloAI
L1 第 3 篇 🐣 难度 🕒 13 分钟

导数与梯度:"学习"的数学定义

"训练神经网络" 的本质就是导数。把这个词搞懂,AI 的训练流程在你眼里就再不神秘了。

阿莱
2026/6/12

回到 L1-02 末尾的问题:矩阵 WW 里的数是从哪儿来的?

答案:训练

更细一点:通过”梯度下降”调出来的

这一篇我们把”梯度”彻底讲明白。读完你会发现,它只是”哪边是下坡”的数学说法

第一站:什么是导数

让我们用一个例子。你在开车,速度仪表盘显示当前 60 km/h。

这个数字 60 是什么?它是**“距离对时间的导数”**——

“再过 1 秒,我会前进 60/3600 km”

导数就是变化率。它回答的问题是:

“自变量增加一点点,因变量增加多少?”

数学上写作:

f(x)=dfdx=limΔx0f(x+Δx)f(x)Δxf'(x) = \frac{df}{dx} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x}

别被这个公式吓住,它就是说”xx 增加 Δx\Delta x 时,ff 增加了多少,再除以 Δx\Delta x——一个比值。

一些直觉

  • 函数 f(x)=x2f(x) = x^2,在 x=3x = 3 处的导数 = 6(因为 f=2xf' = 2x)。意思xx 从 3 增加一点点,ff 大约增加 6 倍那么多。
  • 函数 f(x)=5f(x) = 5(常数),导数 = 0。意思xx 怎么动,ff 都不变。
  • 函数 f(x)=3x+7f(x) = 3x + 7,导数 = 3。意思xx 增加 1,ff 增加 3。

几何意义

导数 = 函数图像在该点的”切线斜率”

向上的切线 → 正导数(值在增加) 向下的切线 → 负导数(值在减少) 水平的切线 → 零导数(局部极大或极小)

💡 一个关键直觉

导数 = 0 是最优点。 我们要找一个函数的最小值,等价于找让”导数 = 0”的点。 这是接下来”梯度下降”的核心思路。

第二站:什么是梯度

如果一个函数只有一个输入(比如 f(x)f(x)),它的”导数”就是一个数。

但 AI 里的函数,往往有几百万、几十亿个输入。比如一个神经网络的损失函数:

L(W)=L(w1,w2,w3,,w175000000000)L(W) = L(w_1, w_2, w_3, \ldots, w_{175000000000})

——GPT-3 的 1750 亿参数都是它的”输入”。

对这种函数,我们怎么定义”导数”?

答:对每一个参数分别求导,得到的一组数叫梯度(gradient)

L=[Lw1,Lw2,,Lwn]\nabla L = \left[ \frac{\partial L}{\partial w_1}, \frac{\partial L}{\partial w_2}, \ldots, \frac{\partial L}{\partial w_n} \right]

梯度的每个分量告诉你:“如果只调这一个参数,损失会怎么变。”

梯度本身是一个向量。

一个图形化的直觉

想象你站在一片山地里。你脚下的高度 = 损失函数的值。你身处的位置(经纬度)= 模型参数。

梯度 = “山的最陡上坡方向”

如果你想找最低点(损失最小),你应该沿着梯度反方向走——这就叫”梯度下降”。

每一步:

Wnew=WoldαL(Wold)W_{new} = W_{old} - \alpha \cdot \nabla L(W_{old})
  • α\alpha 是步长(也叫”学习率”)
  • L\nabla L 是当前位置的梯度
  • 负号表示”反方向”——朝下坡走

这就是几乎所有 AI 训练的核心算法

第三站:链式法则

但神经网络不是 f(x)f(x) 这么简单。它是层层嵌套的——

y=f3(f2(f1(x)))y = f_3(f_2(f_1(x)))

输入 xx 经过第一层 f1f_1,再经过 f2f_2,再经过 f3f_3——这就是”3 层神经网络”。

现在问题来了:怎么对这个嵌套函数求导?

答案:链式法则。这是高中数学就教过的概念,但绝大多数人没意识到它有多重要。

dydx=dydf2df2df1df1dx\frac{dy}{dx} = \frac{dy}{df_2} \cdot \frac{df_2}{df_1} \cdot \frac{df_1}{dx}

翻译过来:每一层”对输入的影响” = 每一层自己导数的连乘。

反向传播(Backprop)

如果你从最后一层开始,一层一层往回算导数——这个过程就叫反向传播

它是神经网络训练的核心算法。1986 年由 Hinton 等人推广(详见 L0-02 AI 简史)。

关键洞察:链式法则让我们不需要”硬刚”整个网络的导数——可以一层一层、机械地、便宜地算出来。

这就是为什么 100 层、1000 层的网络仍然能训——靠链式法则。

一个完整的例子

让我们用最简单的例子走完整个流程。

任务:给定数据点 (1,3),(2,5),(3,7)(1, 3), (2, 5), (3, 7),找一条直线 y=wxy = wx 拟合它们。

我们要找的就是参数 ww

直觉答案w=2.somethingw = 2.something(数据看起来 y ≈ 2x + 1,简化后大概)。

机器怎么学

1. 定义损失函数

L(w)=i(wxiyi)2L(w) = \sum_i (w \cdot x_i - y_i)^2

意思:用我们的 ww 预测,和实际值差多少的平方和。越小说明拟合越好

代入数据:

L(w)=(w13)2+(w25)2+(w37)2L(w) = (w \cdot 1 - 3)^2 + (w \cdot 2 - 5)^2 + (w \cdot 3 - 7)^2

2. 求导

dLdw=2(w3)+22(2w5)+23(3w7)=2w6+8w20+18w42=28w68\frac{dL}{dw} = 2(w-3) + 2 \cdot 2(2w-5) + 2 \cdot 3(3w-7) = 2w - 6 + 8w - 20 + 18w - 42 = 28w - 68

3. 梯度下降

随便初始化 w=0w = 0,学习率 α=0.05\alpha = 0.05

步数ww梯度ww
00.0028(0)68=6828(0)-68 = -6800.05×(68)=3.400 - 0.05 \times (-68) = 3.40
13.4028(3.4)68=27.228(3.4)-68 = 27.23.400.05×27.2=2.043.40 - 0.05 \times 27.2 = 2.04
22.0428(2.04)68=10.8828(2.04)-68 = -10.882.04+0.54=2.582.04 + 0.54 = 2.58
32.5828(2.58)68=4.2428(2.58)-68 = 4.242.580.21=2.372.58 - 0.21 = 2.37
42.37… 越来越接近 02.432.43
收敛w2.43w ≈ 2.43梯度 ≈ 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}")

跑一下,你会看到 ww 从 0 一路逼近 2.43。这就是机器”学”出来的

真正神经网络的训练

真实神经网络比这个例子复杂得多:

  • 参数不是 1 个,是几千亿个
  • 损失函数不是平方误差,是交叉熵(下一篇讲)
  • 不是用全部数据算梯度,是用 mini-batch
  • 不只是简单梯度下降,是 Adam / Momentum 等(详见 L2-09 优化器深度解析)

但核心思路完全一样

  1. 前向:用当前参数算预测
  2. 算损失
  3. 反向:用链式法则算梯度
  4. 用梯度更新参数
  5. 重复几百万次
🔬 一个突然的领悟

“训练”听起来很玄——但本质就是重复做四件事直到收敛。 机器学到的不是”知识”,是一组让损失最小的数。

想”看见”它

👀 打开梯度下降登山者可视化 —— 点击地图任意位置设起点,看 SGD / Momentum / Adam 三条轨迹同时下山。

一句话总结

导数告诉你”哪个方向能更好”,梯度下降让你”朝那个方向走一步”。

重复几百万次,机器就学会了。

下一篇:《概率与最大似然:为什么机器学习是个概率问题》

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。