跳到主要内容

三种架构 — 理解、翻译、生成

这一章讲三件事: 三种架构凭什么分开(答案:注意力矩阵的形状);Encoder-only 一族(BERT 及三个变体)怎么练理解力、天花板在哪;Encoder-Decoder 一族(T5 与 BART)怎么把「生成」接回来。 链条位置:第 02 章给了「一台机器三种练法」的配方表,这一章把前两种配方做成整机——并为第 04 章 Decoder-only 的胜利摆好对照组(用来对比的一组)。

1. 顶层全景:分家的依据是注意力矩阵

Encoder-only :每个词 ↔ 所有词 (完全/双向)
Encoder-Decoder :编码器完全看 + 解码器只看上文(下三角)+ 解码器随时回头查编码器(交叉)
Decoder-only :每个词只 ↔ 之前的词 (下三角/单向)
图说:注意力矩阵是一张「谁能看谁」的许可表;三种架构的一切差异都从这张表长出来。

书里对三种架构逐一核对了这张表:Encoder-only 是「完全」的注意力,每个词的理解动用全句;Encoder-Decoder 是三种机制叠加——编码器自注意力(完全)、解码器掩码自注意力(下三角,生成时只看已生成的部分,防止「预见」未来)、交叉注意力(解码器动态参考编码器的完整上下文——摊在它眼前的全部输入信息);Decoder-only 只剩掩码自注意力1

适用任务随之分开:Encoder-only 适合情感分析(判断一句话是夸还是骂)、文本分类这类**理解(判别)**任务,要它直接生成文本就得逐 token 反复算,成本高、连贯性差2;Encoder-Decoder 适合机器翻译、摘要这类「理解了再产出」的条件生成;Decoder-only 在无给定输入的开放式生成里最自然——这是第 04 章的伏笔:大规模之后它反而成了「大一统」架构3

2. Encoder-only:把「理解」练到极致

2.1 BERT:完型填空练出来的理解力

本节是本章主走查。 BERT(2018-10,Google)结构与 Transformer 编码器几乎一致:Base 版 12 个编码模块、隐藏层(中间那层的宽度)768 维、12 个注意力头、1.1 亿参数;Large 版 24 层、1024 维、16 头、3.4 亿4。训练语料是 8 亿 token 的小说(BookCorpus)加 25 亿 token 的英文维基,共约 33 亿 token、15GB5。它的特别之处在预训练任务,书用水豚的句子走完整条流水线6:

原文:「水豚性格温顺. 且没有攻击性. 因此能与大多数动物和谐相处. …」
① 构造句对:50% 概率取原文连续两句,50% 概率随机拼两句
→ [CLS] 水豚 性格 温顺 . [SEP] 且 无 攻击性 . [SEP] (这俩是连续句)
② NSP 下文预测:判断两句是否连续 → 学句间关系
③ MLM 掩码语言建模:随机遮 ~15% 的 token → [CLS] 水豚 性格 [MASK] . [SEP] 且 无 [MASK] 击性 …
被遮的内容是「温顺」「攻」;模型看前后文猜原词(完型填空)
图说:损失只算被遮的那 15% token,其余不算——只对挖过的空学习。

下游怎么用靠一个特殊标记:[CLS] (Classification Token,分类标记)聚合全句信息,输出一个定长向量——一串装着全句意思的数。分类任务取它接一个全连接层;问答任务输入「[CLS] 问题 [SEP] 文本 [SEP]」,用两个全连接层分别输出答案的起止位置。

语义相似度可以拼两段文本,也可以各取一串数(向量——把意思变成一组坐标的表示)算余弦——两串数的夹角越小越相似——来比相似度7

