我正在寻找PyTorch中`.backward()`方法的`inputs`参数的全面解释。

5
我在理解在 .backward() 调用中的 inputs 关键字的使用方面遇到了困难。
文档如下:

inputs (sequence of Tensor) – 输入,对其梯度将被累积到 .grad。其他所有张量都将被忽略。如果未提供,则梯度将累积到计算 attr::tensors 时使用的所有叶张量中。

据我所知,这允许我们指定我们要查看梯度的输入。
如果像这样调用 .backward() 并传入某个张量(如损失),loss.backward(),那么是否已经指定了呢?不是计算图会确保根据相关参数计算梯度吗?
我没有找到更好的解释来源。如果可以指导我一个解释,我将不胜感激。
1个回答

5

它只是一种限制梯度计算参数集的方法(如文档中所述)。以下是一个示例:

import torch
from torch import nn

class Model(nn.Module):
    # warning: useless model for explanatory purpose only
    def __init__(self):
        super().__init__()
        self.a = nn.Parameter(torch.as_tensor(1.))
        self.b = nn.Parameter(torch.as_tensor(1.))

    def forward(self, x):
        return x + self.a + 2 * self.b

model = Model()

print(f'no gradients accumulated so far: {model.a.grad}, {model.b.grad}')

loss = model(1)**2
loss.backward()
print(f'gradients after calling loss.backward(): {model.a.grad}, {model.b.grad}')

model.zero_grad()
print('gradients reset by model.zero_grad()')

loss = model(1)**2
loss.backward(inputs=[model.a])
print(f'gradients after calling loss.backward(inputs=[model.a]): {model.a.grad}, {model.b.grad}')

输出:

迄今为止未累积任何梯度:None,None
调用 loss.backward() 后的梯度:8.0,16.0
通过 model.zero_grad() 重置的梯度
调用 loss.backward(inputs=[model.a]) 后的梯度:8.0,0.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接