美文网首页
为什么Pytorch在反向传播前需要手动将梯度清零?

为什么Pytorch在反向传播前需要手动将梯度清零?

作者: Co酱_秋乏术 | 来源:发表于2023-02-13 17:01 被阅读0次

    for i,(image, label) in enumerate(train_loader):

        # 1. input output

        pred = model(image)

        loss = criterion(pred, label)

        # 2.1 loss regularization

        loss = loss / accumulation_steps 

        # 2.2 back propagation

        loss.backward()

        # 3. update parameters of net

        if (i+1) % accumulation_steps == 0:

            # optimizer the net

            optimizer.step()        # update parameters of net

            optimizer.zero_grad()  # reset gradient

    上述代码解释如下:

        获取输入数据:从dataloader中取出每个batch的输入数据,图像和标签

        计算loss:输入图像送入网络,执行前向预测得到预测值,计算损失函数

        loss.backward() 反向传播,计算当前梯度

        多次循环步骤 1-2,不清空梯度,使梯度累加在已有梯度上

        梯度累加了一定次数后,先optimizer.step() 根据累计的梯度更新网络参数,然后optimizer.zero_grad() 清空过往梯度,为下一波梯度累加做准备。

    简单来说:梯度累加就是,每次获取1个batch的数据,计算1次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数,然后清空梯度,进行下一次循环。

    一定条件下,batchsize 越大训练效果越好,梯度累加则实现了 batchsize 的变相扩大,如果accumulation_steps 为 8,则batchsize '变相' 扩大了8倍,是我们这种乞丐实验室解决显存受限的一个不错的trick,使用时需要注意,学习率也要适当放大。

    ————————————————

    原文链接:https://blog.csdn.net/sgzqc/article/details/120424281

    相关文章

      网友评论

          本文标题:为什么Pytorch在反向传播前需要手动将梯度清零?

          本文链接:https://www.haomeiwen.com/subject/kzfskdtx.html