梯度下降法 -- 沿着最陡的方向下山
本章从零实现梯度下降,用它拟合线性回归。这就是整个 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}")
# 生成数据 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 等自适应优化器能更有效地逃离鞍点。
