自动差异化包 - torch.autograd


torch.autograd提供了类和函数用来对任意标量函数进行求导。要想使用自动求导,只需要对已有的代码进行微小的改变。只需要将所有的tensor包含进Variable对象中即可。

torch.autograd.backward(variables, grad_variables, retain_variables=False)

计算给定变量 wrt 图叶的梯度的总和。 该图使用链规则进行区分。如果任何 variables 非标量(即它们的数据具有多个元素)并且需要梯度,则该函数另外需要指定 grad_variables。它应该是一个匹配长度的序列,其包含差分函数 wrt 对应变量的渐变(None 对于不需要梯度张量的所有变量,它是可接受的值)。

此函数在树叶中累加梯度 - 在调用它之前可能需要将其清零。

参数:

  • variables (variable 列表) – 将计算导数的变量 。

  • grad_variables (序列(Tensor, Variable或者 None)) – 渐变写入相应变量的每个元素。任何张量将被自动转换为 volatile,除非 create_graph 为 True。可以为标量变量或不需要 grad 的值指定无值。如果所有 grad_variables 都可以接受 None 值,则该参数是可选的。

  • retain_graph(bool,可选) - 如果为 False,则用于计算 grad 的图形将被释放。请注意,在几乎所有情况下,将此选项设置为 True 不是必需的,通常可以以更有效的方式解决。默认值为 create_graph。

  • create_graph(bool,可选) - 如果为 true,则构造导数的图形,允许计算更高阶的衍生产品。默认为 False,除非 grad_variables 包含至少一个非易失性变量。

torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=None, only_inputs=True)

计算并返回输入的输出梯度的总和。

gradoutputs 应该是 output 包含每个输出的预先计算的梯度的长度匹配序列。如果输出不需要 grad,则渐变可以是 None)。当不需要派生图的图形时,梯度可以作为 Tensors 给出,或者作为 Variables,在这种情况下将创建图形。

如果 only_inputs 为 True,该函数将仅返回指定输入的渐变列表。如果它是 False,则仍然计算所有剩余叶子的渐变度,并将累积到其.grad 属性中。

参数:

  • outputs(可变序列) - 差分函数的输出。
  • inputs(可变序列) - 输入将返回梯度的积分(并不积累.grad)。
  • grad_outputs(Tensor 或 Variable 的序列) - 渐变 wrd 每个输出。任何张量将被自动转换为 volatile,除非 create_graph 为 True。可以为标量变量或不需要 grad 的值指定无值。如果所有 grad_variables 都可以接受 None 值,则该参数是可选的。
  • retain_graph(bool,可选) - 如果为 False,则用于计算 grad 的图形将被释放。请注意,在几乎所有情况下,将此选项设置为 True 不是必需的,通常可以以更有效的方式解决。默认值为 create_graph。
  • create_graph(bool,可选) - 如果为 True,则构造导数的图形,允许计算高阶衍生产品。默认为 False,除非 grad_variables 包含至少一个非易失性变量。
  • only_inputs(bool,可选) - 如果为 True,则渐变 wrt 离开是图形的一部分,但不显示 inputs 不会被计算和累积。默认为 True。

API 兼容性

可变 API 与常规 Tensor API(除了几个就地方法,覆盖渐变计算所需的输入之外)几乎相同。在大多数情况下,传感器可以安全地替换为变量,代码将保持工作正常。因此,我们不会记录变量的所有操作,torch.Tensor 为此也应该参考文档。

变量的直接操作

支持自动归档中的就地操作是一件很困难的事情,我们在大多数情况下都不鼓励使用它们。Autograd 的积极缓冲区释放和重用使其非常高效,并且在现场操作实际上会降低内存使用量的情况下,极少数场合很少。除非您在内存压力很大的情况下运行,否则您可能永远不需要使用它们。

In-place 正确性检查

所有 Variable 的跟踪应用于它们的就地操作,并且如果实现检测到在一个功能中保存了向后的变量,但是之后被修改就位,则一旦向后通过开始就会产生错误。这可以确保如果您使用就地功能并且没有看到任何错误,则可以确定计算出的渐变是正确的。

class torch.autograd.Variable

包裹张量并记录应用的操作。

变量是 Tensor 对象周围的薄包装,它也保存了渐变 wrt,并引用了创建它的函数。此引用允许回溯创建数据的整个操作链。如果变量是由用户创建的,那么它的 grad_fn 将被 None 我们称为这样的对象叶变量。

由于自动调整仅支持标量值函数微分,因此 grad 大小始终与数据大小匹配。此外,grad 通常仅分配给叶变量,否则将始终为零。

变量:

  • data – 包含的Tensor

  • grad - 变量保持类型和位置的坡度匹配.data。此属性是懒惰分配的,无法重新分配。

  • requires_grad - 指示变量是否由包含任何需要的变量的子图创建的布尔值。有关详细信息,请参阅从向后排除子图。只能在叶变量上更改。

  • volatile - Boolean 表示在推断模式下应该使用 Variable,即不保存历史记录。有关详细信息,请参阅 从向后排除子图。只能在叶变量上更改。
  • is_leaf - Boolean 指示变量是否为图形叶(即如果由用户创建)。
  • grad_fn - 梯度函数图跟踪。

