繁体   English   中英

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

[英]Is there any essential difference between * and + for Pytorch autograd?

我试图更深入地了解 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的history已经被释放了,但是没有任何反应。

但是当我尝试将 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()

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

不同之处在于添加一个常量不会改变梯度,但 mull by const 会。 看来,autograd 意识到了这一点,并优化了 'b = b + a'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM