您的位置:首页 > 其它

torch.autograd.backward中的参数问题

2017-12-30 19:53 281 查看
torch.autograd.backward(variables, grad_variables=None, retain_graph=None, create_graph=False)

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

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

参数:

variables
(变量的序列) - 被求微分的叶子节点,即
ys


grad_variables
((张量,变量)的序列或无) - 对应
variable
的梯度。仅当
variable
不是标量且需要求梯度的时候使用。

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

create_graph
bool
,可选) - 如果为
True
,则将构造派生图,允许计算更高阶的派生产品。默认为
False


我这里举一个官方的例子

import torch
from torch.autograd import Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0]))
print(x.grad)


输出结果是

Variable containing:
4.5000  4.5000
4.5000  4.5000
[torch.FloatTensor of size 2x2]


out=14∑izi,zi=3(xi+2)2并且zi∣∣xi=1=27。接着∂out∂xi=32(xi+2),因此∂out∂xi∣∣xi=1=92=4.5

接着我们继续

x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
y = y * 2

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)


输出结果是

Variable containing:
204.8000
2048.0000
0.2048
[torch.FloatTensor of size 3]


这里这个
gradients
为什么要是
[0.1, 1.0, 0.0001]


如果输出的多个
loss
权重不同的话,例如有三个
loss
,一个是
x loss
,一个是
y loss
,一个是
class loss
。那么很明显的不可能所有
loss
对结果影响程度都一样,他们之间应该有一个比例。那么比例这里指的就是
[0.1, 1.0, 0.0001]
,这个问题中的
loss
对应的就是上面说的
y
,那么这里的输出就很好理解了
dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx


如有问题,希望大家指正,谢谢^_^!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: