AI基石 | 微积分实战:梯度下降与链式法则 —— AI 是如何“知错能改”的?
前言
在之前的文章中,我们用矩阵构建了数据的结构,用概率处理了世界的噪声。但此时的 AI 模型更像是一个“静态的天才”——它也许结构精妙,但它不会学习。
如果你给它一张猫的图片,它猜是“狗”,它并不知道怎么修正这个错误。
今天我们要讲的微积分,特别是梯度下降 (Gradient Descent) 和 链式法则 (Chain Rule),就是 AI 的“反省机制”。它们告诉模型:“你错了,错在哪了,应该往哪个方向改,改多少。”
正是因为有了这套机制,ChatGPT 才能通过海量数据的训练,从胡言乱语进化到吟诗作对。
一、 场景引入:下山的盲人
想象你被蒙住双眼,放置在一座高山上(这座山代表“误差”,山顶误差最大,山谷误差最小)。你的目标是以最快的速度走到山谷底(让误差最小化)。
你看不见周围的地形,你该怎么办?
- 感知脚下:你会用脚试探周围 360 度的坡度。
- 寻找方向:你会感觉到某一个方向向下倾斜得最厉害。
- 迈出一步:你沿着这个最陡峭的下坡方向,迈出一小步。
- 重复:在新位置重复上述过程,直到你感觉脚下是平地(到达谷底)。
这个过程,在数学上就叫梯度下降。
- 脚下的坡度:就是导数(Derivative)。
- 下坡最陡的方向:就是梯度(Gradient)。
- 迈出的步长:就是学习率(Learning Rate)。
二、 核心原理:让误差“指导”参数
在 AI 训练中,我们有一个衡量“错误程度”的指标,叫 损失函数 (Loss Function, JJJ)。
我们的目标是调整参数 www(权重),让 Loss 越小越好。
1. 导数:变化的指南针
微积分告诉我们,导数 f′(x)f'(x)f′(x) 代表了函数在某一点的变化率。
- 如果导数是正的(坡度向上),说明 www 变大,Loss 也会变大 -> 所以我们要让 www 变小。
- 如果导数是负的(坡度向下),说明 www 变大,Loss 会变小 -> 所以我们要让 www 变大。
2. 梯度下降公式
这就是那个让所有神经网络“动起来”的魔法公式:
wnew=wold−α⋅∂J∂ww_{new} = w_{old} - \alpha \cdot \frac{\partial J}{\partial w}wnew=wold−α⋅∂w∂J
- www:我们要训练的参数。
- α\alphaα (Alpha):学习率,即下山时一步跨多大。步子太大容易跨过谷底(震荡),步子太小下山太慢。
- ∂J∂w\frac{\partial J}{\partial w}∂w∂J:梯度,即当前的坡度。
一句话总结:沿着梯度的反方向(下坡方向),更新你的参数。
三、 链式法则:责任的传递
现在的神经网络动辄几十层、上百亿个参数。当输出结果错了(比如把猫认成了狗),我们怎么知道是哪一层的哪一个参数出了问题?
这就需要 链式法则 (Chain Rule),也就是大名鼎鼎的 反向传播 (Backpropagation) 的数学基础。
🍌 直觉:传话游戏
假设有一个 3 人传话游戏:
A 告诉 B,B 告诉 C,C 喊出了结果。
如果 C 喊出的声音太大了(误差),是谁的锅?
- C 会说:“是 B 跟我说的声音就很大,我只是放大了一点。” -> 我们可以算出 C 对误差的贡献。
- B 会说:“是 A 跟我说的声音也很大…” -> 我们可以通过 C 的反馈,算出 B 的责任。
- A 只能背锅。
⛓️ 数学公式
如果 y=f(u)y = f(u)y=f(u) 且 u=g(x)u = g(x)u=g(x),那么 yyy 对 xxx 的导数是:
dydx=dydu⋅dudx\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}dxdy=dudy⋅dxdu

