【1】深度神经网络的前向/反向传播算法

文章目录

    • 1.感知机
      • 1.1 基本介绍
      • 1.2 感知机模型
      • 1.3 逻辑回归
      • 1.4 感知机到神经网络的演化
    • 2.深度神经网络DNN
      • 2.1 基本概念
      • 2.2 符号定义
      • 2.3 DNN的前向传播算法
      • 2.4 前向传播算法小结
      • 2.5 DNN反向传播算法的基本思路
      • 2.6 符号定义(重要!!!)
      • 2.7 反向传播的四个基本等式
      • 2.8 反向传播算法整体描述
    • 参考资料

1.感知机

1.1 基本介绍

        神经网络的发展,最早可以追溯到感知机模型,我们不妨理解为当前的神经网络模型,都是从感知机进化而来的,因此,在正式学习神经网络之前,认识一下它的“祖先”还是很有必要的。
                       【1】深度神经网络的前向/反向传播算法_第1张图片
        上图就是对感知机的完整诠释,这个名字有点误导,因为它根本上就是做决策用的。

       举个例子:
       你正在考虑今天要不要出去看电影,你主要考虑的有三个因素p1 、p2和p3。其中p1是你女朋友想不想去,p2是电影好不好看,p3是今天工作多不多,每一个因素对应于一个权重wi,有的人看重女朋友,有的人看重电影的质量…
       你把每一项pi和对应的wi相乘,然后累加求和得到一个结果,如果这个值大于设定的阈值,那么你就决定去看电影,如果小于等于设定的阈值,那么就不去看,这就是感知机做决策的例子。

1.2 感知机模型

        根据上面的叙述,我们大概知道,感知机的决策过程主要分两步,一是计算输入乘以权重的累加和,二是判断累加和与阈值之间的大小关系。我们可以把两个步骤合并在一起,把阈值b与累加和相加,再用 s i g n ( x ) sign(x) sign(x)函数得到输入结果。
        我们先计算累加和与bias项的和: z = ∑ i = 1 m w i x i + b z=\sum_{i=1}^{m} w_{i} x_{i}+b z=i=1mwixi+b        得到中间结果 z z z之后,我们可以再用激活函数 s i g n ( x ) sign(x) sign(x),得到最终的决策值:
