对反向传播算法的理解

来源:互联网 发布:主提女装淘宝店有吗 编辑:程序博客网 时间:2024/06/06 08:39

对反向传播算法的理解

求梯度用反向传播算法,核心是“链式求导”法则,又如何具体实现呢?这里,主要参考Michael Nielsen的Neural Networks and Deep Learning里的第二章。

介绍反向传播算法之前,我们需要知道以下几点:
- 确定Cost function C,即损失函数
- 根据C得出Cx,即一个训练样本的损失函数。需要Cx的原因是,我们接下来的反向传播算法是对一个训练样本进行的。重复这个操作,最终对所有训练样本进行完反向传播。这些我们后面会细说。


符号定义

对于一个训练样本,我们记做x
对于神经网络里每一层的权值,我们记做wl
对于神经网络里每一层的偏差,我们记做bl
对于神经网络里每一层的输入,我们记做zl
对于神经网络里每一层的输出,我们记做al
定义激活函数为f
那么 al=f(zl)

神经网络的前向传播过程即:
a0=x
z1=w1a0+b1
a1=f(z1)
z2=w2a1+b2
a2=f(z2)
…….
这样依次进行下去,即 al=f(wlal1+bl)

前面提到我们需要求得一个训练样本的损失函数Cx,这是很容易求出的。
例如:损失函数
下面为了方便,我们把Cx记做C,这里是把下标x省略掉。


反向传播算法

定义神经网络里每一层的误差:
δl=Czl
下面介绍的四个公式会给我们计算δl和损失函数梯度的方法。这四个公式都是链式法则的推论。
公式1:
δl=Calf(zl)
我们使用公式1,求得神经网络里最后一层的误差,最后一层通常不使用激活函数,因此在最后一层里 aL=zL, 我们的重点就是放在计算CaL上。
公式2:
δl=((wl+1)Tδl+1)f(zl)
这个公式是让我们通过递推的方式求得每一层的δl。上面我们提到我们使用公式1求得神经网络最后一层的 δl,那么δl1,δl2.....我们便可以通过公式2求出,注意!!!公式2里面的点乘!!!!!!
公式3:
Cbl=δl
求得偏差bl的梯度
公式4:
Cwl=δl(al1)T

以上是对一个训练样本的损失函数进行梯度计算,最后只需要我们把所有训练样本的梯度累加,然后除以样本数目,作为最终的梯度。(如有正则化,需要再加上正则化部分的梯度,而这个是最好求的,略讲)。

如果我们直接从所有训练样本出发,又该如何呢?注意!!下面在使用上述4个公式的时候,都是在使用整个训练样本,之前的x(Dx1),在下面都是X(DxN),相应的zl,al,δl的列数变成N。大家这里仔细分析一下就可以得出。

公式3表明了一个训练样本的 bl的梯度是δl,我们又知道所有训练样本对bl 的梯度的影响是累加的,即 bl=(b1,l+b2,l+b3,l+....+bN,l)/N,假设训练样本总数是N,我们用[δ1,l,δ2,l.....δN,l]表示所有样本计算的梯度,只需要sum一下,然后除以N,便可以求得最终的bl的梯度。

最后一层的δL,同样是δl=[δ1,l,δ2,l,δ3,l,....δN,l]。运用公式2,递推求得前一层的δl1

运用公式4,即可求得所有训练样本的wl的累积梯度,我们只需再除以N 即可(尚未考虑正则化,如果有正则化,加上相应梯度即可,此步简单)。

通过所有上面讲述的,我们可以意识到,关键点和难点是如何求出最后一层的δL, 得出它后,其他的计算都可以由公式递推得到。因此,在求δL上,我们需要多一些耐心和认真。我个人的求解方式是 通过对单个 Czlj计算,总结出整个 Czl的计算过程。

之后我会贴一份具体的实例代码。

原创粉丝点击