这个自动求导功能其实就是利用了链式求导法则,利用反向传播来求出对应参数的偏导。0.41版本后,pytorch就直接将其合并进了Tensor类里面了。
Tensor类是autograd里面的核心类,通过属性.requires_grad,将其设置为True之后,就会在后续的操作中追踪其所有的操作,形成一个计算网络。然后就可以利用链式法则对其进行梯度传播了。完成计算之后,调用.backward()函数(即反向传播在pytorch里面的那个函数)就可以将该Tensor的所有梯度累积到.grad属性中。
另外一个很重要的类就是Function。Function里面记录的其实就是在前向传播的过程中该张量的计算操作,便于反向传播求导。Tensor.grad_fn属性就对应该类。
实例如下:
x = torch.ones(2, 2, requires_grad=True)
print(x)
print(x.grad_fn)
输出应为:
自己创建的张量x是默认没有grad_fn的,并且若无设置,requires_grad也会默认为false。
做加法运算后:
z = y * y * 3
out = z.mean()
print(z, out)
输出:
grad_fn说明的就是取均值操作。
需要注意的是,在使用.backward()函数求梯度时,如果变量是一个标量y,则可以直接使用 y.backward()来求梯度。若为张量y,则需要创建一个与y形式一样的张量z,假设y由x计算而来,z与y同形。则应为 : y.backward(z)。
这样做是为了避免张量与张量求导,只允许标量对张量求导,求导的结果为与自变量同形的张量。
上式中,z的作用实际上是与y进行了一个加权求和操作,将其转化为标量后再使用。
(单纯自己学习记录使用。图片来自书《动手学Pytorch》,侵删)