反向传播(Back Propagation)

(GPT 为共同创作者)

1. 直观理解

想象一个多层神经网络:输入 → 隐藏层 → 输出。训练的目标是 调整每个权重,使得网络输出更接近目标(标签)。反向传播的核心想法是:

反向传播本质上是把链式求导(chain rule)系统化、按层计算偏导,从而高效得到每个权重的梯度。

2. 关键数学工具:链式法则

链式法则(单变量形式): 如果 $z = f(y)$ 且 $y = g(x)$,那么

\[\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}.\]

神经网络时,输出是很多嵌套函数的组合(激活、加权和、激活……),链式法则把整体导数拆成许多层的局部导数的乘积。

3. 标量形式的反向传播(单个神经元)

单个神经元:

对权重的梯度:

\[\frac{\partial E}{\partial w_i} = \frac{\partial E}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w_i} = \delta \cdot x_i,\]

其中 $\delta \triangleq \frac{\partial E}{\partial z} = \frac{\partial E}{\partial a} \cdot \sigma’(z)$。

偏置的梯度是 $\frac{\partial E}{\partial b} = \delta$(因为 $z$ 对 $b$ 的导数是 1)。

4. 多层网络的反向传播(高层次)

向量化形式(简写)—— 对第 $l$ 层:

这是反向传播的 “矩阵/向量化” 版本,用于实际实现(速度快,易于并行)。

5. 具体手算例子(非常详细的逐步数值示范)

下面给出一个 简单 2-2-1 网络 的单样本向前与反向过程(使用 sigmoid 激活和均方误差),并 逐步计算每个中间值与梯度

网络结构与初始参数(示例):

前向传播(算出每个神经元的输出)

  1. 隐藏单元 1 的净输入:

    \[z^{(1)} \cdot 1 = w^{(1)} \cdot {11}x_1 + w^{(1)}_{21}x_2 + b^{(1)}_1 = 0.15 \times 0.05 + 0.25 \times 0.10 + 0.35.\]

    逐项计算:

    0.15 × 0.05 = 0.0075.

    0.25 × 0.10 = 0.025.

    相加:0.0075 + 0.025 = 0.0325。再加偏置 0.35:

    $z^{(1)}_1 = 0.32 + 0.0125$? 小心 —— 实际合计是 $0.0075 + 0.025 = 0.0325$,$0.0325+0.35 = 0.3825$。(确切值)

  2. 隐藏单元 1 的激活(sigmoid):

    \[h_1 = \sigma(0.3825) = \frac{1}{1+e^{-0.3825}}.\]

    计算近似: $e^{-0.3825} \approx 0.682$,因此 $h_1 \approx \frac{1}{1 + 0.682} \approx 0.594$. (记为 $h_1 \approx 0.594$)

  3. 隐藏单元 2 的净输入:

    \[z^{(1)}_2 = 0.20 \times 0.05 + 0.30 \times 0.10 + 0.35.\]

    逐项:

    $0.20 \times 0.05 = 0.01$

    $0.30 \times 0.10 = 0.03$

    相加 $0.01 + 0.03 = 0.04,0.04 + 0.35 = 0.39$

    激活:

    \[h_2 = \sigma(0.39) \approx 1/(1+e^{-0.39}) \approx 0.598.\]
  4. 输出单元的净输入:

    \[z^{(2)} = w^{(2)}_1 h_1 + w^{(2)}_2 h_2 + b^{(2)} = 0.40 \times 0.594 + 0.45 \times 0.598 + 0.60.\]

    逐项:

    $0.40×0.594 = 0.2376.$

    $0.45×0.598 = 0.2691.$

    相加:$0.2376 + 0.2691 = 0.5067$。再加偏置 $0.60$:

    $z^{(2)} = 0.5067 + 0.60 = 1.1067.$

  5. 输出激活(网络输出):

    \[o = \sigma(1.1067) \approx 1/(1+e^{-1.1067}).\]

    计算: $e^{-1.1067} \approx 0.331$,所以 $o \approx \frac {1}{1 + 0.331} \approx 0.751$.

  6. 损失(单样本):

    \[E = \frac{1}{2} (t - o)^2 = \frac{1}{2} (0.01 - 0.751)^2.\]

    先差值: $0.01 - 0.751 = -0.741$.

    平方: $(-0.741)^2 = 0.549081$.

    乘 $\frac{1}{2}$: $E \approx 0.27454$.


反向传播:求梯度(逐步)

目标:计算每个权重的 $\frac{\partial E}{\partial w}$。

1 输出层误差项 $\delta^{(2)}$

定义 $\delta^{(2)} = \frac{\partial E}{\partial z^{(2)}}$.

用链式: $\frac{\partial E}{\partial o} = o - t$(因为 $E=\frac12(t-o)^2$),又 $o = \sigma(z)$,所以:

\[\delta^{(2)} = (o-t)\cdot \sigma'(z^{(2)}).\]

sigmoid 导数 $\sigma’(z)=\sigma(z)(1-\sigma(z))$。

计算:

因此

\[\delta^{(2)} \approx 0.741 \times 0.187 = 0.138567 \approx 0.1386.\]

2 输出层到权重的梯度

\[\frac{\partial E}{\partial w^{(2)}_1} = \delta^{(2)} \cdot h_1.\]

把数值代入:

\[\frac{\partial E}{\partial w^{(2)}_1} \approx 0.1386 \times 0.594 \approx 0.0823.\]

类似地:

\[\frac{\partial E}{\partial w^{(2)}_2} \approx 0.1386 \times 0.598 \approx 0.0829.\]

偏置的梯度:

\[\frac{\partial E}{\partial b^{(2)}} = \delta^{(2)} \approx 0.1386.\]

3 把误差传回隐藏层(计算每个隐藏单元的 $\delta$)

隐藏单元 $j$ 的误差项:

\[\delta^{(1)}_j = \big(w^{(2)}_j \cdot \delta^{(2)}\big) \cdot \sigma'(z^{(1)}_j).\]

先计算 $\sigma’(z^{(1)}_1) = h_1(1-h_1) \approx 0.594 \times 0.406 \approx 0.241$

第二个隐藏单元:

4 隐藏层到权重的梯度

对权重 $w^{(1)} \cdot {11}$(从 $x_1$ 到隐藏单位 $1$):

\[\frac{\partial E}{\partial w^{(1)} \cdot {11}} = \delta^{(1)} \cdot 1 \cdot x_1 \approx 0.01336 \times 0.05 = 0.000668.\]

对 $w^{(1)} \cdot {21}$(从 $x_2$ 到隐藏单位 $1$):

\[\frac{\partial E}{\partial w^{(1)} \cdot {21}} \approx 0.01336 \times 0.10 = 0.001336.\]

对隐藏单元 $2$ 的权重:

\[\frac{\partial E}{\partial w^{(1)} \cdot {12}} \approx 0.01497 \times 0.05 = 0.000749.\] \[\frac{\partial E}{\partial w^{(1)}_{22}} \approx 0.01497 \times 0.10 = 0.001497.\]

偏置梯度分别为 $\delta^{(1)}_1 \approx 0.01336$,$\delta^{(1)}_2\approx 0.01497$。


采用学习率更新参数(举例:学习率 $\eta = 0.5$)

按梯度下降:

\[w \leftarrow w - \eta \frac{\partial E}{\partial w}\]

举几个更新后的值(近似):

隐藏层权重:

(其余按相同方法更新)

做一次这样的前向 + 反向并更新,损失会下降(通常如此),重复多次、使用多样本 / 小批量就能训练网络。

6. 小建议

7. 小概要