PyTorch 中的累积梯度

文章探讨了在PyTorch中,特别是在小批量训练时,梯度累积对模型权重更新的影响。它指出,对于简单的模型如ExampleLinear,梯度累积可能得到理想结果,但在复杂模型如BERT中,累积策略可能导致BatchNormalization失效,推荐使用GroupNormalization。

https://stackoverflow.com/questions/62067400/understanding-accumulated-gradients-in-pytorch

有一个小的计算图,两次前向梯度累积的结果,可以看到梯度是严格相等的。

在这里插入图片描述
在这里插入图片描述

代码:

import numpy as np
import torch


class ExampleLinear(torch.nn.Module):

    def __init__(self):
        super().__init__()
        # Initialize the weight at 1
        self.weight = torch.nn.Parameter(torch.Tensor([1]).float(),
                                         requires_grad=True)

    def forward(self, x):
        return self.weight * x


model = ExampleLinear()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)


def calculate_loss(x: torch.Tensor) -> torch.Tensor:
    y = 2 * x
    y_hat = model(x)
    temp1 = (y - y_hat)
    temp2 = temp1**2
    return temp2


# With mulitple batches of
### 如何在 PyTorch 中计算梯度 为了理解如何在 PyTorch 中计算梯度,可以按照如下方式操作: 定义张量并设置 `requires_grad=True` 来跟踪其运算以便后续自动求导。例如创建一个简单的线性模型参数 w 和 b 并初始化它们[^1]。 ```python import torch w = torch.tensor([0.5], requires_grad=True) b = torch.tensor([-0.3], requires_grad=True) ``` 接着定义损失函数以及前向传播过程,在此过程中所有的操作都会被记录下来形成动态图结构,这使得反向传播时能够依据链式法则逐层回溯计算各个变量相对于最终输出的偏导数即所谓的“梯度”。 对于具体的训练循环部分,则是在每次迭代中先执行一次正向传递得到预测值 y_pred ,再通过比较真实标签 y_true 计算误差 loss 。之后调用 `.backward()` 方法触发整个网络中的梯度计算流程[^2]。 ```python x_data = torch.tensor([1.0, 2.0, 3.0]) y_truth = torch.tensor([2.0, 4.0, 6.0]) for epoch in range(2): # 前向传播: 使用输入 x 数据来计算预测值. y_pred = w * x_data + b # 计算和打印损失 (Loss). loss = (y_pred - y_truth).pow(2).sum() print(f'Epoch {epoch}: loss={loss.item()}') # 反向传播之前清零累积梯度(如果存在) if w.grad is not None and b.grad is not None: w.grad.data.zero_() b.grad.data.zero_() # 后向传播: 计算所有叶子节点 Tensors 的 grad 属性. loss.backward() print(w.grad) # 打印权重 w 的梯度 print(b.grad) # 打印偏差项 b 的梯度 ``` 上述代码片段展示了完整的单次优化周期内的梯度计算逻辑,其中包含了必要的准备工作如数据准备、模型构建等前置条件说明;同时也体现了核心概念——借助`.backward()`方法实现自动化微分机制从而简化了复杂神经网络架构下的梯度获取难度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值