【问题标题】:Is there any essential difference between * and + for Pytorch autograd?Pytorch autograd的*和+之间有什么本质区别吗?
【发布时间】:2020-01-13 15:44:15
【问题描述】:

我试图更深入地了解 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()

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

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 2013-09-13
      • 2017-04-05
      • 2014-09-18
      • 2015-06-14
      • 2011-05-23
      • 2011-02-15
      • 2011-11-27
      • 2022-01-18
      相关资源
      最近更新 更多