导数是切线的斜率
将导数拓展到向量就是梯度 梯度指向值变化最大的方向 与等高线正交
因为定义x是有梯度的张量, y作为x的函数 可以计算关于x的梯度
x = torch.arange(4.0)
x.requires_grad_(True)
x.grad
y = torch.dot(x,x)
通过反向传播自动计算y关于x每个分量的梯度
y.backward() # 通过反向传播自动计算y关于x每个分量的梯度
x.grad
x.grad == 2*x
# 默认情况下pytorch会累计梯度 需要清除之前的值
x.grad.zero_()
y = x.sum()
y.backward()
x.grad
将某些计算移动到计算图之外
x.grad.zero_()
y = x * x
u = y.detach() # detach之后变为没有梯度的张量
z = u * x
z.sum().backward()
x.grad == u