深度学习基础-反向传播算法

概述

梯度下降法需要利用损失函数对所有参数求梯度,来寻找最小值点。而反向传播法就是用于计算该梯度的方法,其本质利用链式法则对每个参数求导。

网络传播的过程

这里写图片描述

前向传播

  • Initialize the parameters for for an L -layer neural network.
  • Implement the forward propagation module.
    • Complete the LINEAR part of a layer’s forward propagation step (resulting in Z [ l ] ).
    • We give you the ACTIVATION function (relu/sigmoid).
    • Combine the previous two steps into a new [LINEAR->ACTIVATION] forward function.
    • Stack the [LINEAR->RELU] forward function L-1 time (for layers 1 through L-1) and add a [LINEAR->SIGMOID] at the end (for the final layer L ). This gives you a new L_model_forward function.
  • Compute the loss.
  • Implement the backward propagation module (denoted in red in the figure below).
    • Complete the LINEAR part of a layer’s backward propagation step.
    • Gradient of the ACTIVATE function (relu_backward/sigmoid_backward)
    • Combine the previous two steps into a new [LINEAR->ACTIVATION] backward function.
    • Stack [LINEAR->RELU] backward L-1 times and add [LINEAR->SIGMOID] backward in a new L_model_backward function
  • Finally update the parameters.

输入数据及各层shape

Input X is ( 12288 , 209 ) (with m = 209 examples) then:

Shape of W Shape of b Activation Shape of Activation
Layer 1 ( n [ 1 ] , 12288 ) ( n [ 1 ] , 1 ) Z [ 1 ] = W [ 1 ] X + b [ 1 ] ( n [ 1 ] , 209 )
Layer 2 ( n [ 2 ] , n [ 1 ] ) ( n [ 2 ] , 1 ) Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] ( n [ 2 ] , 209 )
Layer L-1 ( n [ L 1 ] , n [ L 2 ] ) ( n [ L 1 ] , 1 ) Z [ L 1 ] = W [ L 1 ] A [ L 2 ] + b [ L 1 ] ( n [ L 1 ] , 209 )
Layer L ( n [ L ] , n [ L 1 ] ) ( n [ L ] , 1 ) Z [ L ] = W [ L ] A [ L 1 ] + b [ L ] ( n [ L ] , 209 )

We compute W X + b in python, it carries out broadcasting. For example, if:

(2) W = [ j k l m n o p q r ] X = [ a b c d e f g h i ] b = [ s t u ]

Then W X + b will be:

(3) W X + b = [ ( j a + k d + l g ) + s ( j b + k e + l h ) + s ( j c + k f + l i ) + s ( m a + n d + o g ) + t ( m b + n e + o h ) + t ( m c + n f + o i ) + t ( p a + q d + r g ) + u ( p b + q e + r h ) + u ( p c + q f + r i ) + u ]

Forward propagation

这里写图片描述

Three functions:

  • LINEAR
  • LINEAR -> ACTIVATION where ACTIVATION will be either ReLU or Sigmoid.
  • [LINEAR -> RELU] × (L-1) -> LINEAR -> SIGMOID (whole model)

The linear forward module (vectorized over all the examples) computes the following equations:

Z [ l ] = W [ l ] A [ l 1 ] + b [ l ]

where A [ 0 ] = X .

A [ l ] = g ( Z [ l ] ) = g ( W [ l ] A [ l 1 ] + b [ l ] ) where the activation “g” can be sigmoid() , relu(), and so on.

Loss Function

Check if your model is actually learning.

Backward propagation

Remember that back propagation is used to calculate the gradient of the loss function with respect to the parameters.
这里写图片描述

反向传播的公式

全连接

这里写图片描述

  • 计算输出层L每个单元的误差,第L层第j个单元的误差的定义 δ j l
      δ j l = C z j l .  
  • 根据链式求导得:

    δ j L = C a j L a j L z j L = C a j L σ ( z j L ) .

  • 算完输出层开始往回算之前层的误差,当前层l的误差用下一层l+1的误差来表示:

    (40) δ j l = C z j l (41) = k C z k l + 1 z k l + 1 z j l (42) = k z k l + 1 z j l δ k l + 1 ,

    其中j是当前层的某个神经元,它和下一层的若干个神经元(由k表示)相连。注意上式交换右边两项,并用误差δ的定义代入,同时注意到:
    (43) z k l + 1 = j w k j l + 1 a j l + b k l + 1 = j w k j l + 1 σ ( z j l ) + b k l + 1 .

