解决torch.autograd.backward中的参数问题

作者:coordinate_blog 时间:2023-11-19 13:16:50 

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]

解决torch.autograd.backward中的参数问题

接着我们继续


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。

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

来源:https://blog.csdn.net/qq_17550379/article/details/78939046

标签:torch,autograd,backward,参数
0
投稿

猜你喜欢

  • golang中的并发和并行

    2024-04-26 17:15:11
  • MySQL 缓存 Query Cache

    2010-03-13 17:06:00
  • Go语言之嵌入类型详解

    2024-02-05 08:39:16
  • 海量数据库的查询优化及分页算法方案

    2024-01-16 18:50:51
  • css样式表使用技巧小结

    2008-01-11 20:44:00
  • Python压缩和解压缩zip文件

    2023-09-16 21:20:10
  • PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

    2021-03-17 16:31:22
  • mssql 30万条数据 搜索文本字段的各种方式对比

    2024-01-14 15:29:18
  • javascript实现表格增删改操作实例详解

    2024-04-29 13:24:36
  • 分享8个非常流行的 Python 可视化工具包

    2022-11-14 08:40:14
  • golang的序列化与反序列化的几种方式

    2024-05-22 10:11:53
  • python Tensor和Array对比分析

    2023-08-27 04:37:02
  • TensorFlow实现iris数据集线性回归

    2023-11-14 09:56:39
  • Python调用ChatGPT制作基于Tkinter的桌面时钟

    2023-05-11 08:23:23
  • 发一段鼠标掠过表格行颜色改变的代码

    2010-07-02 12:59:00
  • SQL Server 2005 开启数据库远程连接的方法

    2024-01-24 19:31:12
  • Sql server数据库优化

    2010-04-06 19:17:00
  • python实现简单的井字棋游戏(gui界面)

    2023-03-06 23:16:01
  • Vue实现登录以及登出详解

    2023-07-02 16:59:51
  • Python 面向对象之封装、继承、多态操作实例分析

    2021-04-09 10:03:54
  • asp之家 网络编程 m.aspxhome.com