为了账号安全,请及时绑定邮箱和手机立即绑定

【深度学习】反向传播算法——原理介绍与推导(最强版)

2018.12.25 16:01 5437浏览

图片描述

简言

前面一系列的手记都是围绕【机器学习】展开的,机器学习是深度学习的基石,两者有着密不可分的关系。从本章节开始,将是【深度学习】的专题博客。每一篇博客都是自己的一次思想风暴,如果你对于自己的理解有些混乱,那么不妨从我的理解角度试试。深度学习,最核心的内容就是神经网络,而对于入门而言,反向传播算法(Back Propagation Neural Networks,简称BP算法),又是绕不开的一大障碍。网络上甚多讲述BP算法的博客,但是很多都有各种各样的问nonglege 题,导致自己学习起来相当吃力,所以在行文之初,我的目标便是希望能给出一份最全面、最清晰、零错误的BP算法手记。

1.神经元模型

神经元是神经网络的基本组成单元,了解神经元的结构对了解整个神经网络大有裨益。目前神经网络采用的神经元模型为“M-P神经元模型”,该神经元模型与生物神经元模型类似,有输入端(树突)、输出端(轴突)、处理中枢(神经元中枢),模型如下所示:
图片描述

注:上图所示的“M-P神经元”模型与实际的“M-P神经元”模型有所出处,具体细节可以参考西瓜书(神经网络章节)。此处如此介绍,是为了与下文叙述保持一致,且如此理解更为简单。

上图x1,x2,⋯,xnx_1,x_2,\cdots,x_nx1,x2,,xn表示神经元的多个输入,w1,w2,⋯,wnw_1,w_2,\cdots,w_nw1,w2,,wn表示对应输入的权重参数(链接权重),神经元对输入的参数和其对应的权重进行线性组合得到z=∑i=1nwixiz=\sum_{i=1}^{n}w_ix_iz=i=1nwixi,随后将zzz作为参数传递给激活函数y=f(⋅)y=f(\cdot)y=f(),并最终得到神经元输出值yyy。其中激活函数f(⋅)f(\cdot)f()可以为多种激活函数,且激活函数均为非线性函数。

2.神经网络

神经网络,是神经元按层结合的一个神经元网络。通常我们将输入(xix_ixi)与偏置(bbb)也当做神经元处理(只是没有对应的处理函数),故我们经常见到的神经网络如下图所示:
图片描述
其中的符号定义规则如图上的规则所示。其中"+1+1+1"的神经元均为偏置项,x1,x2,x3x_1,x_2,x_3x1,x2,x3为输入项,对应于数据的三个属性。如上便为神经元的一般结构,当然,由于组合方式、神经元数量以及激活函数的多样化,导致神经网络的结构也多种多样,而此处的神经网络模型,仅限于本文。

对于神经网络模型的计算过程,主要分为两个部分:

  • 前向传播算法
  • 后向传播算法

前向传播算法,用于计算模型最终的输出结果;后向传播算法,用于减小模型输出结果与实际结果之前的误差,通过调整参数权重来优化模型。故,神经网络就是通过前向传播与后向传播算法的循环迭代,来训练模型,进而进行预测或者分类。

对于前向传播算法以及后向传播算法的介绍,我们将以如下的4层神经网络结构为例,进行介绍:
图片描述
假设输入的样本为:
x=(x1,x2,x3)T\mathbf{x}=(x_1,x_2,x_3)^Tx=(x1,x2,x3)T
有两个隐藏层,分别为Layer 2、Layer 3,且输出结果为2维数据。

2.1前向传播算法

前向传播,也即正向传播,按照输入层、隐藏层到输出层的方向进行传播,即正向计算过程。

