1. 引言

现代深度学习框架为我们提供了非常直观的接口来设置网络层、调整超参数以及评估模型性能。但要真正理解模型的运行机制,以及在讨论结果时更有底气,我们需要掌握一些基本概念。

本文将重点讲解 前向传播网络(Feedforward Neural Networks)反向传播算法(Backpropagation) 的区别和各自作用。

2. 前向传播网络

前向传播网络是深度学习中最基础的模型结构,由人工神经元按层组织而成。其最大特点是 信号仅从输入层向输出层单向流动,不包含任何反馈或循环连接。

2.1 神经元的计算原理

每个神经元接收一组输入 x_1, x_2, \ldots, x_n,通过加权求和加上偏置项,再经过激活函数处理,输出激活值 h

(1)   \begin{equation*}  h = \sigma(z) = \sigma \left(b + \sum_{i=1}^{n}w_i\cdot x_{i}\right) \end{equation*}

其中:

  • b 是偏置项(bias)
  • w_i 是权重(weights)
  • \sigma 是激活函数,如 ReLU 或 Sigmoid

下图展示了一个神经元的结构:

Artificial Neuron

2.2 层与前向传播

神经网络由多个神经元层组成,输入层、隐藏层和输出层之间通过前向传播进行数据流动。例如:

forward propagation

图中:

  • x_1x_2 是输入
  • h_1h_2 是隐藏层输出
  • y_1y_2 是最终输出
  • b_{1}b_{2} 是偏置项,会在训练阶段调整

前向传播网络的核心特征是 没有反向连接,所有信号只从前向后流动。

2.3 示例:图像分类任务

假设我们要构建一个简单的图像分类器,判断图像中是否为狗。为了简化问题,假设只用两个灰度像素值 x_1x_2 进行判断(取值范围:[0, 255])。

网络结构如下:

forward propagation: example

设定输入值为:

  • x_1 = 150
  • x_2 = 34

激活函数为恒等函数(identity function):

(2)   \begin{equation*} h_{1}= \sigma(z_1) = \sigma(w_{1}x_{1}+w_{2}x_{2}+b_{1}) = \sigma(0.2 \cdot 150 + 0.5 \cdot 34 + 3) = \sigma(50) \end{equation*}

因为使用的是恒等函数,所以:

(3)   \begin{equation*} h_{1} = 50 \end{equation*}

同理可得 h_2y_1y_2

3. 反向传播算法

在训练神经网络时,我们通过 反向传播(Backpropagation) 来计算损失函数对各个参数的梯度,从而更新权重和偏置,使模型输出更接近真实值。

3.1 损失函数(Cost Function)

假设我们有一个二分类任务,输出层有两个神经元:

  • y_1 表示“猫”的概率
  • y_2 表示“狗”的概率

对于一张真实为“猫”的图片,期望输出是:

  • y_1 = 1
  • y_2 = 0

如果模型输出为:

  • y_1 = 0.25
  • y_2 = 0.65

则误差为:

(4)   \begin{equation*} (0.25 - 1)^2 + (0.65 - 0)^2 = 0.185 \end{equation*}

整个训练集的损失函数 J 是所有样本误差的平均值:

(5)   \begin{equation*} J = \frac{1}{n} \sum_{i=1}^{n} || \mathbf{y}_i - \widehat{\mathbf{y}}_i ||^2 = \frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{m} (y_{i,j} - \hat{y}_{i,j})^2 \end{equation*}

3.2 偏导数计算

反向传播的核心是计算损失函数对每个参数的偏导数。以一个简单网络为例:

backpropagation: example

其中激活函数为恒等函数。要更新权重 w_2,我们需要计算:

(6)   \begin{equation*}  \frac{\partial{J}}{\partial{w_{2}}} = \frac{\partial{z_{2}}}{\partial{w_{2}}} \;\frac{\partial{y}}{\partial{z_{2}}} \;\frac{\partial{J}}{\partial{y}} \end{equation*}

3.3 示例:具体计算过程