属性:

  • data (any tensor class) – 被包含的Tensor

  • requires_grad (bool) – requires_grad标记. 只能通过keyword传入.

  • volatile (bool) – volatile标记. 只能通过keyword传入.

backward(gradient=None, retain_variables=False)

当前Variableleaf variable求偏导。

计算图可以通过链式法则求导。如果Variable是 非标量(non-scalar)的,且requires_grad=True。那么此函数需要指定gradient,它的形状应该和Variable的长度匹配,里面保存了Variable的梯度。

此函数累积leaf variable的梯度。你可能需要在调用此函数之前将Variable的梯度置零。

参数:

  • grad_variables(Tensor,Variable 或 None) - 渐变 wrt 变量。如果它是张量,它将被自动转换为 volatile,除非 create_graph 是 True。可以为标量变量或不需要 grad 的值指定无值。如果无值可接受,则此参数是可选的。
  • retain_graph(bool,可选) - 如果为 False,用于计算 grads 的图形将被释放。请注意,在几乎所有情况下,将此选项设置为 True 不是必需的,通常可以以更有效的方式解决。默认值为 create_graph。
  • create_graph(bool,可选) - 如果为 true,则构造导数的图形,允许计算更高阶的衍生产品。默认为 False,除非 gradient 是 volatile 变量。

detach()

返回一个新变量,与当前图形分离。

结果将永远不需要渐变。如果输入是易失的,输出也将变得不稳定。

注意: 返回变量使用与原始变量相同的数据张量,并且可以看到其中任何一个的就地修改,并且可能会触发正确性检查中的错误。

detach_()

从创建它的图形中分离变量,使其成为叶。

register_hook(hook)

注册一个backward钩子。

每次gradients被计算的时候,这个hook都被调用。hook应该拥有以下签名:

  1. hook(grad) -> Variable or None

钩子不应该修改它的参数,但是它可以选择返回一个新的渐变,用来代替它 grad。

此函数返回一个带有 handle.remove() 从模块中删除钩子的方法的句柄。

例:

  1. >>> v = Variable(torch.Tensor([0, 0, 0]), requires_grad=True)
  2. >>> h = v.register_hook(lambda grad: grad * 2) # double the gradient
  3. >>> v.backward(torch.Tensor([1, 1, 1]))
  4. >>> v.grad.data
  5. 2
  6. 2
  7. 2
  8. [torch.FloatTensor of size 3]
  9. >>> h.remove() # removes the hook

reinforce(reward)

注册一个奖励,这个奖励是由一个随机过程得到的。

微分一个随机节点需要提供一个奖励值。如果你的计算图中包含随机 operations,你需要在他们的输出上调用这个函数。否则的话,会报错。

参数:

  • reward (Tensor) – 每个元素的 reward 张量。必须和Varaible形状相同,并在同一个设备上。

retain_grad()

启用非叶变量的.grad 属性。

class torch.autograd.Function

记录操作历史并定义用于区分操作的公式。

在 Variables 上执行的每个操作创建一个新的函数对象,执行计算,并记录它发生的情况。历史以 DAG 的形式保留,边缘表示数据依赖()。然后,当调用向后时,通过调用每个对象的方法,并将返回的梯度传递给下一个 s 来处理图形的拓扑排序 。input <- outputbackward()FunctionFunction

通常,用户与功能交互的唯一方式是创建子类并定义新的操作。这是延长 torch.autograd 的推荐方法。

由于函数逻辑是大多数脚本的热点,因此几乎所有脚本都被移动到 C 后端,以确保框架开销最小化。

每个功能仅用于一次(在正向通行证中)。

变量:

  • saved_tensors - 保存在呼叫中的 Tensor 元组 forward()。
  • saved_variables - 对应于调用中保存的张量的变量元组 forward()。
  • needs_input_grad - 长度的布尔元组 num_inputs,指示给定输入是否需要渐变。这可以用于优化缓冲区保存为向后,忽略梯度计算 backward()。
  • num_inputs - 给出的输入数量 forward()。
  • num_outputs - 返回的张量数 forward()。
  • requires_grad - 布尔值,表示是否 backward()需要调用。

backward(* grad_output)

定义用于区分操作的公式。

此功能将被所有子类覆盖。

所有参数都是张量。它必须接受完全一样多的论据,因为许多输出都 forward()返回,它应该返回尽可能多的张量,因为有输入 forward()。每个参数是给定输出的渐变 wrt,每个返回的值应该是对应输入的渐变。

static forward(args, *kwargs)

执行操作。

此功能将被所有子类覆盖。

它可以采取并返回任意数量的张量。

译者署名

用户名 头像 职能 签名
Song 自动差异化包 - torch.autograd - 图1 翻译 人生总要追求点什么