关系图谱 Transformer Field Notes

TRANSFORMER · RELATIONAL ATLAS

从 Token
世界模型

一份从真实疑问长出来的文档:QKV 为什么不只适合文本?代码、3D、图片怎样进入 Transformer?现代大模型又为何逐渐采用同一套架构配方?

10
核心主题
16
科学图谱
2017→2025
架构演化
统一关系图谱:元素、属性、QKV、注意力和多领域输出形成一棵关系树
FIG. 16 信息,在关系中构建意义。
00

START WITH THE QUESTION

先建立一个统一视角

Transformer 并不是一台只为自然语言设计的机器。它真正通用的地方,是能让一组元素根据当前内容动态寻找彼此,并有选择地交换信息

01元素Token / 点 / 节点
02属性内容 / 类型 / 位置
03关系匹配 / 邻接 / 依赖
04输出更新后的表示
核心判断
关键不是数据像不像语言,而是它能否被分解为元素,以及元素之间是否存在值得学习的关系。
01

LEARNED CONTENT ADDRESSING

QKV:可学习的信息路由

对每个输入元素 xᵢ,模型产生三种不同用途的投影:

qᵢ = xᵢWQ kᵢ = xᵢWK vᵢ = xᵢWV
Q · Query

当前元素在问:“我需要什么?”

K · Key

候选元素在说:“可以用什么特征找到我?”

V · Value

匹配成功后:“我实际提供什么信息?”

QKV 注意力总览信息图
FIG. 01 Q、K、V 汇入注意力输出
THE ATTENTION EQUATION
Attention(Q,K,V) = softmax(QKT/√dk)V

Q 与 K 决定关系强度,V 决定沿关系传递的内容。

动态建图

连接由输入决定

每一层都根据当前内容临时生成一张“软关系图”,而不是沿固定线路传递信息。

多头注意力

同时观察多种关系

不同注意力头可以分别关注邻近、指代、类型、结构、因果或定义—使用关系。

多层传播

逐步组合高阶关系

一层完成一次聚合,多层则允许 A→B→C 的多跳信息传播与抽象。

02

THE MANY GRAPHS OF CODE

为什么 Transformer 特别适合代码

代码表面是一条 token 序列,内部却叠着多张关系网:语法树、定义—使用、数据流、控制流、函数调用、类型与模块依赖。注意力可以为远距离元素建立直接通路。

12result = transform(items)
··· 500 lines ···
519return result
代码的 token 序列、AST、数据流和控制流四层结构图
FIG. 08 代码不是一条线

同一个变量,可以同时被多种关系解释

  • 序列关系:它附近写了什么?
  • 语法关系:它属于哪个表达式或 AST 节点?
  • 数据关系:值从哪里来,又流向哪里?
  • 控制关系:哪些分支决定这段代码是否执行?
  • 类型关系:它允许哪些操作和方法?

因此,Transformer 适合代码,不只是因为“代码也是文本”,而是因为代码天然需要动态、多关系、长距离的信息路由。

03

TOKENIZING STRUCTURED WORLDS

3D,以及任何“元素很多、属性很多”的数据

领域可以把什么当 Token关键结构信息
文本子词、字符、字节顺序、语法、指代
代码源码 token、AST 节点、函数作用域、调用、数据流
3D点、边、面、体素、CAD 操作坐标、法线、拓扑、材质
分子原子、化学键、残基键关系、距离、三维构象
机器人物体、关节、动作、观测空间、时间、接触、目标

3D 的难点不是“能不能 Token 化”

真正的难点是让模型尊重几何规律。同一个杯子平移或旋转后仍是同一个杯子;普通注意力并不会自动保证这种性质。

sᵢⱼ = qᵢkⱼᵀ + φ(pᵢ − pⱼ)

在内容相似度之外,把相对位置、距离、方向或拓扑关系加入注意力。

所以实用方案通常不是“裸 Transformer”,而是:

通用 Attention + 几何归纳偏置 + 稀疏/分层计算

