在人工智能的历史中,有少数几个关键思想如同催化剂般,彻底改变了整个领域,并开辟了全新的可能性。1986 年,David RumelhartGeoffrey HintonRonald Williams 发表的论文 《通过反向传播误差学习表征》 (Learning Representations by Back-Propagating Errors) ,正是这样一项突破。

这篇奠基性的论文提出了一种强大而优雅的算法,教会了神经网络如何从错误中学习:** 反向传播 (backpropagation)** 。

在此之前,训练多层神经网络是一个出了名的难题。研究人员知道,深度网络理应比浅层网络更强大,但他们缺乏一种实用且通用的方法来训练它们。像感知器收敛过程这样的算法只能处理线性可分的问题,而多层网络中的隐藏单元在目标输出未知的情况下,没有有效的方法来调整权重。

这就是经典的信用分配问题 (credit assignment problem) : 当网络出错时,应该由哪条连接负责?每条连接又该调整多少?

反向传播算法给出了这个问题的系统化解答。它为每一个连接分配功劳 (或责任) ,使深度网络能够学习到有意义的内部特征。这不仅仅是另一种训练方法——它是解锁深度学习潜力的关键之钥。


架构: 分层前馈网络

作者在解释反向传播时,选取了最简单的一种深度网络结构:** 分层前馈网络 (layered, feed-forward network)** 。

想象一个垂直的堆叠结构:

  • 输入层在底部。
  • 中间是任意数量的隐藏层
  • 输出层在顶部。

信息只在层与层之间向上流动——没有层内连接,也没有反馈回路。

前向传播 (forward pass) 过程中,数据从输入向上流向输出,每个单元根据来自下层的信号计算其激活值。

步骤 1: 单元的总输入

对于一个单元 \( j \),其总输入 \( x_j \) 是来自前一层单元 \( i \) 的输出 \( y_i \) 的加权和:

一个神经元总输入的计算公式,即与之相连的神经元输出乘以它们各自权重的总和。

这是一个简单的线性组合。但仅靠线性无法模拟复杂的函数——因此我们接下来应用一个非线性变换。

步骤 2: 应用非线性激活函数

论文使用了 sigmoid 函数,它将任意实数输入压缩到 (0, 1) 区间:

Sigmoid 激活函数,它将总输入 x_j 转换为一个介于 0 和 1 之间的输出 y_j。

这种“压缩”函数让神经元能够表示平滑、渐变的激活值,并引入了非线性能力。该过程在每一层重复执行,将输入向量一步步转换为网络的最终预测。


学习目标: 最小化误差

一旦网络产生输出,我们需要衡量它与期望目标之间的差距。作者使用了所有输出单元和所有训练样本的平方误差和 (sum of squared errors) :

总误差 E 是所有训练案例 c 和所有输出单元 j 的实际输出 y 与期望输出 d 之差的平方和的一半。

这里:

  • \( c \) 是训练案例的索引。
  • \( j \) 是输出单元的索引。
  • \( y_j \) 是实际输出。
  • \( d_j \) 是期望输出。

目标是调整权重,使 \( E \) 尽可能小。

为了找到最佳权重,作者采用梯度下降 (gradient descent) ——迭代地将权重沿误差梯度的反方向调整,以达到一个 (希望是全局的) 最小值。


核心方法: 反向传播误差

前向传播阶段计算激活值,而反向传播 (backward pass) 阶段则从输出层开始,逐层计算每个单元的误差信号。这是通过微积分中的链式法则 (chain rule) 来实现的。

步骤 1: 输出激活值的误差导数

将误差函数对输出 \( y_j \) 求偏导:

误差 E 相对于一个输出单元激活值 y_j 的偏导数,即实际输出 y_j 与期望输出 d_j 之差。

这个结果十分直观——输出误差就是“预测值减去目标值”。

步骤 2: 误差相对于总输入的导数

使用链式法则来求 \(\partial E / \partial x_j\):

使用链式法则求误差相对于总输入 x_j 的导数。

sigmoid 函数的导数是 \( y_j(1 - y_j) \),因此得到:

误差相对于一个输出单元总输入 x_j 的导数的最终表达式。

