Pytorch的aotugrad大白话理解及属性使用解释 您所在的位置:网站首页 lpr用大白话解释下 Pytorch的aotugrad大白话理解及属性使用解释

Pytorch的aotugrad大白话理解及属性使用解释

2024-06-22 11:18| 来源: 网络整理| 查看: 265

Autogard 是什么?

Autogard是torch下的一个模块,可以帮助我们实现求导,让我们不用自己手动去求导然后进行反向传播。

常见用法

概念1: requires_grad 早期版本是分tonsor和variable的,tensor就是普通的数据结构,并不能进行自动求导,如果你需要自动求导,你创建数据时必须用创建为variable. 现在取消了这个区分,你只需要在创建tensor的时候指定这个属性,那么这个tensor就可以求导了。

a = t.randn(3,4, requires_grad=True) #或者 a = t.randn(3,4).requires_grad_() #或者 a = t.randn(3,4) a.requires_grad=True a

概念2:计算图 计算图就是这样,数据用椭圆表示,加减乘除等操作用矩形表示。依据这种规则,我们整个网络的计算过程就可以被表示为一个图形。 在这里插入图片描述 概念3:叶子结点 在计算图中,由用户自己创建的数据就叫叶子结点,比如上图的w,x,b都是我们自己生成的,也可以说不是经过某种计算得出来的数据就是叶子结点。可以用 a.is_leaf判断是不是叶子结点(a是一个tensor)

概念4:grad_fn z.grad_fn输出的是

tensor由某个操作获得,在pytorch每个操作的反向传播函数是已经被定义好的,比如z是由add即加操作得到的,那么z.grad_fn得到的就是add函数的反向传播函数(好像可以直接理解为求导函数)。注意我们的得到的是AddBackward0 后面有个0,说明一个计算图中可以出现很多次add,每个add的反向传播函数是不一样的。

概念5:next_functions z.grad_fn.next_functions 输出的是 ((, 0L), (, 0L)) z是由add操作得到的,那么add操作的输入是b 和 y,输出的就是b.grad_fn和y.grad_fn。

AccumulateGrad是什么?a.grad是什么?为什么梯度要置0 对于y.grad_fn我们可以知道MulBackward就是 乘 操作对应的反向传播函数。那么b我们只是一个叶子结点,是一个Tensor,他的grad_fn即Accumlate_Grad表示这个b的导数是可积累的。比如你第一次方向传播一次,我们得出b的导数为3,即a.grad为3,但是你再求导一次,就会发现a.grad为6,这就是所谓的可累加。所以在pytorch里面,每一个batch即每一次反向传播前都会把梯度下降即grad都置为0.

概念6:retain_graph=True backward()

z.backward(retain_graph=True) z.backward()表示从z求出来的是z对各个变量的导数。 retain_graph=True表示保存中间变量。比如我们计算z对w的导数发现导数就是y,注意这个y在我们上面举例的计算图中不是我们自己指定的,是中间求出来的,我们第一次z.backward()求z对w的导数会取到y的值。但是如果我们这次传播完立刻在想传播一次,那么就会报错,因为一次梯度玩会自动把中间的计算东西释放掉,也就是第二次传播时候就没有y了,除非你再前向传播一次。所以我们可以提前指定这个保证第一次传播完中间变量仍然存在。

概念7:hook函数

非叶子节点的导求出来后会被释放,如果想看怎么版,可以用autograd.grad或者hook函数。 在这里插入图片描述

总结

关于autograd,我们需要知道的就是我们可以在创建tensor的时候指定 requires_grad = True 表面可求导,然后在最终函数用 z.backward()。 用a.grad查看导数(梯度)。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有