反向传播自动求微分【Pytorch】

时间:2022-01-10 01:17:31

PytorchAutograd技术可以帮助我们自动求微分值

1. 微分实例

反向传播自动求微分【Pytorch】反向传播自动求微分【Pytorch】

2. 基本原理

复杂的计算可以被抽象成一张图,一张复杂的计算图可以分成4个部分:

  1. 叶子节点【图的末端,没有信息流经过,但信息流由此出发】
  2. 中间节点【有信息流经过,信息流经过中间节点来到末端输出叶子节点】
  3. 输出节点
  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_gradTrue,信息流经过该节点时,所有中间节点的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)
反向传播自动求微分【Pytorch】