当前位置: 首页 > news >正文

AI 术语通俗词典:计算图

计算图是深度学习、自动微分、神经网络训练和人工智能框架中非常重要的一个术语。它用来描述:把一次数学计算过程表示成由节点和边组成的图结构。换句话说,计算图是在回答:模型中的输入、参数、运算和输出之间,到底是如何一步步连接起来的。

如果说神经网络公式回答的是“模型算什么”,那么计算图回答的就是“这些计算按什么顺序发生,变量之间有什么依赖关系”。因此,计算图常用于理解前向传播、反向传播、自动微分、PyTorch、TensorFlow、损失函数和神经网络训练,是深度学习框架背后的核心机制之一。

一、基本概念:什么是计算图

计算图(Computational Graph)是一种用图结构表示数学计算过程的方法。

在计算图中:

• 节点表示变量、常量、参数或运算

• 边表示数据流动方向或依赖关系

例如,有一个简单计算:

这个计算可以拆成两步:

u = x × yz = u + b

对应的计算图可以理解为:

x ─┐ × → u ─┐y ─┘ + → zb ────────┘

其中:

• x、y、b 是输入节点

• × 是乘法运算节点

• u 是中间结果

• + 是加法运算节点

• z 是最终输出

从通俗角度看,计算图就是:把一个复杂公式拆成一步步计算,并画出每一步之间的依赖关系。

图 1:计算图的基本结构

它不仅记录最终结果,还记录:

• 这个结果从哪里来

• 中间经过了哪些运算

• 哪些变量影响了哪些变量

• 反向传播时梯度应该沿哪些路径传回去

因此,计算图是深度学习框架能够自动求导的重要基础。

二、为什么需要计算图

计算图之所以重要,是因为神经网络中的计算通常非常复杂。

一个神经网络可能包含:

• 输入数据

• 权重矩阵

• 偏置向量

• 矩阵乘法

• 激活函数

• 多层隐藏层

• 损失函数

• 正则化项

• 优化器更新

如果只看最终公式,很难清楚知道每个参数如何影响最终损失。

例如,一个简单神经元可以写为:

其中:

• x 是输入

• w 和 b 是参数

• z 是线性输入

• a 是激活输出

• y 是真实标签

• L 是损失

训练模型时,我们不仅要算出 L,还要知道:

也就是损失对每个参数的梯度。

计算图的作用就是:记录前向计算过程,并为反向传播提供求导路径。

从通俗角度看:前向传播需要一张“计算路线图”,反向传播需要沿着这张路线图把误差信号传回去。

如果没有计算图,深度学习框架就很难自动知道:

• 哪些参数参与了计算

• 梯度应该怎样传递

• 哪些中间结果需要保存

• 哪些运算需要应用链式法则

因此,计算图是自动微分和神经网络训练的结构基础。

三、计算图的组成:节点与边

计算图的核心组成是节点和边。

1、节点

节点可以表示两类内容。

第一类是数据节点,例如:

• 输入数据 x

• 权重 w

• 偏置 b

• 中间结果 z

• 输出 a

• 损失 L

第二类是运算节点,例如:

• 加法

• 乘法

• 矩阵乘法

• ReLU

• Sigmoid

• Softmax

• 均方误差

• 交叉熵损失

例如:

x → Linear → ReLU → Loss

这里的 Linear、ReLU、Loss 都可以看作运算节点。

2、边

边表示节点之间的数据依赖关系。

如果一个节点的输出会作为另一个节点的输入,就在它们之间建立一条边。

例如:

x → z → a → L

表示:

• z 依赖 x

• a 依赖 z

• L 依赖 a

从通俗角度看:节点表示“算什么”,边表示“谁依赖谁”。

计算图通过节点和边,把一个复杂计算过程组织成清晰结构。

四、一个简单计算图示例

假设有一个简单函数:

这是一个非常简单的回归损失。

可以把它拆成多个步骤:

z = wxa = z + be = a - yL = e²

对应的计算图可以写为:

w ─┐ × → z ─┐x ─┘ + → a ─┐b ────────┘ - → e → square → Ly ───────────────┘

其中:

• w 和 x 先相乘得到 z

• z 和 b 相加得到 a

• a 和 y 相减得到误差 e

• e 平方得到损失 L

从通俗角度看,这张计算图说明:损失 L 不是凭空出现的,它由预测值、真实值、权重、输入和偏置一步步计算得到。

训练模型时,我们希望调整 w 和 b,让 L 变小。

为此,需要计算:

计算图会帮助我们沿着 L 到 w、b 的路径反向应用链式法则。

五、计算图与前向传播

