五样东西 — 让今天这代模型成立的那条接力
这一章讲三件事: 支撑大模型的五样东西各自解决什么问题; 它们为什么是一条接力而不是一张清单;以及每一项的边界在哪、书里漏了什么。 第 01 章给了坐标系,这一章是全书技术部分的骨架——第 03 到 05 章都建在它上面。 只需要知道「模型是一个由训练搜出来的函数」,其余生词当场解释。
1. 先看现象:五个你大概都听过的词,但不知道它们什么关系
任何一场大模型讨论里都会冒出五个词,而多数人说不清它们是什么关系。
最容易犯的错是把它们当成五项并列的技术,好像可以任选几项来用。
不是。它们是一条链,每一环都是被上一环的遗留问题逼出来的。
循环网络学 不到远处的词,而且只能一步步串着算,慢
└→ ① Transformer:注意力让任意两词直接连,顺带能并行
↓ 得到一个什么都懂一点、什么都不精的通用模型
└→ ② 微调:拿小数据把它调到具体任务上
↓ 它会说了,但说的不一定是人想听的
└→ ③ RLHF:让人给它的回答打分,再拿这些分回头去调它
↓ 它听话了,但太大,普通硬件跑不动
└→ ④ 压缩:想办法让它瘦下来
↓ 它跑起来了,但会输出不该输出的东西
└→ ⑤ 安全与隐私:让它别说不该说的、别把人认出来
图说:五项技术是一条接力,不是五个可选项。中间断一环,后面全部落空。
这条链是这本书讲得最清楚的一段,值得完整记住1。 每一环各是什么,下面五节各占一节,到那一节当场解释。
2. ① Transformer:让任意两个词直接连上
先看现象:早期翻译软件为什么老是丢主语
你可能用过早期的机器翻译。它翻短句还行,句子一长就开始出错—— 尤其是代词指代:「他」到底指前面哪个人,它经常搞错。
这不是训练不够,是结构决定的。
它解决什么问题:两个死结
Transformer 之前,处理文字主要靠循环神经网络——「循环」的意思是, 它一个词一个词往下读,每读一个就更新一次内部状态, 当前的理解全靠上一步传下来的那点状态。
这带来两个死结2:
| 死结 | 书里的原话 | 说人话 |
|---|---|---|
| 记不住远处 | 长距离信息会被弱化,距离越远获取难度越大 | 传了几十步之后,开头那个词的信息已经被冲淡了 |
| 快不起来 | 串行处理,依赖前面层的计算结果,难以并行(并行就是好多份计算同时开工) | 第 100 个词必须等前 99 个算完,GPU 有一万个核也用不上 |
第二条比第一条更致命。 它的意思是:这条路线天生吃不下算力。 回想第 01 章那条「能吃满算力的方法会赢」的判断——循环网络输在这里。
怎么做:注意力
2017 年 Google 那篇论文的做法很激进——把循环和卷积全扔了,只留注意力3。
「注意力」这个词的来历,书交代得很好: 它受人类视觉启发—— 人看东西时先整体扫一遍,然后把注意力集中到重点区域,同时忽略其他信息3。
书把具体算法拆成两步:第一步把每个词变成一串数,第二步算出「这个词跟我有多大关系」, 再按这个数把大家的意思混一混4。书到这里就打住了,一个具体的数都没给。 下面这条走查是我们补的,它会一路走到本章末尾。
一条贯穿全章的主走查:「那只猫没过马路,因为它太累了」
这一节到第 6 节的五样东西,每一样都会回到这句话上占一步。 下面出现的每一个数值都是为演示编的,不是真实数值—— 真实模型里一个词带的是几千个数,这里只写三个,好让你能拿计算器跟着按。
第 1 步:每个词先各自变成一串数。 我们只走到「它」为止,前面这八块是——那 / 只 / 猫 / 没 / 过 / 马路 / 因为 / 它 (「马路」「因为」在这里各算一块;「太累了」排在「它」后面,这一步还用不上)。 每一块各带一串数: 「猫」这一串的前三位是 0.31 / −0.12 / 0.88,「它」是 0.02 / 0.10 / 0.35, 「马路」是 −0.60 / 0.22 / −0.40。这一串数就是第 01 章说的向量, 八串数摞起来就是整句话——一张八行三列的数字表格。
第 2 步:两串数怎么比出一个「相关程度」? 书只说了「相关性高的,数值大」,没说这个数从哪来。 最朴素的办法是把两串数逐位相乘再加起来——两串数越像,这个和越大。 拿「它」和「猫」按这个办法算:0.02×0.31 + 0.10×(−0.12) + 0.35×0.88 = 0.302; 换成「它」和「马路」:0.02×(−0.60) + 0.10×0.22 + 0.35×(−0.40) = −0.130。 一正一负,差别当场就出来了。
第 3 步:把这一列原始分数摊成一组加起来正好等于 1 的比例。 分数高的多分一点,分数低的少分一点(具体怎么摊,书里一个字没讲)。 处理到「它」这一步时,摊完是这样:
| 那 | 只 | 猫 | 没 | 过 | 马路 | 因为 | 它 |
|---|---|---|---|---|---|---|---|
| 0.03 | 0.02 | 0.50 | 0.04 | 0.03 | 0.02 | 0.06 | 0.30 |
「猫」拿走了整整一半,「马路」几乎没拿到——两者差 25 倍。
第 4 步:按这组比例,把八串数混成一串新的,当作「它」这一步的新表示。 只看第一位。八个词的第一位依次是 0.10、0.05、0.31、−0.20、0.08、−0.60、0.15、0.02, 各乘上面那八个比例再加起来:
0.03×0.10 + 0.02×0.05 + 0.50×0.31 + 0.04×(−0.20)
+ 0.03×0.08 + 0.02×(−0.60) + 0.06×0.15 + 0.30×0.02 = 0.16
图说:「它」这串数的第一位,从原来的 0.02 变成了 0.16 ——
往「猫」的 0.31 挪了一大截,离「马路」的 −0.60 更远了。
这就是「它指的是猫」这件事在数上的样子:不是模型「判断」出来的,是混出来的。 所以它后面接的词才像在说猫,而不是在说马路。
这套做法叫自注意力——「自」的意思是在同一个句子内部做这件事5。
第 5 步:多头注意力就是把上面这一整套按几个角度各算一遍。 劈成三份,每份独立打自己的分: 一份盯指代,就是上面那份,给「猫」打 0.50; 一份盯场景,给「马路」打 0.35,因为它关心的是这件事发生在哪儿。
第三份盯的是语法——就是词和词怎么搭配才通顺。 它给「没」打 0.31,因为「没」要和「过」搭成「没过」。
注意「马路」这个词:在指代那一份里它只值 0.02,在场景那一份里值 0.35——差 17 倍。 三份各混出一串数,再拼回一串。劈开就是为了同时关注多个位置6。 书举的正是这个例子:翻译时代词「它」指什么,要看整句话的含义。
第 6 步:同一句话交给 BERT 和交给 GPT,输入输出完全不一样。 把「累」挖掉,给 BERT 看「那只猫没过马路,因为它太▢了」,让它把「累」填回来; 把「因为」之后全遮住,给 GPT 看「那只猫没过马路,」,让它自己往下接—— 它可能接出「因为它太 累了」,也可能接出「所以主人很着急」,两个都算对。 同一句话,一个被要求补中间,一个被要求造后面。
为什么这么做有效
两个好处一次拿到,而且是同一个设计带来的。
先补上书跳掉的那一级:凭什么「直接连」就等于「记得住」? 循环网络里,开头那个词的信息要经过 99 次转手才轮到第 100 个词, 每转一手掺进一点别的、丢掉一点自己; 而走查第 4 步里,「猫」那份信息是一步混进「它」的,中间一次转手都没有, 所以那 0.50 的分量原样到账。这才是下表「不受距离限制」那句话的意思。
| 好处 | 为什么 |
|---|---|
| 远近一视同仁 | 任意两个词之间是直接连的,相互作用不受距离限制7。第 1 个词和第 100 个词之间只隔一步,不是 99 步 |
| 可以并行 | 每个词的计算不依赖前一步的结果,一万个核可以同时开工。书特别点出它「在 GPU 架构上表现尤为出色」7 |
回到那个丢主语的例子: 早期翻译软件搞错「它」指谁,输在第一行; 它算得慢,输在第二行。同一个设计一次治了两样。
一半管读进来、一半管写出去:BERT 和 GPT 为什么分了家
书用了一个很好的比喻来讲 Transformer 的两半8:
编码是把语言转成大脑能理解的形式(自然语言 → 数学表达); 解码是把大脑里的内容表达出来(数学表达 → 自然语言)。
这个比喻讲完就该拆掉。 管「读进来」的那一半,后面一律叫编码器—— 它把一句话转成一串数,走查第 1 到第 4 步干的正是这件事。
管「写出去」的那一半叫解码器——它反过来,把一串数还原成词,一个一个往外吐。
两者结构相似,但解码器多一样东西:带遮盖的自注意力。 「遮盖」当场解释: 训练时把后文挡住,只让模型看前文—— 因为它的任务是预测下文,能看到答案就不用学了9。
这一处结构差异,直接分出了两条技术路线:
| BERT(2018,Google) | GPT(2018,OpenAI) | |
|---|---|---|
| 用了哪半 | 只用编码器 | 只用解码器 |
| 怎么看句子 | 双向,前后文一起看(一个词周围那一圈文字,行话叫上下文) | 单向,从左到右,遮住下文 |
| 更像什么 | 完形填空 | 人类的语言生成 |
| 擅长 | 理解类任务 | 生成流畅文本 |
这张表解释了一件大事: 为什么后来赢的是 GPT 那条路。
中间那一级书没写,补在这里。 要接出「因为它太累了」这五个字,它必须先弄清前半句说的是一只猫、而且这只猫没过马路—— 所以练「往下接」,就顺带把「读懂」练了。
反过来看走查第 6 步里 BERT 拿到的那个输入:「因为它太▢了」,前后文都在, 它只需要补中间那一个空。「在没有下文的情况下自己造出下文」这道题,它一次都没做过, 所以练不出生成能力。
于是不是编码器不好,而是**「预测下一个词」这个任务本身能顺带学到理解能力,反过来不行**。 第 01 章那句「大模型让生成这条路顺带把理解也做了」,底层原因就在这里。
边界:书给的四个短板
书很难得地列了 Transformer 的四个问题10。看表之前先立两个词,一段一个。
一段文字按顺序排成的一串,行话叫序列。 走 查里那句话切成的八块,就是一条长度为 8 的序列; 后面几章讲长文档、讲长对话,说的都是同一件事——这条串太长了。
每个词分到的那个「该看多重」的数,行话叫权重。 走查第 3 步那八个比例—— 猫 0.50、马路 0.02——就是八个权重;而它们得排成一张数字表格存起来,存本身就是开销。
| 短板 | 具体是什么 |
|---|---|
| 超长的一串吃不消 | 序列越长,要算的量涨得越猛:走查那句话八个词,两两比对是 8×8 = 64 次;长度翻一倍变 16 个词,就要 256 次,翻了四倍——长文档摘要、长对话的质量会明显下降 |
| 信息冗余 | 它不能直接忽略某些信息,只能给每个词都分一个权重——哪怕「马路」只值 0.02,这个数照样要算、要存 |
| 注意力会分错、也看不懂 | 有时把注意力分到不相关的特征上;而且内部机制难以被完全理解,限制了它在医疗、法律这类要求可解释的领域的应用 |
| 位置信息处理不足 | 注意力本身不知道词的先后——走查里把「猫」和「马路」的位置对调,那八个权重一个都不会变;所以得额外给每个位置配一串数来告诉它,这叫位置编码,但怎么配才有效仍是难题 |
第一条是后来所有「长上下文」竞赛的起点,第二条是第 03 章那些新架构的动机。
补充(不在书里): 这篇论文的正式名称是《Attention Is All You Need》, 第一作者 Ashish Vaswani,2017 年 6 月 12 日提交;摘要里那句关键的话是—— 提出一个完全基于注意力、彻底摒弃循环与卷积的新架构。