美文网首页神经网络与深度学习深度学习PyTorch
超简单!pytorch入门教程(二):Autograd

超简单!pytorch入门教程(二):Autograd

作者: Zen_君 | 来源:发表于2017-02-01 18:06 被阅读9087次

    一、autograd自动微分

    假如我们有一个向量x=(1,1)当成input,经过一系列运算得到了output变量y,如下图所示:

    如图所示,向量x经过与4和自身相乘之后得到向量z,z再求长度,得到y

    我们想要求y关于x的微分时,pytorch会帮我们自动求解。

    >>>from torch.autograd import Variable

    >>>import torch

    >>>x = Variable(torch.ones(2), requires_grad = True) #vairable是tensor的一个外包装

    >>>z=4*x*x

    >>>y=z.norm()

    >>>y

    Variable containing:

    5.6569

    [torch.FloatTensor of size 1]

    我们可以看到y的值与我们上图计算的结果一致。

    >>>y.backward()   #backward()函数表示backprop

    >>>x.grad    #返回y关于x的梯度向量

    Variable containing:

    5.6569

    5.6569

    [torch.FloatTensor of size 2]

    我们可以看到x.grad也与我们上图计算结果一致。

    需要注意:autograd是专门为了BP算法设计的,所以这autograd只对输出值为标量的有用,因为损失函数的输出是一个标量。如果y是一个向量,那么backward()函数就会失效。不知道BP算法是什么的同学,估计也不知道什么是深度学习,建议先看Zen君提供的教材。

    二、autograd的内部机理

    我们之所以可以实现autograd多亏了Variable和Function这两种数据类型的功劳。要进行autograd必需先将tensor数据包成Variable。Varibale和tensor基本一致,所区别在于多了下面几个属性。

    variable是tensor的外包装,variable类型变量的data属性存储着tensor数据,grad属性存储关于该变量的导数,creator是代表该变量的创造者。

    variable和function它们是彼此不分开的,先上图:

    数据向前传输和向后传输生成导数的过程示意图

    如图,假设我们有一个输入变量input(数据类型为Variable)input是用户输入的,所以其创造者creator为null值,input经过第一个数据操作operation1(比如加减乘除运算)得到output1变量(数据类型仍为Variable),这个过程中会自动生成一个function1的变量(数据类型为Function的一个实例),而output1的创造者就是这个function1。随后,output1再经过一个数据操作生成output2,这个过程也会生成另外一个实例function2,output2的创造者creator为function2。

    在这个向前传播的过程中,function1和function2记录了数据input的所有操作历史,当output2运行其backward函数时,会使得function2和function1自动反向计算input的导数值并存储在grad属性中。

    creator为null的变量才能被返回导数,比如input,若把整个操作流看成是一张图(Graph),那么像input这种creator为null的被称之为图的叶子(graph leaf)。而creator非null的变量比如output1和output2,是不能被返回导数的,它们的grad均为0。所以只有叶子节点才能被autograd。

    相关文章

      网友评论

      • wangdongxukin61:pytorch 0.4版本中,变量的creator成员已经被grad_fn替代了
      • _謝威威:博主好,请问您本篇中提到的推荐的深度学习教材是哪些呢?希望博主能告知一下,您的文章真的帮到了我,非常感谢
        wangdongxukin61:pytorch0.4 英文官方教程https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#
        pytorch0.3 中文翻译教程http://pytorch.apachecn.org/cn/tutorials/beginner/blitz/autograd_tutorial.html
      • b6af1537c011:博主,您好,首先感谢您的这一系列教程,超级简单明了.
        我是在自己学习Pytorch,准备自己 边学习边写博客进行记录,想要转载引用一些你这边的介绍和代码,会附上您博客的链接
        这里先征求一下您的同意
        谢谢
      • df736d0e1abf:还有z的长度和矩阵的导数有什么关系呢?为什么两者的值是一样的,计算过程我看懂了,但是不清楚它们为什么是一样的
        Zen_君:z长度的计算把x1和x2当做变数的函数.关于x2的导数和求x1的计算过程是一样的,所以答案是一样的.
      • df736d0e1abf:那function1和function2计算的grad怎么传给input的grad,还是计算的倒数已经在function中了,variable里的grad只是存储而没有被调用? “creator为null的变量才能被返回导数”这句话的意思是只有input的creator能够查看其返回值吗?不是很懂最后一段,能不能再举一个详细的例子?
        Zen_君:不是,所有varibale都有creator的属性,creator属性实际上是function实例的引用,function是由操作(如加\减\乘\除等)产生的,function用来记录操作的历史. 查看一个variable的creator返回值是function的实例,或者是None(叶子节点)
        >>> z.creator
        <torch.autograd._functions.basic_ops.MulConstant object at 0x7fda72791220>
      • cbir:博主好,能帮忙解释下backward函数中参数的意义吗?官方文档里感觉写的比较模糊, It should be a tensor of matching type and location, that contains the gradient of the differentiated function w.r.t. self. 具体应该怎样设置不甚清楚。多谢!
        46a788822a9d:"而creator非null的变量比如output1和output2,是不能被返回导数的,它们的grad均为0", grad为0不严谨吧,测试了一下是None。另外,“所以只有叶子节点才能被autograd”是不是意味着做BP的时候权值W一定要满足creator为null?
        为什么我在调用Variable实例的属性creator会报错:AttributeError: 'Variable' object has no attribute 'creator'?在网上也没有找到相关解释
        cbir: @Zen_君 谢谢!文档里也是这么写的,这个我明白,我不理解的是为什么例子里会传入一个随机数组
        Zen_君:要反向传递的不再是一个标量而是一个向量或者矩阵,则要求backward 传参。其实矩阵和向量也是可以求导的,可以看看类似的矩阵分析之类的课本,当要对矩阵求导时,backward需要传入一个参数,这个参数的维度必须是跟叶子结点的那个变量维度一致且元素值为1。比如叶子结点是2x2的矩阵,就传对backward传一个tensor.ones(2,2)即可。

      本文标题:超简单!pytorch入门教程(二):Autograd

      本文链接:https://www.haomeiwen.com/subject/xgklittx.html