为什么Tensorflow需要使用"图计算"来表示计算过程

今天一个同学问我,在tensorflow里面是图?
我跟他说:
为什么Tensorflow需要使用 (来自Andrew Ng,吴神)
就比如说
J=a+bc 吧
在图计算的表示中:
1.节点表示某种运算,一般都是二元运算
2.有向边,表示数据和数据的流向

比如 上面的图中 有三个节点u=bc,v=a+u,J=3v 它们都在做运算。
而那些边就表示数据的流动。什么意思嘞?
比如 节点u=a+u,有两条边流进来,就说明啊,这个节点是需要这两条边的数据。这是“需”
而 a=5 会自发的流向v=a+u,这是“供”
OK.

“那用这个图表示计算 有什么好处?”

说真的,我还真不知道一时怎么去回答了,于是十分羞愧的回去再看了图计算的定义。

个人觉得,用图来表示计算的好处主要有:

  1. 更加结构化的体现计算过程,而这个过程也实际上是我们人脑在计算的时候会发生的。比如计算a+bc的时候,实际上 我们的确是先计算出bc的中间值,然后再让a加上这个中间值。只不过我们认为这个过程在人脑中太自然了,没有什么好提出来说的。

  2. 这种结构,很利于我们提取中间某些节点的结果。按照这个图的流程结构,当我们计算出J来的时候,我们同时可以随时去取v和u的值。相反如果直接一下子算出来的是J的答案,如果要得到v,u的值,还得重新计算一次前面的几步。这是重复的工作。

  3. 更重要的是,这个图的结构天生就是方便求导。看上面的中间节点 u,v,有木有感觉我们在学习求导的链式法则的时候经常提到?经常会搞出一些中间变量来···
    我们具体来看这个结构下 对求导有什么优势
    我们从右向前看。
    计算 J 与 (J=3*v节点相邻的所有)流入节点的偏导数:
    只有一个:dj/dv=3
    计算v与(v=a+U节点的所有)流入节点的偏导数:
    有两个:dv/da=1
    dv/du=1
    计算u与(u=bc节点相邻的所有)流入节点的偏导数:
    也有两个:du/db=c
    du/dc=b
    OK.

我们来看:

如果要求 dJ/da

就只要:dj/dv * dv/da=3*1;

如果要求dv/dc
就只要:dv/du *du/dc=b
···
为什么Tensorflow需要使用
发现了什么???
为了求任意两个变量x,y之间的偏导dy/dx:
1. 先求出每个节点对它们直接入边的偏导
2. 根据链式法则,找出从y到x的路径,而路径上的各个边就是有向边的箭头那一端对另外一端的偏导,将路径上的偏导相乘,得到的就是dy/dx的值。
(以上没有使用偏导符号是因为 我在markdown 里面打不出那个偏导符号,所以就用了微分符号来表示,o(╯□╰)o)
这是一种分治法,每个节点只要维护好与直接相连的其它入边的偏导即可。

所以,利用这个图来表示计算,正向可以方便取中间值求结果,反向可以很方便的求偏导。而第二代ANN的核心DNN的核心训练方法是误差反向传播,误差反向传播的又是建立在求梯度求偏导的基础上的。

你可能感兴趣的:(机器学习-理论,TensorFlow,学习)