跳到主要内容

语言模型的第一课 — 从数数到循环网络

这一章讲三件事: 语言模型到底是台什么机器;第一代方案(n-grams)怎么靠数数干活、又为什么数不下去;第二代方案(RNN)怎么把前文记下来、又为什么记不长。 它在全书链条里的位置:这里是地基——后面十二章的所有大模型,干的都是本章定义的同一件事:给下一段文字算概率。

1. 顶层全景:这门手艺的两代更替

书的开篇给了全书的总纲:语言符号有不确定性——同样的话可以换好几种说法,同一句话换个语境意思又变了。所以语言是概率的,研究它就得算概率1

目标:算出「这段文字出现的概率」
├─ 第一代 n-grams:翻语料库数词组频率 → 本章第 2、3 节
├─ 第二代 RNN:把前文压缩成一个隐状态传下去 → 本章第 4、5 节
└─ 第三代 Transformer: → 下一章
图说:每一代都是为了修上一代的死穴,不是推倒重来。

本章的主走查只一件事:算「长颈鹿脖子长」这六个字(三个词)出现的概率。n-grams 用它算一遍(第 2 节),RNN 再算一遍(第 4 节)——同一个输入,两代机器各给出什么、卡在哪里,走完就看清了。

2. n-grams:把概率变成数数题

这一节回答:不学任何规律,光数数能算出概率吗?能,而且出奇地好用。

2.1 一个能上手的公式

n-grams 的思路是:一句话的概率,拆成一小截一小截相乘。n-gram 就是长度为 n 的一串词:n=1 叫 unigram(只看单 词),n=2 叫 bigrams(看相邻两个),以此类推2。要算「下一个词在给定前文后的概率」,就去语料库里数:

P(这个词 | 前面那几个词) ≈ 语料库里「前文+这个词」一起出现的次数 ÷ 前文自己出现的次数。

2.2 主走查:算「长颈鹿脖子长」的概率(走查第 ① 步)

书里造了一个 5 句话的小语料库,全是讲长颈鹿脖子的句子(特征——一眼能认出来的标志——都很一致)3。现在问:「长颈鹿脖子长」这句话出现的概率是多少? 它并没有原样出现在语料库里。

用 bigrams(n=2)来算,就是把两步相乘4:

P(长颈鹿, 脖子, 长) = P(脖子|长颈鹿) × P(长|脖子)
= (2/5) × (2/6)
= 2/15 ≈ 0.13
图说:语料库里「长颈鹿」出现 5 次,其中 2 次后面跟着「脖子」;
「脖子」出现 6 次,其中 2 次后面跟着「长」。这些次数都来自那个 5 句语料库。

「长颈鹿脖子长」整句没出现过,我们却算出了它的概率——这就是 n-grams 相比「只认整句」的规则系统的本质进步:它对没见过的组合有泛化(没学过也能套用)的能力5

2.3 死穴一:零概率

把 n 从 2 调到 3(trigrams,看前两个词),同一个句子反而算不动了:「长颈鹿,脖子,长」这个三词序列(按顺序排好的一串词)在语料库里一次都没出现,概率直接等于 06n 越大,拟合语料越像,但对没见过的组合越脆。 书里把 n 定性为两种能力的权衡:太大容易零概率,太小又装不下足够的语言信息7。(零概率可以靠「平滑」技术补救——故意给没见过的组合留一点概率——书里点到为止8。)

2.4 死穴二:它只是数数,不是学规律

书里随后用一整节推导证明了这件事的统计学户口。统计学里管「一个假设能多好地解释眼前数据」的量叫似然

而「下一个词只跟前 n 个词有关」这条马尔可夫(只看前 n 个词,更早的当不存在)假设,先砍掉了更早的历史。

于是问题化简成只看词组的分布(词组在文字堆里怎么散落)。

在这两条之下,bigrams 的「数频率」恰好就是极大似然估计——数出来的频率就是让似然最大的选择,也就是统计学上最优的答案9。这个证明的价值不在公式,在于它把 n-grams 钉死在原地:它的全部本事就是数频率,天花板也就到频率为止。

