反向传播自动求微分【Pytorch】
Pytorch
的Autograd
技术可以帮助我们自动求微分值
1. 微分实例
2. 基本原理
复杂的计算可以被抽象成一张图,一张复杂的计算图可以分成4
个部分:
- 叶子节点【图的末端,没有信息流经过,但信息流由此出发】
- 中间节点【有信息流经过,信息流经过中间节点来到末端输出叶子节点】
- 输出节点
- 信息流【可以理解为有用信息集合,如上述求关于 x 1 x_1 x1 的微分,此时 x 1 x_1 x1 就说有用的信息】
微分示例中的
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
属性能被更新
3. 代码示例
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)