[trick]梯度累加

Posted 栋次大次

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[trick]梯度累加相关的知识,希望对你有一定的参考价值。

简单来说,计算1次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数,然后清空梯度,进行下一次循环。(变相的扩大了batchsize,如果accumulation_steps 为 8, 则batchsize变相扩大8倍)

batchsize 扩大,梯度越平滑,减少抖动,相应的可以取较大的learning_rate。

pytorch为例:正常的训练过程

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()

梯度累加:

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()

https://www.cnblogs.com/sddai/p/14598018.html

以上是关于[trick]梯度累加的主要内容,如果未能解决你的问题,请参考以下文章

梯度下降法改进过程:从 SGD 到 Adam算法

LightGBM详解

LightGBM详解

boost提升

随机森林、GBDT、Xgboost

YOLOv5改进YOLOv7改进IoU损失函数:YOLOv7涨点Trick,改进添加SIoU损失函数EIoU损失函数GIoU损失函数α-IoU损失函数