sign ⁡ ( z ) = { − 1 z < 0 1 z ≥ 0 \operatorname{sign}(z)=\left\{\begin{array}{ll}{-1} & {z<0} \\ {1} & {z \geq 0}\end{array}\right. sign(z)={11z<0z0

1.3 逻辑回归

        不知道大家有没有和我一样的感受,看了感知机的原理之后,就想到了逻辑回归模型,因为二者的相似处实在太多,想想逻辑回归也是计算特征值的加权和,然后喂给了 S i g m o i d Sigmoid Sigmoid激活函数,得到最终的输出结果。

        从函数的判别模型角度来看,感知机和逻辑回归还是挺相似的,那么逻辑回归模型,是否也可以像感知机一样,理解为只含有一个神经元的神经网络模型呢?同理,由LogisicRegression拓展到多分类任务的SoftmaxRegression,是否也是一种特殊的神经网络呢?

        这个只是我目前的学习思考,之后学习的更深之后,再来解答此问题,不容否认的是,逻辑回归和神经网络之间一定是有着某种特别的联系的。

1.4 感知机到神经网络的演化

        上述的感知机模型,只能用于线性的二分类任务,无法用于复杂的非线性多分类任务,于是在此基础上进行一些扩展,得到了现在我们熟知的神经网络,主要有三点扩展:

  1. 增加了隐藏层,提升了模型的表达能力,隐藏层的层数以及每层神经元的个数需要自己设计,代价是增加了模型的复杂程度,计算量增加;
  2. 增加了输出层的神经元个数,有1个变为多个,带来的好处是可用于多分类任务、或其他机器学习领域如降维和聚类
  3. 增加了激活函数的种类,感知机的激活函数是 s i g n ( z ) sign(z) sign(z),虽然简单但是能力有限,常用的激活函数有 S i g m o i d 、 R e L U 、 t a n h 和 s o f t m a x Sigmoid、ReLU、tanh和softmax SigmoidReLUtanhsoftmax等,这里有详细介绍不同激活函数的区别和优缺点。

2.深度神经网络DNN

2.1 基本概念

        深度神经网络,也被叫做多层神经网络,偶尔也会被叫做多层感知机模型(Multi-Layer perceptron , MLP),我们只需要知道它们指的都是同一个东西即可,这里我们统称为DNN.

        深度神经网络的架构图如下:
                【1】深度神经网络的前向/反向传播算法_第2张图片
        层与层之间是全连接的,即第(l-1)层的任意一个神经元一定与第l层的任意一个神经元相连接。DNN的结构看起来是很复杂,但是我们单独抽出某一个神经元以及它上一层中的所有神经元,就会发现它其实就是和感知机(还是说逻辑回归?)一样,首先是计算加权和,再加上偏置项b,最终将这个未激活值送到激活函数σ进行激活。

2.2 符号定义

         w 42 3 : w_{42}^3: w423: 表示第(3-1)层的第2个神经元到第3层的第4个神经元之间的连接的权重;

         z 4 3 : z_4^3: z43:   表示第3层的第4个神经元的未经激活函数激活之前的值,其中 z 4 3 = w 41 3 ⋅ a 1 2 + w 42 3 ⋅ a 2 2 + w 43 3 ⋅ a 3 2 + b 4 3 z_{4}^{3}=w_{41}^{3} \cdot a_{1}^{2}+w_{42}^{3} \cdot a_{2}^{2}+w_{43}^{3} \cdot a_{3}^{2}+b_{4}^{3} z43=w413a12+w423a22+w433a32+b43         a 3 4 : a_3^4: a34:   表示第3层的第4个神经元的激活值(输出值),其中
a 4 3 = σ ( z 4 3 ) a_{4}^{3}=\sigma\left(z_{4}^{3}\right) a43=σ(z43)         b 4 3 : b_{4}^{3}: b43:   表示第3层的第4个神经元所对应的偏置项,注意哦,每一层的每一个神经元都对应着一个b,我们把每一个神经元看成是一个感知机模型,所以每个模型对应的bias项是不一样的;

引申一个问题为什么要在未激活值的计算中加上bias项呢?这里引用知乎上的回答。

回答一:我们可以把问题先简化,为什么线性模型要加 bias?答案很简单,不加 bias 你的分类线(面)就必须过原点,这显然是不灵活的。有了bias我们就可以上下左右移动我们的线了,神经网络是一样的道理。

回答二:Bias的好处在于:可以使得神经网络Fit的范围得到左右的调整。
         【1】深度神经网络的前向/反向传播算法_第3张图片       
       没有bias项时,我们用不同的w来拟合数据,w越大,sigmoid函数越陡峭,分类效果越好!!可观察上图。但是如果要判断图中绿色点的类别呢?按照sigmoid函数的输出,绿色点的激活值小于0.5,应该判为蓝色类,这个时候,让sigmoid函数变得更陡也没办法解决了。
       这个时候,如果加入一个bias项呢?我们观察函数图像:
         【1】深度神经网络的前向/反向传播算法_第4张图片
       w系数不需要学的很大,就可以提高学习的准确率,网络就能够非常灵活的拟合样本点的分布,并准确判断绿点所属的集合。
       简单来说,加上bias项能够更加灵活的fit数据样本点的分布!

2.3 DNN的前向传播算法

        假设一个神经网络共有三层,第一层(输入层)共有三个神经元x1,x2,x3,第二层也是有三个神经元,第三层为输出层,只有1个神经元。如下图所示:
                        【1】深度神经网络的前向/反向传播算法_第5张图片
        那么第二层的三个神经元的输出分别为: a 1 2 = σ ( z 1 2 ) = σ ( w 11 2 x 1 + w 12 2 x 2 + w 13 2 x 3 + b 1 2 ) a 2 2 = σ ( z 2 2 ) = σ ( w 21 2 x 1 + w 22 2 x 2 + w 23 2 x 3 + b 2 2 ) a 3 2 = σ ( z 3 2 ) = σ ( w 31 2 x 1 + w 32 2 x 2 + w 33 2 x 3 + b 3 2 ) \begin{aligned} a_{1}^{2} &=\sigma\left(z_{1}^{2}\right)=\sigma\left(w_{11}^{2} x_{1}+w_{12}^{2} x_{2}+w_{13}^{2} x_{3}+b_{1}^{2}\right) \\\\ a_{2}^{2} &=\sigma\left(z_{2}^{2}\right)=\sigma\left(w_{21}^{2} x_{1}+w_{22}^{2} x_{2}+w_{23}^{2} x_{3}+b_{2}^{2}\right) \\\\ a_{3}^{2} &=\sigma\left(z_{3}^{2}\right)=\sigma\left(w_{31}^{2} x_{1}+w_{32}^{2} x_{2}+w_{33}^{2} x_{3}+b_{3}^{2}\right) \end{aligned} a12a22a32=σ(z12)=σ(w112x1+w122x2+w132x3+b12)=σ(z22)=σ(w212x1+w222x2+w232x3+b22)=σ(z32)=σ(w312x1+w322x2+w332x3+b32)        第三层的神经元输出为: a 1 3 = σ ( z 1 3 ) = σ ( w 11 3 a 1 2 + w 12 3 a 2 2 + w 13 3 a 3 2 + b 1 3 ) a_{1}^{3}=\sigma\left(z_{1}^{3}\right)=\sigma\left(w_{11}^{3} a_{1}^{2}+w_{12}^{3} a_{2}^{2}+w_{13}^{3} a_{3}^{2}+b_{1}^{3}\right) a13=σ(z13)=σ(w113a12+w123a22+w133a32+b13)        将上述例子一般化,假设第 ( l − 1 ) (l-1) (l1)层共有m个神经元,那么对于第l层的第j个神经元的输出值 a j l a_j^l ajl为: a j l = σ ( z j l ) = σ ( ∑ k = 1 m w j k l a k l − 1 + b j l ) a_j^l = \sigma(z_j^l) = \sigma(\sum\limits_{k=1}^mw_{jk}^la_k^{l-1} + b_j^l) ajl=σ(zjl)=σ(k=1mwjklakl1+bjl)

矩阵法表示】上面这个式子,给出了单个神经元的输出值用代数法如何计算,我们下面来推导更加简洁的矩阵法表示.(最终结果如下:)
a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right) al=σ(zl)=σ(Wlal1+bl)        假设第 ( l − 1 ) (l-1) (l1)层共有m个神经元,而第 l l l层共有n个神经元,则第l层的权重系数w组成了一个n×m的矩阵 W l W^l Wl: ( w 11 l w 12 l … w 1 m l w 21 l w 22 l … w 2 m l . . . . . . … . . . w n 1 l w n 2 l … w n m l ) \left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1m}^{l}} \\ \\{w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2m}^{l}}\\\\{...} & {...} & {\dots} & {...} \\\\ {w_{n1}^{l}} & {w_{n2}^{l}} & {\dots} & {w_{nm}^{l}}\end{array}\right) w11lw21l...wn1lw12lw22l...wn2lw1mlw2ml...wnml        第 ( l − 1 ) (l-1) (l1)层的输出 a a a组成了一个m×1的向量 a l − 1 a^{l-1} al1 ( a 1 l − 1 a 2 l − 1 . . . a m l − 1 ) \left( \begin{array}{llll}{a_{1}^{l-1}}\\ \\{a_{2}^{l-1}}\\\\{...}\\\\ {a_{m}^{l-1}}\end{array}\right) a1l1a2l1...aml1        第 l l l层的偏置向量 b b b组成了一个n×1的向量 b l b^{l} bl ( b 1 l b 2 l . . . b n l ) \left( \begin{array}{llll}{b_{1}^{l}}\\ \\{b_{2}^{l}}\\\\{...}\\\\ {b_{n}^{l}}\end{array}\right) b1lb2l...bnl        整个过程可以用矩阵和向量进行表示:
( a 1 l a 2 l . . . a n l ) = σ ( ( w 11 l w 12 l … w 1 m l w 21 l w 22 l … w 2 m l . . . . . . … . . . w n 1 l w n 2 l … w n m l ) ( a 1 l − 1 a 2 l − 1 . . . a m l − 1 ) + ( b 1 l b 2 l . . . b n l ) ) \left( \begin{array}{llll}{a_{1}^{l}}\\ \\{a_{2}^{l}}\\\\{...}\\\\ {a_{n}^{l}}\end{array}\right) = \sigma\left(\left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1m}^{l}} \\ {w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2m}^{l}}\\{...} & {...} & {\dots} & {...} \\ {w_{n1}^{l}} & {w_{n2}^{l}} & {\dots} & {w_{nm}^{l}}\end{array}\right)\left( \begin{array}{llll}{a_{1}^{l-1}}\\ \\{a_{2}^{l-1}}\\\\{...}\\\\ {a_{m}^{l-1}}\end{array}\right)+\left( \begin{array}{llll}{b_{1}^{l}}\\ \\{b_{2}^{l}}\\\\{...}\\\\ {b_{n}^{l}}\end{array}\right)\right) a1la2l...anl=σw11lw21l...wn1lw12lw22l...wn2lw1mlw2ml...wnmla1l1a2l1...aml1+b1lb2l...bnl        用矩阵的形式表达,即为:
a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right) al=σ(zl)=σ(Wlal1+bl)

2.4 前向传播算法小结

        DNN的前向传播算法也就是利用我们的若干个权重系数矩阵 W W W,偏置向量 b b b来和输入值向量 x x x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为止。

2.5 DNN反向传播算法的基本思路

        首先我们要明白反向传播算法的定义:

对DNN的损失函数用梯度下降法进行迭代优化求极小值的过程即为我们的反向传播算法。

(此处之后的内容为 2019/6/25 更新 )

2.6 符号定义(重要!!!)

  为了使数学推导过程更加清晰简洁,我们定义符号表达如下:

  • L L L  ——— 神经网络的总层数
  • n l n^l nl ——— 第 l l l层神经元的总个数
  • w j k l w_{jk}^{l} wjkl ——— 第 l − 1 l-1 l1层的第 k k k个神经元到第 l l l层的第 j j j个神经元的连接权重
  • b j l b_j^l bjl ——— 第 l l l层的第 j j j个神经元的截距项 b i a s bias bias
  • W l W^l Wl ——— 第 l l l层神经元的权重系数矩阵(由 w j k l w_{jk}^{l} wjkl构成的矩阵)
  • b l b^l bl ——— 第 l l l层神经元的截距向量(由 b j l b_j^l bjl构成的向量)
  • z j l z_j^l zjl ——— 第 l l l层第 j j j个神经元的加权输入
  • z l z^l zl ——— 第 l l l层神经元的加权输入向量(由 z j l z_j^l zjl构成的向量)
  • a j l a_j^l ajl ——— 第 l l l层第 j j j个神经元的激活函数输出值
  • a l a^l al ——— 第 l l l层神经元的激活函数输出向量(由 a j l a_j^l ajl构成的向量)
  • C C C ——— 损失函数, C = 1 n ∑ x C x C=\frac{1}{n} \sum_{x} C_{x} C=n1xCx,其中 C x C_x Cx是每个独立训练样本的损失函数,反向传播针对单个训练数据计算偏导数用 ∂ C x ∂ w \frac{\partial C_{x}}{\partial w} wCx ∂ C x ∂ b \frac{\partial C_{x}}{\partial b} bCx,针对n个样本数据,计算偏导数,则用 ∂ C ∂ w \frac{\partial C}{\partial w} wC ∂ C ∂ b \frac{\partial C}{\partial b} bC
  • s ⊙ t s\odot t st ——— Hadamard积,表示两个维度相同的向量的对应元素(element-wise)相乘,例如:
    s ⊙ t = [ 1 2 ] ⊙ [ 3 4 ] = [ 1 × 3 2 × 4 ] = [ 3 8 ] s \odot t=\left[\begin{array}{l}{1} \\ {2}\end{array}\right] \odot\left[\begin{array}{l}{3} \\ {4}\end{array}\right]=\left[\begin{array}{ll}{1 \times 3} \\ {2 \times 4}\end{array}\right]=\left[\begin{array}{l}{3} \\ {8}\end{array}\right] st=[12][34]=[1×32×4]=[38]

  根据神经网络的前向传播,有:

  对于 l = 1 l=1 l=1,即输入层,有:
z 1 = a 1 = x z^1 = a^1=x z1=a1=x

  对于 l = 2 , 3 , 4 , . . . , L l=2,3,4,...,L l=2,3,4,...,L,有:
z j l = ∑ k = 1 k = n l − 1 w j k l a k l − 1 + b j l z_{j}^{l}=\sum_{k=1}^{k=n^{l-1}} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l} zjl=k=1k=nl1wjklakl1+bjl

a j l = σ ( z j l )                                      a_{j}^{l}=\sigma\left(z_{j}^{l}\right)\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; ajl=σ(zjl)
  向量化表达为:
z l = w l a l − 1 + b l a l = σ ( z l ) \begin{aligned} z^{l} &=w^{l} a^{l-1}+b^{l} \\\\ a^{l} &=\sigma\left(z^{l}\right)\end{aligned} zlal=wlal1+bl=σ(zl)

  详细的矩阵表达为:
( a 1 l a 2 l . . . a n l ) = σ ( ( w 11 l w 12 l … w 1 m l w 21 l w 22 l … w 2 m l . . . . . . … . . . w n 1 l w n 2 l … w n m l ) ( a 1 l − 1 a 2 l − 1 . . . a m l − 1 ) + ( b 1 l b 2 l . . . b n l ) ) \left( \begin{array}{llll}{a_{1}^{l}}\\ \\{a_{2}^{l}}\\\\{...}\\\\ {a_{n}^{l}}\end{array}\right) = \sigma\left(\left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1m}^{l}} \\ {w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2m}^{l}}\\{...} & {...} & {\dots} & {...} \\ {w_{n1}^{l}} & {w_{n2}^{l}} & {\dots} & {w_{nm}^{l}}\end{array}\right)\left( \begin{array}{llll}{a_{1}^{l-1}}\\ \\{a_{2}^{l-1}}\\\\{...}\\\\ {a_{m}^{l-1}}\end{array}\right)+\left( \begin{array}{llll}{b_{1}^{l}}\\ \\{b_{2}^{l}}\\\\{...}\\\\ {b_{n}^{l}}\end{array}\right)\right) a1la2l...anl=σw11lw21l...wn1lw12lw22l...wn2lw1mlw2ml...wnmla1l1a2l1...aml1+b1lb2l...bnl

