Chapter 01
心智模型:Transformer 到底在做什么
index 给了全局地图——这章建立词汇表与核心直觉:语言建模的任务、为什么 RNN 不够、attention 的"软字典查找"直觉、一块 Transformer 的通信+计算骨架。
读完本章,你脑子里会多出这几条
- 语言模型 = 把一串 token 映射成下一个 token 的概率分布。
- RNN 的串行瓶颈是 Transformer 出现的根因:step t 依赖 t-1,任意两位置路径长 O(n),无法并行。
- Attention 是可微的软字典查找(直觉):query 与所有 key 算相似度→softmax 权重→对所有 value 加权平均。
- 一块 Transformer = attention 通信 + FFN 计算:attention 是 token 跨位置交换信息的唯一算子,FFN 逐位置独立加工。
1.1从序列建模说起:token、embedding、要预测什么
语言模型的任务是:给定一段文本,预测下一个词是什么——而这个「预测」不是单选,是整张词表上的概率分布。
在深入 Transformer 的机制之前,先弄清楚它在解决什么问题。
Token:模型看到的最小单位
模型不直接处理字符,也不直接处理整词。文本首先被切分成 token(文本的原子单位,由分词器决定边界,通常是子词级别:一个常见词 = 1 个 token,罕见词被切成 2–4 个)。英文 "hello" 是 1 个 token;中文「变压器」可能被切成 2–3 个 token;代码里的缩进符可能独占一个 token。GPT-4 的词表约 10 万个 token,Llama 3 约 12.8 万个。
Embedding:把 token 变成向量
token 是整数 id,神经网络处理的是浮点向量。embedding(词嵌入,把离散 token id 映射成连续向量的查表操作)把每个 token id 映射到一个 d_model 维的实数向量。这个向量是模型的「第一语言」:从这一步起,所有计算都在向量空间进行。d_model 典型值:BERT-base = 768,GPT-2 = 768,Llama 3-8B = 4096。
要预测什么:下一个 token 的概率分布
语言模型的核心任务是 next-token prediction:给定前缀序列 x₁, x₂, …, xₙ,输出下一个 token 在整张词表上的概率分布。这个分布用 logits(模型最后一层输出的原始分数向量,尚未归一化为概率)经过 softmax 得到。采样(sample)或取最高概率(argmax)即得到生成的下一个 token。
语言本身有歧义性和多样性:「今天天气」之后可以接「很好」「不错」「真热」……每一个都合理。用分布而非单点,模型在训练时可以对多个合理续接都分配概率质量,而不是把所有概率押在一个答案上。softmax 后的分布在训练时与 ground truth token 的 one-hot 分布算交叉熵损失,推动模型把正确 token 的概率推高。
token:文本的最小离散单位,是整数 id,模型看到的原始输入。
embedding:把 token id 变成连续向量的查表,是进入神经网络的第一步。
logits:模型最后一层输出的原始分数,softmax 之前的向量;softmax(logits) = 概率。
1.2为什么不用 RNN
RNN 把序列压成一个隐状态串行传递,任意两位置之间的路径长度是 O(n)——长序列下梯度消失,训练不可并行。
Transformer 之前,处理序列的主流方案是 RNN(循环神经网络)与 LSTM(Long Short-Term Memory,通过门控机制缓解梯度消失的 RNN 变体)。理解它们的瓶颈,是理解 Transformer 为什么这么设计的根因。
串行瓶颈:step t 依赖 t-1,不能并行
RNN 的前向公式是 hₜ = f(hₜ₋₁, xₜ):第 t 步的隐状态依赖第 t-1 步。这意味着计算整个序列时,必须按顺序一步一步走,无法并行。GPU 的优势是大规模矩阵并行,而 RNN 把这个优势完全锁死。一条 512 token 的句子,RNN 要串行跑 512 步;Transformer 一次算完所有位置。
长序列梯度消失:信息在长路径上衰减
梯度通过时间反向传播(BPTT)时,需要乘以每一步的 Jacobian。链式相乘超过几十步,梯度要么指数级衰减(消失),要么指数级爆炸。LSTM 的门控机制缓解了这个问题,但没有从根本上解决——超过几百 token 的长程依赖仍然脆弱。
任意两位置路径长 O(n):信号传递代价高
衡量一个架构处理长程依赖的能力,可以看「任意两个位置之间信号需要经过多少步才能互相影响」。RNN 中,位置 1 和位置 n 之间需要经过 n-1 步中间隐状态——路径长度 O(n)。Attention 中,任意两位置直接计算相似度,路径长度 O(1)。路径越长,梯度越难传,依赖越难学。
| 维度 | RNN / LSTM | Transformer |
|---|---|---|
| 训练并行 | 串行,GPU 无法并行计算各步 | 全并行,所有位置同时算(因果掩码保证不偷看未来) |
| 任意两位置路径 | O(n),长序列梯度难传 | O(1),直接计算注意力 |
| 长程依赖 | LSTM 缓解但未解决,超百 token 后脆弱 | 直接连,上限由 d_model 和注意力质量决定 |
| 计算复杂度 | O(n·d²),可并行 d 维 | O(n²·d),注意力矩阵 n×n 是代价(见第 04 章) |
1.3Attention 是什么:可微的软字典查找(直觉层)
注意力是一次"软"字典查找——不精确命中一个 key,而是按相似度对所有 value 加权平均。
「attention」这个词经常被误解为「模型在看哪些词」的玄学。实际上,attention 是一个完全确定的数学操作,有清晰的类比:一次可微的软字典查找。完整数学(softmax(QKᵀ/√d_k)·V 以及为什么除 √d_k)留到第 02 章,这里只建直觉。
类比:从硬字典到软字典
硬字典(精确匹配):给一个 query(查询键),在字典里找到精确匹配的 key,返回对应的 value。Python 的 dict[key] 就是这个操作——命中则返回,不命中则报错。
软字典
「可微」意味着这整个操作端到端可以用梯度下降训练——query、key、value 都是通过线性投影从 token embedding 里学出来的,不是人手工指定的。「软」意味着结果是所有 value 的凸组合,而不是非此即彼地选一个。
如果 attention 权重是 [0.9, 0.05, 0.05],第一个 value 向量范数为 0.01,后两个 value 向量范数各为 100,哪个 value 对输出影响更大?
展开答案(先停 10 秒再点)
后两个 value。输出是加权平均:权重 × value 向量。即使第一个权重最大(0.9),对应的 value 范数极小(0.01),贡献量极低;后两个权重虽只有 0.05,但 value 范数 100,贡献量远超第一个。
这说明注意力权重 ≠ 重要度——value 向量的范数是缺失的另一半。光看注意力热力图会误导。这是 attention 最常见的解释陷阱,完整论证见第 02 章注意力权重≠重要度一节。
形状直觉(不涉及 √d_k 的完整推导)
设序列长度为 n,每个 token 的向量维度为 d_k。attention 操作接受三组向量:Q(query,形状 n × d_k)、K(key,形状 n × d_k)、V(value,形状 n × d_v)。Q 与 K 的点积产生 n×n 的相似度矩阵——每个位置对每个位置的分数。softmax 按行归一化,再乘以 V,输出形状 n × d_v。每一行输出是该位置综合了所有位置信息的新表示。
为什么要除以 √d_k?答案涉及点积方差的论证(d_k 维点积方差 = d_k,不缩放会把 softmax 推进近 one-hot 区导致梯度消失)。这是 attention 机制的重要细节,放到第 02 章完整展开——那章的起点就是从这里接上去的。
1.4一块 Transformer = 通信 + 计算
Karpathy 框架:attention 是 token 跨位置交换信息的唯一算子(通信);FFN 逐位置独立加工(计算)。两者缺一不可,顺序不能换。
Andrej Karpathy 在 nanoGPT 讲解中提出了一个极度清晰的框架:每个 Transformer block 由两种性质完全不同的操作交替组成。
Attention = 通信(Communication)
self-attention 是整个 Transformer 里唯一让 token 跨位置交换信息的算子。每个位置发出 query,与所有位置的 key 计算相似度,把各位置的 value 信息聚合回来——这是 token 之间的通信。没有 attention,每个位置只能看到自己,对上下文一无所知。
LayerNorm、残差连接、FFN 都是逐位置(position-wise)独立处理的——每个位置的计算不依赖其它位置的数据,即使有 n 个 token,这些操作也是 n 个独立的函数调用。token 之间只在 attention 里说话。
FFN = 计算(Computation)
FFN(前馈网络,两层线性变换加激活函数,FFN(x) = max(0, xW₁+b₁)W₂+b₂)逐位置独立处理,位置 3 的 FFN 计算与位置 1、2 的数据毫无关系。Geva 等人(2021)的研究表明,FFN 的权重像键值记忆一样存储事实和语义模式:W₁ 的行是 key(某种输入模式的检测器),W₂ 的列是 value(对应的输出知识)。知识住在 FFN 里,语境整合住在 attention 里。
为什么顺序不能换
先通信(attention)让每个位置知道上下文,再计算(FFN)对这个「被语境化的表示」独立加工——这个顺序有意义。如果先跑 FFN,每个位置只在自己的原始 embedding 上加工,还没看过上下文;再跑 attention,聚合的是还没被 FFN 加工过的信息。两者交替、顺序固定,是 block 设计的核心。
1.5三种形态:encoder-only / decoder-only / encoder-decoder
同一套 attention+FFN 积木,因掩码策略和堆叠方式不同,长出了三种形态:BERT 的双向 encoder、GPT 的因果 decoder、T5 的 seq2seq encoder-decoder。
Transformer 原论文(Vaswani 2017)给出的是 encoder-decoder 结构,用于机器翻译。此后社区发现同一套积木可以三种方式组合,适配不同任务。
Encoder-Only(双向)· 代表:BERT
每个位置的 attention 可以看到整个序列——既看左边也看右边,无因果掩码。输出是每个 token 的双向上下文化表示。适合:分类(句子情感)、序列标注(命名实体识别)、embedding(把句子压成一个向量)。不适合:生成——双向模型看到了整个序列,生成时会泄露「答案」。BERT-base(2018):d_model=768,12 层,约 110M 参数。
Decoder-Only(因果)· 代表:GPT 系列 / Llama / 几乎所有现代 LLM
每个位置只能看到自己和左边的位置(因果掩码,Causal Masking:attention 矩阵的上三角位置置 −∞,softmax 后权重为 0,防止偷看未来 token)。适合:文本生成、补全、对话。关键细节:decoder-only 没有 cross-attention——它不是 encoder-decoder 的「一半」,每个 block 只有因果自注意力 + FFN。为什么它成了 LLM 主流?next-token prediction 这一个目标就能驱动大规模预训练,简单、普适、可扩展,不需要成对的输入-输出数据。GPT-2(2019,1.5B);Llama 3-70B(2024);Claude 3/4 系列均为 decoder-only。
Encoder-Decoder(seq2seq)· 代表:T5 / BART / 原始 Transformer
编码端(encoder)用双向 attention 处理输入序列,解码端(decoder)用因果 attention 处理输出序列,并通过 cross-attention(decoder 的 Q 来自解码端,K/V 来自编码端输出)将两侧信息桥接。适合:机器翻译、摘要、问答(有明确输入输出对)。现状:seq2seq 任务现在也常用指令微调的 decoder-only 模型处理,encoder-decoder 的独特优势在输入-输出差异极大的任务(如翻译)上才特别显著。cross-attention 的完整机制见第 02 章 self vs cross attention。
| 形态 | Attention 方向 | 典型代表 | 主要适用任务 |
|---|---|---|---|
| Encoder-Only | 双向(全局可见) | BERT、RoBERTa | 分类、NER、embedding |
| Decoder-Only | 因果(只看左边) | GPT 系列、Llama、Claude | 生成、补全、对话——LLM 主流 |
| Encoder-Decoder | Encoder 双向 + Decoder 因果 + Cross | T5、BART、原始 Transformer | 翻译、摘要、seq2seq |
decoder-only 的每个 block 是因果自注意力 + FFN,没有 cross-attention。不要把它当成「只用 decoder 的 enc-dec 模型」——enc-dec 的 decoder 有三种 sublayer(masked self-attention + cross-attention + FFN),而 GPT/Llama 的 decoder 只有两种(causal self-attention + FFN)。这个差异在看架构图时非常容易混淆。
§本章 self-check
先合上教程,把能想到的答案写在纸上或编辑器里。写完再展开答案对照——直接展开等于把这一节当再读一遍。
- token、embedding、logits 三者各是什么?在前向计算中的顺序是什么?
- RNN 有三个典型缺陷导致 Transformer 出现,分别是什么?对应于 Transformer 的哪个设计选择解决了它?
- attention 的「软字典查找」类比:Q、K、V 分别扮演类比中的哪个角色?输出是什么?
- 一块 Transformer block 里,哪个操作让 token 跨位置通信?哪个操作逐位置独立?如果一个 bug 让 FFN 意外读到了其它位置的信息,破坏了哪个设计原则?
答案(先做完再展开)
- token:文本切分后的离散单位,整数 id。embedding:把 token id 查表映射到连续向量(d_model 维),是神经网络的输入。logits:模型最后一层输出的原始分数向量,softmax 后得概率。顺序:token id → embedding → 多层 Transformer 处理 → logits → softmax → 概率分布。
- ① 串行不可并行(step t 依赖 t-1)→ Transformer 的 attention 全并行,所有位置同时算。② 梯度消失(长链式乘法)→ 残差连接让梯度绕过中间层(见第 03 章)。③ O(n) 路径长度(任意两位置需经 n-1 步)→ attention O(1) 直接连接。
- Q(query)= 查询键(要找什么);K(key)= 字典里的键(每个条目的标签);V(value)= 条目内容(要返回的信息)。输出是所有 value 的加权平均,权重由 Q 与各 K 的相似度经 softmax 归一化得到。
- attention 让 token 跨位置通信(唯一);FFN、LayerNorm、残差逐位置独立。FFN 意外读其它位置信息,破坏了「FFN = 逐位置独立计算」这一原则,也破坏了通信/计算的明确分工——Karpathy 框架的核心不变式。