2.2 三个变体,三条改造路线

  • RoBERTa(2019-07,Meta):诊断是「BERT 训练不充分」。数据 15GB→160GB(加新闻、网页、故事语料),删掉 NSP,静态掩码改动态——同一份数据复制 10 个副本各掩一次,BERT 过完 40 遍完整语料也只反复看一种掩法,RoBERTa 能看 10 种8

  • ALBERT(2019-09,Google):诊断是「参数太胖」。两刀瘦身:参数因子分解——嵌入矩阵(词表里每个词对应的那排数)不再直接做成「词表×768 维」,而是先投影到 128 维再升回去,BERT-Base 这块从约 2304 万参数降到约 394 万(六分之一);跨层参数共享——12 层只学第一层的参数直接复用。保留 MLM,把 NSP 换成句序预测(判断两句是正序还是反序)9

  • ELECTRA(2020-03,Google/斯坦福):诊断是「只有 15% 的 token 在学习」。改成生成器-判别器:生成器(一个小 BERT)把掩码填上——可能填对也可能填错;判别器逐个判断每个 token 是否被替换过。训练信号从 15% 扩大到全部 token,同样的算力(训练要烧的计算量)学到更多10

2.3 天花板

书里的总结是硬的:这一族参数止步于 6.6 亿(ELECTRA-Large),预训练任务都服务理解,只擅判别任务,难以应对生成任务——在生成式(以产出内容为主)人工智能愈热的背景下作用有限11。要生成,得把解码器接回来。

3. Encoder-Decoder:理解与生成的流水线

3.1 结构:交叉注意力是桥

编码器部分与 BERT 同款;解码器每个模块由掩码自注意力+交叉注意力+FFN 组成。书把两个注意力的分工讲得很清楚:掩码自注意力保证解码只依赖上文(自回归),交叉注意力让解码器每生成一个词都能回头参考编码器对全句的理解——query 来自解码器,key/value 来自编码器12。训练时输出侧前拼 [START] 用 Teacher Forcing 并行算;推理时没有答案,只能自回归串行地一个个往外蹦,直到结束标记或长度上限13

3.2 T5:把所有任务写成「文本进、文本出」

T5(2019-10,Google)要解决的问题是:翻译、摘要、问答各自定制训练,费时费力还难复用,「重复造轮子」。它的答案是把一切任务统一成文本到文本:用输入前缀指示任务——「翻译成中文:」「总结以下内容:」——同一个模型换前缀就换任务。书特别指出:这可以视为早期提示(Prompt)技术的运用14 (第 06 章的 Prompt 工程在此埋下种子)。

规模上给了五档:Small 6000 万(6+6 层)到 11B(约 110 亿参数,128 个注意力头)15。数据是 C4——从 Common Crawl 网页清洗出的约 750GB 语料;这一步花的算力——训练要烧的计算量——由 Google 承担16。预训练任务 Span Corruption:选 15% 的 token,每次遮连续三个 token 成的小段,要求整段还原——比 BERT 逐词填空更难,逼模型抓住短语级的语义单元17。下游既能零样本(不给示例直接考)换前缀直接用,也能微调18

变体里 mT5 扩到 100 多种语言、T0 靠多任务训练强化零样本、Flan-T5 专注指令微调(拿「指令+回答」格式的数据来调)。

3.3 BART:反过来,把「破坏」做成菜单

BART(2019-10,Meta)与 T5 同月发布,思路相反:任务不统一,破坏方式多样化。结构与原始 Transformer 相同(Base 6+6 层,1.4 亿;Large 12+12 层,4 亿),语料与 RoBERTa 同款 160GB。五种破坏文本的手段,训练模型复原19:

破坏手段练什么能力
Token 遮挡(类似 MLM)猜被换掉的词
Token 删除同时推断位置与内容(模型不知道哪儿少了词)
连续文本填空(同 Span Corruption)还原整段;span 长度服从 λ=3 的泊松分布
句子打乱推理前后句关系
文档旋转找到文本的合理起点

书把两家的路线差异总结为一句话:T5 统一任务框架,BART 多样化预训练任务;Encoder-Decoder 一族参数上限到 110 亿(T5-11B),在翻译、摘要、问答上胜过 Encoder-only20