按照图例所示,我们可知:
W(2)=[w11(2)w12(2)w13(2)w21(2)w22(2)w23(2)]W^{(2)}=\begin{bmatrix}w^{(2)}_{11}&w^{(2)}_{12}&w^{(2)}_{13} \\ w^{(2)}_{21}&w^{(2)}_{22}&w^{(2)}_{23}\\ \end{bmatrix}W(2)=[w11(2)w21(2)w12(2)w22(2)w13(2)w23(2)]
W(3)=[w11(3)w12(3)w21(3)w22(3)]W^{(3)}=\begin{bmatrix}w^{(3)}_{11}&w^{(3)}_{12} \\ w^{(3)}_{21}&w^{(3)}_{22}&\\ \end{bmatrix}W(3)=[w11(3)w21(3)w12(3)w22(3)]
b(2)=(b1(2),b2(2))Tb^{(2)}=(b^{(2)}_1,b^{(2)}_2)^Tb(2)=(b1(2),b2(2))T
b(3)=(b1(3),b2(3))Tb^{(3)}=(b^{(3)}_1,b^{(3)}_2)^Tb(3)=(b1(3),b2(3))T
如果抛开矩阵运算,但从代数运算的过程来推到,我们可以轻易的得到:
Layer 2:
z1(2)=x1w11(2)+x2w12(2)+x3w13(2)+b1(2)z_1^{(2)}=x_1w^{(2)}_{11}+x_2w^{(2)}_{12}+x_3w^{(2)}_{13}+b^{(2)}_1z1(2)=x1w11(2)+x2w12(2)+x3w13(2)+b1(2)
z2(2)=x1w21(2)+x2w22(2)+x3w23(2)+b2(2)z_2^{(2)}=x_1w^{(2)}_{21}+x_2w^{(2)}_{22}+x_3w^{(2)}_{23}+b^{(2)}_2z2(2)=x1w21(2)+x2w22(2)+x3w23(2)+b2(2)
a1(2)=f(z1(2))a_1^{(2)}=f(z_1^{(2)})a1(2)=f(z1(2))
a2(2)=f(z2(2))a_2^{(2)}=f(z_2^{(2)})a2(2)=f(z2(2))
向量化对应的计算过程如下:
(z1(2),z2(2))T=W(2)x+b(2)=[w11(2)w12(2)w13(2)w21(2)w22(2)w23(2)][x1x2x3]+[b1(2)b2(2)]=[x1w11(2)+x2w12(2)+x3w13(2)+b1(2)x1w21(2)+x2w22(2)+x3w23(2)+b2(2)]\begin{aligned}(z_1^{(2)},z_2^{(2)})^T&=W^{(2)}\mathbf{x}+b^{(2)}\\ &= \begin{bmatrix}w^{(2)}_{11}&w^{(2)}_{12}&w^{(2)}_{13} \\ w^{(2)}_{21}&w^{(2)}_{22}&w^{(2)}_{23} \end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}+\begin{bmatrix}b^{(2)}_1\\b^{(2)}_2\end{bmatrix} \\ &=\begin{bmatrix} x_1w^{(2)}_{11}+x_2w^{(2)}_{12}+x_3w^{(2)}_{13}+b^{(2)}_1\\ x_1w^{(2)}_{21}+x_2w^{(2)}_{22}+x_3w^{(2)}_{23}+b^{(2)}_2 \end{bmatrix} \end{aligned}(z1(2),z2(2))T=W(2)x+b(2)=[w11(2)w21(2)w12(2)w22(2)w13(2)w23(2)]x1x2x3+[b1(2)b2(2)]=[x1w11(2)+x2w12(2)+x3w13(2)+b1(2)x1w21(2)+x2w22(2)+x3w23(2)+b2(2)]
a(2)=(f(z1(2)),f(z2(2)))Ta^{(2)}=(f(z_1^{(2)}),f(z_2^{(2)}))^Ta(2)=(f(z1(2)),f(z2(2)))T
Layer 3:
z1(3)=a1(2)w11(3)+a2(2)w12(3)+b1(3)z_1^{(3)}=a_1^{(2)}w^{(3)}_{11}+a_2^{(2)}w^{(3)}_{12}+b^{(3)}_1z1(3)=a1(2)w11(3)+a2(2)w12(3)+b1(3)
z2(3)=a1(2)w21(3)+a2(2)w22(3)+b2(3)z_2^{(3)}=a_1^{(2)}w^{(3)}_{21}+a_2^{(2)}w^{(3)}_{22}+b^{(3)}_2z2(3)=a1(2)w21(3)+a2(2)w22(3)+b2(3)
a1(3)=f(z1(3))a_1^{(3)}=f(z_1^{(3)})a1(3)=f(z1(3))
a2(3)=f(z2(3))a_2^{(3)}=f(z_2^{(3)})a2(3)=f(z2(3))
向量化对应的计算过程如下:
(z1(3),z2(3))T=W(3)a(2)=[w11(3)w12(3)w21(3)w22(3)][a1(2)a2(2)]+[b1(3)b2(3)]=[a1(2)w11(3)+a2(2)w12(3)+b1(3)a1(2)w21(3)+a2(2)w22(3)+b2(3)]\begin{aligned}(z_1^{(3)},z_2^{(3)})^T&=W^{(3)}a^{(2)}\\ &=\begin{bmatrix}w^{(3)}_{11}&w^{(3)}_{12} \\ w^{(3)}_{21}&w^{(3)}_{22}&\\ \end{bmatrix}\begin{bmatrix}a^{(2)}_1\\a^{(2)}_2\end{bmatrix}+\begin{bmatrix}b^{(3)}_1\\b^{(3)}_2\end{bmatrix}\\ &=\begin{bmatrix} a_1^{(2)}w^{(3)}_{11}+a_2^{(2)}w^{(3)}_{12}+b^{(3)}_1\\ a_1^{(2)}w^{(3)}_{21}+a_2^{(2)}w^{(3)}_{22}+b^{(3)}_2 \end{bmatrix} \end{aligned}(z1(3),z2(3))T=W(3)a(2)=[w11(3)w21(3)w12(3)w22(3)][a1(2)a2(2)]+[b1(3)b2(3)]=[a1(2)w11(3)+a2(2)w12(3)+b1(3)a1(2)w21(3)+a2(2)w22(3)+b2(3)]
a(3)=(f(z1(3)),f(z2(3)))Ta^{(3)}=(f(z_1^{(3)}),f(z_2^{(3)}))^Ta(3)=(f(z1(3)),f(z2(3)))T
Layer 4:
z1(4)=a1(3)w11(4)+a2(3)w12(4)+b1(4)z_1^{(4)}=a_1^{(3)}w^{(4)}_{11}+a_2^{(3)}w^{(4)}_{12}+b^{(4)}_1z1(4)=a1(3)w11(4)+a2(3)w12(4)+b1(4)
z2(4)=a1(3)w21(4)+a2(3)w22(4)+b2(4)z_2^{(4)}=a_1^{(3)}w^{(4)}_{21}+a_2^{(3)}w^{(4)}_{22}+b^{(4)}_2z2(4)=a1(3)w21(4)+a2(3)w22(4)+b2(4)
a1(4)=f(z1(4))a_1^{(4)}=f(z_1^{(4)})a1(4)=f(z1(4))
a2(4)=f(z2(4))a_2^{(4)}=f(z_2^{(4)})a2(4)=f(z2(4))
向量化对应的计算过程如下:
(z1(4),z2(4))T=W(4)a(3)=[w11(4)w12(4)w21(4)w22(4)][a1(3)a2(3)]+[b1(4)b2(4)]=[a1(3)w11(4)+a2(3)w12(4)+b1(4)a1(3)w21(4)+a2(3)w22(4)+b2(4)]\begin{aligned}(z_1^{(4)},z_2^{(4)})^T&=W^{(4)}a^{(3)}\\ &=\begin{bmatrix}w^{(4)}_{11}&w^{(4)}_{12} \\ w^{(4)}_{21}&w^{(4)}_{22}&\\ \end{bmatrix}\begin{bmatrix}a^{(3)}_1\\a^{(3)}_2\end{bmatrix}+\begin{bmatrix}b^{(4)}_1\\b^{(4)}_2\end{bmatrix}\\ &=\begin{bmatrix} a_1^{(3)}w^{(4)}_{11}+a_2^{(3)}w^{(4)}_{12}+b^{(4)}_1\\ a_1^{(3)}w^{(4)}_{21}+a_2^{(3)}w^{(4)}_{22}+b^{(4)}_2 \end{bmatrix} \end{aligned}(z1(4),z2(4))T=W(4)a(3)=[w11(4)w21(4)w12(4)w22(4)][a1(3)a2(3)]+[b1(4)b2(4)]=[a1(3)w11(4)+a2(3)w12(4)+b1(4)a1(3)w21(4)+a2(3)w22(4)+b2(4)]
a(4)=(f(z1(4)),f(z2(4)))Ta^{(4)}=(f(z_1^{(4)}),f(z_2^{(4)}))^Ta(4)=(f(z1(4)),f(z2(4)))T
我们将输入层的xix_ixi看做ai(1)a^{(1)}_iai(1),则可总结出以下结论:
l(2≤l≤L)l(2\leq l \leq L)l(2lL)层神经元的状态及激活值为:
z(l)=W(l)a(l−1)+b(l)z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}z(l)=W(l)a(l1)+b(l)
a(l)=f(z(l))a^{(l)}=f(z^{(l)})a(l)=f(z(l))
故前向传播算法的过程介绍完毕,即从输入一步一步的到达输出的传播过程。

