torch.autograd.backward中的参数问题
发布日期:2021-06-29 16:00:14 浏览次数:2 分类:技术文章

本文共 1911 字,大约阅读时间需要 6 分钟。

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 tensorvariableNone是可取的)。

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

参数:

  • variables(变量的序列) - 被求微分的叶子节点,即 ys
  • grad_variables((张量,变量)的序列或无) - 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
  • retain_graphbool,可选) - 如果为False,则用于释放计算grad的图。请注意,在几乎所有情况下,没有必要将此选项设置为True,通常可以以更有效的方式解决。默认值为create_graph的值。
  • create_graphbool,可选) - 如果为True,则将构造派生图,允许计算更高阶的派生产品。默认为False

我这里举一个官方的例子

import torchfrom torch.autograd import Variablex = Variable(torch.ones(2, 2), requires_grad=True)y = x + 2z = y * y * 3out = 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]

o u t = 1 4 ∑ i z i out = \frac{1}{4}\sum_i z_i out=41izi z i = 3 ( x i + 2 ) 2 z_i = 3(x_i+2)^2 zi=3(xi+2)2并且 z i ∣ x i = 1 = 27 z_i\bigr\rvert_{x_i=1} = 27 zixi=1=27。接着 ∂ o u t ∂ x i = 3 2 ( x i + 2 ) \frac{\partial out}{\partial x_i} = \frac{3}{2}(x_i+2) xiout=23(xi+2),因此 ∂ o u t ∂ x i ∣ x i = 1 = 9 2 = 4.5 \frac{\partial out}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5 xioutxi=1=29=4.5

接着我们继续

x = torch.randn(3)x = Variable(x, requires_grad=True)y = x * 2while y.data.norm() < 1000:    y = y * 2gradients = 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

如有问题,希望大家指正,谢谢_!

转载地址:https://coordinate.blog.csdn.net/article/details/78939046 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:YOLOv2源码分析--reorg layer
下一篇:numpy.stack最通俗的理解

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月30日 20时51分37秒