前向传播(Forward Propagation)就是按照计算图中边的方向,从输入一步步计算到输出。

例如,对于神经元:

前向传播过程是:

x, w, b → z → a → L

具体来说:

• 输入 x、参数 w、b 参与线性计算

• 得到 z

• z 经过 ReLU 得到 a

• a 与真实标签 y 计算损失 L

从通俗角度看,前向传播就是:数据沿着计算图从前往后流动,最终得到预测结果和损失。

在深度学习框架中,前向传播不仅计算结果,还会记录中间运算。

例如,框架需要记住:

• 哪些张量参与了计算

• 每一步用了什么运算

• 中间结果是什么

• 哪些参数需要梯度

这些信息会在反向传播时使用。

因此,前向传播不只是“算答案”,也是在为之后的求导保留线索。

六、计算图与反向传播

反向传播(Backpropagation)就是沿着计算图的反方向计算梯度。

前向传播方向是:

输入 → 中间结果 → 输出 → 损失

反向传播方向是:

损失 → 输出 → 中间结果 → 参数

以简单计算为例:

设:

z = wxa = z + be = a - yL = e²

反向传播会从 L 开始,依次计算:

这个过程依赖链式法则。

例如:

其中:

• ∂L/∂e 表示损失对误差的影响

• ∂e/∂a 表示误差对预测值的依赖

• ∂a/∂z 表示加法结果对 z 的依赖

• ∂z/∂w 表示乘法结果对权重的依赖

从通俗角度看:反向传播就是沿着计算图倒着追问:最终损失的变化,分别应该归因到哪些中间变量和参数上。

计算图越清楚,梯度传播路径就越清楚。

图 2:计算图中的前向传播与反向传播

七、动态计算图与静态计算图

深度学习框架中,计算图主要有两种组织方式:

• 动态计算图

• 静态计算图

1、动态计算图

动态计算图是在程序运行时即时构建的。

也就是说,每执行一次前向计算,框架就根据实际执行过程生成一张计算图。

PyTorch 采用的就是典型动态计算图机制。

例如:

y = x * w + bloss = (y - target) ** 2loss.backward()

在执行这些语句时,PyTorch 会自动记录计算过程。

当调用 loss.backward() 时,它会沿着这次计算生成的图反向求导。

从通俗角度看:动态计算图是“边运行边画图”。它的优势是:

• 写法直观

• 调试方便

• 控制流灵活

• 更接近普通 Python 编程习惯

2、静态计算图

静态计算图是先定义完整计算结构,再执行计算。

早期 TensorFlow 更强调静态计算图。

从通俗角度看:静态计算图是“先画好图,再运行图”。它的优势是:

• 便于全局优化

• 适合部署和编译优化

• 执行前可以分析完整结构

不过,对初学者来说,动态计算图通常更直观,因为它更符合“写一步、算一步”的思维方式。

3、二者的直观区别

可以简单理解为:

• 动态计算图:运行时生成,灵活易调试

• 静态计算图:先定义后执行,便于优化部署

现代深度学习框架中,二者的边界也在逐渐融合。很多框架既支持动态图开发体验,也支持图编译和优化执行。

八、计算图与自动微分

自动微分(Automatic Differentiation)是深度学习框架自动计算梯度的核心技术,而计算图是自动微分的重要基础。

自动微分并不是简单的数值差分,也不是纯符号求导。它的基本思想是:把复杂函数拆成许多基本运算,然后在计算图上应用链式法则。

例如,一个复杂函数可能包含:

• 加法

• 乘法

• 除法

• 指数

• 对数

• 矩阵乘法

• 激活函数

每个基本运算都有已知导数规则。

计算图记录了这些基本运算如何连接起来。自动微分系统就可以沿着计算图反向传播梯度。

从通俗角度看:计算图告诉框架“怎么算出来的”,自动微分根据这条路线反向计算“每个变量该负多少责任”。

例如,在 PyTorch 中:

• requires_grad=True 表示需要记录梯度

• 前向计算会自动构建计算图

• loss.backward() 会触发反向传播

• 参数的 .grad 中保存对应梯度

因此,计算图是理解 PyTorch 自动求导机制的关键。

九、计算图的优势、局限与使用注意事项

1、计算图的主要优势

计算图最大的优势是结构清晰。

它可以把复杂计算过程拆解为一系列基本运算,并明确变量之间的依赖关系。

其次,计算图支持自动求导。

深度学习框架不需要用户手动推导每个参数的梯度,而是可以根据计算图自动完成反向传播。

再次,计算图便于优化。

框架可以根据图结构进行内存管理、算子融合、并行执行和设备调度。

