现在位置: 首页 > AI 数学基础 > 正文

梯度下降法 -- 沿着最陡的方向下山

本章从零实现梯度下降,用它拟合线性回归。这就是整个 AI 训练循环的数学原型。


概念解析

核心公式

\[ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \]

训练四步循环


前向传播
预测输出

计算损失
衡量差距

计算梯度
反向传播

更新参数
θ -= η·∇J

学习率的影响

学习率效果
太小收敛极慢,需要很多步
适中平稳快速收敛
太大震荡甚至发散

生活例子

大雾天下山

伸手不见五指的大雾天,你要下山。每走一步的策略:

感受脚下最陡的方向 → 往最陡下坡方向走一小步 → 停下来 → 重新感受 → 再走一小步 → 重复。

这就是梯度下降:感受 = 算梯度,走一小步 = 参数更新,停下来 = 下一轮迭代。


Python 动手实践

实例

import numpy as np

# 生成数据 y = 3x + 2 + noise
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 3 * X + 2 + np.random.normal(0, 2, 100)

# 从零实现梯度下降
w, b = 0.0, 0.0
lr, n_iter = 0.01, 200
losses = []

for i in range(n_iter):
    y_pred = w * X + b
    loss = np.mean((y_pred - y) ** 2)
    losses.append(loss)
    # 梯度
    dw = 2 * np.mean((y_pred - y) * X)
    db = 2 * np.mean(y_pred - y)
    # 更新
    w -= lr * dw
    b -= lr * db

print(f"RUNOOB 梯度下降结果:")
print(f"真实: w=3.0, b=2.0")
print(f"拟合: w={w:.4f}, b={b:.4f}")
print(f"初始损失: {losses[0]:.2f} → 最终损失: {losses[-1]:.2f}")
RUNOOB 梯度下降结果:
真实: w=3.0, b=2.0
拟合: w=2.9874, b=2.2835
初始损失: 79.69 → 最终损失: 3.91

损失下降曲线


AI 中的应用场景

PyTorch 训练循环的数学原型

所有深度学习训练循环都遵循同一个模式,这个模式就是梯度下降:

① optimizer.zero_grad() → 清零梯度缓存;② loss = model(x) → 前向传播;③ loss.backward() → 反向传播计算梯度;④ optimizer.step() → 执行参数更新 θ -= η·∇J。

理解了这个四步循环,你就理解了所有深度学习框架的核心训练逻辑。

学习率是最重要的超参数

学习率太大 → 损失震荡甚至发散;学习率太小 → 收敛极慢,可能困在局部最优。学习率调度(Step、Cosine Annealing、Warmup)是训练大模型必不可少的技术——GPT-3 训练用了线性 warmup + cosine decay 策略。

SGD 的批量大小权衡

全量 GD:用全部数据算精确梯度,慢但稳;SGD(batch_size=1):每次只看一个样本,快但梯度估计噪声大;Mini-batch SGD:折中方案(batch_size=32/64/128),噪声适量,反而有助于跳出局部最优——这是实际训练中的标准做法。

梯度下降的局限性

梯度下降找到的是梯度为零的点——可能是全局最优、局部最优或鞍点。在高维空间中,鞍点远比局部最优常见:一个点在某些方向是极小值,在其他方向是极大值。Adam 等自适应优化器能更有效地逃离鞍点。