3.3 计算图与动态图机制

                                                                                               点击此处返回总目录

一、计算图

二、动态图与静态图的区别

 

 

 

一、计算图

计算图是用来描述运算的有向无环图。

计算图有两个主要元素:节点(Node)和边(Edge)。节点表示数据,比如张量、矩阵、向量等。边表示运算,如加减乘除卷积等。

 

比如:下面的计算图就是描述y = (x + w )* (w+1)这个操作的。

 

                

 

采用计算图来描述运算的好处,不仅仅是让运算更加简洁,它有一个更加重要的作用就是使得求导更加方便。

 

通过求导法则,我们可以知道:

 

                                 

 

可以看到y对w求导,就是找到所有y到w的路径。

 

我们用代码来看一下:

 

结果:

 

1. 叶子节点属性

在前面讲张量的属性的时候,讲到Tensor的is_leaf属性,指示张量是否为叶子节点。

什么是叶子节点呢?用户创建的节点称为叶子节点,比如上面的w和x。

叶子节点是整个计算图的根基。刚才看到y,a,b都是依据w和x进行计算的。

 

为什么要设置叶子节点的概念?

主要是为了节省内存。在反向传播结束之后,非叶子节点的梯度就被释放掉。【例1】

 

例1:

 

结果:

 

可以看到w和x是叶子,a、b、y不是叶子。

w和b有梯度,而a、b、y没有梯度。这是因为在反向传播之后,非叶子节点的梯度被释放掉了。

 

如果想要使用a/b/y这些非叶子节点的梯度,怎么办呢?

在pytorch中,有一个retain_grad()方法,在执行反向传播之前,执行这个方法就可以保存梯度。【例2】

 

例2:

 

结果:

 

可以看到执行了backward()之后,非叶子节点a的梯度还是保留了。

 

2.grad_fu属性 

除了叶子节点这个属性,还有一个属性grad_fn,它用来记录创建张量时所用的方法(函数)。

记录方法主要是在反向传播的时候用到。比如由a*b得到y,y就记录下用了乘法,当由y求a和b的梯度的时候就会用到。

比如,刚才的图,记录的方法为:

 

例:

 

结果:

 

可以看到w和x是没有grad_fn的。因为他们是叶子节点,没有通过什么运算得到。

 

 

二、动态图

我们常常听说,pytorch是使用动态图机制,而tensorflow是采用静态图机制。

 

根据计算图的搭建方式,可以将计算图分为静态图和动态图。

动态图:运算和搭建同时进行。灵活、易调节。

静态图:先搭建图,后运算。高效、不灵活。

 

比如,Tensorflow是先搭建所有的计算图,然后传入数据,运算。

而pytorch是没执行一步操作的时候,才会在图中创建。

 

 

  

 

 

 

 

 

以上是 3.3 计算图与动态图机制 的全部内容, 来源链接: utcz.com/a/53296.html

回到顶部