在神经网络中,误差信号就是这样一层一层向后传递的。
第 10 层的误差 →\rightarrow→ 算出第 9 层的梯度 →\rightarrow→ 算出第 8 层的梯度… →\rightarrow→ 直到更新第一层的参数。
四、 代码实战:手写梯度下降解线性回归
为了不让大家觉得微积分只是符号游戏,我们用 Python 徒手实现一个最简单的机器学习模型——线性回归。
我们要训练机器找出一组数据的规律 y=wx+by = wx + by=wx+b。
import numpy as np
import matplotlib.pyplot as plt
# 1. 准备数据 (模拟 y = 2x + 5 加上一些噪音)
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 5 + 2 * X + np.random.randn(100, 1) # 真实规律是 w=2, b=5
# 2. 初始化参数 (瞎猜)
w = np.random.randn(1) # 随机初始化权重
b = np.random.randn(1) # 随机初始化偏置
learning_rate = 0.1 # 学习率 (步长)
n_iterations = 1000 # 训练次数 (下山走多少步)
# 记录 Loss 变化用于画图
loss_history = []
# 3. 开始梯度下降 (训练过程)
for iteration in range(n_iterations):
m = len(X)
# 前向传播:计算预测值
y_pred = w * X + b
# 计算 Loss (均方误差 MSE):(预测 - 真实)^2
loss = (1/m) * np.sum((y_pred - y)**2)
loss_history.append(loss)
# --- 微积分核心时刻 ---
# 计算梯度 (偏导数)
# 对 w 求导: 2/m * sum((y_pred - y) * x)
gradient_w = (2/m) * np.sum((y_pred - y) * X)
# 对 b 求导: 2/m * sum(y_pred - y)
gradient_b = (2/m) * np.sum(y_pred - y)
# 更新参数 (向梯度的反方向走)
w = w - learning_rate * gradient_w
b = b - learning_rate * gradient_b
if iteration % 100 == 0:
print(f"Step {iteration}: Loss={loss:.4f}, w={w[0]:.4f}, b={b[0]:.4f}")
# 4. 结果展示
print(f"\n训练结束!\n真实参数: w=2, b=5")
print(f"AI学到的: w={w[0]:.4f}, b={b[0]:.4f}")
# 可视化拟合效果
plt.scatter(X, y, color='blue', label='Data')
plt.plot(X, w*X + b, color='red', linewidth=3, label='AI Prediction')
plt.title('Gradient Descent in Action')
plt.legend()
plt.show()

代码解读
gradient_w的计算:这里直接用到了微积分里的链式法则求导结果。w = w - lr \* grad:这行代码就是 AI “学习”的本质瞬间。每一次循环,参数都在向正确的方向微调。
五、 进阶思考:从山坡到高原
在实际的大模型训练中,梯度下降并没有这么简单,我们会遇到很多复杂的“地形”:
- 局部最优 (Local Minima):像一个小水坑。你以为到了谷底,其实旁边还有更深的山谷。
- 解决:引入动量 (Momentum),像滚下的石头一样借着惯性冲出水坑。
- 梯度消失 (Vanishing Gradient):链式法则传得太远,误差信号变得极小,前面的层收不到信号,停止学习。
- 解决:使用 ReLU 激活函数 或 Transformer 架构(残差连接)。
- 鞍点 (Saddle Point):前后看是平的,左右看是陡的,容易让 AI 迷失方向。
我们现在常用的优化器 Adam,就是给普通的梯度下降装上了“自适应变速箱”和“GPS”,让它能更聪明地走完这条下山路。
六、 结语:数学基础篇完结撒花
至此,我们的【AI 自学路线第一阶段:数学基础】正式完结!
- 线性代数 让我们学会了如何把世界装进矩阵。
- 概率统计 让我们学会了如何在不确定性中做判断。
- 微积分 让我们掌握了通过梯度自我进化的钥匙。
这三座大山翻过去后,你已经具备了手撕神经网络的理论资格。
下一阶段预告
如果你觉得光看数学枯燥,那么好消息来了。
下一阶段我们将进入 Python 与工具链。我们将不再手算梯度,而是使用 PyTorch —— 这个 AI 界的“神笔马良”,用几行代码自动完成我们今天讲的所有微积分运算。
我们将亲手搭建你的第一个真正的神经网络,敬请期待!
4837



被折叠的 条评论
为什么被折叠?



