主题
第 1 章 · 从规则到统计:NLP 的前半生
ChatGPT 在 2022 年底发布之后,有一种很容易产生的错觉——AI 仿佛是凭空冒出来的。 几个月之间,一个能写代码、能聊天、能写诗的工具突然就站在了所有人面前。
但实际上,让计算机理解人类语言这件事,人类已经认真尝试了七十年。 从 1950 年代到 2017 年,这条路上躺着许多绕不开的失败:有的失败是技术上的, 有的是思路上的,还有一些,它们曾经短暂地"成功"过,但走到尽头才发现走错了方向。
我们之所以要回头看这段历史,不仅是为了凭吊,也是为了理解今天。 你在 SillyTavern 里调一个温度参数、写一段系统提示词的时候, 你正在使用的所有概念——"上下文"、"概率"、"注意力"—— 都是这七十年里一次又一次撞墙之后才慢慢发掘出来的。
只有深刻理解了这段历史,再回头看 Transformer 的发现与应用,你才会明白,为什么是 Transformer 引领 LLM 一步一步走到如今的高度。
章节概要
- 为什么早期 AI 研究者花了三十年研究语法规则,最后承认这条路走不通
- 什么是 n-gram,为什么它简单到滑稽却统治了 NLP 半个世纪
- 词向量(Word2Vec)凭什么被称为"AI 第一次理解了语义"
- 什么是 RNN、LSTM,为什么它们看起来什么都能做但什么都做不好
- 一个贯穿全章的核心矛盾:短记忆——这正是 Transformer 出现的理由
一、重要概念:什么叫 NLP
在往下读之前,先把这一章——也是整本指南——绕不开的两个缩写说清楚。
NLP = Natural Language Processing,自然语言处理。 "自然语言"是相对于"形式语言"(比如编程语言、数学符号)而言的—— 中文、英文、日文这些人在日常说话写字时用的语言,都叫自然语言。
NLP 这门学科想做的事情, 说大一点是"让计算机理解人类的语言", 说小一点是一系列具体任务:
- 机器翻译:把一种自然语言翻成另一种(中翻英、英翻日)
- 文本分类:判断一段话是好评还是差评、是垃圾邮件还是正常邮件
- 命名实体识别:从"马云今天去了杭州"里识别出"马云"是人、"杭州"是地名
- 问答系统:用户问一个问题,系统给出答案
- 情感分析:判断一段话情绪是正面还是负面
- 摘要生成:把一篇长文章压缩成几句话
这一类任务的共同特点是——输入是文字,输出也可能是文字、可能是标签、可能是另一段文字。
而当输出本身也是一段全新的自然语言文字时, 我们会单独再起一个名字叫 NLG(Natural Language Generation,自然语言生成)。
NLG 是 NLP 的一个子集——专门讲"让计算机写出人能读懂的话"。
机器翻译、摘要生成、对话系统、ChatGPT 写故事—— 这些都是 NLG。 你正在学的 SillyTavern 提示词工程, 本质上就是 NLG 的一种应用形态——让 LLM 生成符合你期望的角色对话。
NLP 这门学科诞生于 1950 年代。 本章接下来要讲的整段历史——规则引擎、n-gram、词向量、RNN、LSTM—— 都是 NLP 研究者在不同时代用不同武器去解同一道题的尝试。 而 NLG 这块"输出文字"的硬骨头, 直到 Transformer 出现,才被真正啃下来。
理解了这个学科背景,我们再回到故事的起点—— 1954 年那个塞满磁带的机房。
二、规则的时代(1950s–1980s):让计算机像律师一样思考
故事的起点是 1954 年。 那一年,IBM 和乔治城大学联合做了一次轰动一时的演示: 他们把一台计算机塞进了一个房间,输入 60 多句精心选编的俄语, 计算机"自动"把它们翻译成了通顺的英语。
项目的领导者乔治城大学的 Leon Dostert 在代表项目发言时乐观地预言: 三到五年之内,机器翻译将会是一个被解决的问题。 这是 AI 历史上第一次出现"再过几年就能搞定一切"的承诺, 后来这种承诺还会反复出现,每隔十年一次。
它们是怎么做翻译的?
那次演示背后的逻辑特别朴素:
- 准备一本俄英对照词典;
- 准备一套语法规则——比如"俄语的句尾动词变位对应英语某种句式";
- 计算机查词典、套规则,吐出译文。
这个思路统治了之后整整三十年。研究者们坚信: 只要把人类语言的所有规则都写清楚,计算机就能理解语言。
于是大批语言学家被请进实验室, 他们把语法书一条一条翻译成程序代码,写出了越来越庞大的"规则引擎"。
为什么这条路走不通
到了 1960 年代末,问题暴露了。
把一句话分析成主谓宾不难,难的是——人类语言里几乎没有"完全规则"的事情。 试着用规则解析这一句:
小明对小红说他妈妈病了。
"他"指的是小明还是小红?到底是谁的妈妈生病了?规则书查不到,因为这取决于上下文。 换个语境,答案就会完全不同。
再试一段英文,这是 NLP 历史上最有名的歧义例句:
Time flies like an arrow; fruit flies like a banana.
这两个分句的语法结构几乎完全一样, 但意思天差地别——
- 前半句的意思是"时间像箭一样飞逝", 这里 flies 是动词"飞",like an arrow 是状语"像箭一样";
- 后半句的意思却是"果蝇喜欢香蕉"—— fruit flies 不是"水果飞",而是一个名词"果蝇"(一种苍蝇), like 也不是"像",而是动词"喜欢"。
规则引擎处理不了这种"看似一样、含义完全不同"的句子, 因为规则只能描述形式,描述不了意义。 要分辨这两句话,你必须知道"果蝇是一种昆虫、它会被水果吸引"—— 这是世界知识,不是语法。
最有名的失败案例是 1966 年发布的 ELIZA—— 一个伪装成心理咨询师的聊天程序。它的全部技术内核就是几十条模板:
当用户说"我感到 X"时,回复"为什么你感到 X 呢?"
ELIZA 在 1960 年代曾经让很多人感动落泪、以为它真的在倾听。 但它从未理解过任何一个字。 它只是把人类语言中的统计规律包装成了规则。
到了 1980 年代末,规则派研究者终于承认: 人类语言的复杂程度远超语法规则能描述的范围。 他们花了三十年时间,绕了一个大圈,最后回到了一个朴素的问题——
我们不知道"为什么"这样说话,但我们能不能数一下"通常"怎么说话?
这一问,把 NLP 推进了统计时代。
三、统计的时代(1990s–2000s):n-gram,简单到滑稽却好用
一个三岁小孩也能理解的算法
请你跟我做一个游戏。看下面这半句话:
我今天去超市买了一斤……
请你猜下一个词。
你的脑子里大概会蹦出"苹果"、"米"、"肉"、"鸡蛋"。 你不会蹦出"手机"、"歌曲"、"汽车"。
为什么?因为在你这辈子读过的所有文字里, "买了一斤"后面跟着"苹果"或"米"的次数, 比跟着"手机"或"汽车"的次数多得太多了。
这就是 n-gram 模型 的全部秘密:
不去理解语言,只去数有多少种说法。
具体做法是:
- 准备一堆文本(比如维基百科全文);
- 把它切成相邻的 n 个词的小片段——这就是"n-gram";
- 数一下每个片段出现了多少次;
- 当遇到一段没说完的话,就去查"在我数过的片段里,下一个词最常出现的是哪个"。
第 2 步的"切片"听起来抽象,举一个例子你就明白了。 假设我们的语料库里只有一句话:
我 今天 去 超市 买 了 一斤 苹果
如果 n = 2(bigram,二元组),我们就把它切成"相邻 2 个词"的片段:
(我, 今天)、(今天, 去)、(去, 超市)、(超市, 买)、(买, 了)、(了, 一斤)、(一斤, 苹果)
如果 n = 3(trigram,三元组),就是"相邻 3 个词"的片段:
(我, 今天, 去)、(今天, 去, 超市)、(去, 超市, 买)、(超市, 买, 了)、(买, 了, 一斤)、(了, 一斤, 苹果)
每一句新文本进来都这样切一遍,然后把所有片段汇总起来数次数:
| 片段(trigram) | 出现次数 |
|---|---|
| (买, 了, 一斤) | 12,847 |
| (买, 了, 一盒) | 8,209 |
| (买, 了, 一些) | 6,531 |
| …… | …… |
将来当用户输入"我去超市买了",模型只要查表—— 在所有以"买、了"开头的 trigram 里,第三个词是什么的最多? 是"一斤",那就猜"一斤"。
如果你的 n 选 2,叫 bigram——只看前一个词。 如果选 3,叫 trigram——看前两个词。 n 越大,预测越准(因为上下文更多),但需要数的片段也指数级地变多。
它的影响超出所有人想象
n-gram 看起来简单到不像在做"AI",但它在 1990–2010 年代统治了几乎所有 NLP 应用:
- 你手机上的输入法联想("我今天" → "想"、"吃"、"去"),那时候用的就是 n-gram
- 早期 Google 翻译的核心是统计 n-gram,效果一度比规则派好得多
- 拼写检查、语音识别的语言模型,都是 n-gram
它的成功告诉了 AI 界一件石破天惊的事——
你不需要"理解"语言,光统计就够了。
这句话听起来像异端邪说,但它是 LLM 一切后续发展的真正起点。 今天的 ChatGPT,在最朴素的层面上做的事情,和 n-gram 是同一件事—— 预测下一个词最可能是什么。 区别只是它"数"得更聪明、"记"得更长而已。
n-gram 的天花板
但是 n-gram 有两个先天缺陷,让它注定走不远。
第一个缺陷:稀疏。
假设你想看四元组(quadgram)——也就是根据前三个词猜下一个词。 理论上要把"任意三个词的所有组合"都数一遍。 中文常用词有几万个,三个词的组合就是几万的三次方—— 全人类写过的文字加起来都填不满这个表格。
绝大多数组合在你的数据里一次都没出现过, n-gram 看到没见过的组合就只能两手一摊。
举个具体的例子。假设你用整个互联网中文文本训练了一个 trigram 模型。 现在用户输入了这样一句话:
我在赛博朋克咖啡馆喝了一杯……
模型要根据"喝、了、一杯"去查表, 这个 trigram 因为太常见,表里有几万次出现,能很自然地预测出"咖啡、奶茶、酒"。
但如果用户输入的是稍微大胆一点的搭配:
我用酸奶给乌龟洗了个……
"酸奶、乌龟、洗"这三个词的精确组合, 在整个互联网历史上几乎不可能出现过一次—— 不是因为这种事在物理上不可能, 而是因为这种荒诞的组合超出了人类日常表达的统计分布。
模型查表查不到,就只能猜"出现频率最高的某个词",结果常常是离题万里的胡话。 你换一个说法、调一个语序,模型就崩了。 这就是稀疏问题——它见过的世界永远只是真实语言的一小角, 而真实人类一开口,就经常脚踩在它从未见过的地方。
第二个缺陷:盲。
n-gram 看到的世界是这样的:
"苹果" "香蕉" "梨" 是三个互不相关的符号。
它不知道这三个词都是水果。在它眼里, "苹果"和"鞋子"的距离,跟"苹果"和"梨"的距离一样远。
这就导致一个荒谬的现象——你训练它认识了"红苹果"这个组合, 但它依然不知道"红梨"应该是合理的搭配。 每一个词都得单独学一遍。
NLP 研究者意识到,要打破这个天花板, 必须让计算机理解"词与词之间有内在关系"这件事。
这件事最后是被一种叫词向量的东西做到的。
四、词向量(2013):AI 第一次"懂"了一点点语义
用一串数字描述一个词
2013 年,Google 的工程师 Tomas Mikolov 发布了一个工具叫 Word2Vec。 它做的事情说起来很神秘,但本质很直接:
给每个词分配一串数字(比如 300 个),让"意思相近的词"的数字也相近。
举个直观的例子,假设我们用三个数字描述一个词:
| 词 | 数字 1 | 数字 2 | 数字 3 |
|---|---|---|---|
| 国王 | 0.8 | 0.9 | 0.1 |
| 王后 | 0.8 | 0.9 | 0.9 |
| 男人 | 0.3 | 0.4 | 0.1 |
| 女人 | 0.3 | 0.4 | 0.9 |
| 苹果 | 0.1 | 0.1 | 0.5 |
"国王"和"王后"前两个数字一样(都是 0.8、0.9),只有第三个数字差很多—— 看起来第三个数字大概在描述"性别"。 "国王"和"男人"第三个数字一样(都是 0.1),但前两个差很多—— 看起来前两个数字大概在描述"地位"。 而"苹果"和上面所有词都差得很远——它根本不是同一类东西。
真实的 Word2Vec 不是用三个数字,是用 300 个。 而这 300 个数字代表什么——没人知道,也不需要知道。 它们是从大量文本中"自动学"出来的:
如果两个词经常出现在相似的上下文里,就给它们相似的数字。
为什么这一步是革命
这件事看起来不起眼,但它解决了 n-gram 最根本的盲点—— 计算机第一次知道了"梨"和"苹果"是相近的东西。
更神奇的是,研究者发现这些数字可以做"算术":
国王 − 男人 + 女人 ≈ 王后
巴黎 − 法国 + 日本 ≈ 东京
意思是,"国王"这串数字减去"男人"这串数字,再加上"女人"这串数字, 得到的结果在数字空间里离"王后"非常近。
这件事发生在 2013 年。 那一年很多 NLP 研究者半夜睡不着觉—— 计算机似乎真的"理解"了一点东西, 它没读懂人类世界的男女、君臣、国家、首都, 但它从我们写过的文字里自己摸索出了这些关系的结构。
这是 NLP 历史上第一次出现"涌现"的雏形。 今天大模型的"涌现能力", 在思路上是这次发现的直系后代。
一个比喻
你可以把词向量想象成一张巨大的地图: 每个词都是地图上的一个点。 意思相近的词彼此挨得近,毫不相干的词被甩到地图的两端。 n-gram 看到的是一堆孤立的标签,词向量看到的是一片有结构的大陆。
但词向量只解决了"词是什么", 没解决"一句话是什么"。
要让计算机理解"一整句话"的意思, 研究者把目光投向了一类专门处理"序列"的神经网络——RNN。
五、RNN 与 LSTM(2010s):一个会忘事的记忆
把句子当成时间序列来读
人类读一句话,是一个词接一个词读下去的。 读完前面的词,对理解后面的词有帮助。 这个"边读边记住前面"的过程,能不能让计算机也做?
答案是循环神经网络(RNN, Recurrent Neural Network)。
它的工作方式可以这样想象:
想象你听一个朋友讲故事,他一次只说一个词,说完一个停一下让你消化,再说下一个。 你听不到回放,也不能记笔记,全靠脑子。 每听到一个新词,你都要在脑子里更新一下"故事讲到现在是个什么状况", 然后等着听下一个词。
每听到一个新词,你做两件事:
- 结合这个词和你脑子里目前的故事印象,得出新的印象;
- 把新印象记在脑子里,等待下一个词。
这样一来,理论上他讲到第 100 个词时,你脑子里那个"故事印象"是包含了前面 99 个词的信息的。
RNN 在 2010 年代初一度让所有人激动—— 它似乎天生就适合处理"语言"这种有先后顺序的东西。 机器翻译、语音识别、情感分析都开始用 RNN,效果比 n-gram 好得多。
但是 RNN 有一个致命的毛病
回到刚才那个听故事的场景。 你每听到一个新词,都要把"脑子里目前的故事印象"和"这一秒听到的新词"结合,得出新的印象。
但每次结合,旧印象都会被新输入稀释一点点。 听到第 50 个词时,第 1 个词留下的痕迹已经被稀释了 49 次,几乎归零。 这正是你听别人讲一个很长的故事讲到一半时,会忘记开头细节的感觉。
这就是 RNN 的"短记忆"问题——它理论上能记住任意长的序列, 实际上只能记住最近的几个、十几个词。
这件事在数学上叫梯度消失——你不用懂这个词, 只需要知道它的后果:RNN 一旦句子超过 20 个词,前面的内容就开始模糊。
LSTM:给 RNN 加一个"记事本"
2014 年前后,一个叫 LSTM(Long Short-Term Memory,长短期记忆网络) 的改进流行起来。
它的思路是,允许你掏出一个小本子做笔记:
- 每听到一个新词,你不仅更新脑子里的当前印象,还可以决定在小本子上写一笔;
- 也可以决定从小本子上划掉一笔;
- 还可以决定翻到哪一页来辅助当前理解。
这样一来,重要的信息可以被"记下来", 不重要的可以被"忘掉", 长记忆和短记忆有了一个明确的分工。
LSTM 在 2014–2016 年达到了 NLP 的巅峰。 Google 翻译 2016 年的那次"质量飞跃",背后就是一个典型的 LSTM 系统: 8 层 LSTM 的编码器负责"读懂"原文,再由 8 层 LSTM 的解码器"写出"译文, 中间用一个叫做 attention(注意力) 的机制把两头连起来。 注意力这个词会在下一章变成主角,这里先记住这个名字就行。 那一年很多人觉得,机器翻译这件事大概解决了。
为什么 LSTM 还是不够
但 LSTM 仍然有两个不可调和的缺陷。
第一个缺陷:还是会忘。
LSTM 比 RNN 记得久一些,但本质上还是"一个词一个词听、听到哪儿改到哪儿"。 当故事(或者文档)变得很长,比如几千个词时, 即使有小本子,听众也会被信息量压垮—— 本子上密密麻麻全是字,反而不知道哪条重要。 你可以让一个人一句话一句话读完一本小说,然后问他第二章某段细节—— 他大概率答不出来。LSTM 在这件事上和人类一样。
第二个缺陷:太慢了。
回到那个比喻——你必须先听完第 1 个词,才能去听第 2 个, 第 2 个没听完就不能听第 3 个。 这是 RNN/LSTM 的本质——它是串行的。 你想读 1000 个词的句子,就必须做 1000 次串行计算, 没法用现代 GPU 的"并行算几千个东西"的能力。
2016 年的时候,研究者们越来越焦虑: 模型再大、数据再多,但只要还在用 RNN/LSTM,速度就上不去、记忆就长不了。
NLP 似乎又一次一头撞在了人工智能的天花板上。
六、为什么这些尝试都"短记忆"
如果你把这一章的几个主角放在一起看, 会发现它们其实在反复撞同一堵墙——
- 规则引擎:能描述结构,描述不了上下文
- n-gram:能数字符的共现,但只能看几个词的窗口
- 词向量:理解了单个词的语义,但不理解"一句话怎么连起来"
- RNN / LSTM:能处理序列,但走不远——前面的会被稀释
七十年时间,AI 的语言能力像一个被困在小房间里的人, 偶尔能伸手够到窗外的什么东西,但永远没法走出去。
这堵墙是什么?
其实是同一件事的不同表现: 它们都没办法在一个长序列的任意位置之间,建立"直接的、相关性强弱可学习的"联系。
不管是 n-gram 的固定窗口、还是 RNN 沿着时间一格一格爬的串行结构, 两个相距很远的词之间,永远要经过中间所有词的转手。 转手次数越多,信息丢得越多。
如果有一种结构,可以让句子里任意两个词直接"看到"对方, 不必经过中间,这堵墙就被打破了。
七、转折点
2017 年 6 月 12 日, Google 的 8 位研究者在 arXiv 上提交了一篇预印本, 同年 12 月正式发表于 NIPS(即今天的 NeurIPS)会议。 这篇论文的 NIPS 印本只有十一页(pp. 5998–6008), 标题更短,只有 5 个英文单词——
Attention Is All You Need.
这篇论文里,他们扔掉了 RNN,扔掉了 LSTM,扔掉了所有"按时间串行处理"的思路。 他们提出一种新的网络结构,里面只有一种核心机制:注意力(Attention)。 注意力让句子里任意两个词可以直接互相看见对方, 不再需要经过中间词转手。
他们给这篇论文的网络结构起了一个奇怪的名字,叫 Transformer,与那个著名的电影同名——变形金刚。
七年之后,全世界的人都在用基于 Transformer 的模型聊天、写代码、写小说。 ChatGPT 里的 GPT,G 是 Generative(生成的),P 是 Pre-trained(预训练的), T 就是 Transformer。
下一章,我们将由浅入深的拆开这篇论文,为你理清 Transformer 的架构与原理。
要点回顾
- 规则派失败于"语言的意义无法用形式规则穷尽"
- n-gram 用"统计共现"代替"理解",意外地有效,但被"组合爆炸"和"词与词无关系"两件事卡死
- 词向量第一次让计算机摸到了"语义"的边——意思相近的词,数字也相近
- RNN / LSTM 第一次能处理"一整个序列",但记忆会沿着时间稀释、速度也快不起来
- 七十年里所有尝试的共同失败叫短记忆,本质是"远距离的词之间必须经过中间所有词转手"
- 2017 年的 Transformer 用注意力机制打破了这堵墙——这是下一章的主题
参考文献
- Hutchins, W. J. (2004). The Georgetown-IBM Experiment Demonstrated in January 1954. In Machine Translation: From Real Users to Research (AMTA 2004), Lecture Notes in Computer Science, vol. 3265, pp. 102–114.
- Weizenbaum, J. (1966). ELIZA—A Computer Program for the Study of Natural Language Communication Between Man and Machine. Communications of the ACM, 9(1), 36–45.
- Brown, P. F., Della Pietra, V. J., deSouza, P. V., Lai, J. C., & Mercer, R. L. (1992). Class-Based n-gram Models of Natural Language. Computational Linguistics, 18(4), 467–479.
- Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781.
- Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735–1780.
- Wu, Y., Schuster, M., Chen, Z., et al. (2016). Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation. arXiv:1609.08144.
- Olah, C. (2015). Understanding LSTM Networks. colah.github.io. (英文世界最经典的 LSTM 直觉教程。)
- Vaswani, A., Shazeer, N., Parmar, N., et al. (2017). Attention Is All You Need. In Advances in Neural Information Processing Systems (NIPS 2017), pp. 5998–6008. arXiv:1706.03762.