趋近智
标准(或批量)梯度下降使用整个数据集计算梯度以进行每次参数更新。这提供了梯度的精确估计,但对于深度学习中常见的大数据集而言,计算成本高昂且速度缓慢。随机梯度下降(SGD)则走向另一个极端,仅在单个训练样本上评估梯度后更新参数。每次更新速度快很多,并有助于摆离浅层局部最小值,但更新非常嘈杂,可能导致不稳定的收敛路径。
是否存在一个折中方案?是的,它是实践中最常用的方法:小批量梯度下降。
小批量梯度下降在批量梯度下降(Batch GD)的可靠性与随机梯度下降(SGD)的效率之间取得平衡。它不使用整个数据集或仅一个样本,而是根据训练数据的一个小部分(称为小批量)计算梯度并更新参数。
核心思路直接明了:
一旦算法处理完覆盖整个训练数据集的所有小批量,一个周期就完成了。训练通常需要多个周期。
这种方法提供了几个显著优势:
以下可视化图提供了这些不同梯度下降变体在损失曲面上可能采取的优化路径的比较。
优化路径:批量梯度下降(平滑、直接)、随机梯度下降(嘈杂)、小批量梯度下降(中等噪声、更频繁的更新),向最小值收敛(未显示)。
尽管小批量梯度下降是深度学习优化中的主力方法,仍有一些要点需要注意:
在实践中,小批量梯度下降(在许多深度学习库中常被简称为SGD,尽管它使用了小批量)是当前大多数优化算法的根本。PyTorch和TensorFlow等深度学习框架提供了方便的DataLoader工具,它们可以在训练期间自动为你处理数据打乱和创建小批量。
# PyTorch 使用小批量的训练循环
import torch
from torch.utils.data import TensorDataset, DataLoader
# 假设 X_train, y_train 是张量
# 假设 model 和 criterion (损失函数) 已定义
# 假设 optimizer 已初始化 (例如, torch.optim.SGD)
batch_size = 64
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
num_epochs = 10
for epoch in range(num_epochs):
model.train() # 设置模型为训练模式
running_loss = 0.0
for inputs, labels in train_loader:
# inputs 和 labels 构成一个小批量
# 将参数梯度归零
optimizer.zero_grad()
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, labels)
# 反向传播并优化
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {running_loss / len(train_loader)}")
# 训练后,在验证集上评估
这种效率与合理精确的梯度估计的结合,使得小批量梯度下降成为训练深度神经网络的一种高效且被广泛采用的方法。然而,基本的小批量方法仍会遇到挑战,例如在损失中应对沟壑或鞍点,这促使了动量和自适应方法等更先进技术的发展。
这部分内容有帮助吗?
torch.utils.data.DataLoader, PyTorch Documentation, 2025 (PyTorch Foundation) - PyTorch官方文档中关于DataLoader类的说明,该类对于深度学习模型中高效处理数据加载、打乱和创建小批量数据至关重要。© 2026 ApX Machine Learning用心打造