简单的反向传播神经网络可以说就是将基本单元如感知器,组成层级结构,划分出输入层、隐含层、输出层;不同层之间通过连接来形成耦合,从而组成一个有功用的网状算法结构。
感知器可以通过迭代计算来逼近想获取的结果,迭代过程中感知器不断和计算结果反馈,较为常用的迭代计算方法有梯度下降法。当感知器组成网络之后,每个感知器如果获得结果反馈就比较麻烦,这里就要用到反向传播方法。
假设我们有一个计算过程
y=a∗b+c
,其中
a,b,c
都是输入变量,y是输出。按照梯度下降法,针对
a
的迭代计算过程为
connect1:q=a∗bconnect2:y=q+c
那么 a,b,c 的迭代计算过程都要相应变化:
ck+1=ck−η∗1grad(q)=1,qk+1=qk−η∗1ak+1=ak−ηgrad(q)∗b
注意到这里将 q=a∗b 单独提取出来,其实是可以用微积分的链式法则来推导的。另外, η 一般是个很小的值,是不能传递的,因此每一层之间要传递与 η 无关的提低。实际应用中需要使用链式法则来计算神经网络的反馈。
一般而言神经网络每一层的输出是一堆数据,这里我只推导简单的反向传播神经网络。前向单次计算过程是:先计算连接,输入为上次的输出;然后用H函数激活连接计算后的结果,作为下一次的输入。第k层的感知器输入之后需要经过滤波,定义为激活函数 Oq=H(Q1,Q2...) ,层之间的连接函数为 [Q1,Q2...]=∑wqpIq 。其中 Iq=Op 。我们要反馈修正的是权值w。这里定义神经网络层名为j->p->q。
设总的代价函数为
cost(O)=12(T−O)2
,则根据链式法则,修正量计算为
grad(wqp)=∂cost(O)∂wqp=∂cost(O)∂Oq∂Oq∂Qq∂Qq∂wqp=∂cost(O)∂OqΔHqIq=−(T−Oq)ΔHq(Qq)Iq
其中T表示目标输出,是人工标记结果。 Oq 是神经网络输出层的输出。输出层没有前向连接,修正量为 Δwqp=−ηgrad(wqp) 。
然后是隐含层,隐含层是中间层,受到前方多重连接的影响,且不知道中间目标输出T应该是多少,因此需要从输出层向前递推,其中 Nq 是第q层的感知器数量:
grad(wpj)=∂cost(O)∂Op∂Op∂Qp∂Qp∂wpj=∑q=1Nq∂cost(O)∂Qq∂Qq∂OpΔHpIp=∑q=1Nq∂cost(O)∂QqwqpΔHpIp=∑q=1Nq∂cost(O)∂Oq∂Oq∂QqwqpΔHpIp=∑q=1Nqgrad(wqp)IqwqpΔHpIp
注意这里的代价函数是cost(O),只和输出有关,而不是 cost(Op) 等中间代价函数,后者是无法传递计算的。
设 H(x)=11−ex ,即 sigmoid 函数,有 ΔH(Qq)=H(Qq)(1−H(Qq))=Oq(1−Oq) ,则输出端修正量为
Δwqp=η(T−Oq)Oq(1−Oq)Iq
隐藏层修正量为
Δwpj=−η∑q=1Nqgrad(wqp)IqwqpOp(1−Op)Ip=−η∑q=1Nqgrad(wqp)wqpOp(1−Op)