COURSERA:多层神经网络反向传播的推导
多层神经网络反向传播的推导
BP网络其实就是多个逻辑斯特模型的组合,逻辑斯特模型的梯度下降反向传播请看上一篇。

首先,前向传播的过程是这样的
al=σ(zl)=σ(Wlal−1+bl)
al是第L层的输出,列向量, Wl就是该层前面的权重,矩阵,bl是该层的偏置,列向量。
损失函数
在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失,比如均方误差:
J(W,b,x,y)=21∣∣aL−y∣∣22
其中,aL和 y为特征维度为nout的向量,而∣∣S∣∣2为S的L2范数。
计算输出层第L层的梯度
那么第L层关于W和b的表达式为:
aL=σ(zL)=σ(WLaL−1+bL)
拆分来看,aL1由前一层的四个神经元影响,这里就不拆分开了,其表达就是WLaL−1两个矩阵的点积,即2$\times4矩阵和4\times1矩阵点积,得到2\times$1矩阵。
损失函数就变为:
J(W,b,x,y)=21∣∣aL−y∣∣22=21∣∣σ(WLaL−1+bL)−y∣∣22
从上式就可以求W,b的梯度:
∂WL∂J(W,b,x,y)=∂zL∂J(W,b,x,y)∂WL∂zL=[(aL−y)⊙σ′(zL)](aL−1)T
求导过程中用到了链式法则和复合函数的求导法则,而对于离散型变量的求导则是将其系数矩阵转置,且座乘右乘也要相同,其中A⊙B=(a1b1,a2b2,...anbn)T。
同理:
∂bL∂J(W,b,x,y)=(aL−y)⊙σ′(zL)
这样,就得到了L层权重和偏置的梯度。
计算非输出层任意第l层的梯度
为了方便向前面层传播,将∂zL∂J(W,b,x,y)记做δL,叫做该层的误差,有:
δL=∂zL∂J(W,b,x,y)=(aL−y)⊙σ′(zL)
现在,得到了第L层的梯度,就可以计算前面的某层l的梯度,对于第l层的未**输出zl,它的误差可以表示为:
δl=∂zl∂J(W,b,x,y)=∂zL∂J(W,b,x,y)(∂zL−1∂zL∂zL−2∂zL−1...∂zl∂zl+1)
从第L层直接求第l层的误差是不好求的,这里用到了数学归纳法,第L层的$\delta^L 上面我们已经求出,假设第l+1层的\delta{l+1}$已经求出来了,那么我们就可以求第$l$层的$\deltal$:
δl=∂zl∂J(W,b,x,y)=∂zl+1∂J(W,b,x,y)∂zl∂zl+1=δl+1∂zl∂zl+1
其中:未知量是∂zl∂zl+1,而zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1,所以:
∂zl∂zl+1=(Wl+1)T⊙σ′(zl)
同样,求导后矩阵运算是左乘还是右乘需要与求导前保持一致,并且需要经过转置,此处需要进行矩阵的广播,将σ′(zl)广播成可以和前者运算的大小。
δl=(∂zl∂zl+1)T∂zl+1∂J(W,b,x,y)=(Wl+1)Tδl+1⊙σ′(zl)
由于我们之前计算出了最后一层的delta误差δL ,通过上式,我们可以依次求得一直到第二层的delta误差δ2 ,第一层为我们的输入,并不存在第一层的delta误差。因此我们的计算到第二层截止。
现在就可以对每一层的W,b求解梯度了,由于zl=Wlal−1+bl:
∂Wl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂Wl∂zl=δl(al−1)T
∂bl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂Wl∂bl=δl
参数更新
到现在,就得到了所有层W和b的梯度,可以进行权重更新了:
Wl=Wl−α∂Wl∂J(W,b,x,y)
bl=bl−α∂bl∂J(W,b,x,y)
,x,y)}{\partial W^l}
$$
bl=bl−α∂bl∂J(W,b,x,y)