判断(我们的,不是书里的): n-grams 的两个死穴(零概率、纯数数)在后面会以更高形态反复出现——第 02 章的贪心搜索、第 06 章的检索器都是它的远亲。看懂这 6 个字的走查,后面所有「检索/匹配」类方法都有个参照物。 如果错,会错在: 如果后续方法其实学到了频率之外的规律(比如语义——词和句子的意思),把它们归成 n-grams 远亲就低估了它们;判据是:换个说法的同一问题,它还能不能匹配上。

3. RNN:把前文压进一个会滚动的数

这一节回答:不想只看前两个词,想看前面所有词,又不想让参数无限膨胀,怎么办?

3.1 环路是关键

神经网络(一层层简单计算单元——各自做一次加权求和的小零件——连成的数学机器)按信号流向分两派:前馈(FNN)逐层向前不走回头路;循环(RNN)多了一条环路,把上一时刻算出的隐状态——一个装着「到目前为止读到了什么」的一串数——搬回来加到当前输入上10

3.2 主走查续:同一个句子,RNN 怎么算(走查第 ② 步)

还是「长颈鹿脖子长」。书里给了一个词表(模型认识的全部词的清单),里面有「脖子」「吃」「长」「疼」「短」这些词,演示 RNN 的读法11:

读入「长颈鹿」→ 隐状态 h1 装进「主语是长颈鹿」
读入「脖子」 → h2 = h1 的内容 + 「脖子」 → 输出概率表:长 0.6 / 疼 0.1 / 短 0.05 …
读入「长」 → h3 = h2 的内容 + 「长」 → 预测下一个词……

P(长颈鹿脖子长) = P(脖子|长颈鹿) × P(长|脖子, h1) = 0.2 × 0.6 = 0.12
图说:与 n-grams 算出的 2/15≈0.13 对照——量级相近,但 RNN 用上了全部前文
(这些概率是书里演示用的数,不是真实模型输出)。

关键差别在第二步:如果只有前馈网络,看到「脖子」只能猜「短」「疼」这类跟脖子搭配的词;RNN 因为隐状态里还留着「长颈鹿」,猜「长」的概率就最大12「长颈鹿」三个字一直在场,这就是环路买到的能力。

3.3 死穴:梯度死在传导路上

训练时,要算「最早的词对当前预测该负多大责任」,得把梯度——往回传误差(偏离正确答案的量)的修正信号——沿时间一步步乘回去。步数一多就是大量矩阵连乘。

书里引的结论是,当隐状态权重(每个连接的重要度)矩阵的最大特征值小于 1 时连乘一路缩小,梯度消失;大于 1 时连乘一路放大,梯度爆炸13。两个方向都让「很久以前的词」学不到东西。

GRU 和 LSTM 这两种改进版靠门控(决定信息过不过、忘不忘的小开关)结构把问题压住了把问题压住了,成为主流 RNN14

4. 训练与生成的两难

这一节回答:RNN 语言模型怎么练、怎么用,以及练法和用法之间那道缝。

  • 自回归(拿自己刚写的当下一步的输入)生成:先喂第一个词,得到下一个词;把输出拼到输入后面再喂进去,如此循环,一段文字就滚出来了15

  • 两难: 直接用模型自己的输出当下一轮输入,一个错词会被反复放大,还会串行慢;于是训练时改喂标准答案(Teacher Forcing,每轮都拼正确答案)16

  • 代价: 训练时永远看正确答案、推理时只能看自己写的,这道缝叫曝光偏差——书里的类比是平时带答案刷题、考试没答案会不适应。缓解办法是 Scheduled Sampling:训练中逐步掺一点模型自己的输出,提前适应「没答案」的考场17

判断(我们的,不是书里的): 这一节埋了全书最重要的一条暗线——「训练怎么练」和「推理怎么用」可以不是一回事。后面第 04 章 RLHF(人类给回答打分、模型照着调)的三步、第 14 章「何时该检索」的判断,都是在修这条缝的新变种。 如果错,会错在: 如果某项技术其实是把训练目标直接改成推理形态(而非打补丁),那它就不是这条暗线而是换赛道;判据是看它训练时喂不喂「标准答案」。

