Deep Learning Note: 1-7 反向传播

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

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

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

  涉及的参数及其大小为:

  • 第一层权重 $W^{[1]}$,$n^{[1]} \times n^{[0]}$
  • 第一层偏置 $b^{[1]}$,$n^{[1]} \times 1$
  • 第二层权重 $W^{[2]}$,$n^{[2]} \times n^{[1]}$,即 $1 \times n^{[1]}$
  • 第二层偏置 $b^{[2]}$,$n^{[2]} \times 1$,即 $1 \times 1$

  代价函数为:

\begin{equation}
J(W^{[1]}, b^{[1]}, W^{[2]}, b^{[2]}) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}, y) \tag{1}
\end{equation}

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

\begin{equation}
Z^{[1]} = W^{[1]}X + b^{[1]} \tag{2}
\end{equation}

\begin{equation}
A^{[1]} = g^{[1]}(Z^{[1]}) \tag{3}
\end{equation}

\begin{equation}
Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]} \tag{4}
\end{equation}

\begin{equation}
A^{[2]} = g^{[2]}(Z^{[2]}) \tag{5}
\end{equation}

  然后通过反向传播(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所示。

图 1

图 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)。