4. 作者的判断与证据

  • 给了证据的:BERT 两个版本的层数/维度(向量宽度)/参数;ALBERT 2304 万→394 万的算例;三种架构注意力矩阵的形状对比;两家的参数-语料表(T5 最高 110 亿/750GB,BART 1.4–4 亿/160GB)。

  • 作者的判断(有依据但非本文实验):Encoder-only「止步 6.6 亿」「生成式时代作用有限」——这是对表 2.1 的归纳;RoBERTa「训练不充分」、ALBERT「参数冗余」、ELECTRA「学习信号浪费」三条诊断分别引各自论文。

  • 容易被误读的:「BERT-Base 与 GPT-1 结构高度类似」——后面第 04 章会讲,差别只在注意力是双向还是带掩码的单向。

5. 边界与局限

  • 书未讨论 BERT 系在今天的实际地位:工业界的中文理解类任务仍大量用 Encoder-only 模型,「作用有限」只对生成式场景成立。

  • NSP 被 RoBERTa 废弃、被 ALBERT 换成句序预测——书给了事实,但没给「为什么 NSP 失效」的分析(任务太简单,模型靠词面重叠就能猜对)。

  • ELECTRA 的生成器-判别器借用了生成对抗网络的思想,书只点到名字;这套做法的英文缩写叫 GAN(Generative Adversarial Network),本身不在本书范围。

  • 所有参数/语料数字是 2018–2020 年的存量,今天只当史实读。

6. 可带走的

  1. 三种架构的差异=注意力矩阵的形状;「谁能看谁」决定「适合干什么」。
  2. BERT=完型填空(15% 遮掩,损失只算空)+句对判断;[CLS] 一个向量代表全句。
  3. RoBERTa 加数据换动态掩码;ALBERT 因子分解+跨层共享;ELECTRA 让全部 token 都产生学习信号。
  4. Encoder-only 的死穴:参数止步 6.6 亿,生成要逐词重算。
  5. 交叉注意力是 Encoder-Decoder 的桥:解码器生成的每个词都能回头查编码器的全句理解。
  6. T5 的输入前缀=最早的 Prompt;Span Corruption 遮连续片段。
  7. BART 的五种破坏(遮挡/删除/填空/打乱/旋转)各练一种鲁棒(被折腾过还照样好使)性。

7. 原文地图

