《深度学习调参指南》:
参考资料:谷歌深度学习调参手册(提炼,理解,总结)-CSDN博客
1.batch_size:
小白不是很理解,怎么操作?
梯度累积是一种在多个小 batch 上计算梯度并将它们相加来模拟大 batch_size 的方法。当使用梯度累积时,每个小 batch 的梯度计算需要保存并累加,这会增加内存使用和计算时间。因此,虽然梯度累积可以帮助解决显存不足的问题,但是需要权衡计算效率和内存消耗。(如何操作???)
所以:假设你的模型是model
,优化器是optimizer
,数据加载器是data_loader
,我们希望模拟的大batch_size
是通过累积小batch
的梯度4次来实现的。
步骤
- 初始化梯度为零。
- 对于每个小
batch
,计算损失(loss
)并调用loss.backward()
累积梯度,但不立即进行参数更新。 - 每累积指定次数的梯度后,调用优化器的
step()
方法更新模型参数,并将梯度重置为零。 - 重复步骤2和3直到遍历完所有数据。
import torch
# 假设已经定义了model, loss_function和optimizer
# data_loader = DataLoader(...)
accumulation_steps = 4 # 指定需要累积的步骤数,以模拟更大的batch_size
model.train()
for i, (inputs, labels) in enumerate(data_loader):
outputs = model(inputs) # 计算模型输出
loss = loss_function(outputs, labels) # 计算损失
loss = loss / accumulation_steps # 平均损失,这一步是可选的,但有助于保持不同batch_size下梯度的尺度相同
loss.backward() # 累积梯度
if (i + 1) % accumulation_steps == 0: # 每累积指定次数后,更新一次参数
optimizer.step() # 更新参数
optimizer.zero_grad() # 清空梯度
# 确保最后不足accumulation_steps的部分梯度也能被利用
if i % accumulation_steps != 0:
optimizer.step()
optimizer.zero_grad()
调整accumulation_steps
的值,控制梯度累积的次数,从而模拟更大的batch_size
。
这种方法尤其在GPU内存有限,但需要较大batch_size
来稳定训练过程或提高训练效果的情况下非常有用。
会增加每个epoch的计算时间,并且需要更多的内存来存储累积的梯度,因此需要根据具体情况做出权衡。