Deep Learning Note: 1-7 反向传播
Contents [show]
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])=1mm∑i=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所示。
其中:
L(a[2],y)=−yloga[2]–(1–y)log(1−a[2])
σ(z[2])=11–e−z[2]
首先计算第 2 层(输出层)各参数的偏导 ∂L∂W[2] 和 ∂L∂b[2],由式 (12)、(13),有:
∂L∂a[2]=–ya[2]+1–y1–a[2]
da[2]dz[2]=σ(z[2])(1–σ(z[2]))=a(1–a)
由链式法则,得:
∂L∂z[2]=∂L∂a[2]da[2]dz[2]=(−ya+1–y1–a)⋅a(1–a)=a[2]–y
则:
∂L∂W[2]=∂L∂z[2]∂z[2]∂W[2]=∂L∂z[2]a[1]T
∂L∂b[2]=∂L∂z[2]∂z[2]∂b[2]=∂L∂z[2]
然后来到第一层:
∂L∂z[1]=∂L∂z[2]∂z[2]∂a[1]∂a[1]∂z[1]=W[2]T∂L∂z[2]∗σ′(z[1])
∂L∂W[1]=∂L∂z[1]∂z[1]∂W[1]=∂L∂z[1]xT
∂L∂b[1]=∂L∂z[1]∂z[1]∂b[1]=∂L∂z[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]
上面各式将 ∂L∂x 简写成 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=1m∑mi=1L(ˆy,y)。式 (29)~(32) 即为前面式 (6)~(11)。