Please enable Javascript to view the contents

前向传播与反向传播

 ·   ·  ☕ 4 分钟 · 👀... 阅读

深度神经网络

图 1: 神经网络示例

图 1: 神经网络示例

每个层可以用数学形式描述如下,从输入层逐层计算到最终输出层的过程称为前向传播(forward propagation)

\begin{align}
\label{eq:3}
z^{(l)} &= W^{(l)}a^{(l-1)} + b^{(l)} && (\text{if } l > 1) \\
a^{(l)} &= \begin{cases}
\sigma(z^{(l)}) & \text{if } l > 1 \\
x & \text{if } l = 1
\end{cases}
\end{align}

其中包含线性部分 \(z^{(l)}\) 和激活部分 \(a^{(l)}\)。若使用 sigmoid 作为激活函数:\(\sigma(z^{(l)}) = \frac{1}{1 + e^{-z^{(l)}}} \)

以第 2 层为例,计算过程如下:

\begin{align}
\label{eq:4}
z^{(2)} &= W^{(2)}x + b^{(2)} \\
&= \begin{bmatrix}
w_{1,1}^{(2)} & w_{1,2}^{(2)} & w_{1,3}^{(2)} \\
w_{2,1}^{(2)} & w_{2,2}^{(2)} & w_{2,3}^{(2)} \\
w_{3,1}^{(2)} & w_{3,2}^{(2)} & w_{3,3}^{(2)} \\
w_{4,1}^{(2)} & w_{4,2}^{(2)} & w_{4,3}^{(2)} \\
\end{bmatrix}
\begin{bmatrix}
x_1 \\
x_2 \\
x_3
\end{bmatrix}
+
\begin{bmatrix}
b_1^{(2)} \\
b_2^{(2)} \\
b_3^{(2)} \\
b_4^{(2)}
\end{bmatrix} \\
\begin{bmatrix}
z_{1}^{(2)} \\
z_{2}^{(2)} \\
z_{3}^{(2)} \\
z_{4}^{(2)}
\end{bmatrix}
&= \begin{bmatrix}
w_{1,1}^{(2)} x_1 + w_{1,2}^{(2)} x_2 + w_{1,3}^{(2)} x_3 + b_1^{(2)} \\
w_{2,1}^{(2)} x_1 + w_{2,2}^{(2)} x_2 + w_{2,3}^{(2)} x_3 + b_2^{(2)} \\
w_{3,1}^{(2)} x_1 + w_{3,2}^{(2)} x_2 + w_{3,3}^{(2)} x_3 + b_3^{(2)} \\
w_{4,1}^{(2)} x_1 + w_{4,2}^{(2)} x_2 + w_{4,3}^{(2)} x_3 + b_4^{(2)} \\
\end{bmatrix} \\
a^{(2)} &= \sigma(z^{(2)}) \\
&= \begin{bmatrix}
\sigma(z_{1}^{(2)}) \\
\sigma(z_{2}^{(2)}) \\
\sigma(z_{3}^{(2)}) \\
\sigma(z_{4}^{(2)})
\end{bmatrix} \\
&= \begin{bmatrix}
\frac{1}{1 + e^{-z_{1}^{(2)}}} \\
\frac{1}{1 + e^{-z_{2}^{(2)}}} \\
\frac{1}{1 + e^{-z_{3}^{(2)}}} \\
\frac{1}{1 + e^{-z_{4}^{(2)}}}
\end{bmatrix}
\end{align}

loss(cost)函数

选择损失函数,例如 MSE(均方误差):

\begin{align}
\label{eq:5}
C &= \frac{1}{2} \| a^{(L)} - y \|_{2}^2
\end{align}

gradient descent(梯度下降)

为了使 \(C\) 减小,在每次迭代中应用以下公式(每次迭代累积 \(C\) 的变化量 \(\Delta C\)):

\[
\Delta C = \nabla C \Delta \theta
\]

沿 \(\nabla C\)(\(C\) 的梯度,即增长最快的方向)的反方向更新 \(\theta\),学习率为 \(\eta\):

\begin{align}
\label{eq:10}
\theta &= \theta + \Delta \theta \\
&= \theta -\eta \nabla C \\
\end{align}

计算 \(\nabla C\) 是我们需要的一切,而反向传播正是为此而生。

Forward Propagation(前向传播)

前向传播从第 1 层到第 \(L\) 层,逐层计算 \(z^{(l)}\) 和 \(a^{(l)}\):

  1. 从输入开始:\(a^{(1)} = x\)
  2. 对于每一层 \(l = 2, 3, \ldots, L\):
    1. 计算线性组合:\(z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}\)
    2. 应用激活函数:\(a^{(l)} = \sigma(z^{(l)})\)
  3. 最终输出为 \(a^{(L)}\),然后计算损失 \(C = \frac{1}{2} | a^{(L)} - y |_2^2\)

换句话说,前向传播就是评估神经网络所表示的复合函数的过程:将输入数据逐层送入网络,直到产生预测结果。

图 2: 前向传播:数据从输入流向输出,每一层先进行线性变换再经过激活函数

图 2: 前向传播:数据从输入流向输出,每一层先进行线性变换再经过激活函数

Backward Propagation(反向传播)

前向传播产生预测 \(a^{(L)}\) 和损失 \(C\) 之后,反向传播计算每个参数对该损失的贡献程度。我们需要所有参数的梯度:\(\frac{\partial C}{\partial W^{(l)}}\) 和 \(\frac{\partial C}{\partial b^{(l)}}\)。

