BP 神经网络(反向传播的神经网络)的解读


人工神经网络这几年太火了,普遍用于预测、语音或图像识别。四五年前曾经想学习,但没有找到好的学习资料,一直一知半解的。最近一段时间因为要用 BP 神经网络做需求预测,就重新捡起来了。中文资料大部分的讲解不清晰(符号普遍比较混乱),于是结合维基百科以及查阅的几个英文资料,写下自己对这一算法的理解。

一、 神经网络算法的内涵

神经网络的目标是:找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务,其中输入是动物的图像,正确的输出将是动物的名称。或者根据历史需求数据,预测未来一期的需求数据。

神经网络的思想(内涵)类似回归分析中经常用到的拟合,都用到了最小二乘的思想:数学意义上的决策目标是:选取一些参数(神经网络中每个输入的权重),使得拟合的输出与期望输出的误差平方和最小。

下面是一个神经网络示意图(输入层有 3个神经元,隐含层有 3个神经元,输出层有 3个神经元),输入信息经过正向传播到输出,计算实际输出与期望输出的误差后,在反向传播误差;重复这个过程,在传播过程中,不断减少误差,直到误差减少到一定程度终止。

误差反向传播,是该神经网络叫做 BP 神经网络的原因。

在这里插入图片描述

二、神经元之间信息的传递

每个神经元接受上一层所有神经元传递过来的信息,然后传递到下一层。接受信号时,按一定权重 w i j w_{ij} 接受信号。 下图是一个接受信号与传递信号的示意图:
在这里插入图片描述

w i j w_{ij} 表示从神经元 i i 传递到神经元 j j 时的权重(每个神经元的阈值 θ j \theta_j 也能放在权重里表示,为了便于推算和理解,下面就不提阈值了),神经元 i i 处传来的信息值大小为 o i o_i (若神经元 i i 在输入层,则 o i = x i o_i=x_i ),则每个神经元 j j 的激活值 (activation value) a j a_j 等于:
(1) a j = i w i j o i a_j=\sum_i w_{ij}o_i\tag{1}

神经元 j j 有了激活值后,根据它的激活函数(或叫传递函数) φ \varphi ,计算得到它的信息量大小 o j o_j
(2) o j = φ ( a j ) = φ ( i w i j o i ) o_j=\varphi(a_j)=\varphi(\sum_i w_{ij}o_i)\tag{2}

常用的激活函数 φ \varphi 为 Sigmoid 函数,即:
φ ( z ) = 1 1 + e z \varphi(z)=\frac{1}{1+e^{-z}}
使用这个函数的一个重要原因是它的一阶导数方便求解,
(3) φ z = φ ( z ) ( 1 φ ( z ) ) \frac{\partial\varphi}{\partial z}=\varphi(z)(1-\varphi(z))\tag{3}

三、采用梯度下降法使误差减小

一般来说,神经元 j j 产生的误差 E E 这样定义:
(4) E j = 1 2 j = 1 m ( t j y j ) 2 E_j=\frac{1}{2}\sum_{j=1}^m(t_j-y_j)^2\tag{4}

其中 t j t_j 表示输出层的期望输出, y j y_j 表示输出层的实际输出,假设输出层有 m m 个神经元。我们的目标是选取合适的权重 w i j w_{ij} ,使得 E E 最小,BP 神经网络一般采用梯度下降法逐渐更新权重(类似最优化中的最速下降法,参见本人另外一篇博客关于最速下降法的迭代公式:https://blog.csdn.net/robert_chen1988/article/details/53167156)。

因此,计算 E E w i j w_{ij} 的一阶导数:
E j w i j = E j y j y j w i j \frac{\partial E_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial y_j}\frac{\partial y_j}{\partial w_{ij}}

我们同一用 o j o_j 表示 y j y_j o j o_j 表示输出的信息值,在最后的输出层,输出的信息值为 y j y_j ),则:
E j w i j = E j o j o j w i j \frac{\partial E_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial w_{ij}}

根据公式 (2) 与公式 (3), 输出信息值 o j o_j 又是激活值 a j a_j 的函数,而激活值 a j a_j 才与 w i j w_ij 有直接联系,因此:
(5) E j w i j = E j o j o j w i j = E j o j o j a j a j w i j \frac{\partial E_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j}\frac{\partial{a_j}}{\partial w_{ij}}\tag{5}

下面分开计算每一项,由公式(1):
(6) a j w i j = ( i w i j o i ) w i j = o i \frac{\partial{a_j}}{\partial w_{ij}}=\frac{\partial({\sum_i w_{ij}o_i})}{\partial w_{ij}}=o_i\tag{6}

即这项导数是传递它信息的神经元的信息值。由公式 (3):

(7) o j a j = φ ( a j ) ( 1 φ ( a j ) ) = o j ( 1 o j ) \frac{\partial{o_j}}{\partial a_j}=\varphi(a_j)(1-\varphi(a_j))=o_j(1-o_j)\tag{7}

而计算 E o j \frac{\partial E}{\partial o_j} 则要分两种情况讨论:

  1. o j o_j 位于最后的输出层,则 o j = y j o_j=y_j ,根据公式(4)
    (8) E o j = E y j = y j t j \frac{\partial E}{\partial o_j}=\frac{\partial E}{\partial y_j}=y_j-t_j\tag{8}

根据公式 (5),(6)(7)(8),得到:
(9) E j w i j = E j o j o j a j a j w i j = E j o j o j a j o i = ( y j t j ) y j ( 1 y j ) o i \frac{\partial E_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j}\frac{\partial{a_j}}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j}o_i=(y_j-t_j)y_j(1-y_j)o_i\tag{9}

  1. o j o_j 位于输入层或隐含层, 神经元 j j 输出值 o j o_j 造成的误差等于它输出的所有神经元造成的误差之和 (本人的理解),设神经元 j j 输出的神经元的集合为 L L ,因此得到:
    (10) E j o j = l L ( E l o j ) = l L E l o l o l a l a l o j = l L E l o l o l a l w j l \frac{\partial E_j}{\partial o_j}=\sum_{l\in L}(\frac{\partial E_l}{\partial o_j})=\sum_{l\in L}\frac{\partial E_l}{\partial o_l}\frac{\partial o_l}{\partial a_l}\frac{\partial{a_l}}{\partial o_{j}}=\sum_{l\in L}\frac{\partial E_l}{\partial o_l}\frac{\partial o_l}{\partial a_l}w_{jl}\tag{10}

这两种情况都满足一下式子:(只不过两种情况的 E o j \frac{\partial E}{\partial o_j} 不同)
(11) E j w i j = E j o j o j a j a j w i j = E j o j o j a j o i \frac{\partial E_j}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j}\frac{\partial{a_j}}{\partial w_{ij}}=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j}o_i\tag{11}

为了方便,令
δ j = E j o j o j a j \delta_j=\frac{\partial E_j}{\partial o_j}\frac{\partial o_j}{\partial a_j} ,则权重的一阶导数可以简化成:
(11) E j w i j = δ j o i \frac{\partial E_j}{\partial w_{ij}}=\delta_j o_i\tag{11}

其中, δ j \delta_j 的取值与上面两种情况有关(根据表达式(9),(10)):
(12) δ j = { ( y j t j ) y j ( 1 y j )   j   ( l L E l o l o l a l w j l ) o j ( 1 o j ) = ( l L δ l w j l ) o j ( 1 o j )   j   \delta_j= \begin{cases} (y_j-t_j)y_j(1-y_j) \quad &若~j~位于输出层\\ \\ \left(\sum_{l\in L}\frac{\partial E_l}{\partial o_l}\frac{\partial o_l}{\partial a_l}w_{jl}\right)o_j(1-o_j)=\left(\sum_{l\in L}\delta_l w_{jl}\right)o_j(1-o_j)\quad &若~j~不位于输出层 \end{cases}\tag{12}

于是,表达式(11),(12)就是权重相对于误差的一阶导数取值。BP 神经网络采用梯度下降法使得误差降低。

类似最速下降法的思想,BP 神经网络在迭代时,采用下面的方法更新权重,不断使得误差减小:
w i j = w i j η E j w i j w_{ij}=w_{ij}-\eta\frac{\partial E_j}{\partial w_{ij}}

其中 η \eta 就是梯度下降法的步长,在神经网络算法中称为学习速率,而权重沿负梯度方向更新。

四、BP 神经网络的局限性

  1. 不能保证得到全局最优解
  2. 输入的数据不要求标准化,但若标准化,可以提高神经网络的表现。
发布了280 篇原创文章 · 获赞 496 · 访问量 146万+

猜你喜欢

转载自blog.csdn.net/robert_chen1988/article/details/99237827