前馈神经网络 - 反向传播算法

梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效。在神经网络的训练中经常使用反向传播算法来高效地计算梯度。本文,我们来学习和理解反向传播算法。

一、为什么要用反向传播算法计算每一层的梯度?

梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效。因此在神经网络的训练中,经常使用反向传播算法来高效地计算梯度。

反向传播算法其实就是一种高效应用链式法则的方法。简单来说,虽然理论上可以对每个参数逐一利用链式法则求偏导,但在深层网络中直接这样做会导致大量重复计算和计算资源浪费。反向传播通过以下方式解决了这一问题:

  1. 重用中间计算结果

    前馈神经网络是分层结构,每一层的计算结果在后续层都会被使用。反向传播利用这一点,从输出层开始逐层计算梯度,并将每一层计算得到的中间梯度存储下来,以便在计算前一层梯度时重复使用,从而避免重复计算相同的部分。

  2. 高效组织梯度计算

    反向传播算法按照"从后向前"的顺序进行,通过递归地应用链式法则,将损失函数关于每一层输出的梯度逐层传递给前一层。这种方式类似于动态规划,能够在每一层只计算一次梯度,然后在整个网络中传播,极大地提高了效率。

  3. 向量化计算

    反向传播可以利用矩阵运算和向量化操作,使得整个梯度计算过程可以并行化、批量化地处理,这在现代深度学习框架中非常重要,能够充分利用 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)。具体步骤分为:

  1. 前向传播:计算网络输出和损失。

  2. 反向传播:从输出层到输入层逐层计算梯度。

  3. 参数更新:使用梯度下降调整参数。

(三)反向传播算法详细推导

以如下网络为例:

  • 输入层: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)

(五)关键总结

  1. 链式法则:反向传播通过链式法则逐层计算梯度,从输出层到输入层反向传递误差。

  2. 梯度计算

    • 输出层梯度直接由损失和激活导数计算。

    • 隐藏层梯度由上游误差 Wδ 与激活导数逐元素相乘(哈达玛积)得到。

  3. 参数更新:梯度下降沿负梯度方向调整参数,逐步最小化损失函数。

反向传播的本质:通过高效计算梯度,指导参数向损失减小的方向调整,最终使网络具备强大的非线性映射能力。

相关推荐
说私域3 分钟前
基于开源AI大模型AI智能名片S2B2C商城小程序的参与感构建研究
人工智能·小程序·开源
空白到白9 分钟前
决策树-面试题
算法·决策树·机器学习
flashlight_hi10 分钟前
LeetCode 分类刷题:2563. 统计公平数对的数目
python·算法·leetcode
java1234_小锋11 分钟前
Scikit-learn Python机器学习 - 特征预处理 - 归一化 (Normalization):MinMaxScaler
python·机器学习·scikit-learn
码蛊仙尊14 分钟前
2025计算机视觉新技术
人工智能·计算机视觉
西猫雷婶17 分钟前
scikit-learn/sklearn学习|广义线性回归损失函数的基本表达式
深度学习·神经网络·学习·机器学习·线性回归·scikit-learn·概率论
星空的资源小屋24 分钟前
网易UU远程,免费电脑远程控制软件
人工智能·python·pdf·电脑
前端世界26 分钟前
HarmonyOS 数据处理性能优化:算法 + 异步 + 分布式实战
算法·性能优化·harmonyos
楼田莉子29 分钟前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode
IMER SIMPLE30 分钟前
人工智能-python-深度学习-神经网络-MobileNet V1&V2
人工智能·python·深度学习