这个值通常被称为 delta (\(\delta_j\)),即单元输入端的误差信号。

步骤 3: 每个权重的梯度

权重 \( w_{ji} \) 的梯度为:

误差相对于权重 w_ji 的导数,是单元输入端的误差与发送信号的单元输出 y_i 的乘积。

一个连接的改变量更大,取决于:

  1. 发送信号单元的激活度是否高。
  2. 接收信号单元的误差信号是否大。

步骤 4: 将误差反向传播到隐藏层

对于一个隐藏单元 \( i \),我们没有目标输出。它的误差是它所连接的下一层所有单元误差信号的加权和:

一个隐藏单元输出的误差导数,是来自下一层误差信号的加权和。

重复步骤 2 和 3,就可以将 delta 信号一层层向后传递,直到到达输入层。

步骤 5: 更新权重

一旦计算出所有梯度 \(\partial E / \partial w\),就通过梯度下降来更新权重:

梯度下降的基本权重更新规则,其中 epsilon 是学习率。

这里,\(\varepsilon\) 是学习率 (learning rate) 。作者还在此基础上引入了动量 (momentum) 项:

带有动量项的权重更新规则,其中 alpha 控制了前一次权重变化的影响。

动量 (\(\alpha\)) 有助于加快学习速度并平滑振荡。


实验 1: 检测对称性

反向传播的一个测试任务是对称性检测问题: 判断一个二进制输入模式是否关于中心对称。

图 1: 一个用反向传播训练来检测镜像对称的网络。权重和偏置揭示了一种巧妙的策略: 对称模式会相互抵消。

训练好的网络使用两个隐藏单元,其对镜像输入的权重呈对称且符号相反的关系。当输入对称时,隐藏单元的净输入为零,从而保持不激活;这时输出单元会被激活。非对称模式则会激活一个隐藏单元,从而抑制输出。这表明算法能够发现抽象的高阶特征。


实验 2: 学习家庭关系

作者还展示了反向传播在符号数据上的应用——两个同构的家谱树,一个为英语版本,一个为意大利语版本。

图 2: 用于训练数据的两个同构家谱树。网络的任务是学习诸如“Colin 的姑姑是谁?”这样的关系。

网络接收一个三元组的前两个元素 (例如 <Colin> <has-aunt>) ,并必须输出正确的第三个元素。

图 3: 用于家谱树任务的五层网络架构。它在隐藏层中学习了人物和关系的分布式表征。

通过检查隐藏单元的感受野,可以观察到分布式表征 (distributed representations) :

图 4: 从输入单元 (人物) 到六个隐藏单元的权重可视化。模式表明,这些单元已经学会了表示抽象特征。

这些隐藏单元分别捕捉到:

  • 单元 1: 区分英语与意大利语。
  • 单元 2: 家谱中的代际信息。
  • 单元 6: 家族分支归属。

这正是表征学习 (representation learning) 的体现: 网络将原始输入特征提炼成抽象概念,从而具备了泛化能力。


扩展到循环网络

反向传播也能扩展到循环网络 (recurrent networks) ,方法是在时间维度上将其“展开”为一个具有共享权重的等效前馈网络。

图 5: 一个运行三个时间步的循环网络与一个具有共享权重的三层前馈网络之间的等效关系。

这使得在序列模型中同样可以应用反向传播的原理。


结论与深远影响

Rumelhart、Hinton 和 Williams 总结道,尽管反向传播的误差曲面可能包含局部最小值,但在实践中这些很少会严重阻碍学习过程——尤其是当网络的连接多于最低需求时。

虽然该算法并不符合生物学现实,但它证明了在权重空间中进行梯度下降能够产生丰富的内部特征表征。这为此后数十年的研究与现代深度学习奠定了基础。

1986 年的这篇论文以一种实用的方法解决了信用分配问题,并证明了网络可以从数据中自主构建有用的抽象概念。今天的每一个神经网络模型——从图像分类器到大型语言模型——都建立在这一思想之上。

反向传播至今仍然是一个精彩的例子,展示了如何通过巧妙运用微积分,教会机器去学习。没有它,深度学习革命或许会推迟几十年。