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)计算各参数的偏导:
\begin{equation} dZ^{[2]} = A^{[2]} – Y \tag{6} \end{equation}
\begin{equation} dW^{[2]} = \frac{1}{m}dZ^{[2]}A^{[1]T} \tag{7} \end{equation}
\begin{equation} db^{[2]} = \frac{1}{m}np.sum(dZ^{[2]}, axis = 1, keepdims = True) \tag{8} \end{equation}
\begin{equation} dZ^{[1]} = W^{[2]T}dZ^{[2]} * g^{[1] \prime}(Z^{[1]}) \tag{9} \end{equation}
\begin{equation} dW^{[1]} = \frac{1}{m}dZ^{[1]}X^T \tag{10} \end{equation}
\begin{equation} db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis = 1, keepdims = True) \tag{11} \end{equation}
上面 np.sum
为 Numpy 的函数,axis = 1
表示沿第一个维度求和,keepdims = True
表示保留维度(否则结果会变成一个大小为 (n^{[2]}, ) 的秩为 1 的数组,而不是一个大小为 (n^{[2]}, 1) 的二维数组)。在对 dZ^{[1]} 的计算中,* 表示逐元素相乘,W^{[2]T}dZ^{[2]} 和 g^{[1] \prime}(Z^{[1]}) 都是 n^{[1]} \times m 的矩阵。
2. 反向传播的推导
前述神经网络的计算图如图 1所示。
其中:
\begin{equation} L(a^{[2]}, y) = -y\log{a^{[2]}} – (1 – y)log(1- a^{[2]}) \tag{12} \end{equation}
\begin{equation} \sigma(z^{[2]}) = \frac{1}{1 – e^{-z^{[2]}}} \tag{13} \end{equation}
首先计算第 2 层(输出层)各参数的偏导 \frac{\partial L}{\partial W^{[2]}} 和 \frac{\partial L}{\partial b^{[2]}},由式 (12)、(13),有:
\begin{equation} \frac{\partial L}{\partial a^{[2]}} = – \frac{y}{a^{[2]}} + \frac{1 – y}{1 – a^{[2]}} \tag{14} \end{equation}
\begin{equation} \frac{da^{[2]}}{dz^{[2]}} = \sigma(z^{[2]})(1 – \sigma(z^{[2]})) = a(1 – a) \tag{15} \end{equation}
由链式法则,得:
\begin{align} \frac{\partial L}{\partial z^{[2]}} & = \frac{\partial L}{\partial a^{[2]}} \frac{da^{[2]}}{dz^{[2]}} \\ & = (- \frac{y}{a} + \frac{1 – y}{1 – a}) \cdot a(1 – a) \\ & = a^{[2]} – y \tag{16} \end{align}
则:
\begin{equation} \frac{\partial L}{\partial W^{[2]}} = \frac{\partial L}{\partial z^{[2]}} \frac{\partial z^{[2]}}{\partial W^{[2]}} = \frac{\partial L}{\partial z^{[2]}}a^{[1]T} \tag{17} \end{equation}
\begin{equation} \frac{\partial L}{\partial b^{[2]}} = \frac{\partial L}{\partial z^{[2]}} \frac{\partial z^{[2]}}{\partial b^{[2]}} = \frac{\partial L}{\partial z^{[2]}} \tag{18} \end{equation}
然后来到第一层:
\begin{equation} \frac{\partial L}{\partial z^{[1]}} = \frac{\partial L}{\partial z^{[2]}} \frac{\partial z^{[2]}}{\partial a^{[1]}} \frac{\partial a^{[1]}}{\partial z^{[1]}} = W^{[2]T} \frac{\partial L}{\partial z^{[2]}} * \sigma'(z^{[1]}) \tag{19} \end{equation}
\begin{equation} \frac{\partial L}{\partial W^{[1]}} = \frac{\partial L}{\partial z^{[1]}} \frac{\partial z^{[1]}}{\partial W^{[1]}} = \frac{\partial L}{\partial z^{[1]}} x^T \tag{20} \end{equation}
\begin{equation} \frac{\partial L}{\partial b^{[1]}} = \frac{\partial L}{\partial z^{[1]}} \frac{\partial z^{[1]}}{\partial b^{[1]}} = \frac{\partial L}{\partial z^{[1]}} \tag{21} \end{equation}
其中式 (19) 中的 * 表示逐元素相乘。
以上就是通过反向传播计算单个样本下各参数偏导的过程,将式 (16)~(21) 整理如下:
\begin{equation} dz^{[2]} = a^{[2]} – y \tag{22} \end{equation}
\begin{equation} dW^{[2]} = dz^{[2]}a^{[1]T} \tag{23} \end{equation}
\begin{equation} db^{[2]} = dz^{[2]} \tag{24} \end{equation}
\begin{equation} dz^{[1]} = W^{[2]T}dz^{[2]} * g^{[1] \prime}(z^{[1]}) \tag{25} \end{equation}
\begin{equation} dW^{[1]} = dz^{[1]}x^T \tag{26} \end{equation}
\begin{equation} db^{[1]} = dz^{[1]} \tag{27} \end{equation}
上面各式将 \frac{\partial L}{\partial x} 简写成 dx 的形式。另外注意式 (25) 中的 g^{[1]} 表示第 1 层的激活函数,即式 (19) 中的 \sigma。
2. 向量化计算 m 个样本
将式 (22)~(27) 扩展到 m 个样本的情况,依然使用各个样本的特征向量水平叠加的形式表示 m 个样本的集合,即 X = [x^{(1)} x^{(2)} … x^{(m)} ],则有:
\begin{equation} dZ^{[2]} = A^{[2]} – Y \tag{28} \end{equation}
\begin{equation} dW^{[2]} = \frac{1}{m} dZ^{[2]}A^{[1]T} \tag{29} \end{equation}
\begin{equation} db^{[2]} = \frac{1}{m} np.sum(dZ^{[2]}, axis = 1, keepdims = True) \tag{30} \end{equation}
\begin{equation} dz^{[1]} = W^{[2]T}dZ^{[2]} * g^{[1] \prime}(Z^{[1]}) \tag{31} \end{equation}
\begin{equation} dW^{[1]} = \frac{1}{m} dZ^{[1]}X^T \tag{32} \end{equation}
\begin{equation} db^{[1]} = \frac{1}{m} np.sum(dZ^{[1]}, axis = 1, keepdims = True) \tag{33} \end{equation}
上面式 (29)、(32) 中的 \frac{1}{m} 来自于代价函数 J = \frac{1}{m} \sum_{i=1}^mL(\hat{y}, y)。式 (29)~(32) 即为前面式 (6)~(11)。