gpt4 book ai didi

pytorch - torch.autograd.grad 中的 grad_outputs(CrossEntropyLoss)

转载 作者:行者123 更新时间:2023-12-03 17:03:31 24 4
gpt4 key购买 nike

我正在尝试获取 d(loss)/d(input) .我知道我有 2 个选择。

第一个选项:

    loss.backward()
dlossdx = x.grad.data

第二种选择:
    # criterion = nn.CrossEntropyLoss(reduce=False)
# loss = criterion(y_hat, labels)
# No need to call backward.
dlossdx = torch.autograd.grad(outputs = loss,
inputs = x,
grad_outputs = ? )

我的问题是:如果我使用交叉熵损失,我应该传递什么 grad_outputs在第二个选项中?

我把 d(CE)/d(y_hat) ?由于 pytorch 交叉熵包含 softmax,这将需要我使用 Kronecker delta 预先计算 softmax 导数。

还是我放 d(CE)/d(CE)这是torch.ones_like?

一个概念性的答案是好的。

最佳答案

让我们试着了解这两个选项是如何工作的。

我们将使用此设置

import torch 
import torch.nn as nn
import numpy as np
x = torch.rand((64,10), requires_grad=True)
net = nn.Sequential(nn.Linear(10,10))
labels = torch.tensor(np.random.choice(10, size=64)).long()
criterion = nn.CrossEntropyLoss()

第一个选项
loss = criterion(net(x), labels)
loss.backward(retain_graph=True)
dloss_dx = x.grad

请注意,您没有将选项传递给梯度,因为如果您将损失计算为向量,损失是一个标量,那么您必须通过

第二种选择
dloss_dx2 = torch.autograd.grad(loss, x)

这将返回一个元组,您可以使用第一个元素作为 x 的梯度。

请注意 torch.autograd.grad如果将多个输出作为元组传递,则返回 dout/dx 的总和。但由于损失是标量,你不需要通过 grad_outputs因为默认情况下它会认为它是一个。

关于pytorch - torch.autograd.grad 中的 grad_outputs(CrossEntropyLoss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54166206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com