从通俗角度看,计算图的优势在于:它把复杂模型计算变成一张可以追踪、求导和优化的路线图。

2、计算图的主要局限

计算图也有局限。

首先,复杂模型的计算图可能非常庞大。

大型神经网络中,图中可能包含大量节点和中间张量,带来显存和计算开销。

其次,反向传播通常需要保存前向传播中的部分中间结果。

这会增加内存占用。

再次,如果用户在代码中不小心切断了计算图,梯度就无法正确传递。

例如,在 PyTorch 中,某些操作可能导致梯度路径断开:

• 使用 .detach()

• 错误使用 .data 绕过自动求导机制

• 把张量转换成 NumPy 后再参与计算

• 在不需要梯度的上下文中计算

3、使用计算图时需要注意的问题

使用计算图时,需要注意:

• 只有参与计算图的张量才能自动求导

• 参数通常需要 requires_grad=True

• 反向传播从标量损失开始最常见

• 不要无意中使用 detach() 切断梯度

• 推理阶段可使用 torch.no_grad() 节省内存

• 多次反向传播同一张图时需要理解图释放机制

• 原地操作可能影响梯度计算,应谨慎使用

从实践角度看,计算图不是用户每天都要手动画出的东西,但理解它能帮助我们解释很多深度学习框架中的现象。

十、Python 示例

下面给出几个简单示例,用来帮助理解计算图的基本作用。

示例 1:用 PyTorch 自动构建计算图

import torch # 创建需要梯度的张量(标量)x = torch.tensor(2.0, requires_grad=True) # 输入 x = 2w = torch.tensor(3.0, requires_grad=True) # 权重 w = 3b = torch.tensor(1.0, requires_grad=True) # 偏置 b = 1 # 前向计算z = w * x + b # z = w*x + b = 3*2 + 1 = 7loss = z ** 2 # loss = z² = 49 # 反向传播,自动计算 loss 对各变量的梯度loss.backward() print("z:", z.item())print("loss:", loss.item())print("x 的梯度:", x.grad.item()) # ∂loss/∂x = 2*z * w = 2*7*3 = 42print("w 的梯度:", w.grad.item()) # ∂loss/∂w = 2*z * x = 2*7*2 = 28print("b 的梯度:", b.grad.item()) # ∂loss/∂b = 2*z * 1 = 14

这个例子中,前向计算为:

PyTorch 会自动记录计算图。调用:

loss.backward()

后,会自动计算 loss 对 x、w、b 的梯度。

示例 2:观察 grad_fn

import torch # 创建需要梯度的张量 x = 2.0x = torch.tensor(2.0, requires_grad=True) # 计算 y = 3x(乘法操作)y = x * 3 # 计算 z = y + 1(加法操作)z = y + 1 # 计算 loss = z²(幂运算)loss = z ** 2 # 查看各张量的梯度函数(记录了反向传播所需操作)print("y.grad_fn:", y.grad_fn) # 乘法操作对应的函数print("z.grad_fn:", z.grad_fn) # 加法操作对应的函数print("loss.grad_fn:", loss.grad_fn) # 平方操作对应的函数

这里的 grad_fn 表示该张量是由哪个运算生成的。

例如:

• y 来自乘法

• z 来自加法

• loss 来自平方运算

从通俗角度看:grad_fn 就像计算图中记录的“上一道工序”。

如果一个张量是用户直接创建的叶子张量,通常没有 grad_fn,但如果它设置了 requires_grad=True,就可以保存梯度。

示例 3:detach 会切断计算图

import torch # 创建需要梯度的张量 x = 2.0x = torch.tensor(2.0, requires_grad=True) # 计算 y = 3x,y 会记录计算历史y = x * 3 # detach 会创建一个不再连接原计算图的新张量(共享数据但 requires_grad=False)y_detached = y.detach() # 对 detached 张量进行平方操作,z 不会反向传播到 xz = y_detached ** 2 # y 仍有 grad_fn(乘法)print("y.grad_fn:", y.grad_fn)# detached 变量已经没有 grad_fn(因为它与计算图断开)print("y_detached.grad_fn:", y_detached.grad_fn)# z 的 grad_fn 是平方操作,但无法再追溯到 xprint("z.grad_fn:", z.grad_fn)

这个例子中:

• y 仍然连接着 x

• y_detached 已经从计算图中分离

• z 不再能把梯度传回 x

从通俗角度看:detach 相当于告诉框架,从这里开始,不要再往前追踪梯度。

这在某些场景中是有用的,例如冻结部分计算、停止梯度传播或避免不必要的内存开销。

示例 4:一个简单神经网络中的计算图