2.7 反向传播的四个基本等式

【1】深度神经网络的前向/反向传播算法_第6张图片
  • ( 1 )    δ L = ∂ C ∂ z L = ∇ a C ⊙ σ ′ ( z L ) (1) \;\delta^{L}=\frac{\partial C}{\partial z^L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right) (1)δL=zLC=aCσ(zL)

证明:
   取输出层的某一个神经元 a j L a_j^L ajL为例,根据链式法则:
δ j L = ∂ C ∂ z j L = ∂ C ∂ a j L ⋅ ∂ a j L ∂ z j L \delta_{j}^{L}=\frac{\partial C}{\partial z_{j}^{L}}=\frac{\partial C}{\partial a_{j}^{L}} \cdot\frac{\partial a_{j}^{L}}{\partial z_{j}^{L}} δjL=zjLC=ajLCzjLajL

   取 σ ′ ( z j L ) = ∂ a j L ∂ z j L \sigma^{\prime}\left(z_{j}^{L}\right)=\frac{\partial a_{j}^{L}}{\partial z_{j}^{L}} σ(zjL)=zjLajL,可以得到:
δ j L = ∂ C ∂ a j L σ ′ ( z j L ) \delta_{j}^{L}=\frac{\partial C}{\partial a_{j}^{L}} \sigma^{\prime}\left(z_{j}^{L}\right) δjL=ajLCσ(zjL)
   如果把输出层的所有神经元写成向量的形式,将 [ ∂ C ∂ a 1 L , ∂ C ∂ a 2 L , … , ∂ C ∂ a m L ] T \left[\frac{\partial C}{\partial a_{1}^{L}}, \frac{\partial C}{\partial a_{2}^{L}}, \ldots, \frac{\partial C}{\partial a_{m}^{L}}\right]^{T} [a1LC,a2LC,,amLC]T记为 ∇ a C \nabla_{a} C aC,将 [ σ ′ ( z 1 L ) , σ ′ ( z 1 L ) , … , σ ′ ( z m L ) ] T [\sigma^{\prime}(z_1^L),\sigma^{\prime}(z_1^L),\ldots,\sigma^{\prime}(z_m^L)]^T [σ(z1L),σ(z1L),,σ(zmL)]T记为 σ ′ ( z j L ) \sigma^{\prime}\left(z_{j}^{L}\right) σ(zjL),即可得到:

δ L = ∂ C ∂ z L = ∇ a C ⊙ σ ′ ( z L ) \delta^{L}=\frac{\partial C}{\partial z^L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right) δL=zLC=aCσ(zL)

  • ( 2 )    δ l = ( ( w l + 1 ) T δ l + 1 ) ⊙ σ ′ ( z l ) (2)\;\delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right) (2)δl=((wl+1)Tδl+1)σ(zl)

证明:
   反向传播是从后往前计算的,因此我们在求解 δ l \delta^l δl的时候, δ l + 1 \delta ^{l+1} δl+1是作为已知量看待。于是根据链式法则可得:
δ j l = ∂ C ∂ z j l = ∑ k = 1 n l + 1 ∂ C ∂ z k l + 1 ∂ z k l + 1 ∂ z j l = ∑ k = 1 n l + 1 ∂ z k l + 1 ∂ z j l δ k l + 1 \begin{aligned} \delta_{j}^{l} &=\frac{\partial C}{\partial z_{j}^{l}} \\ &=\sum_{k=1}^{n^{l+1}} \frac{\partial C}{\partial z_{k}^{l+1}} \frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}} \\ &=\sum_{k=1}^{n^{l+1}} \frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}} \delta_{k}^{l+1} \end{aligned} δjl=zjlC=k=1nl+1zkl+1Czjlzkl+1=k=1nl+1zjlzkl+1δkl+1

   如下图所示,其中 n l + 1 n^{l+1} nl+1指的是 l + 1 l+1 l+1层神经元的个数。