以公式 (6) 为例,我们依次计算:

(7) 损失对输出的偏导数:

(7)   \begin{equation*} \frac{\partial{J}}{\partial{y}}= \frac{\partial{(y-\hat{y}})^{2}}{\partial{y}}=2(y-\hat{y}) \end{equation*}

(8) 输出对输入的偏导数(激活函数导数):

(8)   \begin{equation*} \frac{\partial{y}}{\partial{z_{2}}} = \frac{\partial{\sigma}}{\partial{z_{2}}} = \frac{\partial z_2}{ \partial z_2} = 1 \end{equation*}

(9) 输入对权重的偏导数:

(9)   \begin{equation*} \frac{\partial{z_{2}}}{\partial{w_{2}}} = \frac{\partial({w_{2}h+b_{2})}}{\partial{w_{2}}} = h \end{equation*}

(10) 最终偏导数:

(10)   \begin{equation*} \frac{\partial{J}}{\partial{w_{2}}} = h \cdot 2(y-\hat{y}) \end{equation*}

3.4 训练中的反向传播流程

假设当前训练阶段有:

  • h = 0.0125
  • 期望输出  \hat{y} = 1
  • 当前输出  y = 1.2

代入公式 (10):

(11)   \begin{equation*} \frac{\partial{J}}{\partial{w_{2}}} = 0.0125 \cdot 2 \cdot (1.2 - 1) = 0.005 \end{equation*}

设学习率为  \eta = 0.01 ,更新权重:

(12)   \begin{equation*} w_{2} = w_{2} - \eta \cdot \frac{\partial{J}}{\partial{w_{2}}} = 0.1 - 0.01 \cdot 0.005 = 0.09995 \end{equation*}

3.5 训练方式变体

除了对整个训练集进行反向传播外,还有以下常见训练方式:

  • Mini-batch Gradient Descent:每次使用一小批样本更新参数
  • ✅ **Stochastic Gradient Descent (SGD)**:每次使用一个样本更新参数

这些方法在计算效率和收敛性之间做了权衡。

3.6 通用偏导公式

对于任意一个连接第 k 层神经元 j 与第 k+1 层神经元 i 的权重 w_{i,j}^{k},其偏导公式为:

(15)   \begin{equation*} \frac{\partial{J}}{\partial{w_{i,j}^{k}}} = \frac{\partial{z_{i}^{k+1}}}{\partial{w_{i,j}^{k}}} \;\frac{\partial{h_{i}^{k+1}}}{\partial{z_{i}^{k+1}}} \;\frac{\partial{J}}{\partial{h_{i}^{k+1}}} \end{equation*}

同样可得偏置项的偏导公式:

(16)   \begin{equation*} \frac{\partial{J}}{\partial{b_{k+1}}} = \frac{\partial{z_{i}^{k+1}}}{\partial{b_{k+1}}} \;\frac{\partial{h_{i}^{k+1}}}{\partial{z_{i}^{k+1}}} \;\frac{\partial{J}}{\partial{h_{i}^{k+1}}} \end{equation*}

3.7 反向传播 ≠ 训练算法

⚠️ 注意:反向传播只是计算梯度的方法,不是训练算法本身。实际更新参数的是优化算法,如:

  • ✅ Gradient Descent
  • ✅ Stochastic Gradient Descent (SGD)
  • ✅ Adam(Adaptive Moment Estimation)

此外,反向传播不仅适用于前向传播网络,也可以用于 RNN 等具有反馈结构的网络。

4. 总结

  • 前向传播网络 是一种没有反馈连接的神经网络结构,数据从输入层流向输出层。
  • 反向传播算法 是用于计算损失函数对模型参数梯度的数学方法,用于更新权重和偏置。
  • ✅ 在模型推理阶段,数据仅向前流动;而在训练阶段,反向传播负责从输出反向更新参数。

理解这两者的区别,有助于我们更好地掌握神经网络的工作原理,也能在调试和优化模型时更有方向感。


原始标题:Differences Between Backpropagation and Feedforward Networks