pytorch入门教程 | 第二章:Autograd

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的值与我们上图计算的结果一致

需要注意: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。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CreateAMind

keras doc 10终结篇 激活函数 回调函数 正则项 约束项 预训练模型

激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。

2083
来自专栏数据结构与算法

#15. 钻石

钻石 diamond.in/.out/.cpp 【问题描述】 你有 n 个 “量子态” 的盒子,每个盒子里可能是一些钱也可能是一个钻 石。 现在你知道如果打开第...

2636
来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触 第三章:聚类

前一章节中介绍的线性回归是一种监督学习算法,我们使用数据与输出值(标签)来建立模型拟合它们。但是我们并不总是有已经打标签的数据,却仍然想去分析它们。这种情况下,...

3706
来自专栏闻道于事

算法学习(一)

不论学习有多忙,也要抽空读点书。 算法 什么是算法? 有一个很著名的公式  “程序=数据结构+算法”。 曾经跟朋友吃饭的时候我问他什么是算法,他说算法嘛,就是一...

3269
来自专栏木东居士的专栏

Bloom Filter 的数学背景

1223
来自专栏决胜机器学习

机器学习(十八) ——SVM实战

机器学习(十八)——SVM实战 (原创内容,转载请注明来源,谢谢) 一、概述 本篇主要用python来实现SVM算法,并用SVM算法进行预测分类结果。对于SM...

3355
来自专栏人工智能LeadAI

TensorFlow Tutorial-1

1、Why TensorFlow? 网上有关介绍太多了,我就不多说了,这里主要注重使用。 ? Intro.PNG ? github.PNG 2、Programi...

36711
来自专栏小文博客

小文’s blog–特殊回文数 –《蓝桥杯代码笔记4》

1045
来自专栏数据结构与算法

Stirling数

第一类: 定义 第一类Stirling数表示表示将 n 个不同元素构成m个圆排列的数目。又根据正负性分为无符号第一类Stirling数 ? 和带符号第一类...

31510
来自专栏python读书笔记

《python算法教程》Day7 - 获取有向图的所有强连通分量强连通分量定义代码示例

今天是《python算法教程》的第7篇读书笔记,笔记的主要内容是通过python的遍历方式找出有向图的强连通分量。 强连通分量定义 在有向图G中,如果两个顶点v...

3608

扫码关注云+社区