误差反向传播算法误差
反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。
误差反向传播算法系统的解决了多层神经网络隐含层连接权学习问题,人们把采用这种算法进行误差校正的多层前馈网络称为BP网。
BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或(Exclusive OR,XOR)和一些其他问题。
从结构上讲,BP网络具有输入层、隐藏层和输出层;
从本质上讲,BP算法就是以网络误差平方为目标函数、采用梯度下降法来计算目标函数的最小值。
因此学习误差反向传播算法对于深度学习的深造起到非常重要的作用,这也是本篇博客的主题。
在多层感知器中,数据从输入层输入,经过中间层,最终从输出层输出。因此,误差反向传播算法就是通过比较实际输出和期望输出得到误差信号,把误差信号从输出层逐层传播到各层的误差信号,再通过调整各层的连接权重以减小误差。
权重的调整主要使用梯度下降法。如下图所示,通过实际输出和期望输出之间的误差
E
E和梯度,确定连接权重
w0
w0的调整值,得到新的连接权重
w1
w1。
然后便是不断地调整权重以使误差达到最小,从中学习得到最优的连续权重
wopt
wopt。这便是梯度下降法。
由于梯度下降法需要求解相邻层的梯度,这就要求网络中需要处处可导,也就是需要激活函数也必须支持可导性。M-P模型中使用step函数作为激活函数,只能输出0或1,不连续所以不可导。为了使误差能够顺利传播,科学家们提出了可导函数sigmoid作为激活函数
f(u)
f(u),但是在后期的使用中发现sigmoid函数也存在一定的问题(梯度饱和问题),于是发展出了ReLU函数及其变形激活函数,想深入了解激活函数的小伙伴可以查看下这篇博客:https://blog.csdn.net/ViatorSun/article/details/82418578。
1) 以单层感知器入
反向传播算法便于大家理解,下面先解释下单层感知器的梯度下降法。由复合函数求导法则可以知道,误差函数求导如下所示:
∂E∂wi=∂E∂y∂y∂wi
∂wi∂E=∂y∂E∂wi∂y 设
y=f(u)
y=f(u),求误差函数
E
E对
wi
wi的导数为:
∂E∂wi=−(r−y)∂y∂wi=−(r−y)∂f(u)∂wi
∂wi∂E=−(r−y)∂wi∂y=−(r−y)∂wi∂f(u)
f(u)
f(u)的导数就是对复合函数求导
∂E∂wi=−(r−y)∂f(u)∂u∂u∂wi
∂wi∂E=−(r−y)∂u∂f(u)∂wi∂u
u
u对
wi
wi求导的结果只和
xi
xi相关:
∂u∂wi=xi
∂wi∂u=xi 整理下上面两个式子,得到:
∂E∂wi=−(r−y)xi∂f(u)∂u
∂wi∂E=−(r−y)xi∂u∂f(u)在此,我们对激活函数
Sigmoid
Sigmoid :
σ(x)=11+e−x
σ(x)=1+e−x1函数求导:
∂σ(x)∂x=e−x(1+e−x)2
∂x∂σ(x)=(1+e−x)2e−x令
e−x=u
e−x=u则导函数为:
∂f(u)∂u=f(u)(1−f(u))
∂u∂f(u)=f(u)(1−f(u))将激活函数的导数代入上面整理结果得到:
∂E∂wi=−(r−y)xif(u)(1−f(u))
∂wi∂E=−(r−y)xif(u)(1−f(u))由于输出结果
y=f(u)
y=f(u),所以单层感知器的权重调整值为(其中
η
η为学习率):
Δwi=−η∂E∂wi=η(r−y)y(1−y)xi
Δwi=−η∂wi∂E=η(r−y)y(1−y)xi至此,这就是单层感知器权重的调节量。
2)多层感知器的反传传播算法
接下来,我们再分析下多层感知器。多层感知器的误差函数
E
E等于个输出单元的误差总和。
E=12∑qj=1(rj−yj)2
E=21j=1∑q(rj−yj)2
对误差函数求导得:
∂E∂wij=∂E∂yj∂yj∂wij
∂wij∂E=∂yj∂E∂wij∂yj其中,
wij
wij代表
xi
xi和
yj
yj之间的连接权重,对
E
E求导的结果只和
yj
yj相关,如下所示:
∂E∂wij=−(rj−yj)∂yj∂wij
∂wij∂E=−(rj−yj)∂wij∂yj与单层感知相同,对上式展开后对复合函数求导:
∂E∂wij=−(rj−yj)∂yj∂uj∂uj∂wij
∂wij∂E=−(rj−yj)∂uj∂yj∂wij∂uj下面与单层感知器一样,对误差函数求导得:
∂E∂wij=−(rj−yj)yj(1−yj)xi
∂wij∂E=−(rj−yj)yj(1−yj)xi则权重的调节值为(其中
η
η为学习率):
Δwij=η(rj−yj)yj(1−yj)xi
Δwij=η(rj−yj)yj(1−yj)xi由此可见,多层感知器中,只需要使用与连接权重
wij
wij相关的输入
xi
xi和输出
yj
yj,即可计算出连接权重的调节值。
将神经网络分解开可以更清晰的分析,再将最后一列各变量之间的偏导数累成就是整个链式法则的体现。
3) 带中间层的多层感知器的反向传播算法
最后我们再解释下带中间层的多层感知器的梯度下降法。由于中间层的加入,层之间的权重下标我们增加到三个,其中
i
i表示输入层单元,
j
j表示中间层单元,
k
k表示输出层单元 。如下图所
首先考虑输出层与中间层之间的连接权重
w2jk
w2jk的调整。对权重
w2jk
w2jk求导:
∂E∂w2jk=∂E∂yk∂yk∂u2k∂u2k∂w2jk
∂w2jk∂E=∂yk∂E∂u2k∂yk∂w2jk∂u2k经过误差函数
E
E对输出
yk
yk求导,输出
yk
yk求导,输出
yk
yk对激活值
u2k
u2k求导,激活值
u2k
u2k对连接权重
w2jk
w2jk求导之后,得到:
∂E∂w2jk=−(rk−yk)yk(1−yk)zj
∂w2jk∂E=−(rk−yk)yk(1−yk)zj所以,即便是输出层有多个单元,只要对每个输出单元分别求导后,也能得到误差函数对中间层权重的偏导数接下来计算输入层和中间层之间的连接权重
w1ij
w1ij的偏导数:
∂E∂w1ij=∑qk=1[∂E∂yk∂yk∂u2k∂u2k∂w1ij]
∂w1ij∂E=k=1∑q[∂yk∂E∂u2k∂yk∂w1ij∂u2k]
中间层的单元
j
j和输出层的所有单元相连,所以如上式所示,误差函数
E
E对连接权重
W1ij
W1ij求偏导,就是对所有输出单元的导数进行加权和,实际使用的是所有输出单元连接权重的总和。将
sigmoid
sigmoid函数的导数和误差函数代入到上式,得:
∂E∂w1ij=−∑qk=1[(rk−yk)yk(1−yk)∂u2k∂w1ij]
∂w1ij∂E=−k=1∑q[(rk−yk)yk(1−yk)∂w1ij∂u2k]由于连接权重
w1ij
w1ij只对中间层
zj
zj的状态产生影响,所以上式中剩余部分求导后的结果如下:
∂u2k∂w1ij=∂u2k∂zj∂zj∂w1ij
∂w1ij∂u2k=∂zj∂u2k∂w1ij∂zj激活值
u2k
u2k对
zj
zj求导得到连接权重
w2jk
w2jk,结合下式就可以求出输入层与中间层之间的连接权重
w1ij
w1ij的调整值:
∂zj∂w1ij=∂zj∂u1j∂u1j∂w1ij=zj(1−zj)xi
∂w1ij∂zj=∂u1j∂zj∂w1ij∂u1j=zj(1−zj)xi
Δw1ij=η∑qk=1[(rk−yk)yk(1−yk)w2jk]zj(1−zj)xi
Δw1ij=ηk=1∑q[(rk−yk)yk(1−yk)w2jk]zj(1−zj)xi
具体推导过程可以参考下列公式
在此需要注意
zj=f(uj)
zj=f(uj),输入层与中间层之间的权重调整值是相关单元在中间层与输出层之间的权重调整值的总和。
4)小结
至此,误差反向传播算法的讲解就全部结束了,其中包含了大量的公式,理解起来可能会有一些难度,但是这是必过的槛。如果实在不理解过程的话,只记住最后那张图也可以,那张图便是整个算法的精髓所在。除此之外,在实际应用过程中可能还会遇到一个问题,那就是激活函数使用
Sigmoid
Sigmoid或者
tanh
tanh函数的时候,如果
x
x趋向正负无穷的时候,会出现偏导数为零的情况,见下图,左侧为
Sigmoid
Sigmoid函数图像,右侧为其导函数的图像。这时候,由于权重调整值趋近于0,所以无法调整连接权重,权重所在的单元也就不再起作用。
这就是误差反向传播算法中的梯度消失导致无法调整连接权重的问题,对于这个问题,需要在训练的过程中合理地调整学习率
η
η,以防止梯度消失。
转载:
https://blog.csdn.net/ViatorSun/article/details/82696475