Loading [MathJax]/jax/output/HTML-CSS/jax.js

Deep Learning Note: 1-7 反向传播

1. 神经网络中的梯度下降

  本文以前面 给出的用于二分类的两层神经网络为例,展示神经网络中梯度下降的计算过程。在该神经网络中:

  • 各层节点数分别为 n[0]n[1]n[2],由于是二分类问题,只有一个输出,故 n[2]=1
  • 输入为 n[0]×m 的特征向量矩阵 X,其中 m 为样本个数
  • 输出为 1×m 的向量 Y

  涉及的参数及其大小为:

  • 第一层权重 W[1]n[1]×n[0]
  • 第一层偏置 b[1]n[1]×1
  • 第二层权重 W[2]n[2]×n[1],即 1×n[1]
  • 第二层偏置 b[2]n[2]×1,即 1×1

  代价函数为:

J(W[1],b[1],W[2],b[2])=1mmi=1L(ˆy,y)

  首先通过前向传播(Forward Propagation)计算网络输出:

Z[1]=W[1]X+b[1]

A[1]=g[1](Z[1])

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

A[2]=g[2](Z[2])

  然后通过反向传播(Backward Propagation,或 Backpropagation)计算各参数的偏导:

dZ[2]=A[2]Y

dW[2]=1mdZ[2]A[1]T

db[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)

dZ[1]=W[2]TdZ[2]g[1](Z[1])

dW[1]=1mdZ[1]XT

db[1]=1mnp.sum(dZ[1],axis=1,keepdims=True)

  上面 np.sum 为 Numpy 的函数,axis = 1 表示沿第一个维度求和,keepdims = True 表示保留维度(否则结果会变成一个大小为 (n[2],) 的秩为 1 的数组,而不是一个大小为 (n[2],1) 的二维数组)。在对 dZ[1] 的计算中, 表示逐元素相乘,W[2]TdZ[2]g[1](Z[1]) 都是 n[1]×m 的矩阵。

2. 反向传播的推导

  前述神经网络的计算图如图 1所示。

图 1

图 1

  其中:

L(a[2],y)=yloga[2](1y)log(1a[2])

σ(z[2])=11ez[2]

  首先计算第 2 层(输出层)各参数的偏导 LW[2]Lb[2],由式 (12)、(13),有:

La[2]=ya[2]+1y1a[2]

da[2]dz[2]=σ(z[2])(1σ(z[2]))=a(1a)

  由链式法则,得:

Lz[2]=La[2]da[2]dz[2]=(ya+1y1a)a(1a)=a[2]y

  则:

LW[2]=Lz[2]z[2]W[2]=Lz[2]a[1]T

Lb[2]=Lz[2]z[2]b[2]=Lz[2]

  然后来到第一层:

Lz[1]=Lz[2]z[2]a[1]a[1]z[1]=W[2]TLz[2]σ(z[1])

LW[1]=Lz[1]z[1]W[1]=Lz[1]xT

Lb[1]=Lz[1]z[1]b[1]=Lz[1]

  其中式 (19) 中的 表示逐元素相乘。

  以上就是通过反向传播计算单个样本下各参数偏导的过程,将式 (16)~(21) 整理如下:

dz[2]=a[2]y

dW[2]=dz[2]a[1]T

db[2]=dz[2]

dz[1]=W[2]Tdz[2]g[1](z[1])

dW[1]=dz[1]xT

db[1]=dz[1]

  上面各式将 Lx 简写成 dx 的形式。另外注意式 (25) 中的 g[1] 表示第 1 层的激活函数,即式 (19) 中的 σ

2. 向量化计算 m 个样本

  将式 (22)~(27) 扩展到 m 个样本的情况,依然使用各个样本的特征向量水平叠加的形式表示 m 个样本的集合,即 X=[x(1)x(2)x(m)],则有:

dZ[2]=A[2]Y

dW[2]=1mdZ[2]A[1]T

db[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)

dz[1]=W[2]TdZ[2]g[1](Z[1])

dW[1]=1mdZ[1]XT

db[1]=1mnp.sum(dZ[1],axis=1,keepdims=True)

  上面式 (29)、(32) 中的 1m 来自于代价函数 J=1mmi=1L(ˆy,y)。式 (29)~(32) 即为前面式 (6)~(11)。