自动微分变量
表面上看,自动微分变量与普通张量没有区别,都可以进行运算,但自动微分变量内部数据结构更加复杂。
在深度学习中,微分是一个关键的概念,因为我们需要计算梯度来优化模型的参数。然而,手动计算微分公式可能非常复杂,特别是对于复杂的深度学习模型。这就是自动微分变量的作用所在。
在 PyTorch 1.5 中,自动微分变量已经与张量合并,任何一个张量都是一个自动微分变量。
使用自动微分变量后,不论计算多么复杂,系统都会自动构造一个计算图来记录运算过程。构建好计算图后,可非常方便地自动执行反向传播算法,算出每个自动微分变量的梯度信息。
核心属性
自动微分变量核心属性:
-
data:伴随自动分为变量的张量,存储计算结果
-
grad_fn:记录计算图中的前一个节点,存储计算的路径
-
.backward()函数:执行反向传播算法时,可自动计算所有变量的梯度信息,并将叶节点的导数值存储在.grad中
示例
通过PyTorch的自动微分变量来计算下面函数的导数:
其中 m 表示求平均。具体代码:
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y
t = torch.mean(z)
对于输入 x=[[1, 1], [1, 1]]
,得到 z.data=[[9, 9], [9, 9]]
。
t 会对 z 矩阵取平均,最终得到 9。
执行求导,PyTorch 会从 t 到 x 执行反向传播算法:
t.backward()
查看梯度:
print(z.grad)
print(y.grad)
print(x.grad)
None
None
tensor([[1.5000, 1.5000],
[1.5000, 1.5000]])
PyTorch 规定,只有计算图上的叶节点才可以通过.backward()获得梯度信息。z和y不是叶节点,所以都没有梯度信息。
因此,计算得到的
tensor([[1.5000, 1.5000],
[1.5000, 1.5000]])
在上面代码中:requires_grad=True是为了保证它可以在执行反向传播算法的过程中获得梯度信息
本文作者:Maeiee
本文链接:自动微分变量
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!