理解每一代技术解决了上一代的哪个问题
这一篇要讲什么
到这里你已经看了番外 09 的直觉、番外 10 的具体技术。但 embedding 只是更长一条链上的一个节点——理解 LLM 为什么是今天这个样子,需要把整条链都走一遍。
整条链长这样:
One-Hot → 词是孤立的符号,没有语义
↓
TF-IDF → 文档级别的统计表示,能做搜索分类
↓
Word2Vec → 词有了语义向量,但一词一义
↓
RNN / LSTM → 开始理解序列和上下文
↓
Attention → 动态聚焦,解决长距离依赖
↓
Transformer → 并行化,架构革命
↓
BERT / GPT → 预训练 + 微调,通用语言理解
↓
LLM → 规模涌现,接近通用语言智能
每一站不需要讲透——只要讲清楚两件事:它解决了什么、它留下了什么问题。这两件事就是下一站存在的理由。看完这条链,你会理解为什么 LLM 不是某天某个人灵光一闪发明的,是 30 年来一代代研究者解决一个又一个具体瓶颈最后接到一起的产物。
第一站:One-Hot —— 词是孤立的符号
机器只能处理数字。最朴素的把"词"变成"数字"的办法是 one-hot 编码:维护一个词表,每个词对应词表里的一个位置。"猫"是第 5 个词,那它的编码就是一个长度等于词表大小的向量,只有第 5 位是 1,其它全是 0。
词表: [我, 你, 他, 她, 猫, 狗, 鸟, 鱼, ...]
猫 → [0, 0, 0, 0, 1, 0, 0, 0, ...]
狗 → [0, 0, 0, 0, 0, 1, 0, 0, ...]
鸟 → [0, 0, 0, 0, 0, 0, 1, 0, ...]
这种表示有个朴素直接的好处——任意两个词都不会被搞混。但代价是它的根本缺陷:任意两个词的距离都是相同的。"猫"和"狗"的余弦相似度是 0,"猫"和"鸟"也是 0。one-hot 把每个词变成一个独立的孤岛,词义之间的关系无从谈起。
但 one-hot 不会消失——它会作为底层的"输入接口"在后面所有阶段反复出现。Word2Vec 的输入是 one-hot,BERT 的 tokenizer 输出经过 embedding 层之前在概念上也是 one-hot 的索引。one-hot 是基石,问题只是它不能直接用作语义表示。
第二站:TF-IDF —— 让文档有了向量
90 年代的搜索引擎和文本分类需要给整篇文档算相似度。TF-IDF 把 one-hot 升级到文档级别:一个文档表示成一个向量,每一维对应词表里一个词,值是 TF × IDF——这个词在这篇文档里多频繁、在所有文档里多稀有。
直觉是:在一篇文档里出现频繁、但在所有文档里又罕见的词,最能代表这篇文档的特征。"的、是、了"在哪都是,IDF 接近 0;"光合作用"如果只在生物学文档里出现,IDF 就高,对识别"这是一篇生物学文档"很有用。
TF-IDF 让文档之间能算相似度了,至今搜索引擎、文本分类、关键词提取仍在用——BM25 是它的现代变体,几乎所有 RAG 系统都把 BM25 作为关键词召回的兜底。
但它只看字面共现,不懂语义——"机器学习"和"machine learning"在 TF-IDF 看来完全没关系;"猫"和"狗"在向量空间里也毫无关联。要让机器理解词义本身,得换一条路。
第三站:Word2Vec —— 词有了语义
2013 年 Mikolov 团队的 word2vec 是分水岭。核心想法是让神经网络在解决一个简单任务的过程中,副产物就是好的词向量——任务是"用周围几个词预测中间那个词"或反过来,副产物是中间那一层的 embedding 矩阵。
训练完成后,"猫"和"狗"的向量是真的会靠近的,因为它们的上下文很类似(都和"宠物、可爱、毛、叫"这些词共现)。"国王 - 男 + 女 ≈ 女王"这种向量算术也是这时候被发现的。语义有了。
但 word2vec 给出的是静态向量——一个词永远对应一个向量。"苹果"无论指水果还是公司,拿到的都是同一个点。要让向量随上下文变化,模型必须真的会"读句子"——一个一个词依次处理、积累上下文信息。
第四站:RNN / LSTM —— 让模型读句子
1990 年代就有 RNN(recurrent neural network)的概念,2010 年代和 word2vec 同时期被广泛用在 NLP 上。RNN 的想法很自然——让网络一个词一个词地读句子,每一步保留一个"记忆状态":
[我] → RNN → h1
[喜欢] + h1 → RNN → h2
[猫] + h2 → RNN → h3
[咪] + h3 → RNN → h4 (整句话的浓缩表示)
每一步的 h 都依赖于"到目前为止读到的所有词"——RNN 第一次让模型有了真正的"上下文"概念。"我喜欢猫"和"猫喜欢我",词都一样但顺序不同,RNN 能给出不同的 h;而 word2vec 把两个句子的词向量平均,结果完全一样。
但原始 RNN 有个致命问题:长距离依赖会丢失。读到第 50 个词时,第 1 个词的信息基本被稀释没了——反向传播时梯度通过 50 次乘法会指数衰减或爆炸。
LSTM(Long Short-Term Memory)是 1997 年 Hochreiter & Schmidhuber 发明、2014 年起在 NLP 领域大放异彩的方案。它在 RNN 的"记忆状态"基础上加了三个门——输入门、遗忘门、输出门——决定什么信息记下来、什么忘掉、什么输出。这让 LSTM 能记住几十个时间步以前的信息,机器翻译、命名实体识别、情感分析都做出了 SOTA。
但 RNN 家族(包括 LSTM、GRU)有个根本性的瓶颈——必须串行处理。读第 100 个词必须先读完前 99 个。这意味着两件事:
第一,训练慢。一个长序列没办法在 GPU 上并行算,每一步都要等上一步。GPU 的并行优势没法用上。
第二,极长距离依赖仍然损失。LSTM 能撑住几十步,但几百步还是会衰减;几千步基本就忘光了。
要打破这个瓶颈,需要一个能让"任意两个词直接互相看"的机制。
第五站:Attention —— 动态聚焦的诞生
attention 最早出现在 2014 年 Bahdanau 团队做机器翻译的论文里。当时主流的 seq2seq 翻译模型是这样的:encoder 是一个 RNN,把整句中文压缩成一个向量;decoder 是另一个 RNN,从这个向量生成英文翻译。但"整句话压成一个向量"在长句子上效果非常差——你怎么可能用一个固定大小的向量精准编码 100 个词?
attention 的想法很优雅:decoder 在生成每一个目标词时,不再依赖整句话压缩的那一个向量,而是动态地看 encoder 每个时间步的输出,给它们打权重再求和。比如生成英文 "cat" 时,attention 会让模型把权重压在中文输入里 "猫" 那个位置:
中文输入: 我 喜欢 猫
权重: 0.1 0.1 0.8 ← attention 算出来的
↓
动态加权求和
↓
送给 decoder 生成 "cat"
attention 给 NLP 带来两个之前没有的核心能力:
动态聚焦——每生成一个词,attention 重新算一次权重,关注度跟着任务变。生成 "love",权重压在 "喜欢" 上;生成 "cat",压在 "猫" 上。
长距离直连——任意两个位置的信息可以一步直接交互,不需要像 RNN 那样一步步传递、衰减。
attention 一开始只是 RNN 的"补丁",让 seq2seq 在长句子上不那么糟。但有人想到了一个更激进的问题:如果 attention 这么强,为什么还需要 RNN?
第六站:Transformer —— 架构革命
2017 年 Google 一篇 "Attention Is All You Need" 把 RNN 完全踢出局。Transformer 的核心是 self-attention——让句子里每个词同时和其它所有词算 attention,得到一个被全局上下文调制过的新表示:
输入: [我] [喜欢] [猫咪] [因为] [它们] [可爱]
↓
self-attention 让 [它们] 同时看遍整句话
↓
发现自己和 [猫咪] 关联最强 → 新向量向 [猫咪] 靠近
self-attention 的具体做法:每个位置同时算出 Query、Key、Value 三个向量,用 Q 和所有 K 算相似度(softmax 归一化)作为权重,对 V 加权求和。公式番外 10 写过,这里只关心它带来的三件事:
完全并行。所有位置同时计算,不再串行。一个 1024 token 的输入在 GPU 上可以同时算所有位置——RNN 时代要等 1024 步,Transformer 时代是一次矩阵乘法。这让训练速度提升几个数量级,是后续 LLM 能堆到千亿参数的工程前提。
任意距离直连。第 1 个词和第 1000 个词一步就能交互,没有衰减。LSTM 的根本瓶颈被绕过了。
可解释。attention 权重可视化能直接看出"模型在看哪里",对 debug 和理解模型行为很有用。
Transformer 还配套引入了多头注意力(让模型同时从多个不同角度算 attention)、positional encoding(attention 本身没有位置概念,得显式加进去)、残差连接 + layer norm(让深层网络可训)。这一套零件的组合就是现代 LLM 的骨架,从 2017 年到今天没有本质变化。
Transformer 一出来,机器翻译质量大跳,但一个问题仍然存在:每来一个新任务都要从头训一个模型。能不能预训一个通用的,再针对具体任务微调?
第七站:BERT / GPT —— 预训练 + 微调的范式
2018 年同一年出了两个分水岭模型:
BERT(Google) 是 encoder-only Transformer,做的是"理解"——给一段文字,输出每个 token 的上下文表示。预训练任务是"挖空填词"(Masked Language Modeling):随机遮住 15% 的 token 让模型预测。这个任务的设计逼模型必须同时看左边和右边才能填空——这是"双向"的来源。预训练完之后,把它套上一个分类头就能做情感分析、问答、命名实体识别——只需要少量标注数据微调,效果就远超从头训练。
GPT(OpenAI) 是 decoder-only Transformer,做的是"生成"——给一段开头,预测下一个词。预训练任务就是普通的语言模型——预测下一个 token。GPT-1 发布时还要靠下游微调才好用,但已经展示了"先预训练再微调"的威力。
这两个模型把整个 NLP 带入 "pretrain → finetune" 范式:
- 预训练阶段 在海量无标注文本上让模型学语言的统计规律。成本极高(几百到几千 GPU 天)但只做一次
- 微调阶段 在小规模有标注数据上把模型调整到具体任务。成本低,可以做很多次
之前几乎每个 NLP 任务都得从头训一个模型,现在所有任务共享一个底座。整个领域的研究方式都变了——不再是"为这个任务设计一个模型",而是"在 BERT/GPT 上加一个小头来做这个任务"。
但 BERT 和 GPT-1 还是要"微调"才能用。能不能让模型大到一个程度,直接用自然语言就能告诉它要做什么?
第八站:LLM —— 规模带来的涌现
2020 年 GPT-3(1750 亿参数)登场。它没引入根本性的新架构——还是 decoder-only Transformer、还是预测下一个 token 的训练目标——它只是比之前的模型大了 100 倍。
但奇迹发生了——它不需要微调了。你只要在 prompt 里给它几个例子,它就能学着干一件新任务(few-shot learning);甚至零样本——直接告诉它"翻译这句话到法语",它就翻译了。这个现象叫 in-context learning(上下文学习):模型在前向传播的过程中,似乎能"理解"prompt 里给出的指令和示例。
更神奇的是 emergent abilities(涌现能力)——模型小的时候完全做不到的能力,规模超过某个阈值后突然出现:算术、代码生成、多步推理、按指令格式化输出。这些能力没有被研究者直接教过,是规模本身带来的。Wei 等人在 2022 年的论文里把这个现象系统地描述了一遍,至今仍是 LLM 研究里最神秘也最重要的现象之一。
GPT-3 之后,ChatGPT、GPT-4、Claude、Gemini、DeepSeek、Llama、Qwen 等等——它们的核心架构和 2017 年的 Transformer 没有本质区别,但因为四个东西放大了:
第一,参数规模:从亿级到千亿、万亿级。
第二,训练数据:从几十亿到几万亿 token。
第三,训练目标的工程化:在预测下一个 token 之外,加上监督微调(SFT)让模型学会按指令回答、人类反馈强化学习(RLHF)让模型学会人类偏好的回答风格、思维链微调让模型学会显式推理过程。
第四,上下文窗口:从 GPT-3 的 2K 扩到现在的 100 万 token,让模型可以一次"读完"几本书。
LLM 已经不是传统意义上的"语言模型"——它能写代码、做数学、做多轮对话、规划任务。"自然语言"成了人和计算机交互的通用接口。
这条链的内在逻辑
回头看这八站,能看出一条非常清晰的逻辑——每一站都是为了解决前一站的某个具体瓶颈:
| 阶段 | 上一站留下的瓶颈 | 本站的突破 |
|---|---|---|
| One-Hot | (起点) | 把符号变成可计算的向量 |
| TF-IDF | 词是孤岛 | 用统计给文档算相似度 |
| Word2Vec | 字面共现 ≠ 语义 | 学到了词的语义关系 |
| RNN / LSTM | 静态向量、无上下文 | 序列建模、上下文表示 |
| Attention | 串行、长距离衰减 | 动态聚焦、长程直连 |
| Transformer | attention 仍依附 RNN | 完全并行的纯 attention 架构 |
| BERT / GPT | 每任务从头训 | 预训练 + 微调 |
| LLM | 仍需为每任务微调 | 规模带来 in-context learning 与涌现 |
每一次突破都不是"全新发明"——往往是把已有想法(attention 在 2014 年就有了,Transformer 把它独立出来;语言模型在 1980 年代就有了,GPT 把它放大)放到合适的位置上、加上工程上的合理简化、加上规模的支持,才彻底改变格局。
为什么要懂这条链
可能你今天写代码只用 LLM API,前面那些技术看起来跟你没关系。但理解这条链对你做工程是真的有用:
调系统时知道在哪一层。 RAG 召回不准,问题可能在 embedding 这一层(TF-IDF 兜底 / 现代 embedding),可能在上下文窗口(attention 的固有限制),可能在 prompt 设计(in-context learning)。你能区分是哪一层的问题,就能对症下药;不区分,只会反复换模型试。
面对新论文不慌。 几乎每篇 NLP 论文都建立在这条链的某一节上。读论文时心里有这张演化图,能马上判断这工作创新在哪一层、对你有没有用。比如 Mamba 是在挑战 Transformer 的 attention 部分,你听到这个就知道它解决的是 attention 的什么问题(O(n²) 复杂度);reranker 模型是在 BERT 那一层做精排;RAG 是在 LLM 之前接一层 embedding 检索——这些都对得上链上的位置。
理解 LLM 的边界。 LLM 的所有能力来自这条链上某一段技术加上规模。它的盲区也是。比如长上下文衰减仍然是 attention 的固有问题(attention 复杂度是 O(n²),到几十万 token 时计算和内存都吃不消);精确算术和符号推理仍然是"预测下一个 token"这个目标天生不擅长的事——这两个问题不会因为继续堆参数就消失,需要架构层面的新突破。
收尾
embedding 是这条链上一个关键的"接口"——把人类语言翻译成机器能算的向量。但 embedding 本身不是终点,它只是 LLM 这一整套系统里最早被搞定的那一节。后面 RNN 解决序列、attention 解决长距离、Transformer 解决并行、预训练解决通用性、规模解决任务泛化——每一节都是必要的,少了任何一节都构不成今天的 LLM。
回到最朴素的问题:怎么让计算机理解人类语言?答案是从 1990 年代起一代又一代工程师和研究者一点点拼出来的。LLM 不是某个聪明人灵光一闪发明的,是一条接力赛——你只要看完这条链,就能感觉到下一棒会接到哪里。当下挑战 Transformer 的状态空间模型(Mamba)、挑战序列建模的扩散语言模型、挑战预训练范式的合成数据训练——它们都是在这条链上某一节寻找新的突破口。
LLM 的故事远没有结束。
参考资料
- Mikolov et al., word2vec (2013)
- Hochreiter & Schmidhuber, LSTM (1997)
- Bahdanau et al., Neural Machine Translation by Jointly Learning to Align and Translate (2014) — attention 的起源
- Vaswani et al., Attention Is All You Need (2017) — Transformer 原始论文
- Devlin et al., BERT (2018)
- Brown et al., Language Models are Few-Shot Learners (GPT-3, 2020)
- Wei et al., Emergent Abilities of Large Language Models (2022) — 涌现能力的系统性研究
- Jay Alammar, The Illustrated Transformer — Transformer 视觉化讲解的经典
- Christopher Olah, Understanding LSTM Networks — LSTM 最好的图解
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:番外 11:从 One-Hot 到 LLM,自然语言处理三十年的完整演化
本文链接:https://www.sshipanoo.com/blog/ai/ai-for-python/番外11-从One-Hot到LLM/
本文最后一次更新为 天前,文章中的某些内容可能已过时!