要理解Pytorch求解梯度,首先需要理解Pytorch当中的计算图的概念,在计算图当中每一个Variable都代表的一个节点,每一个节点就可以代表一个神经元,我们只有将变量放入节点当中才可以对节点当中的变量求解梯度,假设我们有一个矩阵:

1., 2., 3.
4., 5., 6.

我们将这个矩阵(二维张量)首先在Pytorch当中初始化,并且将其放入计算图当中的节点当中,在Pytorch当中,一个节点用Variable来表示,因此可以编写如下代码:

import torch
from torch.autograd import Variable

# 我们创建的是一个二维张量(即矩阵)而不是标量,因此会报错
# 在Pytorch当中,仅允许标量对标量或者 标量对向量(或者张量)求解偏导数
x=Variable(torch.Tensor([[1., 2., 3.], [4., 5., 6.]]), requires_grad=True)

在节点当中,拥有requires_grad的参数,系统默认是False,也就是不能对其中的变量求解梯度,但是我们需要里面变量的梯度,因此需要将整个参数命名为True。

最后我们写出其他变量有关x的表达式:

y=2*x*x+2

j=y.mean()

这样就得到了j的值,这是一个标量,因为mean表示的求解平均值,在Pytorch当中只能够标量对标量,或者标量对张量求解偏导数,否则就会报错。

现在我们的计算图模型就搭建完毕了,整个模型当中只有一个节点,其他的表示相当于神经元当中的权重,以及J代表loss函数,我们调用Pytorch当中的反向传播函数backward(),对x关于j的梯度进行求解,代码如下:

 

j.backward()

 

这样梯度就求解完毕了,我们打印出x关于j的梯度的值,后面的参数x.grad表示求解出来的x的梯度大小:

print("x的梯度是:",x.grad)

输出:

x的梯度是: 
tensor([[0.6667, 1.3333, 2.0000], [2.6667, 3.3333, 4.0000]]

得解!