python - 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()
c.backward()
显然,在for循环中第二次调用时应该报错,因为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()
它确实报告了我所期望的错误。这对我来说看起来很奇怪。我不明白为什么前一种情况没有引发错误,以及为什么从 + 更改为 * 会有所不同。
解决方案
不同之处在于添加一个常数不会改变梯度,但 mull by const 会。看来,autograd 意识到了这一点,并优化了“b = b + a”。
推荐阅读
- python - 如何删除随机模块中的包围
- r - 用另一个日期添加字符类的日期
- java - 具有与参数相同的对象的对象构造函数
- jquery - 如何解决 DatePicker Jquery 中的 ToDate 问题
- sharepoint - Sharepoint 日历 webpart 仅配置全天事件
- joomla3.0 - display:block 在窄屏幕上时如何隐藏空表格单元格?
- react-native - Razorpay 响应未发送 Razorpay order_id
- groovy - Jmeter MongoDb 未经授权
- json - Jolt 获取键值对的值,其中键等于键值对数组中的主机
- php - 获取商业帐户转换前发布的媒体的覆盖面指标时出现异常[无效参数]