自动求导实现
1.假设对函数y=2xTx关于列向量x求导
import torchx = torch.arange(4.0)
x
2.在计算y关于x的梯度之前,需要地方存储梯度
x.requires_grad_(True)
x.grad
3.计算y
y = 2 * torch.dot(x, x)
y
4.通过反向传播函数来自动计算y关于x每个分量的梯度
y.backward()
x.grad
x.grad == 4 * x
5.计算x的另一个函数
默认情况下,pytorch会积累梯度
x.grad.zero_()
y = x.sum()
y.backward()
x.grad
6.深度学习中,目的是计算批量中每个样本单独计算的偏导数之和
x.grad.zero_()
y = x * x
y.sum().backward()
x.grad
7.将某些计算移动到记录的计算图之外
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x
8.即使构建函数的计算图需要通过Python控制流(条件、循环、任意函数调用),仍然可以技术得到变量梯度
def f(a):b = a * 2while b.norm() < 1000:b = b * 2if b.sum() > 0:c = belse:c = 100 * breturn ca = torch.randn(size=(),requires_grad=True)
d = f(a)
d.backward()a.grad == d / a