TRANSFORMER · 从输入到输出

彻底理解
Transformer

它做的核心工作:让每个 token 查看其他 token,再把有用信息带回自己身上。

文本Token向量
多头自注意力残差 + 归一化前馈网络
同一个模块重复很多层,每层都重新组织上下文。
上下文表示词表概率下一个 token

01 · 全局地图

先把整条流水线装进脑子

下面所有细节都只是这条流水线中的一个局部。先知道数据从哪里来、变成什么、最后去哪里。

一句话版本

Transformer 接收一串 token 向量;每层先让 token 互相交换信息,再分别加工每个 token;最后把某个位置的向量变成词表上的概率。

字 → #切成 token

模型只认识编号。单词、汉字或词片段先映射成词表 ID。

# → [ ]变成向量

Embedding 表把每个 ID 查成 d_model 维向量,并加入位置信息。

交换上下文

注意力决定每个 token 应该从其他位置取回多少信息。

[ ] → 词输出概率

最终向量投影到整个词表,经 softmax 得到下一个 token 的概率。

02 · 输入表示

文字怎样进入神经网络?

计算机不能直接计算“猫”。它需要编号、向量和顺序三样东西。

Tokenization:把文本切成模型词表里的零件

“Transformer 很强”可能被切成 [“Transform”, “er”, “很”, “强”]。切法由 tokenizer 决定,和模型一起固定。

Transformer
Token ID

每个 token 在词表里有唯一整数编号,例如“猫”→ 4387。

Embedding

用编号查询一行可训练参数,得到含义向量。相似用法会逐渐得到相近表示。

序列长度 n

一句话最终变成 n 个 token;批处理中会补齐或截断到一定长度。

位置:同样的词,顺序不同,意思不同

纯注意力本身看不出先后顺序,所以必须把位置信息写入向量。

狗 · 位置0追 · 位置1猫 · 位置2
输入 X = Token Embedding + Position Information
原始 Transformer

使用固定的正弦、余弦位置编码,不需要学习参数。

可学习位置向量

为每个位置训练一行 embedding,BERT 等模型使用过这种方案。

RoPE

许多现代大模型旋转 Q、K 向量,让注意力自然感知相对距离。

03 · 核心机制

Self-Attention 到底算了什么?

对每个 token,都做一次“我现在要找什么、别人提供什么、最后拿回什么”的加权检索。

互动:选择正在“思考”的 token

柱子越高,代表当前 token 从那个位置读取的信息越多。注意力权重相加等于 1。

“猫”主要读取动作“坐在”,也保留自身身份。真实模型的权重由训练自动学出。

Q、K、V:一次可学习的数据库查询

每个输入向量分别乘三组参数矩阵,得到 Query、Key、Value。它们来自同一个序列,所以叫 self-attention。

QQuery · 我在找什么?

当前 token 发出的检索请求。比如“它”可能在找前文中的指代对象。

KKey · 我能匹配什么?

每个 token 提供的索引标签。Q 与 K 越匹配,相关分数越高。

VValue · 我真正提供什么?

匹配后被取走的内容。权重用于加权求和所有 V。

Q = XWQ  K = XWK  V = XWV
关键区分:Q 和 K 决定“看谁”;V 决定“拿走什么”。注意力权重由 QKᵀ 算出,却作用在 V 上。

Scaled Dot-Product Attention:五步完整计算

假设有 n 个 token,每个头的维度为 dₖ。矩阵一次算完所有 token 对所有 token 的关系。

① QKᵀ两两点积,得到 n×n 分数
② ÷ √dₖ防止分数过大导致 softmax 太尖
③ + Mask屏蔽 padding 或未来 token
④ Softmax每行变成和为 1 的权重
⑤ × V按权重汇总 Value
Attention(Q,K,V) = softmax((QKᵀ / √dₖ) + M)V
为什么点积代表相关?

训练会把需要匹配的 Q、K 调整到相近方向;方向越一致,点积越大。

为什么需要 √dₖ?

维度增大时点积方差也增大。缩放让 softmax 保持可训练的梯度。

04 · 多头注意力

为什么要同时开很多个“观察角度”?

单个注意力头只有一套 Q/K/V 投影。多个头可以在不同子空间同时学习不同关系。

