Pytorch--自动求导

        这个自动求导功能其实就是利用了链式求导法则,利用反向传播来求出对应参数的偏导。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)

输出应为:

      Pytorch--自动求导_第1张图片

自己创建的张量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》,侵删)

你可能感兴趣的:(python,pytorch)