caffe study(2) 关于forward和backward - backward

来源:互联网 发布:宏观经济数据分析 编辑:程序博客网 时间:2024/06/05 11:16
1. 在本质上backward解决的是导数计算的问题,用的就是BP算法,所谓的BP算法就是使用当前层权重对于当前误差加权然后传递到下层节点的一个流程。下图是caffe的doc中示意的,这里面有两部分,一个部分就是向下传递的对于g的偏导数,这个数值就是反向传播的输出;另外一部分就是在当前层中对于当前权重的求导。


caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward


2. 下面将通过一个简单的三层网络来说明一下caffe的backward过程所传递的内容的具体形式。


a. 如下图所示,这是一个简单的NN的结构,其输出层就一个节点。其中x代表输入数据,a代表每一层的激活值,对应h。在下面的描述中采用z来对应g。

caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward


在加入正则项之后,loss形式为

caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward

b.  对于输入层net的求导

对于第n_{l} 输出层 的每个输出单元i ,我们根据以下公式计算对于z的导数,把z看成一个局部net的话,这个就是对于net进行的求导。

caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward
其中s_{nt}为当前输出层的神经元的个数,a为第j个神经元的激活值,这个值是通过激活函数f计算得到(如的logistic函数),f的输入就是z。因为当  i != j  的时候,导数为0,因此得到了第三行的求导结果。

c. 对于非输入层net的求导

caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward
根据基本的链式法则可以推导到倒数第二行,里面的导数部分就变成了当前层的每一个神经元z_{j}对于下一层的z_{i}求导的一个过程,将z_{j}做一个展开,就是z_{i}层激活的一个加权和,如b所示,得到了最终的对于非输入层的导数。其中W_{ji}指的的是输出层和隐藏层之间的权重链接。

这个导数分为两部分,一部分就是括号内的,是上层导数在当前层节点上的加权和,这个定义了误差专递的方式,也就是反向传播的一个核心;第二项就是当前层激活函数对于net的导数。这样就得到了一个反向转播的递推公式。caffe中backward的就是在传递每一个节点的导数的计算值。

d. 在传递完基本的残差后,在本层还需要计算的就是对于当前w_{ij}的一个求导。只需要对于上述结果后边再加入一个net对于w_{ij}的求导就可以了,令l = n - 1, n-2,… 

caffe <wbr>study(2) <wbr>关于forward和backward <wbr>- <wbr>backward
0 0
原创粉丝点击