Pytorch
的Autograd
技术可以帮助我们自动求微分值
复杂的计算可以被抽象成一张图,一张复杂的计算图可以分成4
个部分:
微分示例中的 x → \overrightarrow{x} x 是叶子节点、 z → \overrightarrow{z} z 是中间节点、 y → \overrightarrow{y} y 是输出节点,三者都是Tensor
Tensor
在自动微分方面有三个重要属性:
requires_grad
:布尔值,默认为False
,为True
时表示此张量需要自动微分grad
:存储张量微分值grad_fn
:存储张量微分函数当叶子节点的requires_grad
为True
,信息流经过该节点时,所有中间节点的requires_grad
属性都会变为True
,只要在输出节点调用反向传播函数backward()
,Pytorch
就会自动求出叶子节点的微分值并更新存储在叶子节点的grad
属性中。
需要注意的是:只有叶子节点的grad
属性能被更新
import torch
# x是一维张量且值全为 1
x = torch.ones(2)
print('反向传播前,x的grad属性值:', x.grad)
# 我们后边需要计算 y 关于 x 的微分,因此 x 的 requires_grad 属性设置为 True
x.requires_grad = True
# 张量 x 的每个元素都乘 4 得到张量 z
z = x*4
# y 的值等于 z 的二阶范数
# 所谓二阶范数就是 张量内所有元素平方和再开方,与上述微分例子中一致
y = z.norm()
# y 启动反向传播,执行完毕后就能得到 y 关于张量 x 的微分【存储在 x 的 grad 中】
y.backward()
print('反向传播后,x的grad属性值:', x.grad)