自动微分是一种计算张量(tensors)的梯度(gradients)的技术,它在深度学习中非常有用。自动微分的基本思想是:
.backward()
调用之后,autograd开始填充一个新的图。-
- import torch
- import torch.nn as nn
- M = nn.Linear(2, 2) # neural network module
- M.eval() # set M to evaluation mode
- with torch.no_grad(): # disable gradient computation
- for param in M.parameters(): # loop over all parameters
- param.fill_(1) # fill the parameter with 1
- M.requires_grad_(False)
-
- a = torch.tensor([1., 2.], requires_grad=True) # leaf node
- b = torch.tensor([13., 32.], requires_grad=True) # leaf node
- c = M(a) # non-leaf node
- c2 = M(b) # non-leaf node
- d = c * 2 # non-leaf node
- d.sum().backward() # compute gradients
- print(a.grad)
- print(b.grad)
- print(c.grad)
- print(d.grad)
- print(M.weight.grad) # None
构建计算图:当我们调用backward()方法时,PyTorch会自动构建从叶子节点a到损失值d.sum()的计算图,这是一个有向无环图,表示了各个张量之间的运算关系。计算图中还包含了两个中间变量c和d,它们是由a经过M模型的前向传播得到的。计算图的作用是记录反向传播的路径,以便于计算梯度。 计算梯度:在计算图中,每个张量都有一个属性grad,用于存储它的梯度值。当我们调用backward()方法时,PyTorch会沿着计算图按照链式法则计算并填充每个张量的grad属性。由于我们只对叶子节点a的梯度感兴趣,所以只有a的grad属性会被计算出来,而中间变量c和d的grad属性会被忽略。a的grad属性的值是损失值d.sum()对a的偏导数,表示了a的变化对损失值的影响。