🧠 一、什么是计算图?
定义:
计算图是一种有向无环图(DAG, Directed Acyclic Graph) ,用于表示计算过程。图中的节点 表示操作(函数或运算),边表示数据(张量)在操作之间的流动。
举个简单例子:
设有函数:
z = (x + y) \\times (x - y)
可以拆解为一系列中间操作:
- ( a = x + y )
- ( b = x - y )
- ( z = a \times b )
这就是一个计算图:
x y
\ /
+ -
| |
a b
\ /
*
|
z
🧮 二、计算图的两种主要操作
1. 前向传播(Forward Pass)
- 按照计算图的拓扑顺序,从输入到输出逐步执行操作,计算出最终结果。
- 举例:给定 (x = 3, y = 2),按图从头算出 (z = (x + y)(x - y) = 5 \times 1 = 5)
2. 反向传播(Backward Pass)
- 按照链式法则,从输出反向计算梯度(偏导数),用于神经网络的参数更新。
- 计算每个中间变量对最终输出的导数(如 (\frac{\partial z}{\partial x}),(\frac{\partial z}{\partial y}))。
⚙️ 三、为什么要用计算图?
✅ 自动微分(Automatic Differentiation)
- 计算图是实现自动微分(特别是反向模式自动微分,即反向传播)的基础。
- 对神经网络中成千上万的参数,手动求导几乎不可能,计算图让这个过程自动化。
✅ 并行优化
- 由于计算图是结构化的 DAG,可以进行并行计算优化、子图融合等,提高计算效率。
✅ 可视化与调试
- 计算图可视化有助于理解模型结构,发现错误或优化模型。
🔁 四、静态图 vs 动态图
特性 | 静态计算图(Static Graph) | 动态计算图(Dynamic Graph) |
---|---|---|
框架 | TensorFlow 1.x、Theano | PyTorch、TensorFlow 2.x |
构建时间 | 先定义整个图,再执行 | 每一步都即时构建和执行 |
灵活性 | 较低 | 更高,支持动态控制流 |
性能 | 更容易优化和部署 | 灵活但稍慢 |
🧱 五、计算图的构成元素
-
变量节点(Variable Nodes)
- 表示输入、权重、偏置等可学习参数。
-
常量节点(Constant Nodes)
- 表示不可学习的固定数值。
-
操作节点(Operation Nodes)
- 表示加、减、乘、除、激活函数(如 ReLU、Sigmoid)等运算。
-
中间结果节点
- 储存运算过程中的临时变量,供后续操作使用。
📈 六、一个例子:简单神经网络中的计算图
设一个简单的前馈神经网络:
\\begin{align\*} z_1 \&= W_1 x + b_1 a_1 \&= \\text{ReLU}(z_1) z_2 \&= W_2 a_1 + b_2 \\hat{y} \&= \\text{Softmax}(z_2) \\end{align\*}
计算图的节点包括矩阵乘法、加法、激活函数等,自动微分就可以从 (\hat{y}) 反向求导,更新参数 (W_1, b_1, W_2, b_2)。
🔚 七、总结
优点 | 描述 |
---|---|
高效 | 支持大规模并行计算、自动微分 |
灵活 | 支持复杂网络结构(循环、残差等) |
可扩展 | 各种深度学习框架都基于它构建 |
自动化 | 免去手动推导导数的烦恼 |