梯度下降是最小化损失函数的核心优化算法,几乎所有机器学习模型的训练都依赖它。
🎯 核心思想
类比下山:站在山上(高损失),每次朝最陡的下坡方向走一步,直到到达山谷(最低损失)。
$\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta L(\theta_t)$
符号 | 含义 |
|---|---|
θ | 模型参数(权重) |
η | 学习率(步长) |
∇L | 损失函数对参数的梯度(偏导数) |
📐 数学基础
梯度是什么?
梯度是多变量函数的偏导数向量,指向函数增长最快的方向:
$\nabla_\theta L = \left[\frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, ..., \frac{\partial L}{\partial \theta_d}\right]$
更新过程(以线性回归 MSE 为例)
$L = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2, \quad \hat{y}_i = w x_i + b$
$\frac{\partial L}{\partial w} = \frac{1}{n}\sum_{i=1}^{n} 2(\hat{y}_i - y_i) \cdot x_i$
$\frac{\partial L}{\partial b} = \frac{1}{n}\sum_{i=1}^{n} 2(\hat{y}_i - y_i)$
更新:
$w \leftarrow w - \eta \cdot \frac{\partial L}{\partial w}$
$b \leftarrow b - \eta \cdot \frac{\partial L}{\partial b}$
🔄 三种主要变体
1️⃣ 批量梯度下降 (BGD / Batch GD)
特性 | 说明 |
|---|---|
每次更新 | 使用全部训练数据计算梯度 |
优点 | 梯度稳定,收敛方向一致 |
缺点 | 大数据集下计算极慢 |
公式 | $\theta = \theta - \eta \cdot \frac{1}{n}\sum_{i=1}^{n}\nabla L_i(\theta)$ |
数据:全部 n 个样本 → 计算平均梯度 → 一次更新
2️⃣ 随机梯度下降 (SGD)
特性 | 说明 |
|---|---|
每次更新 | 使用单个样本计算梯度 |
优点 | 每次更新极快,可在线学习 |
缺点 | 梯度噪声大,收敛路径震荡 |
公式 | $\theta = \theta - \eta \cdot \nabla L_i(\theta)$(第 i 个样本) |
数据:随机选 1 个样本 → 计算梯度 → 立即更新 → 重复
3️⃣ 小批量梯度下降 (Mini-batch GD) ← 最常用
特性 | 说明 |
|---|---|
每次更新 | 使用一小批(通常 32/64/128/256)样本 |
优点 | 兼顾稳定性和速度,GPU 友好 |
缺点 | 需调参 batch_size |
公式 | $\theta = \theta - \eta \cdot \frac{1}{m}\sum_{i=1}^{m}\nabla L_i(\theta)$(m 为 batch 大小) |
数据:随机取 m 个样本 → 计算平均梯度 → 更新 → 下一批
📊 三种方法对比
维度 | BGD | SGD | Mini-batch |
|---|---|---|---|
更新频率 | 每 epoch 1 次 | 每样本 1 次 | 每 batch 1 次 |
收敛速度 | 慢(每次迭代耗时长) | 快(但震荡) | 平衡 |
内存需求 | 高 | 低 | 中等 |
梯度噪声 | 无 | 大 | 中等 |
GPU 利用 | 一般 | 差 | 优秀 |
实际使用 | 少见 | 偶尔 | 主流 |
⚡ 梯度下降的进阶变体
4️⃣ 带动量的 SGD (SGD with Momentum)
问题:SGD 震荡严重,收敛慢
解决:引入"惯性",累积历史梯度方向
$v_t = \beta v_{t-1} + \eta \cdot \nabla L(\theta_t)$
$\theta = \theta - v_t$
参数 | 典型值 | 说明 |
|---|---|---|
β | 0.9 | 动量系数(越大越平滑) |
类比:小球从山上滚下,有惯性不会轻易改变方向。
5️⃣ RMSprop
问题:固定学习率在某些方向震荡、某些方向进展慢
解决:为每个参数自适应调整学习率
$E[g^2]_t = 0.9 \cdot E[g^2]_{t-1} + 0.1 \cdot g_t^2$
$\theta = \theta - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t$
效果:梯度大的参数缩小步长,梯度小的参数增大步长。
6️⃣ Adam (Adaptive Moment Estimation) ← 最流��
结合 Momentum + RMSprop 的优点:
$m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t \quad \text{(一阶矩/动量)}$
$v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 \quad \text{(二阶矩/方差)}$
$\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} \quad \text{(偏差修正)}$
$\theta = \theta - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t$
参数 | 典型值 | 说明 |
|---|---|---|
β₁ | 0.9 | 一阶矩衰减率 |
β₂ | 0.999 | 二阶矩衰减率 |
ε | 1e-8 | 防止除零 |
🎚️ 学习率(Learning Rate)—— 最重要的超参数
学习率的影响
学习率过大 → 梯度爆炸,损失震荡甚至发散
学习率过小 → 收敛极慢,可能陷入局部最优
学习率适中 → 稳定收敛到最小值
学习率调度策略
策略 | 公式/方式 | 适用场景 |
|---|---|---|
固定学习率 | η = 常数 | 简单问题 |
Step Decay | η = η₀ × γ^k | 通用 |
Exponential Decay | η = η₀ × e^(-kt) | 需要平滑衰减 |
Cosine Annealing | η = η_min + ½(η_max - η_min)(1 + cos(πt/T)) | 深度学习 |
ReduceLROnPlateau | 验证集不降时缩小 | 防止过拟合 |
Warmup | 先小后大 | 大模型训练 |
📉 优化中的常见问题
1. 局部最优 (Local Minimum)
损失曲面有多个山谷,可能停在次优点
缓解:动量法、Adam、多次随机初始化
2. 鞍点 (Saddle Point)
某些方向是极小值,另一些方向是极大值
在高维空间中更常见
缓解:动量帮助"穿过"鞍点
3. 梯度消失/爆炸
梯度消失:深层网络中梯度趋近 0,参数不更新
梯度爆炸:梯度极大,参数更新过大
缓解:梯度裁剪、残差连接、BatchNorm、合适的激活函数
4. 病态条件 (Ill-conditioned)
损失曲面呈狭长椭圆形,某些方向梯度大、某些方向梯度小
缓解:Adam、RMSprop、归一化输入
🧪 完整训练流程示例
初始化参数 θ(随机)
┌─────────────────────────────────┐
│ For epoch = 1 to N: │
│ Shuffle 训练数据 │
│ For each mini-batch: │
│ 1. 前向传播 → 计算预测 ŷ │
│ 2. 计算损失 L(ŷ, y) │
│ 3. 反向传播 → 计算梯度 ∇L │
│ 4. 更新参数 θ = θ - η·∇L │
│ 计算验证集损失(可选) │
│ 调整学习率(可选) │
└─────────────────────────────────┘
输出最优参数 θ*
🏆 算法选择建议
问题规模 → 推荐优化器
─────────────────────────────────────────
小数据集、简单模型 → BGD 或 SGD
中等数据集 → Mini-batch SGD + Momentum
深度学习/大规模数据 → Adam / AdamW
需要精细调参 → SGD + Momentum + 学习率调度