ShusenTang / Dive-into-DL-PyTorch

本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。
http://tangshusen.me/Dive-into-DL-PyTorch
Apache License 2.0
18.17k stars 5.38k forks source link

文档2.3.3 梯度一节中最后一个例子,修改tensor.data不影响梯度吗? #126

Closed NoahFeng closed 4 years ago

NoahFeng commented 4 years ago

文档2.3.3节中例子:

x = torch.ones(1,requires_grad=True)

print(x.data) # 还是一个tensor
print(x.data.requires_grad) # 但是已经是独立于计算图之外

y = 2 * x
x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播

y.backward()
print(x) # 更改data的值也会影响tensor的值
print(x.grad)

输出:

tensor([1.])
False
tensor([100.], requires_grad=True)
tensor([2.])

这里改变x.data没有改变到x.grad是因为y=2*x吧? 如果改成y=x**2

x = torch.ones(1., requires_grad=True)
print(x.data)
print(x.data.requires_grad)

y = x ** 2
x.data *= 100
y.backward()
print(x)
print(x.grad)

输出变成了:

tensor([1.])
False
tensor([100.], requires_grad=True)
tensor([200.])  # 值改变了

文档中所述内容需要怎么理解呢?有点不太明白。

ShusenTang commented 4 years ago

这里这个例子确实举得不太准确。对于x**2,它的导数是2x,所以当x的值(x.data)变了之后导数自然会跟着改变(所以实际上我们很少直接修改x.data)。你只需要记住这样一个事实:x.data是独立在运行图之外的,好好理解下面这个例子即可 image 这里x2是没有梯度的

NoahFeng commented 4 years ago

感谢解答,理解这里所说的用法了。非常感谢。