神经网络 误差逆传播算法推导 BP算法

时间:2023-03-09 20:02:41
神经网络 误差逆传播算法推导 BP算法

  误差逆传播算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多使用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}\)。

神经网络 误差逆传播算法推导 BP算法

  于是,按照神经网络的传输法则,隐层第\(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)\),其中\(f\)函数是“激活函数”,\(\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(1)\]

为了使输出的均方误差最小,我们以均方误差对权值的负梯度方向进行调整,给定学习率\(\eta\),

\[\Delta w_{ij}=-\eta\frac{\partial E_k}{\partial w_{ij}}\ (2)
\]这里为什么是取负梯度方向呢?因为我们是要是均方误差最小,而

\(w\)的更新估计式为\[w=w+\Delta w (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}} (4)
\]显然,

\[\frac{\partial \beta_j}{\partial w_{ij}}=b_h (5)
\]而对Sigmoid函数有

\[f'(x)=f(x)(1-f(x)) (6)
\]所以

\[\begin{aligned}g_j&=-\frac{\partial E_k}{\partial\widehat{y}_j^k}. \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)\end{aligned} (7)
\]将式(7)代入式(3)和式(4),就得到BP算法中关于\(\Delta w_{ij}\)的更新公式

\[\Delta w_{ij}=\eta g_jb_h (8)
\]类似可得,

\[\Delta \theta_j=-\eta g_j (9)
\]\[\Delta v_{ih}=\eta e_hx_i (10)
\]\[\Delta \gamma_h=-\eta e_h (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} (12)\]

  至此,误差逆传播算法的推导已经完成,我们可以回过头看看,该算法为什么被称为误差逆传播算法呢?误差逆传播,顾名思义是让误差沿着神经网络反向传播,根据上面的推导, \(\Delta w_{ij}=-\eta(\widehat{y}^k_j-y^k_j).\frac{\partial \widehat{y}_j^k}{\partial \beta_j}.b_h=\eta g_jb_h\),其中,\((\widehat{y}^k_j-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上层节点的输出,算是对于误差逆向传播法表面上的通俗理解,有助于记忆。