torch.autograd
torch.autograd: 提供了类和函数,用来对任意的标量函数进行求导,要想使用自动 求导,只需要对已有的代码进行微小的改变,只需要将所有的tensor包含进 V a r i a b l e Variable Variable对象中即可。
- torch.autograd.backward(variables, grad_variables, retain_variables=False)
给定图的叶子节点 V a r i a b l e Variable Variable,计算图中变量的梯度和。
注意:我们需要在调用此函数之前将leaf variable的梯度置零。叶子节点和Variable是两个概念,叶子节点是说用户创建的变量,可以保存梯度以进行反向传播;Variable只是对tensor的包装,当设置Variable的required_grad=True时,可以计算梯度,但如果不是叶子节点的话,在反向传播之前会释放梯度。
参数说明
- variables (variable 列表) – 被求微分的叶子节点,即 ys 。
- grad_variables (Tensor 列表) – 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
- retain_variables (bool) – True,计算梯度时所需要的buffer在计算完梯度后不会被释放。如果想对一个子图多次求微分的话,需要设置为True。
class torch.autograd.Variable
包装一个 T e n s o r Tensor Tensor,它同时保存着Variable的梯度和创建这个Variable的Function的引用。这个引用可以用来追溯创建这个Variable的整条链。如果Variable是用户创建的,那么它的creator是None,我们称这种对象为 leaf Variables。
由于 a u t o g r a d autograd autograd只支持标量的值反向求导,梯度的大小总是和数据的大小相匹配,同时,仅仅给leaf variable分配梯度,其他的Variable的梯度总为0.
变量
- data 包含的Tensor。
- grad 保存着Variable的梯度,这个属性是懒分配的,且不能被重新分配。
- requires_grad 布尔值,指示这个Variable是否是被一个包含Variable的子图创建的,只能改变 l e a f V a r i a b l e leaf Variable leafVariable
- creator 创建这个 V a r i a b l e Variable Variable的Function。对于leaf variable,这个属性为None。只读属性。这个属性其实是grad_fn,可能是官方文档上没有改正过来。下面提到creator我们都默认是grad_fn。
属性
Variable
Tensor张量
Variable变量
torch:两个基本对象:tensor:不能反向传播。Variable: 可以反向传播。
tensor的算术运算,和选取操作和numpy一样,一次你numpy相似的运算操作都可以迁移过来。
variable是一种可以不断变化的变量,符合反向传播,参数更新的属性。pytorch的variable是一个存放会变化值的地理位置,里面的值会不停变化,像装糖果(糖果就是数据,即tensor)的盒子,糖果的数量不断变化。pytorch都是由tensor计算的,而tensor里面的参数是variable形式
autograd根据用户对Variable的操作来构建其计算图。
- requires_grad
variable默认是不需要被求导的,即requires_grad属性默认为False,如果某一个节点的requires_grad为True,那么所有依赖它的节点requires_grad都为True。 - volatile
variable的volatile属性默认为False,如果某一个variable的volatile属性被设为True,那么所有依赖它的节点volatile属性都为True。volatile属性为True的节点不会求导,volatile的优先级比requires_grad高。 - retain_graph
多次反向传播(多层监督)时,梯度是累加的。一般来说,单次反向传播后,计算图会free掉,也就是反向传播的中间缓存会被清空【这就是动态度的特点】。为进行多次反向传播需指定retain_graph=True来保存这些缓存 - backward(grad_variables=None,retain_graph=None,create_graph=None)
反向传播,求解Variable的梯度。放在中间缓存中。 - grad_variable
grad_variables是 y y y求导时的梯度参数,由于autograd仅用于标量,因此当 y y y不是标量且在声明时使用了requires_grad=True,必须指定grad_variables参数,在完成原始的反向传播之后得到的梯度会对这个grad_variables进行修正,然后将结果保存在Variable的grad中。grad_variables形状必须与Variable一致。在深度学习中求导与梯度有关,因此grad_variables一般会定义类似为[1, 0.1, 0.01, 0.001],表示梯度的方向,取较小的之不会对求导效率有影响。