梯度累积(Gradient Accumulation)是一种在深度学习训练中常用的技术,尤其在显存受限的情况下。以下是梯度累积在深度学习中的主要应用和优势:
梯度累积的基本思想是在多个小批量上分别计算梯度,然后将这些梯度累加起来,最后进行一次参数更新。具体步骤如下:
import torch
from torch.utils.data import DataLoader
# 假设我们有一个模型和数据加载器
model = ...
train_loader = DataLoader(dataset=..., batch_size=32, shuffle=True)
# 设置累积步数
accumulation_steps = 4
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = torch.nn.CrossEntropyLoss()
for epoch in range(num_epochs):
model.train()
for i, (inputs, targets) in enumerate(train_loader):
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播,但只计算当前小批量的梯度
loss = loss / accumulation_steps
loss.backward()
# 如果达到累积步数,则更新参数并清空梯度
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()总之,梯度累积是一种非常实用的技巧,可以帮助我们在有限的显存资源下训练更大或更复杂的深度学习模型。