机械鸟被分解成点云、网格、体素和 CAD 操作
FIG. 09 点、面、体素与建模操作
04

BEFORE THE TRANSFORMER

Tokenizer 不预测未来,它学习拆分规则

01

训练 Tokenizer

在代表性语料上统计常见片段,学习词表与合并规则。

02

冻结规则

正式训练大模型前,词表和合并顺序通常已经固定。

03

预训练模型

海量文本先变成 Token ID,模型再学习含义与关系。

04

编码新输入

未来的新词由现有子词、字符或字节组合出来。

不会发生

重复一百次,也不会现场注册新 Token

部署后的 tokenizer 通常是确定且冻结的。新字符串反复出现,切分方式依然相同。

仍然可以

模型能在上下文中学会这个新组合

Tokenizer 不变,但 Attention 可以把多个旧 token 当成一个新概念来理解和使用。

一个从未见过的新字符串:

CyberPomegranate2026
CyberPomegranate2026
示意切分,并非某个指定 tokenizer 的实际输出

常见片段可能只占一个 token;陌生内容往往被切得更碎,从而占用更多上下文。Byte-level BPE 之类的方法以字节作为兜底,因此不必提前见过未来的完整字符串。

05

FROM PIXELS TO TOKENS

图片怎样进入多模态模型

Patch / 特征网格切成局部区域
视觉编码器提取连续向量
投影 / 压缩对齐语言维度
LLM跨模态 Attention

经典 Vision Transformer 会把图片切成固定大小的 patch。比如 224×224 的图片按 16×16 切分,会得到 14×14=196 个视觉 token。每个 patch 展平、线性投影并加入二维位置信息,然后进入 Transformer。

固定 Patch

规则网格

最经典的 ViT 路线。Patch 可能切到半只眼睛或背景,并不是预先分好的语义对象。

动态分辨率

切块与多尺度

高清图片先缩放或切成多个 tile,以保留小字、图表与局部细节。

视觉压缩

重采样 Token

把上千个视觉特征压缩成更少 token,降低语言模型的上下文和注意力成本。

文本与图片的统一点
它们的切分方式不同,但进入 Transformer 后都成为一串带位置、可参与 QKV 的向量。
06

CACHE IS NOT A DATABASE

别把 QKV 与长期记忆混在一起

01

上下文工作记忆

当前窗口中可被 Attention 访问的信息。

随上下文存在
02

KV Cache

缓存历史 token 的 K/V,避免生成时重复计算。

主要是计算优化
03

参数记忆

训练规律压缩在模型权重中,不易精确修改。

来自训练
04

外部长期记忆

数据库、文件、向量库和知识图谱中的持久信息。

可更新、可检索
四层记忆档案馆:上下文、KV Cache、参数和外部记忆
FIG. 12 四种记忆不是一回事

最容易混淆的一句话

“可被 Q 查询”
不等于
“可以永久保存”

Q 是当前元素发出的查询;KV Cache 保存的是已经计算过的历史表示。真正跨会话、可编辑、可追溯的记忆,通常需要外部存储与检索系统。

07

THE MODERN TRANSFORMER RECIPE

2017 → 2025:四项趋同的选择

这不是四个应用领域,而是四类架构设计。大量公开模型在效果、稳定性和系统成本之间反复试验,逐渐形成了一套强烈的工程共识。

设计维度2017 原始 Transformer现代主流核心作用
位置编码Sinusoidal / AbsoluteRoPE让 Q、K 匹配自然携带相对位置
归一化Post-LayerNormPre-RMSNorm更简单的数据搬运与更稳定的深层训练
激活函数ReLU,后有 GELUSwiGLU用平滑门控选择信息通过
Bias线性层通常带 BiasBias-Free收益很小的参数干脆移除
RoPEPre-RMSNormSwiGLUBias-Free
输入 x
RMSNorm先归一化
Attention + RoPE无 Bias 的 QKV 投影
残差
RMSNorm再次归一化
SwiGLU MLP无 Bias 门控前馈层
残差
RoPE