主题原书章原文位置
注意力矩阵三形状2.2 大语言模型架构概览text/03-ch02-02-2-2.txt:254(搜「完全」) · text/03-ch02-02-2-2.txt:270(搜「下三角」) · text/03-ch02-02-2-2.txt:270(搜「下三角」)
掩码防预见未来2.2 大语言模型架构概览text/03-ch02-02-2-2.txt:152(搜「预见」)
Enc-only 生成要重算2.2 大语言模型架构概览text/03-ch02-02-2-2.txt:97(搜「重新计算整个输入序列」)
大一统2.2 大语言模型架构概览text/03-ch02-02-2-2.txt:342(搜「大一统」)
双向编码与上下文嵌入2.3 基于 Encoder-only 架构的大语言模型text/04-ch02-03-2-3-encoder-only.txt:19(搜「双向编码模型」) · text/04-ch02-03-2-3-encoder-only.txt:31(搜「上下文嵌入」)
BERT 两版本参数2.3.2 BERT 语言模型text/04-ch02-03-2-3-encoder-only.txt:74(搜「1.1 亿」)
33 亿 token 语料2.3.2 BERT 语言模型text/04-ch02-03-2-3-encoder-only.txt:82(搜「33 亿」)
水豚预训练流水线2.3.2 BERT 语言模型text/04-ch02-03-2-3-encoder-only.txt:87(搜「NSP」) · text/04-ch02-03-2-3-encoder-only.txt:115(搜「50% 的概率」) · text/04-ch02-03-2-3-encoder-only.txt:133(搜「15% 的 Token」)
[CLS] 分类标记2.3.2 BERT 语言模型text/04-ch02-03-2-3-encoder-only.txt:165(搜「分类标记」) · text/04-ch02-03-2-3-encoder-only.txt:182(搜「起始和结束位置」)
RoBERTa 动态掩码2.3.3 BERT 衍生语言模型text/04-ch02-03-2-3-encoder-only.txt:217(搜「不充分」) · text/04-ch02-03-2-3-encoder-only.txt:263(搜「10 个副本」)
ALBERT 因子分解2.3.3 BERT 衍生语言模型text/04-ch02-03-2-3-encoder-only.txt:320(搜「394 万」) · text/04-ch02-03-2-3-encoder-only.txt:331(搜「第一层编码模块」) · text/04-ch02-03-2-3-encoder-only.txt:365(搜「句序预」)
ELECTRA 找茬2.3.3 BERT 衍生语言模型text/04-ch02-03-2-3-encoder-only.txt:413(搜「替换词检测」) · text/05-ch02-04-2-4-encoder-decoder.txt:5(搜「15% 的固定比例」)
止步 6.6 亿2.4 基于 Encoder-Decoder 架构的大语言模型text/05-ch02-04-2-4-encoder-decoder.txt:21(搜「止步于 6.6 亿」)
Enc-Dec 双注意力分工2.4.1 Encoder-Decoder 架构text/05-ch02-04-2-4-encoder-decoder.txt:57(搜「泄露」) · text/05-ch02-04-2-4-encoder-decoder.txt:91(搜「query」)
T5 前缀即早期 Prompt2.4.2 T5 语言模型text/05-ch02-04-2-4-encoder-decoder.txt:132(搜「输入前缀」) · text/05-ch02-04-2-4-encoder-decoder.txt:134(搜「早期的提示」)
T5 五档与 C42.4.2 T5 语言模型text/05-ch02-04-2-4-encoder-decoder.txt:177(搜「110 亿」) · text/05-ch02-04-2-4-encoder-decoder.txt:186(搜「C4 数据集」)
Span Corruption2.4.2 T5 语言模型text/05-ch02-04-2-4-encoder-decoder.txt:191(搜「Span Corruption」) · text/05-ch02-04-2-4-encoder-decoder.txt:193(搜「连续三个 Token」)
BART 五任务2.4.3 BART 语言模型text/05-ch02-04-2-4-encoder-decoder.txt:268(搜「被破坏的文本」) · text/05-ch02-04-2-4-encoder-decoder.txt:317(搜「泊松分布」) · text/05-ch02-04-2-4-encoder-decoder.txt:326(搜「文档旋转」)

