深度学习中的反向传播:完整、直观且实用的指南
Source: Dev.to
引言:反向传播为何重要
反向传播是现代深度学习背后的 学习引擎。
每当神经网络提升预测能力——无论是人脸识别还是文本生成——其提升都来源于一种机制:使用梯度调整权重,而这些梯度正是通过反向传播计算得到的。
为什么这很重要
- 神经网络本质上是一个拥有数百万甚至数十亿权重的巨型参数化函数。
- 反向传播提供了一种高效的方法,计算每个权重对最终误差的贡献程度。
- 没有反向传播,训练深度模型将几乎不可能实现——你必须为每个权重独立重新计算偏导数,这会导致指数级的计算量。
- 反向传播使学习 实用 且 高效,即使是非常大的模型也能训练。
它还构成了以下技术的基础:
- 卷积网络
- Transformer
- 扩散模型
- 强化学习
- 大语言模型
简而言之,反向传播是现代人工智能的支柱。
什么是神经网络真正计算的内容(前向传播概述)
在理解反向传播之前,我们需要清晰地了解网络在 前向传播 中的工作原理,因为反向传播只是 该计算的逆过程。
从本质上讲,神经网络在各层之间反复执行以下三步:
- 获取 前一层的输入。
- 使用权重和偏置进行线性变换。
- 将结果通过非线性激活函数。
# 数学上,对单层而言:
z = W @ x + b # 线性组合(激活前)
a = f(z) # 激活
其中
x= 输入向量W= 权重矩阵b= 偏置向量z= 线性组合(激活前)f(·)= 激活函数(ReLU、Sigmoid 等)a= 输出(激活)
深层网络只是 一次又一次地重复 这一过程。每一层都将输入转换为一种表示,使得最终任务(无论是分类、检测、语言建模还是其他任务)更容易完成。
为什么这对反向传播很重要
- 前向传播会创建一个 计算图——一个操作链,其中每个输出都依赖于之前的输出。
- 反向传播将在该图的相反方向移动,计算 每个权重的变化如何影响最终损失。
- 了解前向传播中的精确操作有助于我们理解梯度是如何向后流动的。
反向传播背后的核心思想
“网络中的每个权重应该如何改变以降低最终误差?”
神经网络可能拥有数百万个参数,每个参数以略有不同的方式影响输出。反向传播提供了一种系统化的方法,能够高效地计算这些影响。
简单步骤
- 计算损失 – 前向传播结束后,将模型的预测与真实标签进行比较,计算预测有多“错误”。
- 确定损失相对于最后一层输出的变化 – 这告诉我们模型应当立即朝哪个方向进行调整。
- 逐层向后移动 – 使用链式法则,我们找出损失如何依赖于:
- 每一层的激活值
- 每一层的权重
- 每一层的输入
- 累计梯度 – 每个权重都会得到一个梯度值,告诉我们:
- 方向(正向或负向)
- 大小(更新的强度)
- 更新权重 – SGD、Adam 等优化器利用这些梯度,将权重移动到稍微更好的值。
关键洞察
反向传播 不 为每个权重从头计算梯度。它复用前向传播中的中间结果,从而使整个过程高效。
理解计算图
神经网络可以被视为一个计算图——一个操作序列,其中每个节点代表一个数学函数,每条边代表数据的流动。
为什么这个图很重要
- 在前向传播过程中产生的每个值(如
z、a、activations 等)都会成为图的一部分。 - 反向传播依赖此图来了解输出如何取决于之前的计算。
- 深度学习框架如 PyTorch 和 TensorFlow 会在后台自动构建此图。
Source: …
链式法则:反向传播的数学引擎
反向传播完全基于一个数学原理:微积分的链式法则。如果你理解链式法则,就理解了反向传播的核心。
为什么需要链式法则
- 在神经网络中,损失函数并不直接依赖于任意权重。
- 它依赖于:
- 最后一层的激活值
- 这些激活值依赖于前一层
- 前一层又依赖于再前一层
这形成了一条很长的依赖链。链式法则告诉我们,早期变量(比如权重)的微小变化如何影响最终的损失。
将链式法则应用于单层
# 前向计算
z = W @ x + b
a = f(z)
# 损失
L = Loss(a)
利用链式法则,损失相对于权重的梯度为:
[ \frac{\partial L}{\partial W} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial W} ]
其中
∂L/∂a– 损失随该层输出的变化率∂a/∂z– 激活函数对其输入的响应程度∂z/∂W– 本层输出对权重的依赖程度
步骤式单神经元反向传播
现在链式法则和计算图的概念已经清晰,让我们在 单个神经元内部 进行反向传播的演练。
这是神经网络中最小的单元,理解它可以消除对更深层模型的大部分困惑。
前向传播(单神经元)
神经元的计算过程:
z = W * x + b
a = f(z)
# where
# x → input
# W → weight
# b → bias
# f → activation function
# a → output of the neuron
# L(a) → loss function
反向传播(目标:计算梯度)
对激活输出的梯度
[ \frac{\partial L}{\partial a} ]
通过激活函数的梯度
[ \frac{\partial L}{\partial z}= \frac{\partial L}{\partial a}; f’(z) ]
对权重的梯度
因为 (z = W x + b),
[ \frac{\partial z}{\partial W}=x ]
[ \frac{\partial L}{\partial W}= \frac{\partial L}{\partial z}; x ]
对偏置的梯度
[ \frac{\partial z}{\partial b}=1 \quad\Rightarrow\quad \frac{\partial L}{\partial b}= \frac{\partial L}{\partial z} ]
对输入的梯度
[ \frac{\partial L}{\partial x}= \frac{\partial L}{\partial z}; W ]
结论
反向传播不仅仅是一个数学过程——它是使神经网络能够学习的核心机制。
一旦你理解了梯度在网络中的传播方式,你就能够推理以下问题:
- 为什么某些架构训练效果好?
- 为什么其他架构会失败?
- 初始化、激活函数、归一化和残差连接如何影响梯度行为?
- 什么因素使得 Transformer、CNN 和深层 RNN 稳定?
- 如何自信地调试训练问题?
对反向传播的直觉越深入,你在设计和改进模型时就越得心应手。
