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

Sha*_*wat 5 python pytorch autograd

我无法理解inputs调用中关键字的用法.backward()

\n

该文档说明如下:

\n
\n

输入(张量序列) \xe2\x80\x93 输入,梯度将累积到 .grad 中。所有其他张量将被忽略。如果未提供,则梯度将累积到用于计算 attr::tensor 的所有叶张量中。

\n
\n

据我了解,这允许我们指定我们将查看梯度的输入。

\n

已经指定的 if 不是.backward()被称为像损失这样的张量吗loss.backward()?\n计算图不能确保梯度是根据相关参数计算的。

\n

我还没有找到更好地解释这一点的来源。如果我能得到解释,我将不胜感激。

\n

che*_*ate 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}')
Run Code Online (Sandbox Code Playgroud)

输出:

到目前为止没有积累的梯度:无,无
调用loss.backward()后的梯度:8.0, 16.0
由model.zero_grad()重置的梯度 调用
loss.backward(inputs=[model.a])后的梯度:8.0, 0.0