实践·pytorch梯度计算

简介

pytorch梯度机制,计算梯度注意事项

关键字

pytorch,autograd,tensor,自动微分,张量,梯度

正文

  在一些优化算法中,常常需要计算函数的梯度,在pytorch可以借助autograd机制来自动计算梯度值。

1. 梯度对象及对应方法

  假设y=f(x),关于x的梯度记为\nabla f(x)\nabla f(x)是关于变量x的函数,其梯度\nabla是随着x的值变化而变化的,决定梯度的除了x自身的值以外还有施加在x上的运算。因此,关注梯度就是关注两个东西,求哪个变量的梯度,该变量上被施加了哪种运算

  首先看变量:在pytorch中把梯度作为一个固有属性结合进张量(tensor),任何一个tensor类型的变量都有梯度(grad)属性,再结合一般场景下的需要,pytorch把tensor类型定义为一个对象,包括5个属性,分别对应data(变量本身的值),grad(梯度值),requires_grad(是否需要梯度,很多场景都不需要求变量的微分),grad_fn(生成该变量结果的运算,即这个值通过什么运算来的),is_leaf(是否叶子节点,叶子才帮你算梯度)。

  接着看运算:在pytorch中没有显式的给出梯度函数表达,而是算出梯度值,存放在tensor类型变量的grad属性中,那么运算也一样用结果来表达,假设y=f(x),这里的y就承载了运算的结果,因此需要求x的梯度值时就对y使用backward()方法来计算x的梯度。

2. 如何使用

  上面提到计算梯度的两个要素:变量运算,对应的pytorch机制是tensor对象和backward方法。因此计算梯度就是学会怎么用这俩货。具体的例子这边不写,各位大神写的很多了,不当搬运工了,推荐参考资料3参考资料2。这里说明两点,然后总结个过程。

  (1)可求梯度的条件

  从上面的叙述知道,一个变量有5个属性,要求这个变量可以求梯度,需要满足2个属性为真,requires_grad=True,is_leaf=True。在声明变量的时候声明requires_grad=True就可以了。在实践过程中如果发现梯度没法计算,要查一下这两个属性。

  (2)回传结果类型

  大部分情况是对标量求梯度,也是在y=f(x)中,y是标量的情况,如果y向量或矩阵,也可以求梯度,此时本质上也是按分量一个一个来,因此要给backward()加个参数,一般情况下该参数的形状和y一样,每一个位置的值指示每个分量的梯度权重,多数情况就是全部设置为1。

  (3)一般过程

  仍然假设求x的关于y=f(x)的梯度,首先设置声明tensor类型变量x,声明的时候需要设置参数requires_grad=True;接下来计算出y=function(x),这里的function是用来表示函数运算过程,最后使用y.backward(),如果y非标量,就加个参数,假设为vv的形状与y相同,此时使用的是y.backward(v),要的梯度值可以通过x.grad获得。

3. 注意事项

  单独写个注意事项,计算变量x的梯度时,x的属性有可能会变化,比如需要对x进行迭代,假设为x=x’,那么x的requires_grad和is_leaf属性会变化,变得不可求梯度,那怎么办呢,其实程序迭代时只需要改变值就好了,使用x.data=x'.data就可以了。

参考资料

[1] https://pytorch.org/docs/1.3.1/index.html
[2] https://blog.csdn.net/qq_27825451/article/details/89393332
[3] https://www.cnblogs.com/marsggbo/p/11549631.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容