神经网络之随机梯度下降

🎯 一、什么是随机梯度下降法(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(θ)=N1i=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} )(B1,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ηm1iBθ(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 使用
理论性质梯度方向是无偏估计,收敛到局部最优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值