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

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

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

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

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

  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. 参数更新:梯度下降沿负梯度方向调整参数,逐步最小化损失函数。

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

相关推荐
problc6 分钟前
Manus AI 全球首款通用型 Agent,中国制造
大数据·人工智能·制造
xiangzhihong88 分钟前
GitHub神秘组织3小时极速复刻Manus
人工智能·深度学习·机器学习
总斯霖12 分钟前
题解:士兵排列
数据结构·c++·算法
稳兽龙17 分钟前
P4268 [USACO18FEB] Directory Traversal G
c++·算法·换根dp
博云技术社区28 分钟前
DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元
人工智能·博云·deepseek
ZHOU_WUYI36 分钟前
Process-based Self-Rewarding Language Models 论文简介
人工智能·深度学习
优维科技EasyOps1 小时前
优维眼中的Manus:AI工程化思维重构Agent的运维端启示
运维·人工智能·重构
碣石潇湘无限路1 小时前
【奇点时刻】通义千问开源QwQ-32B技术洞察报告(扫盲帖)
人工智能·开源
西猫雷婶1 小时前
神经网络|(十五)|霍普菲尔德神经网络-Storkey 训练
人工智能·深度学习·神经网络
张申傲1 小时前
DeepSeek + ReAct 实现 Agent
人工智能·ai·chatgpt·aigc·deepseek