Processing math: 34%

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)计算各参数的偏导:

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