【AI专栏】图解Transformer - 第01章:建立直觉

博主介绍:程序喵大人

从 token 到上下文表示

这一章咱们先建立一个全局的视角。当一条prompt被发送给LLM时,文字会先被切成 token,token 会变成编号,编号会查出向量,向量带着位置信息进入 Transformer,然后在 self-attention 里吸收上下文。

从软件工程角度看,Transformer 可以先理解成一个函数:输入一串向量,输出一串新的向量。输出长度通常对应输入位置,但每个位置的向量已经带上上下文。

这一章不急着展开训练、KV Cache、FlashAttention 这些后续话题。先看懂信息怎么流动,后面的细节就能接到同一条线上。

读这章时,可以把模型想成一条流水线。每个环节都不神秘,只是在把"人能读的文字"一步步改造成"机器能计算的向量"。

cpp 复制代码
Transformer(input_vectors) → output_vectors

先抓主线:文字 → token → Token ID → embedding → position → attention → 上下文表示。

1. 认识"角色"

Token 是模型看到的文字碎片;Token ID 是词表里的编号;Embedding 是编号查出来的向量;Position 负责告诉模型顺序。

Attention 负责让一个位置去参考其他可见位置。Q/K/V 是 attention 里的三个分工:Q 表示我要找什么,K 表示我怎么被匹配,V 表示被关注以后能提供什么。

FFN 可以先理解成每个位置自己的加工桌。Attention 负责收集上下文,FFN 继续加工这个位置的表示。KV Cache 会在后面推理工程里重点讲,第一章只需要知道它和历史上下文的复用有关。

当然,这里角色不需要现在就全部记住。后面每经过一个环节,就会把对应的角色重新拉出来,用它解释当页正在发生的动作。

这些角色都是帮助理解的入口。真实模型内部流动的是向量、矩阵和概率分布。

2. 文字先被切成 token

人读一句话时,会自然看到字、词和句子。模型进入计算前,会先用 tokenizer 把文本切成一串 token。token 可以理解成模型真正处理的文字碎片。

图里用"我喜欢 CUDA"做示意,把它切成"我|喜欢|CUDA"。这只是教学切法,真实模型怎么切,取决于具体 tokenizer。不同模型、不同词表,切分结果可能不同。

这一点很重要:Transformer 本体不直接处理字符串。它接收的是 token 后面的编号和向量。tokenize 是文本进入数值计算世界的第一道门。

tokenize 发生在模型主体计算之前。很多推理指标按 token 计费、按 token 计时,根源就在这里:模型真正处理的是 token 序列。

token 是模型的基本处理单位。它和"词"很像,但粒度更灵活。

3. token 的粒度很灵活

token 经常会让初学者误以为它就是词。更准确的的理解是:token 是 tokenizer 切出来、能在词表里找到编号的单位。它可能是一个字,也可能是一个词,还可能是英文单词的一部分。

中文里,"人工智能"可能被切成"人工|智能",也可能被切成"人|工|智|能"。英文里,unbelievable 这种词也可能被拆成 un、believ、able。

切分粒度会影响 token 数量,也会影响推理成本。输入 prompt 有多少 token,就有多少位置进入模型;长上下文成本高,第一步就和 token 数量有关。

token 粒度灵活也解释了一个现象:同样长度的人类文本,在不同语言、不同 tokenizer 下,token 数可能差很多。

学习 Transformer 时,先把 token 当作"模型可处理的最小片段"。具体片段由 tokenizer 决定。

4. 编号把文字接到数值世界

token 被切出来之后,还要查词表变成 Token ID。这个 ID 可以理解成词表编号,也可以用程序员更熟悉的方式理解:它就是 embedding table 的数组下标。

比如"我"对应 1001,"喜欢"对应 2456,"CUDA"对应 8912。ID 本身像学生证号,负责稳定定位。它不负责直接表达完整语义。

模型最后生成答案时,也会回到词表。输出层给每个候选 token 一个分数,采样或选择出某个 Token ID,再把这个 ID 还原成下一个 token。

cpp 复制代码
token_id → embedding_table[token_id]

Token ID 的价值是定位:让文字世界能进入 GPU 擅长的数值计算。

5. 用 ID 查出真正要计算的向量

有了 Token ID,下一步就是查 embedding table,拿到一个向量。这个向量才是神经网络真正要算的东西。

