Neural Network中的Back-Propagation的详细推导过程

你可能已经看过了一些关于Deep Learning, 尤其是CNN相关的资料。你可能对于里面的前向传导(Forward)和后向传导(Backward)也明白是怎么回事。但是,仍然觉得具体的推导过程有些迷糊。
我觉得原因是因为除了本身Back-Propagation(B-P)推导过程有些繁琐之外,就是因为各种papers, 资料里面的符号,公式不完全统一,你看着,看着就绕晕了。
今天,在这篇blogs里面,我来详细的推导一下CNN里的B-P过程。让你真正地能明白这个过程是如何推导出来的。
首先,我们来看一个简单的CNN的示意图:
Neural Network中的Back-Propagation的详细推导过程_第1张图片

根据上面的图示,我们来定义一些变量,或者说同意一些变量:
y(L1)i L1 层的node- i 的输出,也就是 L 层的其中一个输入;
W(L)i : L 层权重值,作用于每一个 L1 层的输入值上面;
Z(L)i : L 层上对于 L1 层的输入,做的加权求和的结果;
a() : 代表着activation function(激活函数). e.g.: sigomoid, tanh, ReLU;
y(L)i : 代表着 L 层第 i 个node的输出值,这个值会被作为 L+1 层的输入的一份子;

上面的过程呢,一层接一层的往下计算下去,一直到最后一层,使用的是不同的activation function 而已,比如说分类的用途,就会使用softmax作为激活函数,最后得到是某一个类的概率值。这也就是Forward propagation - 前向传导的过程。

然后关键来了,怎样做后向传导呢?
首先要从最后一层(output层)算起,算什么呢? 简单地讲就是算“差距”或者叫“损失”(Loss), 也就是说根据你目前的网络配置(weights),得出的结论( y^k )与实际的label值( yk )之间的差距,我们称之为”残差”( δ )。 该残差表明该节点对于最终输出值的残差产生多少影响。

在这里,我再补充一下, 我们为啥需要计算B-P, 为啥需要计算残差?
这是因为我们的learning过程,其实是一开始给定一些初始化的weights的值,我们通过不停地前向和后向的传导学习,使得最后一层的残差(Loss)变为零,这个时候的weights我们就认为是learning出来的有效的权重值。那么权重值以及bias值怎么更新的呢?(bias是一个offset在每一层的每一个node都有的,我们这里按下不表)。
Neural Network中的Back-Propagation的详细推导过程_第2张图片

具体就是使用上面这两个公式进行更新weights和bias啦。 那么 J(W,b)W(l)ij 这个量具体怎么算呢?就要用到我之前说的B-P过程,以及计算残差了。

下面,我们从最后一层,即output层,来计算残差:
(我们这里的Loss使用的是最小二乘法,也可以是别的)
L(y^k,yk) 代表的就是最后一层的loss. 以及这里的残差是对每一层的 ZLi 求偏导。

δk=L(y^k,yk)zk=zk12||yky^k||2=zk12i=1S1(ykak(zk))2=(ykak(zk))ak(zk)

然后,我们对于中间层,来求其中的残差 δj :
δj=zj12||yky^k||2=zji=1S2(ykak(zk))2=12i=1S2zj(ykak(zk))2=i=1S2(ykak(zk))zjaj(zk)=i=1S2(ykak(zk))ak(zk)zkzj=i=1S2δkzkzj=i=1S2δkzjt=1S3(Wityt)=(i=1S2δkWit)at(zt)

这样,B-P的主要过程就全写出来了。
但是,因为残差是对 zj 的求导,我们需要的是对于weights的求导,才能更新weights和bias, 那么我们还需要继续进行:

Lwj=Lzjzjwj=δjyj1

Lbj=Lzjzjbj=δj

以上。

参考资料:
1. Ufldl-Andrew Ng:
http://ufldl.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95
2. Paper: a critical review of recurrent neural networks for sequence learning;
3. Prof. Guo-jun Qi’s Lecture of Neural Networks.

你可能感兴趣的:(Machine,Learning)