10 计算图(Computation Graph)
1. 背景与动机
在深度学习中,神经网络的计算通常分为两个阶段:
- 前向传播(Forward Propagation) :从输入开始,逐层计算,最终得到输出(例如损失函数 $J$)。
- 反向传播(Backward Propagation) :从输出 $J$ 出发,利用链式法则计算梯度(即偏导数),用于参数更新。
计算图 正是用来清晰地表示这两个过程的工具。它将复杂的函数分解为一系列基本运算,并以有向图的形式组织起来,使得前向计算和反向求导变得直观且系统化。
2. 简化示例:函数 $J = 3(a + bc)$
为了说明计算图,课程使用了一个比完整神经网络更简单的函数:
$$
J = 3(a + bc)
$$
这个函数可以分解为 三个计算步骤:
步骤 1:计算中间变量 $u$
$$
u = b \cdot c
$$
步骤 2:计算中间变量 $v$
$$
v = a + u
$$
步骤 3:计算最终输出 $J$
$$
J = 3v
$$
3. 构建计算图
计算图是一个有向无环图(DAG) ,节点表示变量或操作,边表示数据流向。
- 输入节点(叶节点) :$a, b, c$
- 中间节点:$u, v$
- 输出节点(根节点) :$J$
图结构如下(文字描述):
a ----\ |
- 从左到右(蓝色箭头):前向传播,计算 $J$ 的值。
- 从右到左(红色箭头):反向传播,计算 $\frac{\partial J}{\partial a}, \frac{\partial J}{\partial b}, \frac{\partial J}{\partial c}$。
4. 前向传播示例(数值代入)
设:
- $a = 5$
- $b = 3$
- $c = 2$
则逐步计算:
- $u = b \cdot c = 3 \times 2 = 6$
- $v = a + u = 5 + 6 = 11$
- $J = 3v = 3 \times 11 = 33$
验证原式:
$$
J = 3(a + bc) = 3(5 + 3 \times 2) = 3(5 + 6) = 3 \times 11 = 33 \quad \checkmark
$$
5. 为什么需要计算图?
- 模块化:将复杂函数拆解为简单操作(如加法、乘法),便于实现和调试。
- 自动微分基础:现代深度学习框架(如 TensorFlow、PyTorch)底层都依赖计算图来自动计算梯度。
- 高效反向传播:通过链式法则(Chain Rule) ,从输出 $J$ 反向逐层计算梯度,避免重复计算。
在后续课程中,将展示如何通过从右向左的反向遍历,高效计算:
$$
\frac{\partial J}{\partial a},\quad \frac{\partial J}{\partial b},\quad \frac{\partial J}{\partial c}
$$
6. 与神经网络的联系
- 在逻辑回归或神经网络中,$J$ 通常是损失函数(Loss Function) ,例如交叉熵损失。
- 我们的目标是最小化 $J$,因此需要知道 $J$ 对每个参数(如权重 $w$、偏置 $b$)的梯度。
- 计算图使得这一过程系统化、可扩展,即使网络有成千上万个参数,也能高效求导。
✅ 总结要点
| 概念 | 说明 |
|---|---|
| 计算图 | 将函数分解为基本运算的有向图,用于组织前向/反向计算 |
| 前向传播 | 从输入到输出,计算函数值(如 $J$) |
| 反向传播 | 从输出到输入,利用链式法则计算梯度 |
| 中间变量 | 如 $u = bc$, $v = a + u$,使复杂函数可分解 |
| 实际应用 | 是自动微分和深度学习框架的核心机制 |