Footnotes

  1. 出处:「2.2 大语言模型架构概览」第 254 段(text/03-ch02-02-2-2.txt:254,搜「完全」)、第 270 段(text/03-ch02-02-2-2.txt:270,搜「下三角」)与第 270 段(text/03-ch02-02-2-2.txt:270,搜「下三角」)。三种注意力机制的叠加描述在第 24 段。

  2. 出处:「2.2 大语言模型架构概览」第 97 段(text/03-ch02-02-2-2.txt:97,搜「重新计算整个输入序列」)与「2.2.2 模型架构的功能对比」(text/03-ch02-02-2-2.txt:301,搜「自然语言理解」)。

  3. 出处:「2.2.2 模型架构的功能对比」第 342 段(text/03-ch02-02-2-2.txt:342,搜「大一统」)。

  4. 出处:「2.3.2 BERT 语言模型」第 74 段(text/04-ch02-03-2-3-encoder-only.txt:74,搜「1.1 亿」)。Base 12 层/768 维/12 头,Large 24 层/1024 维/16 头/3.4 亿。

  5. 出处:「2.3.2 BERT 语言模型」第 82 段(text/04-ch02-03-2-3-encoder-only.txt:82,搜「33 亿」)。BookCorpus 约 8 亿 token,英文维基约 25 亿。

  6. 出处:「2.3.2 BERT 语言模型」第 87 段(text/04-ch02-03-2-3-encoder-only.txt:87,搜「MLM」)。MLM 与 NSP 两任务定义在同段;50% 连续句概率在第 115 段(text/04-ch02-03-2-3-encoder-only.txt:115,搜「50% 的概率」);水豚样例见图 2.7(text/04-ch02-03-2-3-encoder-only.txt:87,搜「NSP」);15% 遮掩比例与只算被遮 token 的损失在第 133 段(text/04-ch02-03-2-3-encoder-only.txt:133,搜「15% 的 Token」)。

  7. 出处:「2.3.2 BERT 语言模型」第 165 段(text/04-ch02-03-2-3-encoder-only.txt:165,搜「分类标记」)。问答起止位置在第 182 段(text/04-ch02-03-2-3-encoder-only.txt:182,搜「起始和结束位置」)。

  8. 出处:「2.3.3 BERT 衍生语言模型」第 217 段(text/04-ch02-03-2-3-encoder-only.txt:217,搜「不充分」)与第 263 段(text/04-ch02-03-2-3-encoder-only.txt:263,搜「10 个副本」)。

  9. 出处:「2.3.3 BERT 衍生语言模型」第 320 段(text/04-ch02-03-2-3-encoder-only.txt:320,搜「394 万」)、第 331 段(text/04-ch02-03-2-3-encoder-only.txt:331,搜「第一层编码模块」)与第 365 段(text/04-ch02-03-2-3-encoder-only.txt:365,搜「句序预」)。BERT-Base 嵌入层约 2304 万参数的对照在第 308 段(text/04-ch02-03-2-3-encoder-only.txt:308,搜「V × H」)。

  10. 出处:「2.3.3 BERT 衍生语言模型」第 413 段(text/04-ch02-03-2-3-encoder-only.txt:413,搜「替换词检测」)与「2.4 基于 Encoder-Decoder 架构的大语言模型」第 5 段(text/05-ch02-04-2-4-encoder-decoder.txt:5,搜「15% 的固定比例」)。

  11. 出处:「2.4 基于 Encoder-Decoder 架构的大语言模型」第 21 段(text/05-ch02-04-2-4-encoder-decoder.txt:21,搜「止步于 6.6 亿」)。

  12. 出处:「2.4.1 Encoder-Decoder 架构」第 57 段(text/05-ch02-04-2-4-encoder-decoder.txt:57,搜「泄露」)与第 91 段(text/05-ch02-04-2-4-encoder-decoder.txt:91,搜「query」)。

  13. 出处:「2.2 大语言模型架构概览」第 168 段(text/03-ch02-02-2-2.txt:168,搜「[START]」)与第 168 段(text/03-ch02-02-2-2.txt:168,搜「[START]」)。

  14. 出处:「2.4.2 T5 语言模型」第 132 段(text/05-ch02-04-2-4-encoder-decoder.txt:132,搜「输入前缀」)与第 134 段(text/05-ch02-04-2-4-encoder-decoder.txt:134,搜「早期的提示」)。

  15. 出处:「2.4.2 T5 语言模型」第 177 段(text/05-ch02-04-2-4-encoder-decoder.txt:177,搜「110 亿」)。Small 6000 万/6+6 层在同段开头。

  16. 出处:「2.4.2 T5 语言模型」第 186 段(text/05-ch02-04-2-4-encoder-decoder.txt:186,搜「C4 数据集」)。约 750GB 在同段。

  17. 出处:「2.4.2 T5 语言模型」第 191 段(text/05-ch02-04-2-4-encoder-decoder.txt:191,搜「Span Corruption」)与第 193 段(text/05-ch02-04-2-4-encoder-decoder.txt:193,搜「连续三个 Token」)。

  18. 出处:「2.4.2 T5 语言模型」第 227 段(text/05-ch02-04-2-4-encoder-decoder.txt:227,搜「mT5」)与第 231 段(text/05-ch02-04-2-4-encoder-decoder.txt:231,搜「Flan-T5」)。

  19. 出处:「2.4.3 BART 语言模型」第 268 段(text/05-ch02-04-2-4-encoder-decoder.txt:268,搜「被破坏的文本」)、第 317 段(text/05-ch02-04-2-4-encoder-decoder.txt:317,搜「泊松分布」)与第 326 段(text/05-ch02-04-2-4-encoder-decoder.txt:326,搜「文档旋转」)。

  20. 出处:「2.4.3 BART 语言模型」末段(text/06-ch02-05-2-5-decoder-only.txt:15,搜「良好的性能表现」)。T5 统一框架与 BART 多样化任务的对比在第 238 段(text/05-ch02-04-2-4-encoder-decoder.txt:238,搜「不同于 T5」)。