原文出处:DengBoCong
无论是机器学习也好,还是深度学习也好,都是围绕着数学建模以及数学运算进行的,在这样的背景之下,诞生了许多的计算框架,我们所熟知的TensorFlow和Pytorch就是其中的主流,这些计算框架以计算服务为根本,自然需要一个计算模型。
如果接触过开发的小伙伴就能体会到,tf这些计算框架的编程方式有着很大的差异。无论是编译类型的语言还是脚本语言,都是一步一步的计算变量, 从而得到结果,比如result = input1 + input2
,当执行完语句后,就会得到result
的值。
而TensorFlow和Pytorch则不一样,首先需要通过编程构建一个计算图,然后将数据作为输入,通过这个计算图规定的计算操作进行计算,最后得到计算结果。
这种符号式编程有着较多的嵌入和优化,性能也随之提升。同时计算图非常适合用来思考数学表达式,举个例子,比如计算 e = (a + b)*(b + 1)
,在这个式子中存在两个加法和一个乘法的运算,为了更加方便我们讨论,我们引入中间变量来给每个运算的输出表示为一个变量,如下:
c = a + b
d = b + 1
e = c * d
接下来,我们来构建计算图,我们将所以这些操作放入图节点中,并同时计算出结果:
接着求边的偏导数:
通过链式法则,我们逐节点的计算偏导数,在网络backward时候,需要用链式求导法则求出网络最后输出的梯度,然后再对网络进行优化。类似上图的表达形式就是TensorFlow以及Pytorch的基本计算模型。总结而言,计算图模型由节点(nodes)和线(edges)组成,节点表示操作符Operator,或者称之为算子,线表示计算间的依赖,实线表示有数据传递依赖,传递的数据即张量,虚线通常可以表示控制依赖,即执行先后顺序。
计算图从本质上来说,是TensorFlow在内存中构建的程序逻辑图,计算图可以被分割成多个块,并且可以并行地运行在多个不同的cpu或gpu上,这被称为并行计算。因此,计算图可以支持大规模的神经网络,如下: