深度学习 --- BP算法详解(偏差反向传播算法)

本节开始深度学习的第一个算法BP算法,本打算第一个算法为单层感知器,可是感受太简单了,不懂得找本书看看就会了,这里简要的介绍一下单层感知器:web

图中能够看到,单层感知器很简单,其实本质上他就是线性分类器,和机器学习中的多元线性回归的表达式差很少,所以它具备多元线性回归的优势和缺点。单层感知器只能对线性问题具备很好的解决能力,可是非线性问题就没法解决了,可是多层感知器却能够解决非线性问题,多层感知器存在的问题是隐层的权值向量没法调整,咱们从学习规则来看:算法

如上图的多层感知器的模型,而单层感知器的通用学习规则为:\Delta w_j(t) = \eta (d_j-o_j(t))x,权值的调整量只取决于指望输出和实际输出之差,然而对于隐层节点来讲不存在指望输出,于是该权值更新不适合隐层,由于这个问题,一直没有很好的解决办法,因此神经网络停滞了。直到1986年, Rumelhart和McCelland提出了反向传播偏差算法即BP,完全的解决了这个问题,也所以神经神经网络重新回到人们的视野。下面咱们详细讲解BP算法,搞懂BP的前因后果。网络

BP算法机器学习

        本篇的核心就是BP算法,讲解过程当中会有大量的数学公式,想深刻理解BP算法的同窗,请不要害怕数学,你要克服它,尝试理解他,数学公式会告诉你最本质的问题,你们跟着个人思路走必定能够理解的,尤为我当时第一次学习时的疑惑的地方更会详细的讲解,同时本篇我是站在对BP一无所知的同窗的角度进行讲解,学习过程当中,建议你们不要只看,本身也动手推一下,搞懂每一个公式的来由,另外就是公式有点繁琐,我会尽可能讲清楚,好下面开始:函数

       为了简单起见,本篇将以三层感知器为例进行讲解,下面开始:学习

上图给出了三层感知器的模型图,其中.net

输入向量为:3d

                      x = (x_1,x_2,....,x_i,....,x_n)^T,其中x_0 = -1为隐层神经元引入阈值而设定的。code

隐层输出向量为:orm

                     Y = (y_1, y_2,...,y_j,...,y_m)^T,其中y_0 = -1是为输出层神经元引入阈值而设定的。

输出层向量为:

                     O = (o_1,o_2,...,o_k,...,o_l)^T

指望输出向量为:

                      d = (d_1,d_2,...,d_k,...,d_l)^T

输入层到隐层之间的权值矩阵用V表示:

                       V = (V_1,V_2,...,V_j,...,V_m),其中列向量V_j为隐层第j个神经元对应的权向量

                         V=\begin{Bmatrix} v_{11},v_{12},...,v_{1j},...,v_{1m} & \\ v_{21},v_{22},...,v_{2j},...,v_{2m}& \\ ....,....,....,...,...,..., & \\ v_{i1},v_{i2},....,v_{ij},...,v_{im}& \\ ....,....,....,...,...,..., & \\ v_{n1},v_{n2},...,v_{nj},...,v_{nm}& \\ \end{Bmatrix}

隐层到输出层之间的权值矩阵用W表示为:

                        W = (W_1,W_2,...,W_k,...,W_l),其中列向量W_k为输出层第k个神经元对应的权值向量

好,到这里,基本上就是介绍了一些符合的意义,这里你们须要注意的是下标的含义,输入向量使用下表i表明第i个输入。隐层输出向量使用下标j表示第j个隐层输出,而输出层使用下标k表示第k个输出,还有就是这都是向量不是矩阵,只有一列为向量。

咱们再看看权值,这些权值组成的是矩阵,为何是矩阵呢?先看看输入层到隐层的权值矩阵V,其中他是nxm的即n行m列,其中列向量V_j为隐层第j个神经元对应的权向量,说明v矩阵的列向量对应着隐层的神经元,那么对应的行向量就是表明全部输入向量对隐层的权值,由于隐层的每一个神经元的输入是全部的输入向量,这里你们特别注意,隐层权值是矩阵而不是向量,如上图。同理隐层到输出层的权值也矩阵,同时你们要多留意下标表明的意义,下面开始看看他们的数学关系:

对于输出层,有:

                           o_k = f(net_k)                     k = 1,2,3,4,,,,,,l(不是i,是L的小写)                               \left ( 1 \right )

                           net_k = \sum_{j=0}^{m}w_{jk}y_j              k = 1,2,3,4,,,,,,l                                                                \left ( 2 \right )

 对于隐层,有:

                            y_j = f(net_j)                      j = 1,2,3,...,m                                                                     \left ( 3 \right )

                          net_j = \sum_{i=0}^{n}v_{ij}x_i                 j = 1,2,3,...,m                                                                      \left ( 4 \right )

上面两式的转移函数f(x)都是单极性Sigmoid函数:

                               f(x) = \frac{1}{1+e^{-x}}                                                                                                                 \left ( 5 \right )                   f(x)具备连续可导的特色,且具备:

                              f'(x) = f(x)[1-f(x)]                                                                                                     \left ( 6 \right )

这里也要多注意替换思路和下标,理解下标的意义 ,搞明白思路,下面就介绍偏差究竟是怎么反向传播的。

BP学习算法:

在推倒公式前,我先使用语言简单的描述一下BP的工做过程,这样再看推倒也不至于太突兀,内心有个思路会清晰不少。

       BP算法的基本思想是,学习过程由信号的正向传播与偏差反向传播两个过程组成。正向传播时,输入样本从输入层传入,通过各隐层逐层处理后,传向输出层。若输出层的实际输出与指望输出不符,则转入偏差的反向传播阶段。偏差反向传播是将输出偏差以某种形式经过隐层向输入层逐层反传,并将偏差分摊给各层的全部单元,从而得到各层的偏差信号,此偏差信号即做为修正单元权值的依据。这种信号正向传播与偏差反向传播的各层权值调整过程周而复始的进行,权值不断调整的过程,也就是网络学习训练的过程,此过程一直进行到网络输出的偏差减小到可接受的程度,或进行到预先设定的学习次数为止。

         你们看了是否是有点晕晕的呢,仍是不知道到底如何反向传播的,别急,咱们下面经过数学进行说明他究竟是如何进行反向传播的。

我么知道偏差E的来源就是实际输出和指望输出的差值即:

                           E = \frac{1}{2}(d-O)^2 = \frac{1}{2}\sum_{k=1}^{l}(d_k-O_k)^2                                                                                \left ( 7 \right )

根据\left ( 1 \right ),\left ( 2 \right )式将偏差E式展开到隐层为:

                           E = \frac{1}{2}\sum_{k=1}^{l}(d_k-O_k)^2 =\frac{1}{2}\sum_{k=1}^{l}(d_k - f(net_k))^2

                                                                     = \frac{1}{2}\sum_{k=1}^{l}[d_k-f(\sum_{j=0}^{m}w_{jk}y_j)]^2                                                  (8)

根据(3),(4)式将偏差E进一步展开至输入层为:

                             E= \frac{1}{2}\sum_{k=1}^{l}\left \{ \right.d_k-f[\sum_{j=0}^{m}w_{jk}f(ne)]\left. \right \}^2

                                  = \frac{1}{2}\sum_{k=1}^{l}\left \{ \right.d_k-f[\sum_{j=0}^{m}w_{jk}f(\sum_{i=0}^{n}v_{ij}x_i)]\left. \right \}^2                                                               (9)

到此咱们把偏差的表达式都带进去了,咱们发现权值w和v都在其中,只要w和v取合适的值就可使E达到最小,此时的公式即为代价函数或者损失偏差函数,那么咱们怎么求最优值呢?若是你们机器学习学的比较深刻,机会想到使用梯度降低法进行更新权值能够达到最优,那什么是梯度呢?什么又是梯度降低呢?为何梯度降低就是函数降低最快的方向呢?不懂的请看个人这篇文章,请务必深刻理解我提的问题,这里就不详细讲了,那篇文体我讲的很透彻了,这里就默认你们都深刻理解了梯度降低的概念,咱们更新权值只需按照梯度降低方向进行更新便可找到最优的权值。

    咱们知道一点的梯度就是这里的一阶偏导,所以对w和v求偏导便可:

对输出层的权值调整量:

                              \Delta w_{jk} = -\eta\frac{\partial E}{\partial w_{jk}}         j=0,1,2,....,m; k= 1,2,....,l                                          \left ( 11 \right )

对隐层的权值调整量:

                               \Delta v_{ij} = -\eta \frac{\partial E}{\partial v_{ij}}            i = 0,1,2,....,n;j=0,1,2,3,...,m                                  \left ( 12 \right )

负号表示梯度降低,\eta为学习系数,从这里能够看出BP的学习规则是\delta类型的,不懂的请看个人深度学习第一篇文章,好,到这里咱们基本知道是经过什么进行学习的,可是具体的更新过程仍是不知道,咱们下面的精力是推倒偏差对权值的偏导公式,等推倒 完之后你们也就知道,权值是如何更新的,同时也明白偏差反向传播的原理是是什么,下面开始:

推倒以前你们须要明确下标的意思:

输入层向量元素是使用x_i进行表示的,下标是i,同时下标的取值范围为:i = 0,1,2,3,...,n

隐藏层输出向量元素使用y_j进行表示,下标是j,同时下标的取值范围为:j = 1,2,3,...,m(注意,不从0开始,缘由看图)

输入层到隐藏层的权值矩阵元素使用V_{ij}表示,下标ij表明是ij列的元素,由于是矩阵,因此列对应隐藏层的神经元个数,行表明输入层的个数,因此i = 0,1,2,3,...,nj = 1,2,3,...,m

输出层的输出向量元素使用o_k表示,下标是k,同时下标的取值范围为:k = 1,2,3,...,l

隐藏层到输出层的权值矩阵元素使用w_{jk}进行表示,下标jk表明的是jk列的元素,由于是矩阵,因此列表明的是输出层神经元的个数,行表明隐藏层的神经元的个数,因此j = 0,1,2,3,...,m,k = 1,2,3,...,l

请你们必定要搞明白字母和下标表明的含义,这是深刻理解的前提,下面开始推倒公式:

对于输出层,根据\left ( 11 \right )式可得:

                                   \Delta w_{jk} =-\eta\frac{\partial E}{\partial w_{jk}}= -\eta\frac{\partial E}{\partial net_k} \frac{\partial net_k}{\partial w_{jk}}                                                                     \left ( 13 \right )

对于隐层,根据(12)式可得:

                                   \Delta v_{ij} = -\eta \frac{\partial E}{\partial v_{ij}}= -\eta\frac{\partial E}{\partial net_j} \frac{\partial net_j}{\partial v_{ij}}                                                                         \left ( 14 \right )       

为了看起来方便,咱们对输出层和隐层各定义一个偏差信号err

                                   err_k^o= -\frac{\partial E}{\partial net_k}                                                                                                           \left ( 15 \right )

                                   err_j^y= -\frac{\partial E}{\partial net_j}                                                                                                           \left ( 16 \right )

根据\left ( 2 \right )\left ( 13 \right )\left ( 15 \right )输出层权值向量的调整可写为:

                                   \Delta w_{jk} = \eta \cdot err^o_k\cdot y_j                                                                                                   \left ( 17 \right )

根据\left ( 4 \right )\left ( 14 \right )\left ( 16 \right )隐藏层权值向量的调整可写为:                        

                                   \Delta w_{ij} = \eta \cdot err^y_j\cdot x_i                                                                                                   \left ( 18 \right )

经过  \left ( 17 \right )、 \left ( 18 \right )能够看到,咱们只须要求出err就能够求出最后的权值调整量,下面就开始求解err:

对于输出层,根据\left ( 1 \right )\left ( 15\right )使用链式求导规则:

                                   err_k^o= -\frac{\partial E}{\partial net_k} = -\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial net_k} = -\frac{\partial E}{\partial o_k}f'(net_k)                                              \left ( 19 \right )

对于隐藏层,根据\left ( 3 \right )\left ( 16 \right )使用链式求导规则:

                                   err_j^y= -\frac{\partial E}{\partial net_j} =- \frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial net_j} = - \frac{\partial E}{\partial y_j}f'(net_j)                                               \left ( 20 \right )

下面就是求\left ( 19 \right )\left ( 20 \right )式中的偏导:

对于输出层,此时根据\left ( 7 \right )可得:

                                  \frac{\partial E }{\partial o_k} = -(d_k-o_k)                                                                                                      \left ( 21 \right )

对于输出层,此时根据(8)可得:

                                 \large \dpi{120} \frac{\partial E}{\partial y_j}=\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial y_j}= -\sum_{k=1}^{l}(d_k-o_k)f'(net_k)w_{jk}                                       \left ( 22 \right )

将 \left ( 21 \right )\left ( 22 \right )分别代入 \left ( 19 \right )\left ( 20 \right ),同时根据  \left ( 6 \right )式的:                                                           

                                err_k^o= -\frac{\partial E}{\partial o_k}f'(net_k) = (d_k-o_k)o_k(1-o_k)                                                         \left ( 23 \right )

                                err_j^y= - \frac{\partial E}{\partial y_j}f'(net_j)=[\sum_{k=1}^{l}(d_k-o_k)f'(net_j)w_{jk}]f'(net_j)

                                          =(\sum_{k=1}^{l} err_k^o\cdot w_{jk})y_j(1-y_j)                                                                           \left ( 24 \right )

                                                                 

根据\left ( 23 \right )\left ( 24 \right )代入权值调整公式即\left ( 17 \right )\left ( 18 \right )

                                \Delta w_{jk} = \eta \cdot err^o_k\cdot y_j=\eta \cdot (d_k-o_k)\cdot o_k\cdot (1-o_k)\cdot y_j                                       \left ( 25 \right )

                                \Delta v_{ij} = \eta \cdot err^y_j\cdot x_i=\eta \cdot \sum_{k=1}^{l} err_k^o\cdot y_j\cdot (1-y_j)\cdot x_i                                           \left ( 26 \right )

咱们就获得了三层感知器的权值调整表达式,从上式咱们能够看到输出层和隐藏层的权值调节过程,调节过程和三个因素有关即:学习率\eta,本层输出的偏差信号err以及本层的输入信号x或y,其中输出层的偏差信号与网络的指望输出和实际输出之差有关,直接反映了输出偏差,而隐层的偏差信号与前面各层的偏差信号均有关,且是从输出层反向传过来的,你们详细的看看\left ( 25 \right )\left ( 26 \right )两式,会发现输出层的权值调整是指望和真实信号的差值,乘上学习率\eta和输出层的输入信号(此时就是隐层的输出信号),对于隐藏层的权值调整不只和当前隐层的输出信号有关,还和输出层的偏差信号有关,若是是多个隐层,那么隐层的信号都会和输出层的偏差信号err有关,也就是说是经过输出层的偏差信号err反向传播到各层,对于多隐层的神经网络的偏差信号传播是否是这样呢?咱们在根据上面三层网络推倒到多隐层的网络。

            对于通常多层感知器,设有h个隐层,按照前行顺序,各隐层的节点数分别为记为m_1,m_2,...,m_h,各隐层的输出分别为计为y^1,y^2,...,y^h,各层权值矩阵分别记为w^1,w^2,...,w^h,w^{h+1},则各层的权值调整公式为:

输出层:

                                \Delta w _{jk}^{h+1} = \eta \cdot err_k^{h+1}\cdot y_j^h = \eta \cdot (d_k-o_k)\cdot o_k\cdot (1-o_k)\cdot y_j^h                        \left ( 27 \right )

                                j=0,1,2,...,m_h;          k = 0,1,2,3,...,l

第h隐层:

                                 \Delta w_{ij}^h =\eta \cdot err_j^h\cdot y_i^{h-1}= \eta \cdot (\sum_{k=1}^{l}\cdot err_k^o\cdot w_{jk}^{h+1})\cdot y_j^h\cdot (1-y_j^h)\cdot y_i^{h-1}       \left ( 28 \right )

                                   i = 0,1,2,3,...,m_{h-1};  j = 1,2,3,...,m_{h}

按照上面的规律,第一层的隐藏层的权值调整为:

                                  \Delta w _{pq}^1 = \eta err_q^1x_p = \eta (\sum_{r=1}^{m2}err_r^2w_{qr})y_q^1(1-y_q^1)x_p                                        \left ( 29 \right )

                                   p = 0,1,2,3,...,n;         j = 1,2,3,...,m_1

此时你们应该好好理解一下上式的公式,深刻理解他是怎么反向传播的,这个反向表如今哪里?在这里简单的解释一下,对于隐层,根据\left ( 28 \right )式,咱们能够看到隐层的权值更新和输出层的偏差和上一层的权值的乘积有关,这就是反向的来意,全部隐层的权值调整都和输出层的偏差有关,也就是说全部权值的调整都来源与输出层的指望值和真实值的差有关,这就是反向传播的来历,后面会使用图来解释这方面的内容,下面先把\left ( 27 \right )\left ( 28 \right )式使用向量进行表示一下:

对于输出层;

Y = (y_0,y_1,y_2,...,y_j,...,y_m)^Terr^o = (err_1^o,err_2^o,...,err_k^o,...,err_l^o)则:

                                    \Delta w = \eta (err^oY^T)^T

对于隐层:

x = (x_0,x_1,x_2,...,x_i,...,x_m)^T,err^y = (err_1^y,err_2^y,....,err_j^y,...,err_m^y)^T则:

                                     \Delta V = \eta(err^yx^T)^T

到这里公式就推倒结束了,下面详细看看他到底如何反向传播的,这里给出偏差信号流向图进行解释:

这里只画出了输出层和第一层隐藏层,是彻底按照公式 \left ( 27 \right ) 、\left ( 28 \right )来的,你们结合者这两个公式好好理解一下,反向偏差的传播也很清晰d-o一直反向调节权值,这就是反向的来源,请你们务必深刻理解,有什么疑问请留言,本节到此结束,下一节咱们看看BP有哪些性质以及优缺点,如何改进等。