pytorch 导数在 .grad 上不返回任何结果

Posted

技术标签:

【中文标题】pytorch 导数在 .grad 上不返回任何结果【英文标题】:pytorch derivative returns none on .grad 【发布时间】:2022-01-09 06:32:24 【问题描述】:
i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x =  tr.tensor(2*(math.cos(i1)*math.cos(i2) - math.sin(i1)*math.sin(i2)) + 3*math.cos(i1),requires_grad=True)
y =  tr.tensor(2*(math.sin(i1)*math.cos(i2) + math.cos(i1)*math.sin(i2)) + 3*math.sin(i1),requires_grad=True)
    
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)

我尝试运行以下代码,但在z.backward() 之后遇到了问题。 i1.gradi1.grad 无返回值。据我了解,这个问题的原因是在火炬中评估backward() 的方式。所以必须使用类似于i1.retain_grad() 的东西来避免这个问题,我尝试这样做,但我仍然没有得到。 i1.retain_grad 和 i2.retain_grad() 放在 z.backward() 之前和 z.backward() 之后,我仍然没有得到任何答案。到底发生了什么,我该如何解决? y.gradx.grad 工作正常。

【问题讨论】:

【参考方案1】:

用途:

i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x =  2*(torch.cos(i1)*torch.cos(i2) - torch.sin(i1)*torch.sin(i2)) + 3*torch.cos(i1)
y =  2*(torch.sin(i1)*torch.cos(i2) + torch.cos(i1)*torch.sin(i2)) + 3*torch.sin(i1)
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)

在这里,使用torch.sintorch.cos 确保输出是连接到计算图中i1i2 的火炬张量。此外,像您一样使用torch.tensor 创建xy 会将它们从现有图形中分离出来,这再次防止渐变流回i1i2

【讨论】:

以上是关于pytorch 导数在 .grad 上不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

使用Pytorch实现Transformer,如何巧妙的使用或者停用 optimizer.zero_grad()来训练大模型?

。grad()在pytorch中返回None

pytorch 中张量的 Autograd.grad()

PyTorch简单线性回归的实现

net.zero_grad() 与 optim.zero_grad() pytorch

Pytorch is_leaf