核心要点

  • 能说清计算图是有向无环图:节点是运算(matmul、relu),边是流动的张量,它显式表达了依赖关系

  • TF 1.x 是「先定义整张图、再用 Session.run 执行」的声明式范式,便于全局优化与多设备放置,但调试困难

  • TF 2.x 默认 Eager 即时执行(像普通 Python),用 @tf.function 把函数追踪成图以换取性能和可部署性

  • 有了计算图才能做自动微分:反向时沿图按链式法则回传梯度

简要回答

计算图(Computation Graph) 将数学运算表示为 DAG(有向无环图)

  • 节点(Node):运算(matmul、relu、add)
  • 边(Edge):张量数据流

TF 1.x 范式

  1. 定义阶段:组装整张图(placeholder、Variable、op)
  2. 执行阶段Session.run 按拓扑序计算

优势:全局优化、多设备放置;

TF 2.x

  • 默认 Eager:运算立即执行,无显式大图
  • @tf.function:将 Python 函数追踪为图,获性能与部署优势
  • Autograph 将部分 Python 控制流转为图 op

PyTorch 动态图对比:TF 历史上偏声明式静态图

标准回答

计算图(Computation Graph) 将数学运算表示为 DAG(有向无环图)

  • 节点(Node):运算(matmul、relu、add)
  • 边(Edge):张量数据流

TF 1.x 范式

  1. 定义阶段:组装整张图(placeholder、Variable、op)
  2. 执行阶段Session.run 按拓扑序计算

优势:全局优化、多设备放置;劣势:调试难。

TF 2.x

  • 默认 Eager:运算立即执行,无显式大图
  • @tf.function:将 Python 函数追踪为图,获性能与部署优势
  • Autograph 将部分 Python 控制流转为图 op

与 PyTorch 动态图对比:TF 历史上偏声明式静态图;2.x 兼顾两者。理解计算图有助于读懂 反向传播 与分布式 placement。详见 反向传播原理

常见误区

⚠️ 常见踩坑

只说 1.x 静态图不提 2.x Eager;认为 PyTorch 没有计算图;混淆建图与训练本身。

追问

追问 1tf.function 如何追踪图?

首次以某组输入签名(dtype、shape)调用被装饰函数时,TF 以「追踪」模式跑一遍 Python 代码,把其中的 TF op 记录成一张 ConcreteFunction 图并缓存;之后相同签名的调用直接复用这张图、跳过 Python。不同输入签名会触发重新追踪(retracing)。注意:纯 Python 副作用(print、列表 append)只在追踪那一次执行,容易踩坑。

追问 2计算图如何做自动微分?

图记录了每个 op 及其输入输出依赖,每个 op 都注册了对应的梯度函数。反向时从损失节点出发,按拓扑逆序遍历图,对每个 op 用其梯度函数把上游梯度乘以本地偏导,沿边累加到各变量,即反向模式自动微分。TF 2.x 用 GradientTape 记录前向 op,再调用 tape.gradient 完成这一过程。

追问 3control dependency 是什么?

控制依赖用来强制 op 之间的执行顺序,即使它们没有数据依赖。例如更新 running mean 的赋值 op 与主计算无数据连接,需用 tf.control_dependencies 确保它在某步之前执行。它解决的是「图中无数据边、但仍需先后顺序」的副作用排序问题,常见于变量更新、队列入队等场景。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具