5. 作者的判断与证据

  • 证据充分的: n-grams 的泛化与零概率(5 句语料库的实算,2/15 与 0);RNN 特征值与梯度消失/爆炸的关系(书引了专门的分析文献);长颈鹿例中「历史信息提升预测」(图示演示)。

  • 书给判断、没给数字的: GRU/LSTM「取得了良好效果,成为主流」——书没有给这两者与原始 RNN 的对比实验,当结论记住即可,别当数据引用。

  • 作者的态度: 全章反复用同一个长颈鹿语料库贯穿三种模型,这是作者的写法选择:同一输入对比不同机器,本章我们照搬了这个走查设计。

6. 边界与局限

  • 本章的 n-grams 和 RNN 都以「词」为基本单位;真实系统切的是 token(见第 06 章),书把这块推迟到了 Prompt 一章。

  • 书里对「平滑」只给了一句话加参考文献,零概率问题在本章只算点名、没有解决。

  • RNN 一族后来并没有被 Transformer 完全埋掉——第 05 章的 RWKV/Mamba 会把「循环」请回来,读的时候可以回看本章的特征值分析。

  • 书出版时(2024)的部分表述以当时模型为准,具体数字(如模型的规模、版本)以各章「边界」节另行校正。

7. 可带走的

  1. 语言模型 = 给文字算出现概率的机器;它追求「像」,不追求「对」。
  2. n-grams 用频率乘法算概率:长颈鹿例给出 2/15;没见过的组合会算,但 n 一大就归零。
  3. n 的大小是「背得像」与「猜得出」的权衡;平滑是给零概率打补丁。
  4. 马尔可夫假设+极大似然估计是 n-grams 的统计学户口:数频率就是最优解,天花板也在频率。
  5. RNN 的隐状态=前文的滚动摘要:「长颈鹿」在场,「长」才排第一。
  6. 隐状态权重矩阵特征值小于 1 梯度消失、大于 1 梯度爆炸;门控(GRU/LSTM)是止痛药。
  7. Teacher Forcing 与曝光偏差:训练喂标准答案、推理只能靠自己,这道缝是全书反复出现的母题。

8. 原文地图

主题原书章原文位置
语言是概率的1 语言模型基础text/01-ch01.txt:12(搜「语言是概率的」)
n-gram 定义与 unigram/bigrams1.1 基于统计方法的语言模型text/01-ch01.txt:55(搜「n-gram 指的是长度为 n 的词序列」)
5 句长颈鹿语料库1.1 基于统计方法的语言模型text/01-ch01.txt:75(搜「长颈鹿最醒目的特征」)
2/15 计算1.1 基于统计方法的语言模型text/01-ch01.txt:110(搜「2」) · text/01-ch01.txt:117(搜「泛化能力」)
零概率与 n 的权衡1.1 基于统计方法的语言模型text/01-ch01.txt:120(搜「零概率」) · text/01-ch01.txt:124(搜「拟合语料库的能力」)
平滑1.1 基于统计方法的语言模型text/01-ch01.txt:132(搜「平滑」)
马尔可夫假设、极大似然1.1 基于统计方法的语言模型text/01-ch01.txt:144(搜「马尔可夫假设」) · text/01-ch01.txt:160(搜「极大似然估计」)
前馈与循环两种范式1.2 基于 RNN 的语言模型text/01-ch01.txt:292(搜「前馈传播范式」)
RNN 猜「长」、FNN 猜「短」1.2 基于 RNN 的语言模型text/01-ch01.txt:345(搜「仅仅考虑」)
梯度消失/爆炸与特征值1.2 基于 RNN 的语言模型text/01-ch01.txt:404(搜「最大特征值」)
GRU/LSTM 门控1.2 基于 RNN 的语言模型text/01-ch01.txt:410(搜「门控结构」)
0.12 的演示计算1.2 基于 RNN 的语言模型text/01-ch01.txt:452(搜「0.12」)
自回归生成1.2 基于 RNN 的语言模型text/01-ch01.txt:481(搜「自回归」)
Teacher Forcing 与曝光偏差1.2 基于 RNN 的语言模型text/01-ch01.txt:500(搜「Teacher」) · text/01-ch01.txt:508(搜「曝光偏差」) · text/01-ch01.txt:518(搜「Scheduled Sampling」)

