🎯 一、什么是随机梯度下降法(SGD)?
✅ 定义:
随机梯度下降法是一种基于样本子集(而非全体数据)计算梯度并更新模型参数的优化算法,常用于训练机器学习模型(尤其是神经网络)。
✅ 与梯度下降法的对比:
| 方法 | 每次迭代的梯度计算方式 |
|---|---|
| 全梯度下降(Batch Gradient Descent) | 用所有训练样本计算梯度 |
| 随机梯度下降(SGD) | 每次只使用一个样本 |
| 小批量梯度下降(Mini-batch SGD) | 每次使用一小批(batch_size)样本 |
🧮 二、SGD 的数学形式
设定:
- 模型参数为 (θ)( \theta )(θ)
- 损失函数为 (L(θ)=1N∑i=1Nℓ(xi,yi;θ))( L(\theta) = \frac{1}{N} \sum_{i=1}^N \ell(x_i, y_i; \theta) )(L(θ)=N1∑i=1Nℓ(xi,yi;θ))
- ((xi,yi))((x_i, y_i))((xi,yi)) 为第 (i)( i )(i) 个训练样本
- 学习率(步长)为 (η>0)( \eta > 0 )(η>0)
✅ SGD 的单步更新公式:
当使用第 (i)( i )(i) 个样本时:
θt+1=θt−η⋅∇θℓ(xi,yi;θt) \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta \ell(x_i, y_i; \theta_t) θt+1=θt−η⋅∇θℓ(xi,yi;θt)
- 只依赖于一个样本的梯度(近似整个损失函数的梯度)
- 每次迭代都带有“随机性”
✅ Mini-batch SGD 的形式:
使用一个小批量 (B⊂1,2,…,N)( \mathcal{B} \subset {1, 2, \dots, N} )(B⊂1,2,…,N),大小为 (∣B∣=m)( |\mathcal{B}| = m )(∣B∣=m),则:
θt+1=θt−η⋅1m∑i∈B∇θℓ(xi,yi;θt) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{m} \sum_{i \in \mathcal{B}} \nabla_\theta \ell(x_i, y_i; \theta_t) θt+1=θt−η⋅m1i∈B∑∇θℓ(xi,yi;θt)
这也是实际中使用最多的形式。
🔁 三、SGD 的动机与优势
✅ 为什么不直接用 Batch Gradient Descent?
- 对于大规模数据集,计算完整梯度非常慢(尤其是神经网络)。
- SGD 计算梯度非常快 —— 只需一个样本或一个小批量。
- 虽然方向不一定最优,但期望方向是下降的:
E[∇θℓ(xi,yi)]=∇θL(θ) \mathbb{E}[\nabla_\theta \ell(x_i, y_i)] = \nabla_\theta L(\theta) E[∇θℓ(xi,yi)]=∇θL(θ)
也就是说,SGD 是无偏估计的下降方向。
⚙️ 四、SGD 的核心参数
| 参数 | 说明 |
|---|---|
| (η)( \eta )(η)(学习率) | 控制更新步长,过大可能发散,过小可能收敛太慢 |
| batch size | 越小越“随机”,越大越稳定,但代价高 |
| epoch 数 | 一个 epoch 表示用完一遍训练集,一般需要多个 |
| shuffle | 每个 epoch 需随机打乱数据以增强收敛效果 |
🧠 五、SGD 的优缺点
✅ 优点:
- 对大规模数据友好
- 内存效率高(可处理分批加载的数据)
- 具备跳出局部最优的“扰动能力”
- 易于实现,可与其他方法结合(如 momentum、Adam)
❌ 缺点:
- 收敛速度较慢
- 每次更新方向噪声大,抖动明显
- 学习率敏感:需要良好的调参策略(或自适应)
🚀 六、常见的 SGD 改进版本
| 优化器 | 描述 |
|---|---|
| SGD with Momentum | 加入惯性项,使更新更平滑 |
| Nesterov Momentum | 预判梯度方向,提前“踩刹车” |
| AdaGrad | 根据历史梯度调整学习率,适合稀疏特征 |
| RMSProp | 改进 AdaGrad,防止学习率过快衰减 |
| Adam | 动量 + 自适应学习率,最常用优化器之一 |
📉 七、SGD 的收敛性(理论观点)
-
SGD 在 非凸优化问题(如神经网络)中不保证全局最优,但在实践中表现良好。
-
若满足:
- 学习率满足 (∑ηt=∞,∑ηt2<∞)( \sum \eta_t = \infty,\quad \sum \eta_t^2 < \infty )(∑ηt=∞,∑ηt2<∞)
- 梯度是无偏估计
-
则可以保证收敛到局部极小值(或鞍点)。
🧪 八、PyTorch 示例代码(Mini-batch SGD)
import torch
from torch import nn, optim
from torch.utils.data import DataLoader, TensorDataset
# 数据准备
X = torch.randn(1000, 10)
y = torch.randn(1000, 1)
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 模型定义
model = nn.Linear(10, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练循环
for epoch in range(10):
for batch_X, batch_y in dataloader:
pred = model(batch_X)
loss = criterion(pred, batch_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
✅ 九、总结:SGD 的全景图
| 方面 | 描述 |
|---|---|
| 类型 | 一阶优化算法(基于梯度) |
| 基本思想 | 每次只用一个样本或一小批样本来更新参数 |
| 优点 | 计算快、内存少、可处理大数据 |
| 缺点 | 更新方向不稳定、收敛慢 |
| 使用建议 | 通常配合 Momentum 或 Adam 使用 |
| 理论性质 | 梯度方向是无偏估计,收敛到局部最优 |
2万+

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