2.2反向传播算法

反向传播算法,其实和线性回归的思想是一样的,通过梯度下降的方法,逐渐调节参数,进而训练模型。所以此部分内容主要围绕梯度下降和误差反向传播来讲。关于梯度下降的具体细节,可以参考前面机器学习章节的线性回归内容。由于中间篇幅较长,为了便于阅读,再次将神经网络模型展示如下:
图片描述
假设训练集样本为:
T={(x(1),y(1)),(x(2),y(2)),⋯,(x(N),y(N))}T=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(N)},y^{(N)})\}T={(x(1),y(1)),(x(2),y(2)),,(x(N),y(N))}
其中对应于上面的神经网络模型,则有:
x(i)={x1(i),x2(i),x3(i)}x^{(i)}=\{x^{(i)}_1,x^{(i)}_2,x^{(i)}_3\}x(i)={x1(i),x2(i),x3(i)}
y(i)={y1(i),y2(i)}y^{(i)}=\{y^{(i)}_1,y^{(i)}_2\}y(i)={y1(i),y2(i)}
要对模型进行优化,则必须要有能够优化的函数。假设对于任一训练样本(x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i)),引入损失函数为:
E(i)=12∣∣y(i)−o(i)∣∣=12∑k=1nL(yk(i)−ok(i))2E_{(i)}=\frac{1}{2}||y^{(i)}-o^{(i)}||=\frac{1}{2}\sum^{n_L}_{k=1}(y_k^{(i)}-o_k^{(i)})^2E(i)=21y(i)o(i)=21k=1nL(yk(i)ok(i))2
其中nLn_LnL表示输入数据的维数,对于此处的模型而言nL=3n_L=3nL=3y(i)y^{(i)}y(i)代表样本的真实LabelLabelLabelo(i)o^{(i)}o(i)表示神经网络的输出结果。通过观察公式,我们不难发现,前面的系数12\frac{1}{2}21可有可无。此处加入该系数,只是为了后续计算(求导)方便。
根据损失函数,则整个神经网络的代价函数为:
E(i)=12(y1(i)−a1(4))2+12(y2(i)−a2(4))=12(y1(i)−f(a1(3)w11(4)+a2(3)w12(4)+b1(4)))+12(y2(i)−f(a1(3)w21(4)+a2(3)w22(4)+b2(4))\begin{aligned}E_{(i)}&=\frac{1}{2}(y^{(i)}_1-a_1^{(4)})^2+\frac{1}{2}(y_2^{(i)}-a_2^{(4)})\\ &=\frac{1}{2}\left(y^{(i)}_1-f(a_1^{(3)}w^{(4)}_{11}+a_2^{(3)}w^{(4)}_{12}+b^{(4)}_1)\right)+\frac{1}{2}\left(y^{(i)}_2-f(a_1^{(3)}w^{(4)}_{21}+a_2^{(3)}w^{(4)}_{22}+b^{(4)}_2\right) \end{aligned}E(i)=21(y1(i)a1(4))2+21(y2(i)a2(4))=21(y1(i)f(a1(3)w11(4)+a2(3)w12(4)+b1(4)))+21(y2(i)f(a1(3)w21(4)+a2(3)w22(4)+b2(4))
我们还可以进一步的展开,消去a1(3),a2(3)a^{(3)}_1,a^{(3)}_2a1(3),a2(3),直至公式中只含有权重参数、偏置参数、输入等。故通过反向传播,调整权重矩阵W(l)W^{(l)}W(l)和偏置向量b(l)b^{(l)}b(l)能够达到降低损失函数的目的。

算法推导
所有训练数据的总体(平均)代价可写成:
Etotal=1N∑i=1NE(i)E_{total}=\frac{1}{N}\sum_{i=1}^NE_{(i)}Etotal=N1i=1NE(i)
当然我们的目标也是:调整权重和偏置试整体代价(误差)最小
如果采用梯度下降法(或批量梯度下降法),即:
W(l)=W(l)−μ∂Etotal∂W(l)=W(l)−μN∑i−1N∂E(i)∂W(l)\begin{aligned}W^{(l)}&=W^{(l)}-\mu \frac{\partial E_{total}}{\partial W^{(l)}}\\ &=W^{(l)}-\frac{\mu}{N}\sum_{i-1}^N\frac{\partial E_{(i)}}{\partial W^{(l)}} \end{aligned}W(l)=W(l)μW(l)Etotal=W(l)Nμi1NW(l)E(i)
b(l)=b(l)−μ∂Etotal∂b(l)=b(l)−μN∑i−1N∂E(i)∂b(l)\begin{aligned}b^{(l)}&=b^{(l)}-\mu \frac{\partial E_{total}}{\partial b^{(l)}}\\ &=b^{(l)}-\frac{\mu}{N}\sum_{i-1}^N\frac{\partial E_{(i)}}{\partial b^{(l)}} \end{aligned}b(l)=b(l)μb(l)Etotal=b(l)Nμi1Nb(l)E(i)
去更新参数W(l),b(l)W^{(l)},b^{(l)}W(l),b(l)。由上面公式可知,秩序求得每个训练数据的代价函数E(i)E_{(i)}E(i)对参数的偏导数∂E(i)∂W(l),∂E(i)∂b(l)\frac{\partial E_{(i)}}{\partial W^{(l)}},\frac{\partial E_{(i)}}{\partial b^{(l)}}W(l)E(i),b(l)E(i),即可进行参数的迭代更新。

我们以单个训练样本(x,y)(\mathbf{x},y)(x,y)为例,神经网络依然采用本文涉及的神经网络进行介绍,假设:
x=(x1,x2,x3)Ty=(y1,y2)T\mathbf{x}=(x_1,x_2,x_3)^T \qquad \qquad \mathbf{y}=(y_1,y_2)^Tx=(x1,x2,x3)Ty=(y1,y2)T
逐层更新神经网络的权重参数W(l)W^{(l)}W(l)
首先更新输出层Layer 4权重参数,其损失函数表示为:
E=12∣∣y−o∣∣=12((y1−a1(4))2+(y2−a2(4))2)=12((y1−f(z1(4)))2+(y2−f(z2(4)))2)=12((y1−f(a1(3)w11(4)+a2(3)w12(4)+b1(4)))2+(y2−f(a1(3)w21(4)+a2(3)w22(4)+b2(4)))2)\begin{aligned}E&=\frac{1}{2}||y-o|| \\ &=\frac{1}{2}\left((y_1-a^{(4)}_1)^2+(y_2-a^{(4)}_2)^2\right)\\ &=\frac{1}{2}\left( (y_1-f(z^{(4)}_1))^2+(y_2-f(z^{(4)}_2))^2 \right)\\ &=\frac{1}{2}\left( (y_1-f(a_1^{(3)}w^{(4)}_{11}+a_2^{(3)}w^{(4)}_{12}+b^{(4)}_1))^2+(y_2-f(a_1^{(3)}w^{(4)}_{21}+a_2^{(3)}w^{(4)}_{22}+b^{(4)}_2))^2 \right) \end{aligned}E=21yo=21((y1a1(4))2+(y2a2(4))2)=21((y1f(z1(4)))2+(y2f(z2(4)))2)=21(