梯度下降法(Gradient Descent)详解 [复制链接]

管理员组

梯度下降是最小化损失函数的核心优化算法,几乎所有机器学习模型的训练都依赖它。


🎯 核心思想

类比下山:站在山上(高损失),每次朝最陡的下坡方向走一步,直到到达山谷(最低损失)。

$\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 + 学习率调度
最新回复

请先登录后再回复 登录

uid:1 管理员组
关注
发帖 8
评论 0
粉丝 0
关注 0
发新帖
目录
梯度下降法(Gradient Descent)详解