按位置旋转 Q/K,使注意力分数自然依赖相对距离。

Pre-RMSNorm

RMSNorm 放在子层之前,通常让梯度传播更顺畅。

SwiGLU

内容支路乘以门控支路,决定哪些特征通过以及通过多少。

No Bias

在线性投影中省掉收益有限的加性偏置,减少参数与搬运。

不是唯一真理

这是一套截至该统计时期的主流工程配方,不是数学上证明的唯一最优解。Attention 变体、MoE、QK-Norm、长上下文和稀疏结构仍在快速演化。

08

FEW FLOPS, REAL TIME

归一化:计算很少,为什么还会很慢?

因为 GPU 的时间不只由 FLOPs 决定。归一化要读完整行、做跨线程归约、再写完整行,却几乎没有数据复用;矩阵乘法恰好相反——同一块数据会被重复计算很多次,并能喂满 Tensor Core。

先读懂比例:“<0.2% FLOPs / 25% 时间”不是所有模型都成立的常数;它取决于训练或推理、批量大小、张量形状、精度、实现是否融合以及 profiler 的统计口径。反直觉机制本身是真实的。

LayerNorm

先居中,再统一尺度

μ = mean(x)
yᵢ = γᵢ · (xᵢ − μ) / √(σ²+ε) + βᵢ

每个 token 独立地沿隐藏维计算均值和方差。它不是把整批数据变成高斯分布,而是约束这一条隐藏向量的中心与尺度。

RMSNorm

不减均值,只统一“能量”

rms = √(mean(x²)+ε)
yᵢ = γᵢ · xᵢ / rms

省掉求均值、减均值和通常的 β,但仍要扫描整行、做平方和归约,再把比例应用到每个元素。

可手算的小例子

x = [1, 2, 3, 4]

LayerNorm
  1. 均值:μ = (1+2+3+4) / 4 = 2.5
  2. 方差:σ² = (2.25+0.25+0.25+2.25) / 4 = 1.25
  3. 标准差:√1.25 ≈ 1.118
  4. 若 γ=1、β=0,输出约为 [-1.342, -0.447, 0.447, 1.342]
RMSNorm
  1. 平方和:1²+2²+3²+4² = 30
  2. 均方:30 / 4 = 7.5
  3. RMS:√7.5 ≈ 2.739
  4. 若 γ=1,输出约为 [0.365, 0.730, 1.095, 1.461]

它的主要任务是给 Attention 和 MLP 一个可控的输入尺度。残差流经过几十层不断相加,幅度可能漂移;归一化让后续子层不必同时追逐“内容是什么”和“数值突然大了多少”,从而改善深层训练的稳定性。

4096 维真实量级示例

看 FLOPs,也要看搬了多少字节

张量形状2048 × 4096

共 8,388,608 个元素

RMSNorm 运算≈ 34M

约 4 次标量运算 / 元素

BF16 最少搬运≥ 32 MiB

读 x 16 MiB+写 y 16 MiB

算术强度≈ 1 FLOP/B

典型的带宽受限区域

归一化4096×4096 线性层
计算量约 0.03–0.07 GFLOPs约 68.7 GFLOPs
数据复用低:大多读一次、算几下、写回高:一个 tile 在片上反复乘加
主要硬件CUDA Core+归约+特殊函数Tensor Core
常见瓶颈显存带宽、同步或启动延迟计算吞吐或高效流水

假设 GPU 约有 3 TB/s 显存带宽和 1 PFLOP/s 矩阵计算力:搬 32–48 MiB 的理论下限约为 11–17 μs;做 68.7 GFLOPs 的理论下限约为 69 μs。于是,归一化即使只有千分之一量级的 FLOPs,时间也完全可能达到矩阵乘法的十分之一甚至更多。真实时间还要加归约同步、访存效率和 kernel 启动。

01 · 低算术强度

每个字节只做几次运算

数据刚从 HBM 搬到计算单元,做少量加、乘和平方根就要写回;没有 GEMM 那样的 tile 复用。

