图解 Transformer
从文字、向量到一层网络,建立模型内部的直觉。
对应资料:The Illustrated Transformer [S006]
沿着对象与状态理解本章
本章可以分成两种动作:同一位置内部改变特征,与不同位置之间混合信息。X乘参数表属于前者,注意力份额乘V属于后者。先在下图指出“输入数据”“参数”“本次结果”,再读多层公式,避免把W与Q/K/V当成同一种东西。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
Q/K/V:先算从哪读,再算读进多少
Query、Key、Value各自是什么数,为什么分三条路径?
计算某个位置的新表示时,它是接收者;所有可见位置都是潜在信息提供者。Query与Key决定各提供者的读取份额,Value提供实际被混合的数。可以借“提问—匹配—取内容”记住分工,但Q不是自然语言问题,K不是数据库主键,V不是正确答案。
输入与适用条件:沿用F11正文的独立两位置算例:X=[[1,1],[1,−1]]。本图省略偏置、RoPE、归一化和多头。所有Q/K/V和输出都由配套程序计算。
1 / 5 · 同一输入,三条参数路径
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
先不打分。两行输入分别代表“我”和“爱”;Wq、Wk、Wv是三张乘法系数表。它们不是另外三份文字。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
让匹配特征与被传递内容分开学习,给模型不同的变换能力。
怎样实现
先分别投影每行,再跨位置打分、屏蔽、softmax、混合V。
可能的代价与误解
“注意力最大”不直接证明模型最终回答的因果原因;若只有一个可见Key,softmax永远为1,不能用来展示竞争。
如何判断是否做对
核对六行投影、两项分数、份额和输出;改变Wv不应在本层直接改变由Q/K算出的份额。
从“输入一句话”到“网络中的矩阵”
本篇对应《图解Transformer》的主题,用本书自编案例建立直觉,不是原文逐句翻译。先把三个层次分开:字符串是人类输入,Token ID是离散符号,隐藏向量是网络计算使用的表示。向量维度没有预先规定的中文释义,不能把它想成一个存满事实的表格。[S006][S007]
假设教学Tokenizer把“检查路径过滤”分成三个Token,ID是7、12、3。真实Tokenizer未必如此切分,这里只为了追踪流程。查Embedding矩阵后得到三个向量,组成3×d矩阵。之后每层根据位置、上下文关系和非线性变换更新表示。
为什么“同一个词”会因上下文改变
代码里的root可以是目录根、树根,也可以是某个对象名。初始词向量提供学习到的统计起点;上下文中的函数调用、注释与类型线索影响后续表示。网络不是先查一个“root唯一意思”再固定使用,而是在多层计算中形成适合当前输入的表示。[S010][S008]
但表示能消歧,不等于模型已经执行语言解析器。真实代码中root绑定哪个变量、函数是否被调用,仍可能需要LSP、源码和运行证据。这说明底层能力与工程工具是互补关系。
一个完整层怎样工作
注意力让当前位置从其他可见位置组合信息;前馈网络对每个位置做非线性变换;残差提供跨子层的信息通路;归一化处理数值尺度。不同模型的顺序与具体组件可能不同,不能用原始2017年结构图描述所有现代模型。[S008][S009]
教学结构可以写为:
输入表示 X
→ 注意力变换 + 残差
→ 前馈变换 + 残差
→ 下一层表示
原始Transformer包含编码器和解码器。编码器可以形成源序列表示,解码器结合已生成前缀与源表示继续生成。GPT类Decoder-only模型则以因果前缀生成作为主要结构。理解两者共同组件,同时保留结构差异。[S002][S008]
为什么需要位置与因果限制
“排除A,保留B”与“保留A,排除B”使用相近词汇,但顺序改变含义。位置编码让网络获得顺序信息;因果掩码限制生成位置不能读取未来答案。位置编码不是长期记忆,掩码也不是用户权限控制,它们发生在模型内部计算层。
训练时,目标序列已知,因此可以并行计算多个位置的预测损失;生成时,下一个Token依赖前一个已选结果,通常存在串行依赖。不要把“Transformer可以并行”误解为“所有回答都是一次无依赖生成”。[S008]
用一个反例检查理解
模型看到“测试通过”四个字,不代表测试真的运行过。网络能处理这段文本,却不知道它是工具事实、用户陈述还是模型猜测,除非输入与训练行为帮助区分。工程系统必须保留来源和真实状态。
查看参考答案
练习答案:如果Agent修改后只说“应该能通过”,应记录为推测,不能升级成验证结果。底层理解告诉我们模型输出如何形成,工程验证告诉我们输出是否对应现实。
继续深入:第1章 · 模型内部 或阅读拓展阅读目录1.1的逐项讲义。所有链接均为本地内容。
一个两位置单层Decoder,从输入一直算到词表概率
输入与条件。采用教学pre-norm Decoder:X=[[1,0],[0,2]];LayerNorm的ε=1e−5,γ=1、β=0;Wq=Wk=Wv=Wo=I;因果注意力;FFN(z)=0.5×ReLU(z);最后再LayerNorm并乘词表头 [[1,0,-1],[0,1,0.5]]。不使用RoPE和bias。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1输入归一化 | 逐行Norm,不跨位置 | 约 [[0.999980,−0.999980],[−0.999995,0.999995]]。 |
| 2生成Q/K/V | 本例投影是单位矩阵 | 三者都等于归一化输入;这是为方便计算而选的特例。 |
| 3算因果注意力 | 第1位置只能看自己,第2位置可看两处 | 第2行权重约 [0.055810,0.944190],加权输出约 [−0.888377,0.888377]。 |
| 4第一次残差 | 把注意力输出加回原X | 第2位置变 [−0.888377,2.888377]。 |
| 5Norm与FFN | 第2位置归一化约 [−0.999999,0.999999] | ReLU与0.5缩放后约 [0,0.499999],再加残差得 [−0.888377,3.388376]。 |
| 6生成分数 | 最后Norm后乘词表头 | logits约 [−0.999999,0.999999,1.499998],概率约 [0.048611,0.359188,0.592201]。 |
把过程连起来。模型内部每一个“层名”都对应一份实际新数组。词表概率出现在最后投影之后,而不是Attention权重直接变成词。
边界与反例。全部数值来自随包程序同一条前向链,展示值经舍入;这是未训练微型结构,不是任何商业模型的架构或输出。
依据与适用范围:[SDPA]。示例输入和场景由本书明确设定。