如果模型维度是 4096,那每个 token 查出来的就是 4096 个浮点数。embedding table 是模型参数的一部分,训练时候学出来的。

但这里有个容易忽略的点:查出来的只是 token 的初始表示。它带着训练学到的统计关联,但还不知道自己在当前这句话里是什么意思。"CUDA"这个词在模型里有一个固定的 embedding,不管它出现在"学习 CUDA"还是"卸载 CUDA"里,查出来的都是同一个向量。

要变成这句话里的" CUDA",得等后面的 Transformer 层来改造它。

6. 输入向量,输出新向量

从软件工程视角看,Transformer 很适合先看成一个函数。输入是一串 token 向量,输出也是一串向量。输出位置通常仍然对应原来的 token 位置。

关键变化在"表示变丰富了"。输入阶段,每个向量主要来自自己的 token 和位置;输出阶段,每个向量已经经过多层 attention 和 FFN 加工,带上了上下文信息。

这解释了为什么模型能处理指代、语义关系和任务要求。它并没有让一个 token 单独作判断,而是在每一层不断把上下文信息混进当前位置的表示里。

这也是为什么输出向量更有价值:它们已经经过上下文加工,可以用于后续预测、分类、生成等任务。

7. 位置让模型知道顺序

只有 token 向量还不够。句子有顺序,"我喜欢你"和"你喜欢我"用了同样的几个字,但含义完全不同。模型必须知道每个 token 在序列里的位置。

图里把 position 画成座位号。token 告诉模型"我是谁",position 告诉模型"我在哪"。两者结合起来,模型才知道谁在前、谁在后、距离多远。

原始 Transformer 里,位置编码会加到 embedding 上。现代 LLM 常见的 RoPE 通常把位置信息写进 Q/K 的匹配过程。第一章先不展开公式,先抓住顺序和距离这个直觉。

位置不是附加装饰。没有位置,模型很难知道主语、宾语、修饰关系和先后顺序,句子结构会变得混乱。

信息 = 位 + 上下文。Token ID 是入口,位置和上下文让它获得当前意义。

8. 上下文决定当前意义

很多 token 单独看时含义不完整。图里用"她"举例:只看"她",很难知道它指谁。放回"小明把球踢给小红,因为她在前面"这个句子里,它才有机会指向"小红"。

这里的"在前面"是线索,"小红"是更可能的候选对象。模型要做的事情,就是让"她"这个位置去吸收上下文里有用的信息,更新自己的表示。

同一个 token 在不同上下文里会有不同内部表示。Apple 在 "Apple released a chip" 里更像公司,在 "I ate an apple" 里更像水果。token 本身只是入口,当前上下文里的表示才真正参与预测。

上下文让 token 从"词表里的可能意义"落到"这句话里的当前意义"。这正是大模型看起来会理解语境的基础。

语言是符号入口。模型内部越往深层走,越接近"概念、关系、任务线索"的混合表示。

9. 生成时只能看见"可见 "token

讲 self-attention 时,很多资料会说"每个 token 看全句"。这个说法适合 encoder 或教学简化,但对于 decoder-only LLM 的生成过程,需要加一个关键限制:未来 token 还没有出现。

生成第 i 个位置时,模型通常只能看左边已经出现的 token 和当前位置,右边未来 token 会被 causal mask 挡住。这个限制保证模型按从左到右的方式生成。

所以更稳的说法是:每个 token 看所有可见 token。可见范围由模型结构和 mask 决定。后面讲 prefill、decode、KV Cache 时,这个边界会非常重要。

causal mask 是生成式模型很核心的约束。它让训练和推理都围绕"给定前文,预测下一个 token"这个任务展开。

cpp 复制代码
可见 token = 已出现 token + 当前 token

。生成式 LLM 的上下文是按时间一步步增长的。

10. 每个位置都会从上下文找信息

self-attention 的第一直觉,就是当前 token 会观察所有可见 token,再决定哪些信息对自己更重要。图里的粗线表示影响更强,细线表示影响更弱。

这一步解决"信息从哪里来"。当前 token 的新表示,会在自己原来的向量基础上吸收可见 token 的信息。它不会平均看所有 token,而是根据相关性分配权重。

完整 attention 的关系规模接近 n × n。序列越长,需要考虑的 token 关系越多。长上下文为什么贵,FlashAttention 为什么重要,根因都能回到这里。

