type
status
date
slug
summary
tags
category
icon
password
Property
torch.Tensor
是包的核心类。如果将其属性 .requires_grad
设置为 True,则会开始跟踪针对 tensor 的所有操作。完成计算后,可以调用 .backward()
来自动计算所有梯度。该张量的梯度将累积到 .grad
属性中。要停止 tensor 历史记录的跟踪,可以调用
.detach()
,它将其与计算历史记录分离,并防止将来的计算被跟踪。要停止跟踪历史记录(和使用内存),还可以将代码块使用
with torch.no_grad():
包装起来。在评估模型时特别有用,因为模型在训练阶段具有requires_grad = True
的可训练参数有利于调参,但在评估阶段不需要梯度。还有一个类对于 autograd 实现非常重要那就是 Function。Tensor 和 Function 互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个 .grad_fn 属性保存着创建了张量的 Function 的引用,(如果用户自己创建张量,则grad_fn 是 None )。
如果你想计算导数,你可以调用 Tensor.backward()。如果 Tensor是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果它有更多元素,则需要指定一个gradient 参数来指定张量的形状。
自动求导
- 手动求导
torch.autograd.grad(loss, [w1, w2, ...])
[w1.grad, w2.grad...]
- 自动求导
loss.backward()
返回的梯度信息不会返回而是附在每个梯度信息上面 w1.grad w2.grad
假设对函数关于列向量x求导
非标量变量的反向传播
当
y
不是标量时,向量y
关于向量x
的导数的最自然解释是一个矩阵。 对于高阶和高维的y
和x
,求导的结果可以是一个高阶张量分离计算
有时我们希望将某些计算移动到记录的计算图之外。 例如,假设
y
是作为x
的函数计算的,而z
则是作为y
和x
的函数计算的。 想计算z
关于x
的梯度,但由于某种原因,希望将y
视为一个常数, 并且只考虑到x
在y
被计算后发挥的作用。在这里,可以分离
y
来返回一个新变量u
,该变量与y
具有相同的值, 但丢弃计算图中如何计算y
的任何信息。 换句话说,梯度不会向后流经u
到x
。 因此,下面的反向传播函数计算z=u*x
关于x
的偏导数,同时将u
作为常数处理, 而不是z=x*x*x
关于x
的偏导数Python控制流的梯度计算
使用自动微分的一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),仍然可以计算得到的变量的梯度。 在下面的代码中,
while
循环的迭代次数和if
语句的结果都取决于输入a
的值