Transformer 是怎么工作的?——从输入到输出的完整动态图解
不用大段术语,只用一句话开场:Transformer 是一台"让序列里每个词都能找到其他词、并按重要性聚合信息"的机器。下面把它从输入到输出拆开,每一步都配图、配公式、配可交互演示。
端到端流程
自注意力
多头·掩码
残差与归一
自回归输出
一、一句话定位:它在干什么
把 Transformer 想象成一个超级版的"读全文再答题":
- 输入:一串词(比如一句中文句子)
- 中间:每个词都去"看"整句话的所有词,问"谁对我最重要?",然后把重要词的信息按比例加权混进来,更新自己 —— 这一步叫自注意力(Self-Attention),是 Transformer 的灵魂
- 输出:每个位置得到一个"理解后的新向量",再拿来预测下一个词(或翻译出下一个词)
为什么它比 RNN/CNN 强?老模型要么只能从左往右逐个看(RNN 串行慢、远距离会忘),要么只看局部窗口(CNN 感受野有限)。Transformer 让任意两个词之间只需一步就能直接对话,所以能并行、能抓长距离依赖。这就是它成为大模型底座的原因。
二、全景:从输入到输出,全流程摁↑次理清
下面这张是完整结构(编码器 + 解码器)。点「下一步」或「自动播放」,跟着高亮走一遍整条链路:
步骤 0 / 8
点「下一步」开始——从输入走到输出
每一步都会在上方架构图中高亮当前正在处理的模块。
三、第①步:把词变成数字(分词 + 词嵌入)
模型不认识汉字,只认识数字。所以要先把每个 token 变成一个向量(一串数字)——这串数字就是它的"含义坐标"。
四、第②步:位置编码——告诉模型"谁在前谁在后"
为什么必须加?自注意力是"一锅端"地看全部词,它本身完全不知道顺序。"猫追球"和"球追猫"在它眼里词是一样的。所以要在向量上叠加一个"位置信号"。
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
// 然后:最终输入 = 词嵌入 + 位置编码(直接相加,维度相同)
五、第③步:自注意力 —— 整个 Transformer 的灵魂(重点)
这一步要解决的问题只有一个:"当我(当前词)要理解自己时,应该重点关注句子里的哪些词?"
5.1 三个角色:Query / Key / Value
每个词的向量会生成三个新向量,用图书馆查资料来类比最好懂:
- Query(查询):我手里的"检索需求" —— 我在找什么样的信息?
- Key(键):每本书脊上的"标签" —— 我能提供什么信息?
- Value(值):书里的实际内容 —— 如果你选中我,就把这个交给你
流程就是三步走:用 Q 去和所有 K 匹配打分 → 归一化成注意力权重 → 按权重把 V 加权求和。
Attention(Q, K, V) = softmax( Q · Kᵀ / √d_k ) · V
// ÷√d_k 是"缩放",防止点积太大把 softmax 压成非0即1,梯度消失
5.2 动手算一遍:注意力计算器(真实数值,可点)
下面用句子 小猫 / 追 / 毛线球 / 它 / 累,把每个词对全部词的注意力真算一遍。点表格里任意一行,看它的分数、权重和最终聚合出的向量:
← 点上面任意一行
选一个查询词,这里会显示它的打分、softmax 权重,以及加权求和后的输出向量。
看重点(这张表在讲什么故事):
- 「它」最关注「小猫」(权重最高)—— 这就是指代消解:模型通过注意力,知道"它"指的是谁。这是自注意力最经典的成效。
- 「追」同时关注「小猫」和「毛线球」 —— 动词把主语和宾语关联起来(谁追谁)。
- 「累」关注「它」 —— 谁累,就指向谁。
- 注意输出向量:「它」聚合后的新向量已经很像「小猫」的向量了——"它"这个词把自己的表示更新成了包含指代对象信息的表示。
六、第④步:多头注意力 —— 一组人同时看不同的关系
只做一次注意力,等于只能用一种"视角"看句子。多头(Multi-Head)就是把向量切成 h 份,并行做 h 次注意力,每个头自动负责一种关系(语法 / 语义 / 指代 / 距离…),最后拼起来。
headᵢ = Attention( X·WQᵢ, X·WKᵢ, X·WVᵢ )
MultiHead(X) = Concat(head₁, …, head_h) · WO
// 真实模型常用 8~96 个头,每头维度 = d_model / h
七、第⑤步:FFN + 残差 + 层归一(简述)
注意力负责"词与词之间交换信息",之后每个位置还要独立思考加工一下,这是 FFN 的活。
FFN(x) = max(0, x·W₁ + b₁)·W₂ + b₂
// 先升维(通常 4 倍) → ReLU/GELU 非线性 → 再降回原维度。给模型提供"非线性计算能力"
| 组件 | 作用 | 一句话理解 |
| 前馈网络 FFN | 对每个位置独立做非线性变换 | 每个词"消化"刚吸收来的信息 |
| 残差连接 | 输出 = 输入 + 子层输出(x + f(x)) | 保留"原的我",防止深度网络退化、梯度断流 |
| 层归一 LayerNorm | 把向量标准化(均值0方差1)再缩放 | 稳定数值、加速训练,让每层输入分布不乱漂 |
一个编码器层 = 多头自注意力 → 残差+归一 → FFN → 残差+归一,然后这个层重复堆叠 N 次(如 12 / 32 / 96 层),每一层都在上一层理解的基础上再"深化"一层。
八、第⑥步:解码器 —— 两个关键差异
解码器比编码器多两样东西:掩码自注意力和交叉注意力。
8.1 掩码自注意力:不许偷看未来
生成是从左往右一个词一个词来的。当模型正在生成第 3 个词时,它绝对不能看到第 4、5 个词(否则训练时就作弊了)。做法是把未来的位置屏蔽掉(分数设为 −∞,softmax 后权重为 0)。
8.2 交叉注意力:去原文里找答案
这是编码器与解码器之间唯一的桥梁。区别只在于 Q、K、V 的来源:
| 注意力类型 | Q 来自 | K、V 来自 | 作用 |
| 自注意力 | 自己 | 自己(同一序列) | 句内词互相理解 |
| 掩码自注意力 | 解码器自己 | 解码器自己(且只能看已生成部分) | 理解已生成的内容 |
| 交叉注意力 | 解码器 | 编码器输出 | 把"原文信息"对应过来(翻译时对齐) |
提示:现在最流行的大语言模型(GPT 系)只保留解码器堆叠,去掉了编码器和交叉注意力(因为没有"第二种输入",源=目标),所以是自回归的"续写机器"。编码器-解码器架构则多用于翻译、摘要这类"输入→另一种输出"的任务。
九、第⑦步:输出层 —— 从向量到"下一个词"
解码器最后一层输出的向量,经过 Linear(映射到词表大小的分数)+ Softmax(变成概率) → 得到下一个词的概率分布 → 选一个词 → 接回输入开头 → 继续。
这和上一篇完全接上了:所谓"大模型按概率输出",概率就是这一步算出来的。Transformer 的全部工作,都是为了算出一个尽量准确的下一个词概率分布。
→ 想把这个环节彻底看懂,推荐看姊妹篇:《大模型「按概率输出」到底是怎么回事》(含温度交互与逐字生成演示)。
十、总结:整条链路回顾
记忆口诀(8 个字串全程):
嵌入 → 加位置 → 注意聚集 → 前馈加工 → 堆叠加深 → 掩码防偷看 → 交叉取原文 → softmax 出概率。
如果只能记住一句:请记住 「Query 找 Key,加权取 Value」 —— 这就是 Transformer 的全部灵魂。