神经网络计算图

本篇文章给大家讲解的是计算图,它是我们在研究神经网络时经常用到的一个重要手段,因为在实际工作中神经网络是很复杂的,要借助于计算图才能使其条理请晰,让复杂的事情变得直观便于研究。这里要吐槽一下不少人的坏习惯,不喜欢画图,觉得自己是天才,画图会显得自己智商低,这是自欺欺人的表现,多少大师、教授、真正的天才他们都一丝不苟地画图,可见画图是很重要的。
一个人工智能学习任务的核心是模型的定义以及模型的参数求解方式,对这两者进行抽象之后,可以确定一个唯一的计算逻辑,将这个逻辑用图表示,称之为计算图。计算图表现为有向无环图,定义了数据的流转方式,数据的计算方式,以及各种计算之间的相互依赖关系等。
神经网络的计算是由一个前向传播以及一个反向传播构成的。先通过前向传播计算出预测结果以及损失;然后再通过反向传播计算出损失函数关于每一个参数(w、b)的偏导数,并对这些参数进行梯度下降,然后用新的参数进行新一轮的前向传播计算,这样来回不停地进行前向传播反向传播计算来训练(更新)参数使损失函数越来越小使预测越来越精准。

通过计算图可以把上面所述的计算过程非常直观地展示出来。
为了便于理解,本篇文章先用一个简单的计算过程来讲解计算图,下一篇文章再将神经网络计算过程和计算图结合起来讲。
我们将用函数J(a,b,c) = 3(a+bc)来讲解计算图。这个函数有三个计算步骤组成,若第一步用U来表示,则U=bc;第二步用V来表示,则V=a+U;最后是J=3V。如果用计算图表示函数J的计算过程,那么将有下图(其中假设a、b、c分别为5、3、2)。

如上图所示,通过前向传播一步一步地最终即可算出函数J的值,在神经网络的计算中,通过前向传播我们可以最终算出预测值和损失值。

下面我们再来介绍一下反向传播。反向传播用于计算函数J关于各个参数的偏导数,然后对参数进行梯度下降。

首先我们来计算J关于中间量V的偏导数,我们将其记为dJ/dV。前面的文章有讲到过“偏导数说白了就是斜率。斜率就是变化比例,即W改变一点后J会相应的改变多少”。所以为了计算关于V的偏导数,我们可以假设改变V一点点,比如让V加上0.001,即V从11变成了11.001。然后看J改变了多少,J从33变成了33.003(J=3V=3*11.001)。J的 变化量除以V的变化量(0.003:0.001)等于3,即变化比例等于3,即斜率、偏导数等于3。同理我们可以计算出中 间量V关于中间量U的偏导数dV/dU为1。也可以算出中间 量U关于参数b的偏导数dU/db为2。

那么J关于中间量U 的偏导数是多少呢?其实道理一样,我们让U改变一点点, 从6变成6.001,这会导致V从11变成11.001, 而V的改变 会导致J从33变成33.003,J的改变量除以U的改变量等 于3(0.003÷0.001)即偏导数dJ/dU为3。

其实J关于 U的偏导数等于J关于V的偏导数与V关于U的偏导数的乘积,即dJ/dU=dJ/dV*dV/dU=3*1=3。这种传导性计算在微 积分里面我们称之为链式法侧。同理,J关于参数b的偏导数dU/db=dJ/dU*dU/db=3*2=6。dJ/db这个偏导数才是我们最终需要的,我们需要的是函数J关于参数a、b、c的偏导数。为了得到这三个偏导数,我们需要先计算出关于中间量V的偏导数然后再计算出关于中间量U的偏导数,最后计算出关于参数的偏导数,一步一步反向推进,这个过程就是一个反向传播的过程。大家可以自己计算一下关于a和c的偏导数,看自己掌握了没有,dJ/da等于3,dJ/dc等于9。
通常我们会将最终函数(在这里是J)的偏导数的符号进行简化,例如dJ/da可以写成da,将dU/dU写成dU,当你看到db时你会知道它是dJ/db而不是dU/db。
tensorflow就是一个用计算图的形式来表示计算的人工智能框架,所有的数据和计算都能被转化成计算图的形式。tensor就是数据,flow就是流,tensorflow就是数据流。数据流图或计算图是TensorFlow的基本计算单位。计算图由节点和边组成,每个节点代表一个操作(tf.Operation),每条边代表在节点之间传递的张量(tf.Tensor)
本篇文章用一个简单的函数讲解了计算图、前向传播反向传播、求导计算,下篇文章将这些知识应用到神经网络计算中进行实战。

评论留言