计算图
Computational Graph
深度学习就是对张量进行一系列的操作,随着操作种类和数量的增多,会出现各种值得思考的问题。比如多个操作之间是否可以并行,如何协同底层的不同设备,如何避免冗余的操作,以实现最高效的计算效率,同时避免一些 bug。因此产生了计算图 (Computational Graph)。
基本概率
计算图是用来描述运算的有向无环图。
计算图有两个主要元素:结点(Node)和边(Edge)。
结点表示数据,如向量、矩阵、张量
边表示运算,如加减乘除卷积等
用计算图表示:
y = (x + w) * (w + 1)
a = x + w
b = w + 1
y = a * b
计算图与梯度求导
y = (x + w) * (w + 1)
叶子结点:用户创建的结点成为叶子节点,如x与w
is_leaf:表示张量是否为叶子结点
grad_fn:记录创建该张量时所用的方法(函数)
PyTorch 的动态图机制
PyTorch 采用的是动态图机制 (Dynamic Computational Graph),而 Tensorflow 采用的是静态图机制 (Static Computational Graph)。
动态图 vs 静态图
Dynamic VS Static Computational Graphs
根据计算图搭建方式,可将计算图分为动态图和静态图。
动态图是运算和搭建同时进行,也就是可以先计算前面的节点的值,再根据这些值搭建后面的计算图。优点是灵活,易调节,易调试。PyTorch 里的很多写法跟其他 Python 库的代码的使用方法是完全一致的,没有任何额外的学习成本。
静态图是先搭建图,然后再输入数据进行运算。优点是高效,因为静态计算是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。但是不灵活。TensorFlow 每次运行的时候图都是一样的,是不能够改变的,所以不能直接使用 Python 的 while 循环语句,需要使用辅助函数 tf.while_loop 写成 TensorFlow 内部的形式。