18.md 10.8 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
# 自动差异化包 - torch.autograd

*   [Variable](https://ptorch.com/docs/1/autograd#variable)
*   [API 兼容性](https://ptorch.com/docs/1/autograd#api-compatibility)
*   [变量的直接操作](https://ptorch.com/docs/1/autograd#in-place-operations-on-variables)
*   [In-place 正确性检查](https://ptorch.com/docs/1/autograd#in-place-correctness-checks)
*   [Function](https://ptorch.com/docs/1/autograd#function)

* * *

`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)

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

grad*outputs 应该是 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)

当前`Variable``leaf 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`应该拥有以下签名:

W
wizardforcel 已提交
117
```py
W
wizardforcel 已提交
118 119 120 121 122 123 124 125 126
hook(grad) -> Variable or None 
```

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

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

例:

W
wizardforcel 已提交
127
```py
W
wizardforcel 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
>>> v = Variable(torch.Tensor([0, 0, 0]), requires_grad=True)
>>> h = v.register_hook(lambda grad: grad * 2)  # double the gradient
>>> v.backward(torch.Tensor([1, 1, 1]))
>>> v.grad.data
 2
 2
 2
[torch.FloatTensor of size 3]
>>> 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](https://ptorch.com) | ![](img/2018033000352689884.jpeg) | 翻译 | 人生总要追求点什么 |