02 · Reduction

均值与方差要“全员会合”

一行的线程必须用 warp shuffle、共享内存或多级归约汇总统计量,得到结果后才能完成缩放,天然带有等待点。

03 · Kernel latency

小批量时,启动比计算更显眼

自回归解码常常一次只处理很少 token,张量太小,HBM 还没跑满 kernel 就结束了;重复启动本身便占据可见时间。

04 · 精度路径

统计量常用 FP32 累加

即使输入输出是 BF16/FP16,均值、平方和与倒数平方根通常仍需要较高精度;这些也不是 Tensor Core 擅长的矩阵乘加。

DOES HBM FIX IT?

HBM 有帮助,但不能单独“治好”

容量不是答案,带宽才相关。更多 GB 只是能装下更大的模型;更高 TB/s 才会缩短带宽受限 kernel 的时间。以 H100 SXM 为例,官方规格给出 3.35 TB/s HBM 带宽,但它的 BF16 Tensor Core 峰值高达千 TFLOP/s 量级——计算增长得比外部内存供数更快。

而且 HBM 无法消除线程归约、同步、kernel 启动,也无法让小任务自动占满整张 GPU。如果张量跨 GPU 切分,统计量还可能涉及 NVLink/网络通信,那已经不是 HBM 能解决的路径。

工程上怎么优化

核心不是“再加 FLOPs”,而是少搬、少等、少启动

  1. 融合读写

    把 residual add、RMSNorm、量化/cast,甚至后续 Linear 的入口融合,让中间结果留在寄存器或片上缓存,不反复落回 HBM。

  2. 用成熟 fused kernel

    采用框架或 Transformer Engine 的 RMSNorm、LayerNormLinear 等实现;PyTorch 的 torch.compile 也可融合符合条件的逐元素与归约操作。

  3. 减少启动开销

    解码阶段可用 CUDA Graph、持久化 kernel 或更大批量来摊薄启动成本;前提是先用 profiler 确认瓶颈。

  4. 模型设计时选 RMSNorm

    它比 LayerNorm 少一步中心化,常用于现代 LLM;但不能把已训练模型的 LayerNorm 直接替换后期待权重行为不变。

一句话记忆

FLOPs 衡量“算了多少”,不衡量“为了算这些,搬了多少、等了多久”。

判断归一化是否真是瓶颈,应看 profiler 的 DRAM 吞吐、算术强度、kernel 时长、启动次数和归约效率,而不是只看 FLOPs 占比。

09

DATA MOVEMENT PLAYBOOK

减少数据搬运:五种方法,一条原则

GPU 优化常常不是让算术更少,而是让每个字节在离开芯片之前多做一点有用工作。越能把中间结果留在寄存器、共享内存或缓存里,越少把同一批数据反复送回 HBM。

读图方式:这是方向性层级,不是固定延迟表。具体容量、缓存行为和访问延迟随 GPU 架构、占用率、访问模式与命中率而变;真正要优化的是昂贵层级之间的往返次数和无效字节。

01
LESS BYTES

更低精度:同样元素,搬更少字节

FP32 每元素 4 B,BF16/FP16 为 2 B,FP8 约 1 B。仅按权重载荷估算,10 亿参数分别约为 4 GB、2 GB、1 GB;字节减半,理论所需带宽也随之下降。

边界:混合精度通常保留高精度累加、缩放或敏感算子。量化/反量化有成本,数值稳定与模型质量必须实测。
FP32 4 BBF16 / FP16 2 BFP8 ≈1 B
02
FEWER ROUND TRIPS

算子融合:中间结果不落回 HBM

把 residual add、RMSNorm、cast,或连续逐元素操作合在一个 kernel 中:输入读一次,中间值留在寄存器/共享内存,最终结果写一次。

边界:并非相邻算子都能安全融合;过度融合会增加寄存器压力、降低 occupancy,动态形状也可能触发重新编译。
朴素

HBM ⇄ OP A ⇄ HBM ⇄ OP B ⇄ HBM ⇄ OP C