定义第 \(l\) 层的误差信号(也称 delta)为:

\begin{align}
\label{eq:8}
\delta^{(l)} &= \frac{\partial C}{\partial z^{(l)}} \\
&= \frac{\partial C}{\partial a^{(l)}} \odot \frac{\partial a^{(l)}}{\partial z^{(l)}} \\
&= \begin{cases}
(a^{(L)} - y) \odot \sigma’(z^{(L)}) & \text{if}\ l = L \\
(\frac{\partial z^{(l+1)}}{\partial a^{(l)}} \frac{\partial C}{\partial z^{(l+1)}}) \odot \sigma’(z^{(l)}) & \text{if}\ l<L \\
\end{cases} \\
&= \begin{cases}
(a^{(L)} - y) \odot \sigma’(z^{(L)}) & \text{if } l = L \\
((W^{(l+1)})^{T}\delta^{(l+1)}) \odot \sigma’(z^{(l)}) & \text{if } l<L \\
\end{cases} \\
\frac{\partial C}{\partial W^{(l)}} &= \frac{\partial C}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial W^{(l)}} \\
&= \delta^{(l)}(a^{(l-1)})^{T} \\
\frac{\partial C}{\partial b^{(l)}} &= \frac{\partial C}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial b^{(l)}} \\
&= \delta^{(l)} \\
\end{align}

图 3: 反向传播:误差信号从输出层向输入层回传,沿途计算每一层的梯度

图 3: 反向传播:误差信号从输出层向输入层回传,沿途计算每一层的梯度

以神经网络(\(L = 3\))为例:

\begin{align}
\label{eq:11}
\delta^{(l)} &= \begin{cases}
(a^{(L)} - y) \odot \sigma’(z^{(L)}) & \text{if } l = L \\
((W^{(l+1)})^{T}\delta^{(l+1)}) \odot \sigma’(z^{(l)}) & \text{if } l < L
\end{cases} \\
&= \begin{cases}
\begin{bmatrix}
a_{1}^{(3)} - y_{1} \\
a_{2}^{(3)} - y_{2}
\end{bmatrix} \odot \begin{bmatrix}
\sigma’(z_{1}^{(3)}) \\
\sigma’(z_{2}^{(3)})
\end{bmatrix} & \text{if } l = L = 3 \\
(\begin{bmatrix}
w_{1,1}^{(3)} & w_{2,1}^{(3)} \\
w_{1,2}^{(3)} & w_{2,2}^{(3)} \\
w_{1,3}^{(3)} & w_{2,3}^{(3)} \\
w_{1,4}^{(3)} & w_{2,4}^{(3)}
\end{bmatrix}
\begin{bmatrix}
\delta_{1}^{(3)} \\
\delta_{2}^{(3)}
\end{bmatrix}
) \odot \begin{bmatrix}
\sigma’(z_{1}^{(2)}) \\
\sigma’(z_{2}^{(2)}) \\
\sigma’(z_{3}^{(2)}) \\
\sigma’(z_{4}^{(2)})
\end{bmatrix} & \text{if } l = 2 \\
\end{cases} \\
\frac{\partial C}{\partial W^{(l)}} &= \delta^{(l)} (a^{(l-1)})^{T} \\
&= \begin{cases}
\begin{bmatrix}
\delta_{1}^{(3)} \\
\delta_{2}^{(3)}
\end{bmatrix} \begin{bmatrix}
a_{1}^{(2)} & a_{2}^{(2)} & a_{3}^{(2)}
\end{bmatrix} & \text{if } l = 3 \\
\begin{bmatrix}
\delta_{1}^{(2)} \\
\delta_{2}^{(2)} \\
\delta_{3}^{(2)} \\
\delta_{4}^{(2)}
\end{bmatrix} \begin{bmatrix}
x_{1} & x_{2} &x_{3}
\end{bmatrix} & \text{if } l = 2
\end{cases} \\
\frac{\partial C}{\partial b^{(l)}} &= \delta^{(l)} \\
&= \begin{cases}
\begin{bmatrix}
\delta_{1}^{(3)} \\
\delta_{2}^{(3)}
\end{bmatrix} & \text{if } l = 3 \\
\begin{bmatrix}
\delta_{1}^{(2)} \\
\delta_{2}^{(2)} \\
\delta_{3}^{(2)} \\
\delta_{4}^{(2)}
\end{bmatrix} & \text{if } l = 2
\end{cases}
\end{align}

完整训练流程

反向传播计算出所有梯度后,完整的梯度下降算法如下:

  1. 初始化(initialize):用小的随机值初始化所有权重 \(W^{(l)}\) 和偏置 \(b^{(l)}\)
  2. 重复(repeat) 直到收敛(或固定轮数):
    1. 前向传播:逐层计算 \(a^{(l)}\)(\(l = 1 \ldots L\)),然后计算损失 \(C\)
    2. 反向传播:使用链式法则从输出层到输入层计算 \(\delta^{(l)}\)(\(l = L, L-1, \ldots, 2\))
    3. 计算梯度:\(\frac{\partial C}{\partial W^{(l)}} = \delta^{(l)}(a^{(l-1)})^{T}\),\(\frac{\partial C}{\partial b^{(l)}} = \delta^{(l)}\)
    4. 更新参数:对于每一层,\(W^{(l)} \leftarrow W^{(l)} - \eta \frac{\partial C}{\partial W^{(l)}}\) 和 \(b^{(l)} \leftarrow b^{(l)} - \eta \frac{\partial C}{\partial b^{(l)}}\)
分享