(44) z k l + 1 z j l = w k j l + 1 σ ( z j l ) .

(45) δ j l = k w k j l + 1 δ k l + 1 σ ( z j l ) .

  • W,b
    这里写图片描述

CNN

CNN的反向传播不同之处
  • 一般神经网络中每一层输入输出a,z都只是一个向量,而CNN中的a,z是一个三维张量,即由若干个输入的子矩阵组成。
  • 池化层没有激活函数,可以令池化层的激活函数为σ(z)=z,这样池化层激活函数的导数为1。
  • 池化层在前向传播的时候,对输入进行了压缩,那么我们向前反向推导上一层的误差时,需要做upsample处理。
  • 卷积层是通过若干个矩阵卷积求和而得到当前层的输出,这和一般的网络直接进行矩阵乘法得到当前层的输出不同。这样在卷积层反向传播的时候,上一层误差的递推计算方法会不同。
  • 对于卷积层,由于W使用的运算是卷积,那么由该层误差推导出该层的所有卷积核的W,b的方式也不
池化层

已知池化层的误差,反向推导上一隐藏层的误差,第l层误差的第k个子矩阵 δ k l :
这里写图片描述
扩展:
这里写图片描述

如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:

这里写图片描述
如果是Average,则进行平均,转换后的矩阵为:

这里写图片描述
上边这个矩阵就是误差矩阵经过upsample之后的矩阵,那么,由后一层误差推导出前一层误差的公式为:

δ k l 1 = J ( W , b ) a k l 1 a k l 1 z k l 1 = u p s a m p l e ( δ k l ) σ ( z k l 1 )

简化:
δ l 1 = u p s a m p l e ( δ l ) σ ( z l 1 )

对比:
(45) δ j l = k w k j l + 1 δ k l + 1 σ ( z j l ) .

区别:

  • 无权重W
  • upsample

池化层: 没有W,b,不用求W,b的梯度

卷积层
  • 已知卷积层的误差,推导上一隐藏层的误差:

    δ l 1 = δ l z l z l 1 = δ l r o t 180 ( W l ) σ ( z l 1 )

    对比:翻转180°
    (45) δ j l = k w k j l + 1 δ k l + 1 σ ( z j l ) .

  • 权重梯度
    这里写图片描述
    对比:旋转180度的操作。

  • 偏置
    偏差是三维向量,b是一个一个向量,不能和偏差直接相等,通常做法就是将偏差的子矩阵分别求和,得到误差向量,即b的梯度
    这里写图片描述

旋转180°原因
卷积神经网络(CNN)反向传播算法-刘建平

一句话

DNN:

这里写图片描述

  • L层的偏差 δ j L =损失函数对a求梯度再圈乘该层激活函数的导数
  • l层偏差 δ j l =上层权重矩阵的转置与偏差矩阵的乘积,再圈乘该层的激活函数的导数。
  • 根据偏差分别求W,b的梯度
    • W:等于该层偏差与上一层a转置的矩阵乘积
    • b: 等于该层偏差矩阵

CNN

卷积偏差:上层偏差与权重矩阵的翻转180°的卷积,再乘该层的激活函数的导数。

δ l 1 = δ l z l z l 1 = δ l r o t 180 ( W l ) σ ( z l 1 )

池化偏差:上层偏差上采样后圈乘该层的激活函数的导数。
δ l 1 = u p s a m p l e ( δ l ) σ ( z l 1 )

权重W:上层a卷积该层偏差
J ( W , b ) W l = J ( W , b ) z l z l W l = a l 1 δ l

偏置b: 将 δ l 的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:
J ( W , b ) b l = u , v ( δ l ) u , v

猜你喜欢

转载自blog.csdn.net/qq_38622495/article/details/82349082