注意力权重可以理解成信息分配比例。权重大,那个 token 的 Value 对当前表示贡献更大;权重小,贡献就更小。

并行处理表示许多位置可以一起算;上下文交互表示这些位置的表示会互相参考。

11. 找谁、怎么找、拿走什么

一个 token 进入 attention 后,会从同一个输入表示里投影出 Query、Key、Value 三份向量。它们来源相同,职责不同。

Query 是"我想找什么"。Key 是"我怎么被匹配"。Value 是"别人关注我以后,能从我这里拿走什么"。Key 参与算分,Value 参与被读取和混合。

比如"他饿了"里的"他"要回头找前面的对象。它用 Query 去匹配"小红""苹果""小明"等 token 的 Key。某个 Key 匹配度更高,对应 Value 就会更多混进"他"的新表示。

Q/K/V 的拆分让模型可以用一套向量负责匹配,用另一套向量负责传递内容。这种分工让 attention 更灵活。

K 和 V 不是人工可读字段。它们是高维向量,只是在教学上可以分别理解成"匹配材料"和"读取内容"。

12. 先算谁重要,再收集信息

self-attention 的核心动作可以压成三步:Q 匹配 K,得到权重,再按权重读取 V。

当前 token 先生成自己的 Query,然后和所有可见 token 的 Key 做匹配,得到一组 attention scores。score 越高,说明那个 token 对当前 token 越重要。softmax 会把这些分数变成一组加起来等于 1 的权重。

有了权重以后,模型就读取 Value。被关注更多的 token,它的 Value 贡献更大;被关注较少的 token,贡献更小。所有 Value 按权重加起来,得到当前 token 的上下文向量。

softmax 的作用是把原始匹配分数变成可加权的比例。所有比例加起来为 1,模型就能按比例混合不同 Value。

cpp 复制代码
QKᵀ → scores → softmax → weights × V

attention 本身输出上下文向量。完整 Transformer block 还会接残差、归一化、FFN 等步骤。

13. token 的有效意义

咱们总结一下第一章:token 的有效意义 = token 本身 + 位置 + 上下文 + 任务指令。token 本身提供入口,位置提供顺序,上下文提供当前语义,任务指令告诉模型现在要做什么。

这也解释了为什么同一个词在不同句子里会变成不同表示。模型训练结束后,参数里保存了大量语言规律;推理时,它用这些参数把当前 token 序列转换成上下文相关的内部表示。

生成时,模型每一步都在计算 P(next token | prompt + 已生成 token)。上下文越具体,下一步的概率分布通常越集中。第一章咱们先把这条信息流吃透,后面再进入 attention 细节和推理工程。

到这里,第一章的所有图就串起来了:token 不是最终意义,token 在位置、上下文和任务共同作用下变成当前表示。

cpp 复制代码
token 的有效意义 = 本身 + 位置 + 上下文 + 任务指令

从文字到预测,中间真正流动的是不断更新的向量表示。
码字不易,欢迎大家点赞,关注,评论,谢谢!

相关推荐
2601_962344621 小时前
计算机毕业设计之基于大数据的投保数据的分析系统的设计与实现
大数据·人工智能·深度学习·机器学习·信息可视化·小程序·课程设计
手写码匠1 小时前
手写 LLM 结构化输出引擎 —— 从 JSON Schema 约束到类型安全的数据提取
人工智能·深度学习·算法·aigc
QYR-分析1 小时前
柔性传感新赛道崛起:织物压力传感器行业发展全景解析
大数据·人工智能
Token炼金师1 小时前
架构的岔路:Decoder 一统江湖,MoE 另辟蹊径 —— 主流架构变体的工程权衡
人工智能·encoder-decoder·moe·decoder-only
2zcode2 小时前
免费开源项目文档:基于HSV颜色空间和卷积神经网络的交通标志识别系统设计与实现
人工智能·深度学习·cnn
德昂信息dataondemand2 小时前
如何评估BI项目的价值与效益
大数据·人工智能
星马梦缘2 小时前
机器学习与模式识别 第八章 MAP与偏方差 模拟卷及答案
人工智能·机器学习·map·岭回归·mle·双重下降
liangshanbo12152 小时前
大模型混合精度训练:原理、选型与实战笔记
人工智能·深度学习