深度学习之梯度累加(Pytorch实现)

本文最后更新于:2021年10月22日 下午

深度学习之梯度累加(Pytorch实现)

参考文献

What is Gradient Accumulation in Deep Learning? | by Raz Rotenberg | Towards Data Science

梯度累加(Gradient Accumulation) - stardsd - 博客园 (cnblogs.com)

梯度累加是什么

梯度累加就是把一个大Batch分成小mini-batch,每个mini-batch分别送模型算loss得到梯度,并进行累加,直到大Batch里所有数据计算完,再梯度下降。

梯度累加示意图

梯度累加就是运行几个step但是不更新模型,在这几个step中,模型的参数不变,也就是假装我们在计算大Batch。

Pytorch代码示例

传统训练过程

1
2
3
4
5
6
7
8
for i, (inputs, labels) in enumerate(trainloader):
optimizer.zero_grad() # 梯度清零
outputs = net(inputs) # 正向传播
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播,计算梯度
optimizer.step() # 更新参数
if (i+1) % evaluation_steps == 0:
evaluate_model()

梯度累加

1
2
3
4
5
6
7
8
9
10
for i, (inputs, labels) in enumerate(trainloader):
outputs = net(inputs) # 正向传播
loss = criterion(outputs, labels) # 计算损失函数
loss = loss / accumulation_steps # 损失标准化
loss.backward() # 反向传播,计算梯度
if (i+1) % accumulation_steps == 0:
optimizer.step() # 更新参数
optimizer.zero_grad() # 梯度清零
if (i+1) % evaluation_steps == 0:
evaluate_model()

挖坑:Video Captioning通过梯度累加来加快速度

实验平台GPU被占了做不了实验填不了坑了哼唧


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!