Transformer 是怎么工作的?——从输入到输出的完整动态图解

不用大段术语,只用一句话开场:Transformer 是一台"让序列里每个词都能找到其他词、并按重要性聚合信息"的机器。下面把它从输入到输出拆开,每一步都配图、配公式、配可交互演示。

端到端流程 自注意力 多头·掩码 残差与归一 自回归输出

一、一句话定位:它在干什么

把 Transformer 想象成一个超级版的"读全文再答题":

为什么它比 RNN/CNN 强?老模型要么只能从左往右逐个看(RNN 串行慢、远距离会忘),要么只看局部窗口(CNN 感受野有限)。Transformer 让任意两个词之间只需一步就能直接对话,所以能并行、能抓长距离依赖。这就是它成为大模型底座的原因。

二、全景:从输入到输出,全流程摁↑次理清

下面这张是完整结构(编码器 + 解码器)。点「下一步」或「自动播放」,跟着高亮走一遍整条链路:

输入:源句子 输入:已生成的词(右移) 词嵌入 + 位置编码 Embedding + Positional 词嵌入 + 位置编码 Embedding + Positional 编码器 Encoder × N 多头自注意力 残差 + 层归一 前馈网络 FFN 残差 + 层归一 解码器 Decoder × N 掩码多头自注意力 残差 + 层归一 交叉注意力 K,V 来自编码器 残差 + 层归一 前馈网络 FFN 残差 + 层归一 K, V Linear 线性层 → 词表分数 Softmax → 概率分布 下一个词 → 接回去继续 自回归:新生成的词再喂回解码器顶端
步骤 0 / 8
点「下一步」开始——从输入走到输出 每一步都会在上方架构图中高亮当前正在处理的模块。

三、第①步:把词变成数字(分词 + 词嵌入)

模型不认识汉字,只认识数字。所以要先把每个 token 变成一个向量(一串数字)——这串数字就是它的"含义坐标"。

每个 token → 查嵌入表 → 一个 d_model 维的向量(这里用 4 维示意,真实是 768/4096 维) 小猫 追 毛线球 → → → 0.91 0.12 0.03 0.44 0.08 0.87 0.21 0.10 0.05 0.19 0.94 0.31 …一直排到 d_model 维 这些数字不是人写的,是训练中学出来的参数;语义相近的词,向量也更接近。

四、第②步:位置编码——告诉模型"谁在前谁在后"

为什么必须加?自注意力是"一锅端"地看全部词,它本身完全不知道顺序。"猫追球"和"球追猫"在它眼里词是一样的。所以要在向量上叠加一个"位置信号"。
不同维度的位置编码 = 不同频率的 sin / cos 波;位置不同 → 波形取值不同 → 模型能还原出顺序 位置1位置2位置3位置4位置5 低频 dim 中频 dim 高频 dim
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

每个词的向量会生成三个新向量,用图书馆查资料来类比最好懂:

流程就是三步走:用 Q 去和所有 K 匹配打分 → 归一化成注意力权重 → 按权重把 V 加权求和。

Attention(Q, K, V) = softmax( Q · Kᵀ / √d_k ) · V // ÷√d_k 是"缩放",防止点积太大把 softmax 压成非0即1,梯度消失
以「它」为例(数值与下方计算器一致):它用自己的 Q 去匹配所有词的 K,算出权重,再把所有 V 按权重加总 Q(它) × K(小猫) K(追) K(毛线球) K(它) K(累) → 打分 2.6 0.1 0.0 0.9 0.3 → softmax 0.69 0.06 0.05 0.13 0.07 → 加权求和 V 「它」的新表示 [0.74, 0.15, 0.06, 0.06] 关键在 0.69:「它」把近 7 成权重给了「小猫」,所以聚合出的新向量 ≈ 小猫的信息 —— 模型借此学会了"它"指的是谁

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
输入 X → 头1:语法关系 头2:指代关系 头3:语义相似 → Concat 拼接 → × Wᴼ 线性融合 → 多头输出

七、第⑤步: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 的全部工作,都是为了算出一个尽量准确的下一个词概率分布。

→ 想把这个环节彻底看懂,推荐看姊妹篇:《大模型「按概率输出」到底是怎么回事》(含温度交互与逐字生成演示)。

十、总结:整条链路回顾

句子 +嵌入+位置 多头自注意力 FFN×N层 解码(掩码+交叉) 概率→下一个词 核心永远是那句:每个词用 Q 去匹配所有 K,按 softmax 权重把 V 加权聚合

记忆口诀(8 个字串全程):

嵌入 → 加位置 → 注意聚集 → 前馈加工 → 堆叠加深 → 掩码防偷看 → 交叉取原文 → softmax 出概率。
如果只能记住一句:请记住 「Query 找 Key,加权取 Value」 —— 这就是 Transformer 的全部灵魂。

继续深入(站内姊妹篇):
本文为教学示意:注意力计算器中的打分为说明性数值(非真实模型输出),但 softmax、加权求和均按公式实时真实计算;位置编码与公式遵循原始 Transformer 论文定义。
← 返回人工智能总目录