3 次读+3 次写
融合

HBM → A · B · C → HBM

1 次读+1 次写
03
COMPUTE FOR MEMORY

重计算:不用存的中间量,就在需要时再算

Activation checkpointing 只保存选定边界的输入,丢掉内部激活;反向传播到这里时,再执行一次前向以恢复它们。它主要缓解训练期激活占用,也可减少保存/读取压力。

边界:这是“算力换内存”,通常增加计算量,不保证缩短墙钟时间;随机算子、状态与精确重现还需要额外处理。
前向x₀→ x₁ → x₂ →x₃丢弃 x₁、x₂
反向x₃← 重算 x₂、x₁ ←x₀
04
USE EVERY TRANSACTION

对齐与合并读取:让一个 warp 少发事务

让相邻线程访问相邻、对齐的数据,使硬件把 warp 的请求合并为尽可能少的内存事务。大步长、散乱 gather 或行首错位会取回很多没有被使用的字节。

边界:在计算能力 6.0+ 的常见规则中,事务以覆盖地址所需的 32 B 段计数;更具体的对齐与缓存粒度依架构而变。padding 有时会多算一点,却更快。
连续 / 对齐

少量事务 · 高有效载荷
跨步 / 散乱

更多事务 · 带宽被浪费
05
REUSE ON CHIP

分块:搬一小块,反复使用,再换下一块

矩阵乘法把 A/B 的 tile 搬到共享内存后反复乘加;FlashAttention 则流式处理 Q/K/V 块,在片上完成局部 softmax 更新,避免物化完整的 N×N 注意力矩阵。

边界:tile 太小会复用不足,太大则挤占共享内存和寄存器、降低并发,甚至 spill 回显存。最优块大小取决于形状和硬件。
SRAM TILE复用 × K
累加结果
理想化下界算例

256 MiB 中间张量,连续做 3 个逐元素操作

NAIVE · 3 KERNELS1.5 GiB

3 ×(读 256 MiB+写 256 MiB)

÷ 3
FUSED · 1 KERNEL512 MiB

读输入一次+写最终结果一次

若有效 HBM 带宽恰好为 3 TB/s,对应的纯搬运下界约为 0.54 ms vs 0.18 ms。这是帮助建立直觉的估算:缓存命中、额外输入、对齐损失、寄存器 spill、编译器选择和实际带宽都会改变结果。

你观察到什么优先检查得到什么主要代价
带宽接近上限、算术强度低低精度+融合更少字节与 HBM 往返精度管理、融合边界
训练因激活显存 OOM重计算 / checkpoint更低峰值显存额外前向计算
全局载入效率低、事务数多对齐+合并访问更高有效带宽布局重排或 padding
同一数据被多次读取分块+片上复用更高算术强度tile 调参、片上资源压力
kernel 很碎、启动时间显眼融合+图编译少启动、少中间张量编译开销、可融合性限制
实践顺序

先用 profiler 找“字节去了哪里”,再选技巧。

看 DRAM 吞吐、global load/store efficiency、kernel 数量、occupancy、spill 与峰值激活;优化后重新测端到端时间。五种方法可以叠加,但没有一种在所有形状和硬件上都自动更快。

10

GENERAL DOES NOT MEAN OPTIMAL

通用性的边界与代价

O(N²)

全局注意力成本

元素数量翻倍,注意力关系可能增长到四倍。

DATA

数据需求高

归纳偏置较弱意味着模型经常需要更多样本自行学习结构。

BIAS

需要领域先验

3D 的旋转等变、图的邻接和物理守恒不应全靠数据碰运气。

VERIFY

不保证严格正确

代码需要编译器和测试,几何需要内核,事实需要检索与来源。

LONG

超长结构仍困难

能放进上下文,不等于模型能稳定利用每一段信息。

真正强的系统,往往是
Transformer + 专用结构 + 外部工具 + 可验证反馈

12

PRIMARY SOURCES

继续向下挖

输入关键词,在文档章节中搜索。