MultiHead(X) = Concat(head₁, …, headₕ)WO
典型设置:d_model = 768、h = 12,则每个头 dₖ = 64。所有头拼接后又回到 768 维。

05 · 一个完整 Block

注意力之后,还发生了什么?

一个 Transformer block 通常由注意力子层和前馈子层组成;每个子层外都有残差连接与归一化。

完整数据流

LayerNorm稳定每个 token 的特征尺度
Multi-Head Attention在 token 之间交换信息
残差相加x + Attention(LN(x))
LayerNorm再次标准化
Feed-Forward Network每个 token 独立做非线性加工
残差相加得到下一层输入

Residual Connection:保留旧信息,学习增量

子层只需要学习“应该补充什么”,原输入沿捷径直接通过。这让深层网络更容易训练。

原输入 x

当前 token 已经拥有的信息。

子层输出 Δx

注意力或 FFN 新学到的修正。

xnew = x + Sublayer(LayerNorm(x))
现代大语言模型多用 Pre-LN:先 LayerNorm 再进入子层。原论文使用 Post-LN:先残差相加再 LayerNorm。

FFN:token 之间停止交流,各自深入思考

注意力沿“序列方向”混合信息;FFN 沿“特征方向”加工每个 token。所有位置共享同一套 FFN 参数。

FFN(x) = W₂ · activation(W₁x + b₁) + b₂
扩张

d_model 常先扩大到约 4 倍的 d_ff,增加表达容量。

非线性

GELU、SiLU 或 SwiGLU 让网络能表示复杂函数。

压回

第二个线性层把维度恢复到 d_model,便于残差相加。

堆叠很多层:表示逐层变“懂上下文”

Token + Position
第 1 层:局部词语关系
第 2–N 层:组合语义、句法、事实与任务模式
最后一层:为当前预测组织信息
最终隐藏状态
“浅层一定学语法、深层一定学事实”只是常见观察,并非硬编码规则。每层学什么由数据和训练目标共同决定。

06 · Encoder 与 Decoder

能看全句,还是只能看左边?

两种结构最关键的差异是注意力可见范围。这个差异决定模型适合“理解”还是“生成”。

双向 Self-Attention

每个 token 可查看左右所有位置。适合理解整段输入,BERT 是典型 encoder-only 模型。

Causal Self-Attention

每个 token 只能看自己和左侧,避免训练时偷看未来。GPT 是典型 decoder-only 模型。

因果 Mask 长什么样?

行表示正在计算的位置,列表示想看的位置。灰色格子是未来,分数会被加上负无穷,softmax 后权重变成 0。

机器学习
×××
××
机器×
学习

Encoder–Decoder:输入和输出分成两条流

翻译、摘要等任务常使用完整 encoder–decoder。Decoder 除了看已生成内容,还通过 Cross-Attention 读取 encoder 输出。

Encoder

双向读取源文本,产出每个输入 token 的上下文表示。

Decoder Self-Attention

因果遮罩,只读取已经生成的目标 token。

Cross-Attention

Q 来自 decoder;K、V 来自 encoder,让生成内容对齐输入。

07 · 训练与推理

模型怎样学会生成下一个词?

训练时整段目标一次并行计算;推理时必须一个 token 接一个 token 生成。这是速度差异的根源。

Next-Token Prediction:把每个位置都变成一道题

输入右移

输入“我 爱 机器”,目标分别是“爱 机器 学习”。

得到 logits

每个位置输出一个词表长度的原始分数。

Cross-Entropy

正确 token 概率越低,损失越大。

反向传播

梯度更新 embedding、QKV、FFN 等全部参数。

Teacher Forcing:训练时位置 t 总能看到真实的前缀 token;推理时看到的是模型自己刚生成的 token,所以错误可能累积。

从隐藏状态到下一个 token

最后位置向量h ∈ Rd_model
线性投影得到 vocab_size 个 logits
采样temperature / top-k / top-p
Greedy

每次选概率最高者,稳定但容易重复、缺少多样性。

Temperature

降低会让分布更尖锐,提高会增加随机性。

Top-p

只在累计概率达到 p 的最小候选集合中采样。

KV Cache:推理为什么不用每次重算全部历史?

旧 token 在每层产生的 K 和 V 不会因新 token 到来而改变,所以缓存起来。新一步只计算新 token 的 Q、K、V。

