Pytorch autograd的*和+之间有本质区别吗?

时间:2020-01-13 00:17:37

标签: python pytorch

我试图更深入地了解autograd机制。为了测试我的理解,我尝试编写以下预期会产生错误的代码(例如,尝试第二次向后浏览图形)。

b = torch.Tensor([0.5])
for i in range(5):
    b.data.zero_().add_(0.5)
    b = b + a
    c = b*a
    c.backward()

很显然,在for循环中第二次调用c.backward()时,它应该报告一个错误,因为b的历史记录已被释放,但是什么也没有发生。

但是当我尝试将b + a更改为b * a时,

b = torch.Tensor([0.5])
for i in range(5):
    b.data.zero_().add_(0.5)
    b = b * a
    c = b*a
    c.backward()

它确实报告了我所期望的错误。 这对我来说看起来很奇怪。我不明白为什么在前一种情况下不会引发任何错误,以及为什么从+变为*会有所不同。

1 个答案:

答案 0 :(得分:2)

不同之处在于添加常数不会更改渐变,但按const进行修改会改变渐变。似乎autograd意识到了这一点,并优化了'b = b + a'。