跳到主要内容

自然语言处理 — 从 n-gram 到 Transformer

这一章讲三件事: 「语言模型」这个概念怎么从数词频长成 GPT; 规则派(文法+句法分析)与统计派的三十年此消彼长; 以及 Transformer 的三个零件——自注意力(自己关注自己)、多头(多组并行)、位置嵌入(把词序补给模型)——各自解决什么。 读完你会拿到与大模型系列拆解对接的原文出处层

1. 这一章讲什么

计算机处理自然语言的三个理由:与人交流、读取人类记录的知识 (仅维基百科就有 3000 万页事实,没有一页是形式逻辑)、科学理解语言本身1。 自然语言与一阶逻辑的差异是全部难度的来源:歧义(He saw her duck)、 模糊(That's great!)、没有符号-对象的固定映射2

核心概念因此很低调:语言模型 = 描述任意字符串可能性的概率分布。 它认为「Do I dare disturb the universe?」是合理的英语, 而「Universe dare the I disturb do?」几乎不可能3。 补全、纠错、翻译、问答,全是这一个分布的不同用法。

2. 顶层全景

词袋(朴素贝叶斯):词与词独立 → 分类能用,生成胡话
n-gram:每个词只依赖前 n−1 个词;参数 O(v^n)→数数+平滑(拉普拉斯/<UNK>/Kneser-Ney)

规则派:CFG/PCFG/树库;CYK O(n³);依存分析
乔姆斯基一句「概率模型对句法无洞见」让统计派冷了 20 年

词嵌入:Firth「知词看邻」;词=几百维稠密向量;向量算术(Athens−Greece+Oslo≈Norway)

RNN/seq2seq:语言模型参数 O(1);翻译=(编码器,解码器)
注意力:每个目标词看源句的不同部分;束搜索解码

Transformer:自注意力(Q/K/V)+多头+位置嵌入;双向=掩码语言模型(BERT)
预训练+微调;GPT-2(15 亿参数,零微调);T5;「为什么舍弃文法」之问

3. 核心原理

3.1 n-gram:数数、平滑、以及参数爆炸

词袋模型把句子当成「从袋子里有放回地抽词」——显然错误(词与词无关, 生成不出连贯句子),但分类足够准:stocks/earnings 指向 business, rain/cloudy 指向 weather4。n-gram 补上一阶依赖:每个词的概率只依赖 前 n−1 个词。代价用书里的账算:n 元「考虑全部历史」的版本, 词表(全部候选词)10 万、句长 40 时要估 10^200 个参数;截到 3 元才落回人间5

数出来的概率有两个坑,各有一个经典解法:

  • 没见过的词():把低频词统一替换成未知符号再数; 整句概率才不会被一个词乘成 06
  • 没见过的组合:「colorless aquamarine ideas」三个词都见过、 这个三连没见过——平滑给所有未见 n-gram 留一点概率质量。 最老的是拉普拉斯(加 1)平滑,书里用「太阳升起」问题讲它的来历 (太阳系约 200 万天,明天不升起的估计 1/(N+2));实务里用 回退/线性插值(λ3+λ2+λ1=1)与 Kneser-Ney7

n-gram 的天花板是不会泛化:「a black cat」见过、 「the fulvous kitten」没见过,母语者靠「冠词-形容词-名词」模式与 「-ous 是形容词后缀」判定后者合法,n-gram 做不到——每个词都是原子8。 泛化需要内部结构:词嵌入(把每个词变成一个可计算的向量)。

3.2 词嵌入:把词变成可以加减的东西

独热向量无法表达「cat 和 kitten 相似」。词嵌入遵循语言学家 Firth 的 一句名言——「要知道一个单词的含义,就要看它周围是什么单词」—— 把词表示成几百维的稠密向量,从语料(大量真实文本)里学出9。两个标志性现象:

  • 聚类:country、kinship、transportation、food 各自成簇(60 亿词训练的 GloVe)10;
  • 向量算术:Athens 的词向量(即词嵌入)A 与 Greece 的 B 之差 B−A 似乎编码 「国家/首都」关系;Oslo+C 得到的 D,最近邻是 Norway11

书里立刻给了防过头的警告:无法保证特定语料+特定算法捕捉特定语义关系; 词嵌入受欢迎是因为它是下游任务的好表示,不是因为类比题12

3.3 RNN 与序列到序列:翻译作为条件生成

RNN 语言模型每步读入一个词嵌入、维护隐藏状态、输出下一个词的分布; 参数 O(1) 与序列长度无关(对比 n-gram 的 O(v^n));训练=预测下一个词 (hello→world),生成=从输出分布采样(采样策略是个超参数:总选最高分? 按概率?给冷门词加权?)13。书里放的莎士比亚伪文本样例展示它「局部通顺、 全篇无主」的品性。

机器翻译把它扩展成序列到序列:编码器读源句、解码器写目标句。 解码是逐词的:贪心解码每步选概率最高的词——书里给了它翻车的最小例子: The front door is red 应译作 La puerta de entrada es roja, 贪心在第二步就被 entrada 带偏(西语名词要先于修饰语),而且没有纠错机制14; 束搜索每步保留 k 个最优假设(现代神经翻译 k=4–8,老统计翻译 ≥100)15

注意力修的是信息瓶颈:解码器不再只依赖编码器的最终向量, 而是对源句所有位置算注意力得分,softmax 成权重,加权平均出上下文向量。 书里强调三点:注意力本身没有可学习权重;它完全是潜在的(模型自己学看哪); 注意力概率可以被人解释——它通常与人工给出(人手标的对应关系)的词对齐高度一致16

3.4 Transformer:自注意力的三件套

「Attention is all you need」(Vaswani et al.)的核心是自注意力: 让序列关注自己(源到源、目标到目标)。直接对输入做点积(两串数逐位相乘再相加)有个缺陷—— 向量与自身的点积总是偏高,每个位置都自我迷恋;Transformer 的解法是用 三个投影矩阵把输入变换成三种角色17:

查询 q_i = Wq·xi 注意力从哪出发(我在找什么)
键 k_j = Wk·xj 被注意的对象(我这里有什么)
值 v_j = Wv·xj 被聚合的内容(我提供什么)
c_i = Σ_j softmax(q·k/√d)·v √d 是数值稳定用的比例因子

多头注意力——把同一句话复制成 m 份、各学各的投影再拼接——让、各学各的投影,拼接结果——让「一个重要的 子块脱颖而出」18。注意力本身不感知词序,顺序由位置嵌入 补上(每个位置学一个向量,加到词嵌入上)19。每个 Transformer 层 = 自注意力 + 前馈 + 残差连接;完整模型 = 编码器(双向,做分类)

  • 解码器(自注意力只看左侧,另加一层对编码器的注意力,做生成)20

3.5 预训练:先读遍互联网,再上课

预训练的动力是数据经济学:互联网每天新增超过 1000 亿词, 而给词标上语法类别、构建句法树,都需要专业训练才能做21。阶梯上的两级:

  • 预训练词嵌入(word2vec 2013、GloVe 2014):完全无监督。 GloVe 的直觉可写成一个算术式:比较 P(w|ice)/P(w|steam)—— w=solid 时比值大,w=gas 时比值小,w=the/water/fashion 时≈1; 最终约束是「两个词向量的点积=共现概率的对数」。台式机 CPU 几小时 就能在几十亿词上训一个22
  • 预训练上下文表示:一个词一个向量不够——rose(花)与 rose(升起的 过去式)必须是不同的向量。上下文表示按句学;掩码语言模型(MLM) 是它的对称化版本:遮住 The river __ five feet 的中间词让模型填空, 句子本身提供标签,不需要任何人工标注——这就是 BERT 的预训练任务23

SOTA 一节给出了时代的坐标:2018 年被称作「NLP 的 ImageNet 时刻」; RoBERTa 在问答/阅读理解上达到最高水平;GPT-2 有 15 亿参数、在 40GB 文本上训练,不做任何针对任务的再调优,就同时拿下法英翻译、指代消解、通用问答;把再调优后的 BERT 用作分类器(给输入贴类别标签)也拿下了问答榜首;T5 在 750GB 语料上把所有任务统一成「文本进、文本出」24。 Aristo 系统在八年级科学选择题上拿 91.6%(其中 RoBERTa 单独 88.2%)25

书尾的提问值得原样保存:「为什么我们学了文法、句法分析和语义解释, 却在本章舍弃它们?」答案:数据驱动的模型更容易开发和维护、 基准分更高;它是否学到了与语法语义相同的基本思想—— 「也可能发生了完全不同的事情,但我们根本不知道」26。 而另一句约束同样有效:这些系统「处理了人类一辈子都无法阅读的数千倍的文本, 仍然落后于人类」27

4. 作者的判断与证据

  • (书内历史判断) 乔姆斯基 1956/1957 对统计模型的否定「造成了遗憾的 后果,20 年来许多人回避统计模型」——书里明确记为一次方向性误判28
  • (书内数据) 10^200 参数、GPT-2 15 亿参数/40GB 文本、 RoBERTa 2.2 万亿词训练、束宽 4–8 vs ≥100、语音识别错误率 3–5%52429
  • (作者的立场) 对「端到端 vs 显式语法」不下终审判决,押注混合方法: 注意力改进的传统句法分析器已创下 Penn Treebank 最佳纪录30
  • (书内坦白) 模型过于自信(概率挤向 0 或 1)是独立性假设的系统性副作用 (第 9/12 章的旧账在 NLP 上兑现)31

5. 边界与局限

  • Transformer 只依赖几百词的窄上下文;Reformer 这类实验把窗口推到百万词, 但这只是工程缓解32
  • 生成文本「局部流畅、全局崩坏」——GPT-2 连续九句 Tell me a story 的 崩溃样例被原书收进图 24-1333
  • 词嵌入把语料偏见一并学走(下卷 27 章的公平问题在此埋线)。
  • 观察到的规律不保证是「语言规律」:基准分数高≠语言学意义上正确。

6. 可带走的

  1. 一切语言任务都能折算成语言模型的一个用法;先问「分布估准了吗」。
  2. 数数必有平滑:没见过的词与没见过的组合是两类 0,各有一个标准解。
  3. 「知词看邻」:词嵌入的意义在邻域统计里;向量算术是副产品不是保证。
  4. 贪心解码没有纠错机制——序列生成永远值得开一束搜索。
  5. 注意力的价值排序:可微 > 可学习 > 可解释;三者互相独立。
  6. 自注意力三件套各治一病:Q/K/V 治自我迷恋,多头治信息平均化, 位置嵌入治词序失明。
  7. 预训练的本质是把标注成本转嫁给无标注文本;MLM 让句子自己出题。
  8. 数据驱动赢了,但「它学到了什么」仍是开放问题——别把基准分当理解。

7. 原文地图

主题原书章原文位置
NLP 三理由/维基 3000 万页23 开篇text/10-fm.txt:26427(搜「3000 万页」)
歧义与模糊23.1text/10-fm.txt:26440(搜「her duck」)
语言模型定义23.1text/10-fm.txt:26456(搜「语言模型」) · text/10-fm.txt:26457(搜「universe」)
词袋=抽词23.1.1text/10-fm.txt:26484(搜「词袋」) · text/10-fm.txt:26488(搜「袋子」)
语料库 25 亿/140 亿词23.1.1text/10-fm.txt:26496(搜「25 亿」)
分词 aren't23.1.1text/10-fm.txt:26517(搜「分词」)
n-gram 10^20023.1.2text/10-fm.txt:26529(搜「10200」) · text/10-fm.txt:26530(搜「n 元模型」)
字符级/语言识别 99%23.1.3text/10-fm.txt:26551(搜「字符级」) · text/10-fm.txt:26556(搜「99%」)
23.1.4text/10-fm.txt:26575(搜「UNK」)
拉普拉斯平滑23.1.4text/10-fm.txt:26590(搜「拉普拉斯」) · text/10-fm.txt:26594(搜「1/(N + 2)」)
Kneser-Ney/stupid backoff23.1.4text/10-fm.txt:26605(搜「Kneser-Ney」)
n-gram 不泛化/fulvous23.1.5text/10-fm.txt:26616(搜「fulvous」) · text/10-fm.txt:26622(搜「原子模型」)
Penn Treebank 45 标签23.1.6text/10-fm.txt:26646(搜「45 个标签」)
HMM 词性标注23.1.6text/10-fm.txt:26657(搜「隐马尔可夫模型」)
语音识别 3–5%23.6text/10-fm.txt:27368(搜「3%」) · text/10-fm.txt:27368(搜「3%」)
机器翻译的 seq2seq/注意力23.6text/10-fm.txt:27394(搜「序列到序列循环神经网络模型」) · text/10-fm.txt:27397(搜「Vaswani」)
乔姆斯基 20 年冷落23 参考文献text/10-fm.txt:27452(搜「乔姆斯基」) · text/10-fm.txt:27455(搜「20 年」)
Firth 名言24.1text/10-fm.txt:27635(搜「Firth」,或搜「周围」)
10^25 个 5 元 → 几百维24.1text/10-fm.txt:27638(搜「1025」)
向量算术 Norway24.1text/10-fm.txt:27658(搜「Athens」) · text/10-fm.txt:27665(搜「Norway」)
类比警告24.1text/10-fm.txt:27672(搜「无法保证」)
RNN 参数 O(1)24.2.1text/10-fm.txt:3116(搜「O(1)」)
采样策略超参数24.2.1text/10-fm.txt:27777(搜「采样权重」)
莎士比亚伪文本24.2.1text/10-fm.txt:27780(搜「Marry」)
贪心解码翻车24.3.2text/10-fm.txt:27945(搜「贪心解码」) · text/10-fm.txt:27952(搜「纠错机制」)
束宽 4–8 vs 10024.3.2text/10-fm.txt:27963(搜「4 ~ 8」)
注意力三点(潜在/可微/可解释)24.3.1text/10-fm.txt:3092(搜「潜在的」) · text/10-fm.txt:27927(搜「解释」)
Q/K/V24.4.1text/10-fm.txt:27983(搜「查询向量」)
多头注意力24.4.1text/10-fm.txt:27999(搜「multiheaded attention」)
位置嵌入24.4.2text/10-fm.txt:28014(搜「位置嵌入」)
编码器/解码器差异24.4.2text/10-fm.txt:24914(搜「编码器」) · text/10-fm.txt:28032(搜「从左到右生成」)
每天新增 1000 亿词24.5text/10-fm.txt:20487(搜「1000 亿」)
GloVe ice/steam24.5.1text/10-fm.txt:28067(搜「ice」) · text/10-fm.txt:28082(搜「几小时」)
材料科学嵌入24.5.1text/10-fm.txt:28086(搜「NiFe」) · text/10-fm.txt:28094(搜「2009」)
多义词 rose24.5.2text/10-fm.txt:28098(搜「rose 一词可以指一种花」)
掩码语言模型24.5.3text/10-fm.txt:28133(搜「掩码语言模型」) · text/10-fm.txt:28141(搜「不需要标记数据」)
NLP 的 ImageNet 时刻24.6text/10-fm.txt:28150(搜「ImageNet 时刻」)
GPT-2 15 亿/40GB24.6text/10-fm.txt:28165(搜「15 亿」)
GPT-2 崩溃样例24.6text/10-fm.txt:28183(搜「Tell me a story」)
Aristo 91.6%24.6text/10-fm.txt:28190(搜「91.6%」)
T524.6text/10-fm.txt:28211(搜「T5」) · text/10-fm.txt:28212(搜「750 GB」)
窄上下文/Reformer24.6text/10-fm.txt:28220(搜「Reformer」)
为什么舍弃文法24.6text/10-fm.txt:28227(搜「舍弃」) · text/10-fm.txt:28231(搜「根本不知道」)
数千倍文本仍落后24.6text/10-fm.txt:28240(搜「数千倍」)
混合方法24.6text/10-fm.txt:28234(搜「混合方法」)

Footnotes

  1. 出处:「自然语言处理」第 26427 段(text/10-fm.txt:26427,搜「3000 万页」)。

  2. 出处:「自然语言处理」第 26440 段(text/10-fm.txt:26440,搜「her duck」)。

  3. 出处:「自然语言处理」第 26456 段(text/10-fm.txt:26456,搜「语言模型」)。

  4. 出处:「自然语言处理」第 26484 段(text/10-fm.txt:26484,搜「词袋」)。

  5. 出处:「自然语言处理」第 26529 段(text/10-fm.txt:26529,搜「10200」)。 2

  6. 出处:「自然语言处理」第 26575 段(text/10-fm.txt:26575,搜「UNK」)。

  7. 出处:「自然语言处理」第 26594 段(text/10-fm.txt:26594,搜「1/(N + 2)」)与 第 26605 段(text/10-fm.txt:26605,搜「Kneser-Ney」)。

  8. 出处:「自然语言处理」第 26622 段(text/10-fm.txt:26622,搜「原子模型」)。

  9. 出处:「自然语言处理中的深度学习」第 2264 段(text/10-fm.txt:2264,搜「周围」)。

  10. 出处:「自然语言处理中的深度学习」第 27654 段(text/10-fm.txt:27654,搜「GloVe」)。

  11. 出处:「自然语言处理中的深度学习」第 27665 段(text/10-fm.txt:27665,搜「Norway」)。

  12. 出处:「自然语言处理中的深度学习」第 27672 段(text/10-fm.txt:27672,搜「无法保证」)。

  13. 出处:「自然语言处理中的深度学习」第 3116 段(text/10-fm.txt:3116,搜「O(1)」)与 第 27777 段(text/10-fm.txt:27777,搜「采样权重」)。

  14. 出处:「自然语言处理中的深度学习」第 27945 段(text/10-fm.txt:27945,搜「贪心解码」)。

  15. 出处:「自然语言处理中的深度学习」第 27963 段(text/10-fm.txt:27963,搜「4 ~ 8」)。

  16. 出处:「自然语言处理中的深度学习」第 3092 段(text/10-fm.txt:3092,搜「潜在的」)与 第 27927 段(text/10-fm.txt:27927,搜「解释」)。

  17. 出处:「自然语言处理中的深度学习」第 27983 段(text/10-fm.txt:27983,搜「查询向量」)。

  18. 出处:「自然语言处理中的深度学习」第 27999 段(text/10-fm.txt:27999,搜「multiheaded attention」)。

  19. 出处:「自然语言处理中的深度学习」第 28014 段(text/10-fm.txt:28014,搜「位置嵌入」)。

  20. 出处:「自然语言处理中的深度学习」第 24914 段(text/10-fm.txt:24914,搜「编码器」)。

  21. 出处:「自然语言处理中的深度学习」第 20487 段(text/10-fm.txt:20487,搜「1000 亿」)。

  22. 出处:「自然语言处理中的深度学习」第 28082 段(text/10-fm.txt:28082,搜「几小时」)。

  23. 出处:「自然语言处理中的深度学习」第 28141 段(text/10-fm.txt:28141,搜「不需要标记数据」)。

  24. 出处:「自然语言处理中的深度学习」第 28165 段(text/10-fm.txt:28165,搜「15 亿」)。 2

  25. 出处:「自然语言处理中的深度学习」第 28190 段(text/10-fm.txt:28190,搜「91.6%」)。

  26. 出处:「自然语言处理中的深度学习」第 28231 段(text/10-fm.txt:28231,搜「根本不知道」)。

  27. 出处:「自然语言处理中的深度学习」第 28240 段(text/10-fm.txt:28240,搜「数千倍」)。

  28. 出处:「自然语言处理」第 27455 段(text/10-fm.txt:27455,搜「20 年」)。

  29. 出处:「自然语言处理」第 1423 段(text/10-fm.txt:1423,搜「3%」)与 「自然语言处理中的深度学习」第 28098 段(text/10-fm.txt:28098,搜「rise 的过去式」)。

  30. 出处:「自然语言处理中的深度学习」第 28234 段(text/10-fm.txt:28234,搜「混合方法」)。

  31. 出处:「自然语言处理」第 1191 段(text/10-fm.txt:1191,搜「过度自信」,或搜「自信」)。

  32. 出处:「自然语言处理中的深度学习」第 28220 段(text/10-fm.txt:28220,搜「Reformer」)。

  33. 出处:「自然语言处理中的深度学习」第 28183 段(text/10-fm.txt:28183,搜「Tell me a story」)。