缓存的历史 K / V
K₁,V₁K₂,V₂K₃,V₃
新 token 的 Q / K / V
QₜKₜVₜ
收益

避免重复计算旧 token,大幅减少自回归解码的算力。

代价

上下文越长、层数越多,KV Cache 占用的显存越大。

08 · 张量形状

用形状把所有部件对齐

理解 shape 能直接消除大部分 Transformer 代码阅读障碍。下面以 batch=B、长度=n 为例。

张量典型形状含义
token_idsB × n每个样本的一串词表编号
XB × n × d_modelembedding 后的输入表示
Q,K,VB × h × n × dₖ拆成 h 个注意力头
scoresB × h × n × n每个头内,所有 token 两两相关分数
head_outputB × h × n × dₖ每个头汇总 V 后的结果
concatB × n × d_model把所有头重新拼接
FFN hiddenB × n × d_ff每个 token 的扩张特征,常约为 4×d_model
logitsB × n × vocab_size每个位置对整个词表的预测分数
例:d_model=768、h=12,所以 dₖ=64。长度 n=128 时,每层注意力分数含 12×128×128 个数(每个样本)。

09 · 架构家族

BERT、GPT、T5 的区别落在哪里?

它们都使用 Transformer block,主要差别来自可见范围、模块组合和训练目标。

ENCODER-ONLYBERT 类

双向看完整输入,擅长提取上下文表示。

  • 分类、实体识别、检索编码
  • 常用 Masked Language Modeling
  • 天然不按自回归方式生成长文本
DECODER-ONLYGPT 类

因果注意力,只看左侧前缀,连续预测下一个 token。

  • 文本生成、对话、代码生成
  • 训练目标简单且可规模化
  • 当前主流通用大语言模型路线
ENCODER–DECODERT5 类

Encoder 理解输入,Decoder 在 Cross-Attention 帮助下生成输出。

  • 翻译、摘要、结构化转换
  • 输入输出边界清晰
  • 推理时保存 encoder 结果

10 · 成本与边界

Transformer 为什么强,又为什么贵?

注意力让任意两个 token 一步建立联系,但也产生随序列长度平方增长的矩阵。

O(n²)注意力长度成本

n 翻倍时,n×n 注意力分数约变为 4 倍。长上下文尤其昂贵。

参数FFN 常占大头

注意力只是模型参数和算力的一部分;宽大的 FFN 往往占多数参数。

显存训练与推理不同

训练保存中间激活用于反向传播;推理主要承受模型权重和 KV Cache。

常见优化

FlashAttention 减少显存读写;GQA/MQA 减少 K/V 头;量化降低权重与缓存占用。

仍然存在的限制

输出由概率驱动,可能幻觉;有限上下文不等于可靠长期记忆;注意力权重也不等于完整因果解释。

11 · 自测

能答出这 8 题,就真正串起来了

先在脑中回答,再展开答案。每题都对应架构中的一个关键边界。

1. Q、K、V 分别负责什么?

Q 表示当前 token 想找什么;K 表示每个 token 可匹配的索引;V 是匹配后真正被加权取回的内容。

2. 为什么 attention 要除以 √dₖ?

维度增大时点积绝对值容易变大,让 softmax 过度饱和、梯度变小。缩放可稳定分布和训练。

3. 多头与多层有什么区别?

多头在同一层并行观察不同关系;多层把前一层结果继续加工,逐步形成更复杂表示。

4. Attention 和 FFN 各沿哪个方向工作?

Attention 在 token 之间交换信息;FFN 对每个 token 的特征独立做非线性变换。

5. GPT 为什么需要 causal mask?

训练时整段文本同时进入模型;遮住未来位置可防止当前 token 偷看目标答案,并与自回归推理保持一致。

6. Cross-Attention 的 Q、K、V 来自哪里?

Q 来自 decoder 当前状态;K、V 来自 encoder 输出。它让生成端有选择地读取输入端。

7. KV Cache 缓存什么,为什么不缓存 Q?

缓存历史 token 每层的 K、V,因为未来 token 会查询它们。Q 只用于当前 token 发起查询,用完即可。

8. 训练为什么能并行,生成为什么仍是串行?

训练时已知完整真实序列,可用 mask 一次计算所有位置;生成时下一个 token 依赖刚生成的结果,必须逐步进行。