??误差逆传播算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多使用BP算法进行训练。
??给定训练集\(D={(x_1,y_1),(x_2,y_2),......(x_m,y_m)},x_i \in R^d,y_i \in R^l\),即输入示例由\(d\)个属性描述,输出\(l\)个结果。如图所示,是一个典型的单隐层前馈网络,它拥有\(d\)个输入神经元、\(l\)个输出神经元、\(q\)个隐层神经元,其中,\(\theta_j\)表示第\(j\)个神经元的阈值,\(\gamma_h\)表示隐层第\(h\)个神经元的阈值,输入层第\(i\)个神经元与隐层第\(h\)个神经元连接的权值是\(v_{ih}\),隐层第\(h\)个神经元与输出层第\(j\)个神经元连接的权值是\(w_{hj}\)。
??于是,按照神经网络的传输法则,隐层第\(h\)个神经元接收到的输入\(\alpha_h=\sum_{i=1}^dv_{ih}x_i\),输出\(b_h=f(\alpha_h-\gamma_h)\),输出层\(j\)第个神经元的输入\(\beta_j=\sum_{h=1}^qw_{hj}b_h\),输出\(\widehat{y}_j^k=f(\beta_j-\theta_j)\),其中函数是“激活函数”,\(\gamma_h\)和\(\theta_j\)分别是隐藏层和输出层的阈值,选择Sigmoid函数\(f(x)=\frac{1}{1+e^{-x}}\)作为激活函数。
??对训练样例\((x_k,y_k)\),通过神经网络后的输出是\(\widehat{y}_k=(\widehat{y}_1^k,\widehat{y}_2^k,......,\widehat{y}_l^k)\),则其均方误差为\[E_k=\frac{1}{2}\sum_{j=1}^{l}(\widehat{y}_j^k-y_j^k)^2\tag{1}\]
为了使输出的均方误差最小,我们以均方误差对权值的负梯度方向进行调整,给定学习率\(\eta\),\[\Delta w_{ij}=-\eta\frac{\partial E_k}{\partial w_{ij}}\tag{2}\]这里为什么是取负梯度方向呢?因为我们是要是均方误差最小,而\(w\)的更新估计式为\[w=w+\Delta w\tag{3}\]如果,\(\frac{\partial E_k}{\partial w_{ij}}>0\),则表明减小\(w\)才能减小均方误差,所以\(\Delta w\)应该小于零,反之,如果\(\frac{\partial E_k}{\partial w_{ij}}<0\),则表明增大\(w\)的值可以减小均方误差,所以所以\(\Delta w\)应该大于零,所以在这里取负的偏导,以保证权值的改变是朝着减小均方误差的方向进行。
??在这个神经网络中,\(E_k\)是有关\(\widehat{y}_j^k\)的函数,\(\widehat{y}_j^k\)是有关\(\beta_j\)的函数,而\(\beta_j\)是有关\(w_{ij}\)的函数,所以有\[\frac{\partial E_k}{\partial w_{ij}}=\frac{\partial E_k}{\partial \widehat{y}_j^k}.\frac{\partial \widehat{y}_j^k}{\partial \beta_j}. \frac{\partial \beta_j}{\partial w_{ij}}\tag{4}\]显然,\[\frac{\partial \beta_j}{\partial w_{ij}}=b_h\tag{5}\]
而对Sigmoid函数有\[f‘(x)=f(x)(1-f(x))\tag{6}\]所以\[
\begin{aligned}g_j&=-\frac{\partial E_k}{\partial \widehat{y}_j^k}\cdot\frac{\partial \widehat{y}_j^k}{\partial \beta_j}\&=-(\widehat{y}^k_j-y^k_j)f(\beta_j-\theta_j)\&=-(\widehat{y}^k_j-y^k_j)f(\beta_j-\theta_j)(1-f(\beta_j-\theta_j))\&=-(\widehat{y}^k_j-y^k_j)\widehat{y}^k_j(1-\widehat{y}^k_j)\tag{7}
\end{aligned}
\]
将式(7)代入式(3)和式(4),就得到BP算法中关于\(\Delta w_{ij}\)的更新公式\[\Delta w_{ij}=\eta g_jb_h\tag{8}\]类似可得,
\[\Delta \theta_j=-\eta g_j\tag{9}\]\[\Delta v_{ih}=\eta e_hx_i\tag{10}\]\[\Delta \gamma_h=-\eta e_h\tag{11}\]
其中,式(10)和式(11)
\[\begin{aligned}e_h&=-\frac{\partial E_k}{\partial b_h}.\frac{\partial b_h}{\partial \alpha_h}\\&=-\sum_{j=1}^l\frac{\partial E_k}{\partial \beta_j}.\frac{\partial \beta_j}{\partial b_h}f‘(\alpha_h-\gamma_h)\\&=\sum_{j=1}^lw_{hi}g_jf‘(\alpha_h-\gamma_h)\\&=b_h(1-b_h)\sum_{j=1}^lw_{hj}g_j\end{aligned}\tag{12}\]
??至此,误差逆传播算法的推导已经完成,我们可以回过头看看,该算法为什么被称为误差逆传播算法呢?误差逆传播,顾名思义是让误差沿着神经网络反向传播,根据上面的推导,
\(\Delta w_{ij}=\eta(y^k_j-\widehat{y}^k_j).\frac{\partial \widehat{y}_j^k}{\partial \beta_j}.b_h=\eta g_jb_h\),其中,\((y^k_j-\widehat{y}^k_j)\)是输出误差,\(\frac{\partial \widehat{y}_j^k}{\partial \beta_j}\)
是输出层节点的输出\(y\)对于输入\(\beta\)的偏导数,可以看做是误差的调节因子,我们称\(g_j\)为“调节后的误差”;而\(\Delta v_{ih}=\eta e_hx_i\),\(e_h=b_h(1-b_h)\sum_{j=1}^lw_{hj}g_j=\frac{\partial b_h}{\partial \alpha_h}\sum_{j=1}^lw_{hj}g_j\),所以\(e_h\)可以看做是“调节后的误差”\(g_j\)通过神经网络后经过调节的误差,并且我们可以看出:权值的调节量=学习率x调节后的误差x上层节点的输出,算是对于误差逆向传播法表面上的通俗理解,有助于记忆。<\font>