梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效。在神经网络的训练中经常使用反向传播算法来高效地计算梯度。本文,我们来学习和理解反向传播算法。
一、为什么要用反向传播算法计算每一层的梯度?
梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效。因此在神经网络的训练中,经常使用反向传播算法来高效地计算梯度。
反向传播算法其实就是一种高效应用链式法则的方法。简单来说,虽然理论上可以对每个参数逐一利用链式法则求偏导,但在深层网络中直接这样做会导致大量重复计算和计算资源浪费。反向传播通过以下方式解决了这一问题:
-
重用中间计算结果
前馈神经网络是分层结构,每一层的计算结果在后续层都会被使用。反向传播利用这一点,从输出层开始逐层计算梯度,并将每一层计算得到的中间梯度存储下来,以便在计算前一层梯度时重复使用,从而避免重复计算相同的部分。
-
高效组织梯度计算
反向传播算法按照"从后向前"的顺序进行,通过递归地应用链式法则,将损失函数关于每一层输出的梯度逐层传递给前一层。这种方式类似于动态规划,能够在每一层只计算一次梯度,然后在整个网络中传播,极大地提高了效率。
-
向量化计算
反向传播可以利用矩阵运算和向量化操作,使得整个梯度计算过程可以并行化、批量化地处理,这在现代深度学习框架中非常重要,能够充分利用 GPU 等硬件加速。
虽然链式法则是梯度计算的理论基础,但在深度神经网络中逐个参数计算梯度会非常低效。反向传播算法通过分层传递和重用中间梯度,组织出一种高效、系统的方法来计算所有参数的梯度,从而使得整个网络训练在计算上变得可行和高效。
二、从数学角度需要搞清楚的几个关键公式
假设采用随机梯度下降进行神经网络参数学习,给定一个样本 (𝒙, 𝒚),将其输入到神经网络模型中,得到网络输出为 𝒚̂。假设损失函数为 L(𝒚, 𝒚̂),要进行参数学习就需要计算损失函数关于每个参数的导数。
这里我们先来回顾一下,前馈神经网络的数学表示:

首先根据第𝑙−1层神经元的活性值(Activation)𝒂(𝑙−1) 计算出第𝑙层神经元的净活性值(NetActivation)𝒛(𝑙),然后经过一个激活函数得到第 𝑙 层神经元的活性值。
不失一般性,对第 𝑙 层中的参数 𝑾 (𝑙) 和 𝒃(𝑙) 计算偏导数。根据链式法则:

上面2个公式的第二项都是目标函数关于第 𝑙 层的神经元 𝒛(𝑙)的偏导数,称为误差项。请大家记住并理解这个概念,它很关键。
下面分别来计算这三个偏导数:
1、第一个偏导数:

2、第二个偏导数:

3、第三个偏导数:
表示第 𝑙 层神经元对最终损失的影响,也反映了最终损失对第 𝑙 层神经元的敏感程度,因此一般称为第 𝑙 层神经 元的误差项,用 𝛿(𝑙) 来表示:

误差项𝛿(𝑙) 也间接反映了不同神经元对网络能力的贡献程度,从而比较好地解决了贡献度分配问题(Credit Assignment Problem,CAP)。
根据链式法则,第 𝑙 层的误差项为:

其中 ⊙ 是向量的 Hadamard 积运算符,表示每个元素相乘,这里注意区别于矩阵相乘。
从上面的公式可以看出,第 𝑙 层的误差项可以通过第 𝑙 + 1 层的误差项计算得到,这就是误差的反向传播(BackPropagation,BP)。反向传播算法的含义是: 第 𝑙 层的一个神经元的误差项(或敏感性)是所有与该神经元相连的第 𝑙 + 1 层 的神经元的误差项的权重和。然后,再乘上该神经元激活函数的梯度(即导数)。
4、在计算出上面三个偏导数之后,我们可以得出损失函数对第 𝑙 层中的参数 𝑾 (𝑙) 和 𝒃(𝑙) 的偏导数:


在计算出每一层的误差项之后,我们就可以得到每一层参数的梯度。因此,使用误差反向传播算法的前馈神经网络训练过程可以分为以下三步:
(1) 前馈计算每一层的净输入 𝒛(𝑙) 和激活值 𝒂(𝑙),直到最后一层;
(2) 反向传播计算每一层的误差项 𝛿(𝑙)。
(3) 计算每一层参数的偏导数,并更新参数.
下面算法给出使用反向传播算法的随机梯度下降训练过程。有一些复杂,但是思路还是比较清晰的,感兴趣的同学可以深入了解一下。

三、举例说明:前馈神经网络参数学习与反向传播算法详解
(一)前馈神经网络基础
前馈神经网络(Feedforward Neural Network, FNN) 是一种由输入层、隐藏层和输出层组成的网络结构,数据单向流动(无循环)。其核心任务是学习从输入到输出的映射关系,通过调整权重和偏置参数,使预测输出尽可能接近真实值。
参数学习目标 :
最小化损失函数 LL,通过梯度下降优化参数 W 和 b。
(二)反向传播算法(Backpropagation)的核心思想
反向传播是一种高效计算损失函数对参数梯度的算法,其核心是 链式法则(Chain Rule)。具体步骤分为:
-
前向传播:计算网络输出和损失。
-
反向传播:从输出层到输入层逐层计算梯度。
-
参数更新:使用梯度下降调整参数。
(三)反向传播算法详细推导
以如下网络为例:
-
输入层:2个神经元(输入 x1,x2)
-
隐藏层:2个神经元(激活函数为 Sigmoid)
-
输出层:1个神经元(激活函数为 Sigmoid)
1. 前向传播
-
输入层到隐藏层:
-
隐藏层到输出层:
2. 损失函数
使用均方误差(MSE):

3. 反向传播(梯度计算)
目标 :
步骤1:输出层梯度
-
误差信号 δ2:
其中 Sigmoid 导数:
-
参数梯度:
步骤2:隐藏层梯度
-
误差信号 δ1:
其中 Sigmoid 导数:
-
参数梯度:
4. 参数更新
使用梯度下降更新参数(学习率 ηη):

(四)具体例子说明
以输入样本 x=[1,0],真实标签 y=1 为例:
1. 网络参数初始化

2. 前向传播
-
隐藏层输入:
-
隐藏层输出:
-
输出层输入:
-
预测输出:
3. 损失计算

4. 反向传播
-
输出层梯度:
-
隐藏层梯度:
5. 参数更新(学习率 η=0.1)

(五)关键总结
-
链式法则:反向传播通过链式法则逐层计算梯度,从输出层到输入层反向传递误差。
-
梯度计算:
-
输出层梯度直接由损失和激活导数计算。
-
隐藏层梯度由上游误差 Wδ 与激活导数逐元素相乘(哈达玛积)得到。
-
-
参数更新:梯度下降沿负梯度方向调整参数,逐步最小化损失函数。
反向传播的本质:通过高效计算梯度,指导参数向损失减小的方向调整,最终使网络具备强大的非线性映射能力。