对反向传播算法的理解

对反向传播算法的理解

求梯度用反向传播算法,核心是“链式求导”法则,又如何具体实现呢?这里,主要参考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(D x 1) ,在下面都是 X(D x N) ,相应的 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 的计算过程。

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

猜你喜欢

转载自blog.csdn.net/yqmind/article/details/77119521