在任何深度学习库中,都需要一种机制来计算误差梯度,并通过计算图进行反向传播。这种机制在PyTorch中称为autograd,变量类是autograd系统的主要组件。
变量类封装了一个张量及梯度属性,当调用.backward()
函数时,会自动计算张量的梯度,并存储在梯度属性中。变量和张量之间的区别是变量中包含梯度,变量也可以进行数学运算。
让我们从一个简单的张量中创建一个变量:
# 从pytorch autograd库中导入变量
from torch.autograd import Variable
# 定义变量
x = Variable(torch.ones(2, 2) * 2, requires_grad=True)
x
输出
tensor([[2., 2.],
[2., 2.]], requires_grad=True)
在上面的变量声明中,传入了一个张量,同时指明这个变量需要一个梯度,这意味着这个变量是可以训练的。如果requires_grad
标志设置为False,则不会对变量进行训练。
对于这个简单的例子,我们没有进行任何训练,接下来,让我们看另外一个例子。
- 假设方程是 y = x^2
- 定义变量 x =[2,4]
- 经过计算,得到 y = [4,16]
- 假设损失函数为:o = (1/2)sum(y) = (1/2)sum(x²)
- 计算梯度,即o对于x的导数: do/dx = x,所以梯度是[2,4]
# 从pytorch autograd库中导入变量
from torch.autograd import Variable
# 让我们进行基本的反向传播
# 方程是y = x^2
array = [2,4]
tensor = torch.Tensor(array)
x = Variable(tensor, requires_grad = True)
y = x**2
print(" y = ",y)
# 损失函数为:o = (1/2)sum(y) = (1/2)sum(x²)
o = (1/2)*sum(y)
print(" o = ",o)
# 反向传播
o.backward() # 计算梯度
# 变量的梯度保存在.grad属性中,查看x的梯度: x.grad
print("gradients: ",x.grad)
输出
y = tensor([ 4., 16.], grad_fn=<PowBackward0>)
o = tensor(10., grad_fn=<MulBackward0>)
gradients: tensor([2., 4.])
可以看出,梯度属性也是一个张量。