深度学习基础(一)——反向传播算法

概述

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

网络传播的过程

这里写图片描述

前向传播

  • 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[L1],n[L2]) (n[L1],1) Z[L1]=W[L1]A[L2]+b[L1] (n[L1],209)
Layer L (n[L],n[L1]) (n[L],1) Z[L]=W[L]A[L1]+b[L] (n[L],209)

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

(2)W=[jklmnopqr]X=[abcdefghi]b=[stu]

Then WX+b will be:

(3)WX+b=[(ja+kd+lg)+s(jb+ke+lh)+s(jc+kf+li)+s(ma+nd+og)+t(mb+ne+oh)+t(mc+nf+oi)+t(pa+qd+rg)+u(pb+qe+rh)+u(pc+qf+ri)+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[l1]+b[l]

where A[0]=X .

A[l]=g(Z[l])=g(W[l]A[l1]+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个单元的误差的定义δjl
     δjl=Czjl. 
  • 根据链式求导得:

    δjL=CajLajLzjL=CajLσ(zjL).
  • 算完输出层开始往回算之前层的误差,当前层l的误差用下一层l+1的误差来表示:

    (40)δjl=Czjl(41)=kCzkl+1zkl+1zjl(42)=kzkl+1zjlδkl+1,

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

(44)zkl+1zjl=wkjl+1σ(zjl).

(45)δjl=kwkjl+1δkl+1σ(zjl).
  • W,b
    这里写图片描述

CNN

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

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

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

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

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

δkl1=J(W,b)akl1akl1zkl1=upsample(δkl)σ(zkl1)

简化:
δl1=upsample(δl)σ(zl1)

对比:
(45)δjl=kwkjl+1δkl+1σ(zjl).

区别:
  • 无权重W
  • upsample

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

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

    δl1=δlzlzl1=δlrot180(Wl)σ(zl1)

    对比:翻转180°
    (45)δjl=kwkjl+1δkl+1σ(zjl).
  • 权重梯度
    这里写图片描述
    对比:旋转180度的操作。

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

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

一句话

DNN:

这里写图片描述

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

CNN

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

δl1=δlzlzl1=δlrot180(Wl)σ(zl1)

池化偏差:上层偏差上采样后圈乘该层的激活函数的导数。
δl1=upsample(δl)σ(zl1)

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

偏置b: 将δl 的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:
J(W,b)bl=u,v(δl)u,v
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章