【1】深度神经网络的前向/反向传播算法_第7张图片

   另外,我们将 z k l + 1 z_k^{l+1} zkl+1展开可得:
z k l + 1 = ∑ j n l w k j l + 1 a j l + b k l + 1 = ∑ j n l w k j l + 1 σ ( z j l ) + b k l + 1 z_{k}^{l+1}=\sum_{j}^{n^l} w_{k j}^{l+1} a_{j}^{l}+b_{k}^{l+1}=\sum_{j}^{n^l} w_{k j}^{l+1} \sigma\left(z_{j}^{l}\right)+b_{k}^{l+1} zkl+1=jnlwkjl+1ajl+bkl+1=jnlwkjl+1σ(zjl)+bkl+1

   于是,计算 ∂ z k l + 1 ∂ z j l \frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}} zjlzkl+1的值为:
∂ z k l + 1 ∂ z j l = w k j l + 1 ⋅ σ ′ ( z j l ) \frac{\partial z_k^{l+1}}{\partial z_j^l}= w_{kj}^{l+1} \cdot \sigma^{\prime}(z_j^l) zjlzkl+1=wkjl+1σ(zjl)

   如下图所示

【1】深度神经网络的前向/反向传播算法_第8张图片

   代入到上面的 δ j l = ∑ k n l + 1 ∂ z k l + 1 ∂ z j l δ k l + 1 \delta _j^l = \sum_{k}^{n^{l+1}}\frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}} \delta_{k}^{l+1} δjl=knl+1zjlzkl+1δkl+1,可以得到:
δ j l = ∑ k n l + 1 w k j l + 1 δ k l + 1 σ ′ ( z j l ) \delta_{j}^{l}=\sum_{k}^{n^{l+1}} w_{k j}^{l+1} \delta_{k}^{l+1} \sigma^{\prime}\left(z_{j}^{l}\right) δjl=knl+1wkjl+1δkl+1σ(zjl)

   如下图所示

【1】深度神经网络的前向/反向传播算法_第9张图片

   上式向量化表达为:
δ j l = [ w 1 j l + 1 , w 2 j l + 1 , … , w n l + 1 j l + 1 ] [ δ 1 l + 1 δ 2 l + 1 ⋯ δ n l + 1 l + 1 ] σ ′ ( z j l ) \delta_j^l=[w_{1j}^{l+1},w_{2j}^{l+1},\ldots,w_{{n^{l+1}}j}^{l+1}]\left[\begin{array}{c}{\delta_{1}^{l+1}} \\{\delta_{2}^{l+1}}\\ {\cdots} \\ {\delta_{n^{l+1}}^{l+1}}\end{array}\right]\sigma^{\prime}\left(z_{j}^{l}\right) δjl=[w1jl+1,w2jl+1,,wnl+1jl+1]δ1l+1δ2l+1δnl+1l+1σ(zjl)

   用矩阵形式详细表达为:
( δ 1 l δ 2 l . . . δ n l l ) = ( w 11 l w 12 l … w 1 n l l w 21 l w 22 l … w 2 n l l . . . . . . … . . . w n l + 1 1 l w n l + 1 2 l … w n l + 1 n l l ) T ⋅ ( δ 1 l + 1 δ 2 l + 1 . . . δ n l + 1 l + 1 ) ⊙ σ ′ ( z 1 l z 2 l . . . z n l ) \left( \begin{array}{llll}{\delta_{1}^{l}}\\ \\{\delta_{2}^{l}}\\\\{...}\\\\ {\delta_{n^{l}}^{l}}\end{array}\right) = \left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1n^l}^{l}} \\ {w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2n^l}^{l}}\\{...} & {...} & {\dots} & {...} \\ {w_{n^{l+1}1}^{l}} & {w_{n^{l+1}2}^{l}} & {\dots} & {w_{n^{l+1}n^l}^{l}}\end{array}\right)^T \cdot \left( \begin{array}{llll}{\delta_{1}^{l+1}}\\ \\{\delta_{2}^{l+1}}\\\\{...}\\\\ {\delta_{n^{l+1}}^{l+1}}\end{array}\right)\odot\sigma^\prime\left( \begin{array}{llll}{z_{1}^{l}}\\ \\{z_{2}^{l}}\\\\{...}\\\\ {z_{n}^{l}}\end{array}\right) δ1lδ2l...δnll=w11lw21l...wnl+11lw12lw22l...wnl+12lw1nllw2nll...wnl+1nllTδ1l+1δ2l+1...δnl+1l+1σz1lz2l...znl

   即可得到:

δ l = ( ( w l + 1 ) T δ l + 1 ) ⊙ σ ′ ( z l ) \delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right) δl=((wl+1)Tδl+1)σ(zl)

  • ( 3 )    ∂ C ∂ b l = δ l (3)\;\frac{\partial C}{\partial b^{l}}=\delta^l (3)blC=δl

证明:
   取第 l l l层的某一个神经元的偏置项 b j l b_j^l bjl为例,根据链式法则:
∂ C ∂ b j l = ∂ C ∂ z j l ∂ z j l ∂ b j l = δ j l ⋅ ∂ ( ∑ k = 1 n l − 1 w j k l a k l − 1 + b j l ) ∂ b j l = δ j l \begin{aligned} \frac{\partial C}{\partial b_{j}^{l}} &=\frac{\partial C}{\partial z_{j}^{l}} \frac{\partial z_{j}^{l}}{\partial b_{j}^{l}} \\ &=\delta_{j}^{l}\cdot\frac{\partial \left(\sum_{k=1}^{n^{l-1}} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l} \right)}{\partial b_j^l}\\&=\delta_j^l\end{aligned} bjlC=zjlCbjlzjl=δjlbjl(k=1nl1wjklakl1+bjl)=δjl

   于是,推广之后可得:
∂ C ∂ b l = [ ∂ C b 1 l , ∂ C b 2 l , … , ∂ C b n l l ] T = [ δ 1 l , δ 1 l , … , δ n l l ] T = δ l \frac{\partial C}{\partial b^l}=[\frac{\partial C}{b_1^l},\frac{\partial C}{b_2^l},\ldots,\frac{\partial C}{b_{n^l}^l}]^T =[\delta_1^l,\delta_1^l,\ldots,\delta_{n^l}^l]^T=\delta^l blC=[b1lC,b2lC,,bnllC]T=[δ1l,δ1l,,δnll]T=δl

  • ( 4 )    ∂ C ∂ W l = δ l ⋅ ( a l − 1 ) T (4)\;\frac{\partial C}{\partial W^l}=\delta^{l} \cdot \left(a^{l-1}\right)^T (4)WlC=δl(al1)T

证明:
   取第 l − 1 l-1 l1层到第 l l l层的某一条神经元权重 w j k l w_{jk}^l wjkl为例,根据链式法则:
∂ C ∂ w j k l = ∂ C ∂ z j l ∂ z j l ∂ w j k l = δ j l ⋅ ∂ ( ∑ k = 1 n l − 1 w j k l a k l − 1 + b j l ) ∂ w j k l = δ j l ⋅ a k l − 1 \begin{aligned} \frac{\partial C}{\partial w_{j k}^ l} &=\frac{\partial C}{\partial z_{j}^{l}} \frac{\partial z_{j}^{l}}{\partial w_{j k} ^l} \\ &=\delta_{j}^{l}\cdot\frac{\partial \left(\sum_{k=1}^{n^{l-1}} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l} \right)}{\partial w_{jk}^l}\\&=\delta_j^l \cdot a_k^{l-1}\end{aligned} wjklC=zjlCwjklzjl=δjlwjkl(k=1nl1wjklakl1+bjl)=δjlakl1

   已知矩阵 W l W^l Wl具体为:
W l = ( w 11 l w 12 l … w 1 , n l − 1 l w 21 l w 22 l … w 2 , n l − 1 l . . . . . . … . . . w n l , 1 l w n l , 2 l … w n l , n l − 1 l ) W^l= \left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1,n^{l-1}}^{l}} \\\\ {w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2,n^{l-1}}^{l}}\\\\{...} & {...} & {\dots} & {...} \\\\ {w_{n^{l},1}^{l}} & {w_{n^{l},2}^{l}} & {\dots} & {w_{n^{l},n^{l-1}}^{l}}\end{array}\right) Wl=w11lw21l...wnl,1lw12lw22l...wnl,2lw1,nl1lw2,nl1l...wnl,nl1l

   因此:
∂ C ∂ W l = ( δ 1 l a 1 l − 1 δ 1 l a 2 l − 1 … δ 1 l a n l − 1 l − 1 δ 2 l a 1 l − 1 δ 2 l a 2 l − 1 … δ 2 l a n l − 1 l − 1 . . . . . . … . . . δ n l l a 1 l − 1 δ n l l a 2 l − 1 … δ n l l a n l − 1 l − 1 ) \frac{\partial C}{\partial W^l}= \left( \begin{array}{llll}{\delta_1^{l}a_1^{l-1}} & {\delta_1^{l}a_2^{l-1}} & {\dots} & {\delta_1^{l}a_{n^{l-1}}^{l-1}} \\\\ {\delta_2^{l}a_1^{l-1}} & {\delta_2^{l}a_2^{l-1}} & {\dots} & {\delta_{2}^{l}a_{n^{l-1}}^{l-1}}\\\\{...} & {...} & {\dots} & {...} \\\\ {\delta_{n^l}^{l}a_1^{l-1}} & {\delta_{n^l}^{l}a_2^{l-1}} & {\dots} & {\delta_{n^l}^{l}a_{n^{l-1}}^{l-1}}\end{array}\right) WlC=δ1la1l1δ2la1l1...δnlla1l1δ1la2l1δ2la2l1...δnlla2l1δ1lanl1l1δ2lanl1l1...δnllanl1l1

= ( δ 1 l δ 2 l . . . δ n l l ) ⋅ ( a 1 l − 1 , a 2 l − 1 , … , a n l − 1 l − 1 ) =\left( \begin{array}{llll}{\delta_{1}^{l}}\\ \\{\delta_{2}^{l}}\\\\{...}\\\\ {\delta_{n^{l}}^{l}}\end{array}\right) \cdot \left(a_1^{l-1},a_2^{l-1},\ldots,a_{n^{l-1}}^{l-1}\right) =δ1lδ2l...δnll(a1l1,a2l1,,anl1l1)

= δ l ⋅ ( a l − 1 ) T                                                                  =\delta^l\cdot \left(a^{l-1}\right)^T\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; =δl(al1)T

2.8 反向传播算法整体描述

  一图看懂神经网络训练流程:

【1】深度神经网络的前向/反向传播算法_第10张图片

  具体分为以下6个步骤:

  • 1.随机初始化
     将神经网络中的所有连接权重和偏置项随机初始化为(0,1)区间内的一个值。
  • 2.正向传播
     当 l = 1 l=1 l=1时, a 1 = x a^1=x a1=x
     当 l = 2 , 3 , … , L l=2,3,\ldots,L l=2,3,,L时:
    z l = W l a l − 1 + b l z^l=W^la^{l-1}+b^l zl=Wlal1+bl a l = σ ( z l )                    a^l=\sigma(z^l)\;\;\;\;\;\;\;\;\; al=σ(zl)
  • 3.通过损失函数,计算输出层的 δ L \delta^L δL
    δ L = ∂ C ∂ z L = ∇ a C ⊙ σ ′ ( z L ) \delta^L=\frac{\partial C}{\partial z^L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right) δL=zLC=aCσ(zL)
  • 4.误差反向传播
     当 l = L − 1 , L − 2 , … , 3 , 2 l=L-1,L-2,\ldots,3,2 l=L1,L2,,32时:
    δ l = ( ( w l + 1 ) T δ l + 1 ) ⊙ σ ′ ( z l ) \delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right) δl=((wl+1)Tδl+1)σ(zl)
  • 5.更新权重
     当 l = 2 , 3 , … , L l=2,3,\ldots,L l=2,3,,L时,更新 W l W^l Wl b l b^l bl如下:
    W l = W l − η ∂ C ∂ W l = W l − η ⋅ δ l ( a l − 1 ) T W^l=W^l-\eta\frac{\partial C}{\partial W^l}=W^l-\eta \cdot \delta^l(a^{l-1})^T Wl=WlηWlC=Wlηδl(al1)T b l = b l − η ∂ C ∂ b l = b l − η ⋅ δ l                            b^l=b^l-\eta\frac{\partial C}{\partial b^l}=b^l-\eta \cdot\delta^l\;\;\;\;\;\;\;\;\;\;\;\;\; bl=blηblC=blηδl
  • 6.继续迭代,直至收敛
     迭代停止条件为:
        ⋅ \cdot 所有的 W , b W,b Wb的变化值都小于阈值 ϵ \epsilon ϵ
        ⋅ \cdot 迭代次数到达指定的最大迭代次数;

参考资料

  1. 刘建平Pinard 《深度神经网络(DNN)模型与前向传播算法》

  2. 刘建平Pinard 《深度神经网络(DNN)反向传播算法(BP)》

  3. 2019/6/25更新的内容,主要参考梯度下降与反向传播(含过程推导及证明)

你可能感兴趣的:(深度学习,深度神经网络,前向传播算法,反向传播算法)