Footnotes

  1. 出处:「1 语言模型基础」第 12 段(text/01-ch01.txt:12,搜「语言是概率的」)。原文从语言学的音韵/词法/句法约束讲起,落点是「因此,语言是概率的」。

  2. 出处:「1.1 基于统计方法的语言模型」第 55 段(text/01-ch01.txt:55,搜「n-gram 指的是长度为 n 的词序列」)。n=1 为 unigram、n=2 为 bigrams、n=3 为 trigrams 的命名在同一节后面给出。

  3. 出处:「1.1 基于统计方法的语言模型」第 75 段(text/01-ch01.txt:75,搜「长颈鹿最醒目的特征」)。图 1.1 的语料库共 5 句,含「长颈鹿脖子和人类脖子一样,只有七节颈椎」。

  4. 出处:「1.1 基于统计方法的语言模型」第 106 段(text/01-ch01.txt:106,搜「在此语料库中」)。分子分母的次数为:C(长颈鹿)=5、C(长颈鹿,脖子)=2、C(脖子)=6、C(脖子,长)=2,故 P=2/5×2/6=2/15。

  5. 出处:「1.1 基于统计方法的语言模型」第 117 段(text/01-ch01.txt:117,搜「泛化能力」)。原文:「虽然“长颈鹿脖子长”并没有直接出现在语料库中……仍可以预测出……出现的概率」。

  6. 出处:「1.1 基于统计方法的语言模型」第 120 段(text/01-ch01.txt:120,搜「零概率」)。trigrams 下 C(长颈鹿,脖子,长)=0,整句概率为 0。

  7. 出处:「1.1 基于统计方法的语言模型」第 124 段(text/01-ch01.txt:124,搜「拟合语料库的能力」)。原文:「n 代表了拟合语料库的能力与对未知文本的泛化能力之间的权衡」。

  8. 出处:「1.1 基于统计方法的语言模型」第 132 段(text/01-ch01.txt:132,搜「平滑」)。书里写「具体技术可参见文献 [11]」(Jurafsky & Martin 教材)。

  9. 出处:「1.1 基于统计方法的语言模型」第 144 段(text/01-ch01.txt:144,搜「马尔可夫假设」)与第 160 段(text/01-ch01.txt:160,搜「极大似然估计」)。结论在第 254 段(text/01-ch01.txt:254,搜「上述分析表明」):bigram 的频率比就是对语料中二词序列条件概率的极大似然估计。

  10. 出处:「1.2 基于 RNN 的语言模型」第 276 段(text/01-ch01.txt:276,搜「环路」)与第 292 段(text/01-ch01.txt:292,搜「前馈传播范式」)。

  11. 出处:「1.2 基于 RNN 的语言模型」第 441 段(text/01-ch01.txt:441,搜「0.5」)。图 1.4:输入「长颈鹿」后输出 长 0.5/疼 0.2/短 0.1;输入「长颈鹿脖子」后输出 长 0.6/疼 0.1/短 0.05;0.12 的乘法在第 452 段(text/01-ch01.txt:452,搜「0.12」)。

  12. 出处:「1.2 基于 RNN 的语言模型」第 345 段(text/01-ch01.txt:345,搜「仅仅考虑」)。原文:FNN 仅凭「脖子」可能预测出「短」「疼」,RNN 同时考虑「长颈鹿」和「脖子」,预测「长」的概率更高。

  13. 出处:「1.2 基于 RNN 的语言模型」第 404 段(text/01-ch01.txt:404,搜「最大特征值」)。最大特征值小于 1 梯度消失、大于 1 梯度爆炸,引自文献 [17] (Pascanu 等,ICML 2013)。

  14. 出处:「1.2 基于 RNN 的语言模型」第 410 段(text/01-ch01.txt:410,搜「门控结构」)。

  15. 出处:「1.2 基于 RNN 的语言模型」第 481 段(text/01-ch01.txt:481,搜「自回归」)。

  16. 出处:「1.2 基于 RNN 的语言模型」第 500 段(text/01-ch01.txt:500,搜「Teacher」)。两个问题(错误级联放大、串行效率低)在第 19 段末(text/01-ch01.txt:492,搜「级联放大」)。

  17. 出处:「1.2 基于 RNN 的语言模型」第 508 段(text/01-ch01.txt:508,搜「曝光偏差」)与第 518 段(text/01-ch01.txt:518,搜「Scheduled Sampling」)。