【文档学习】PyTorch——torch.autograd(含Variable)

本系列记录了博主学习PyTorch过程中的笔记。本文介绍的是troch.autograd,官方介绍。更新于2019.03.20。

Automatic differentiation package - torch.autograd

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

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

Computes the sum of gradients of given variables w.r.t. graph leaves. 给定图的叶子节点variables, 计算图中变量的梯度和。 计算图可以通过链式法则求导。如果variables中的任何一个variable是 非标量(non-scalar)的,且requires_grad=True。那么此函数需要指定grad_variables,它的长度应该和variables的长度匹配,里面保存了相关variable的梯度(对于不需要gradient tensor的variable,None是可取的)。

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

参数说明:

  • variables (variable 列表) – 被求微分的叶子节点,即 ys 。
  • grad_variables (Tensor 列表) – 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
  • retain_variables (bool) – True,计算梯度时所需要的buffer在计算完梯度后不会被释放。如果想对一个子图多次求微分的话,需要设置为True。

Variable

API兼容性

Variable API 几乎和 Tensor API一致 (除了一些in-place方法,这些in-place方法会修改 required_grad=True的 input 的值)。多数情况下,将Tensor替换为Variable,代码一样会正常的工作。由于这个原因,我们不会列出Variable的所有方法,你可以通过torch.Tensor的文档来获取相关知识。

In-place operations on Variables

在autograd中支持in-place operations是非常困难的。同时在很多情况下,我们阻止使用in-place operations。Autograd的贪婪的 释放buffer和 复用使得它效率非常高。只有在非常少的情况下,使用in-place operations可以降低内存的使用。除非你面临很大的内存压力,否则不要使用in-place operations。

In-place正确性检查

所有的Variable都会记录用在他们身上的 in-place operations。如果pytorch检测到variable在一个Function中已经被保存用来backward,但是之后它又被in-place operations修改。当这种情况发生时,在backward的时候,pytorch就会报错。这种机制保证了,如果你用了in-place operations,但是在backward过程中没有报错,那么梯度的计算就是正确的。

class torch.autograd.Variable [source]

包装一个Tensor,并记录用在它身上的operations。

Variable是Tensor对象的一个thin wrapper,它同时保存着Variable的梯度和创建这个Variable的Function的引用。这个引用可以用来追溯创建这个Variable的整条链。如果Variable是被用户所创建的,那么它的creator是None,我们称这种对象为 leaf Variables。

由于autograd只支持标量值的反向求导(即:y是标量),梯度的大小总是和数据的大小匹配。同时,仅仅给leaf variables分配梯度,其他Variable的梯度总是为0。

变量:

  • data – 包含的Tensor
  • grad – 保存着Variable的梯度。这个属性是懒分配的,且不能被重新分配。
  • requires_grad – 布尔值,指示这个Variable是否是被一个包含Variable的子图创建的。更多细节请看Excluding subgraphs from backward。只能改变leaf variable的这个标签。
  • volatile – 布尔值,指示这个Variable是否被用于推断模式(即,不保存历史信息)。更多细节请看Excluding subgraphs from backward。只能改变leaf variable的这个标签。
  • creator – 创建这个Variable的Function,对于leaf variable,这个属性为None。只读属性。

属性:

  • data (any tensor class) – 被包含的Tensor
  • requires_grad (bool) – requires_grad标记. 只能通过keyword传入。
  • volatile (bool) – volatile标记。只能通过keyword传入。

更多内容,欢迎加入星球讨论。

你可能感兴趣的:(笔记,Python基础)