import torch import torch.nn as nn # 神经网络模块 # 简单线性模型:输入3维,输出1维model = nn.Linear(3, 1) # 一个输入样本(批大小为1,特征3)x = torch.tensor([[1.0, 2.0, 3.0]]) # 真实值(标量)y_true = torch.tensor([[10.0]]) # 前向传播:计算预测值y_pred = model(x) # 均方误差损失函数loss_fn = nn.MSELoss()loss = loss_fn(y_pred, y_true) # 清空旧梯度(防止累积)model.zero_grad() # 反向传播,自动计算梯度loss.backward() print("预测值:", y_pred.item())print("损失:", loss.item()) # 打印各参数的梯度for name, param in model.named_parameters(): print(name, "梯度:", param.grad)

这个例子中,计算图包含:

输入 x → Linear 层 → 预测 y_pred → MSELoss → loss

调用 loss.backward() 后,PyTorch 会沿着计算图反向计算:

• loss 对权重的梯度

• loss 对偏置的梯度

这些梯度随后可以由优化器用于更新参数。

📘 小结

计算图是一种用节点和边表示数学计算过程的图结构。节点表示变量或运算,边表示数据依赖关系。前向传播沿计算图从输入计算到输出,反向传播沿计算图反方向计算梯度。深度学习框架通过计算图实现自动微分,使模型参数能够根据损失自动更新。对初学者而言,可以把计算图理解为:模型计算过程的一张路线图,前向时沿图算结果,反向时沿图传梯度。

“点赞有美意,赞赏是鼓励”

http://www.jsqmd.com/news/833231/

相关文章:

  • 2026年4月前景好的冒菜加盟公司口碑推荐分析,麻辣烫/餐饮/冒菜店/冒菜,冒菜加盟合作哪家靠谱 - 品牌推荐师
  • 从开源物理拼图游戏学习Unity 2D物理引擎与游戏架构设计
  • 基于Raspberry Pi Pico与CircuitPython的自定义PCB机械键盘制作全攻略
  • Arm Morello平台模型与CHERI安全扩展开发指南
  • Iris API错误处理机制与嵌入式系统优化实践
  • TypeScript类型修复实战:从诊断到解决,提升大型项目开发体验
  • 中文长文本语音崩溃?ElevenLabs API超时/截断/静音突变?20年语音架构师紧急发布的6行容错重试+分段重对齐代码(已验证10万+字符稳定输出)
  • 离线普通话发音测试软件设计与实现
  • 脉冲神经网络与神经形态计算在DVS手势识别中的应用
  • Rekall:基于时空查询的视频内容智能检索开源框架
  • ElevenLabs葡萄牙语语音优化黄金7步法:含音频波形对比图、MOS评分提升路径与合规性审查checklist
  • 基于MCP协议与COM自动化,为传统ERP软件Subiekt构建AI智能体接口
  • 仅限菲律宾本地团队使用的ElevenLabs隐藏功能:Tagalog重音标记语法(`[ˈba.ka]`)、连读规则注入与敬语语调开关(内测白名单已开放)
  • 2025届最火的十大降AI率网站解析与推荐
  • 基于Groq LPU与React技术栈构建极速AI聊天应用实战
  • 基于ESP32与WLED打造智能边缘发光招牌:从硬件选型到软件配置全解析
  • Arm CoreLink PCK-600电源管理架构与寄存器编程详解
  • AI 术语通俗词典:激活函数
  • 基于Feather RP2040 RFM69构建低功耗无线传感器网络实战指南
  • 【ElevenLabs僧伽罗文语音实战指南】:20年AI语音工程师亲测的5大本地化落地陷阱与绕过方案
  • 去除豆包视频水印(最稳定小程序)福气满满去水印小程序 - 政企云文档
  • CursorAgents:基于AI智能体的自动化开发工作流实践
  • 2026届最火的六大降重复率神器解析与推荐
  • 乌尔都语语音合成落地难?揭秘ElevenLabs未公开的ur-PK语言代码陷阱与ISO 639-3双标适配规范(仅限首批127家认证开发者知晓)
  • 深入解析go-containerregistry:无守护进程的容器镜像操作利器
  • AI 术语通俗词典:权重与偏置
  • Claude模型思维链评估框架:从原理到实战部署
  • 揭秘Midjourney V6玻璃拟态出图逻辑:从--style raw到--s 750的透光率映射表,附12组实测prompt对照库
  • 轻量级预言机shrimp-oracle:模块化设计与DeFi数据喂价实战
  • 像素艺术家紧急预警:Midjourney即将关闭--tile参数兼容性(倒计时14天),现在必须掌握的3种替代渲染方案