语言模型的演化
语言模型最核心的问题其实很简单:给定前面的词,预测下一个词。
但难点在于:上下文可能很长,词表可能很大,语言里还存在大量没有见过的新组合。因此语言模型的发展,基本就是一条不断扩大上下文、改进表示方式、增强长期依赖建模能力的路线。
N-gram模型
N-gram 是最早期、也最直观的统计语言模型。它的核心假设是:预测当前词时,不需要看完整历史,只需要看前面固定长度的 $N-1$ 个词。
例如三元模型(trigram)会把句子概率近似为:
也就是说,如果我们要预测“学习”,模型只看前面的两个词:
N-gram 的训练方式非常朴素:在语料库里数频次。
比如语料中“我 喜欢 学习”出现 10 次,“我 喜欢”出现 20 次,那么:
这种方法的优点是可解释、实现简单、训练成本低。但它也有明显缺陷:
- 上下文太短:$N$ 固定,模型无法利用更远处的信息。
- 数据稀疏:词表很大时,很多合理组合在训练集中根本没出现过。
- 无法理解语义相似性:模型不知道“汽车”和“轿车”语义接近,只会把它们当作两个完全不同的符号。
- 存储开销大:$N$ 越大,需要统计的组合数量越爆炸。
所以 N-gram 本质上是一个基于“记忆表”的模型:见过的组合能处理,没见过的组合就很难泛化。
神经网络语言模型与词嵌入
神经网络语言模型(Neural Network Language Model, NNLM)试图解决 N-gram 最大的问题:词与词之间没有可学习的语义关系。
它不再把词看作离散符号,而是把每个词映射成一个连续向量,也就是词嵌入(word embedding)。
词嵌入的关键思想是:语义相近的词,在向量空间里也应该更接近。比如“猫”和“狗”都经常出现在“宠物”“动物”“喂养”等上下文中,所以它们的向量会逐渐靠近。
NNLM 的基本流程可以写成:
输入是前面若干个词,模型先把它们转换成词向量,再经过神经网络,最后输出下一个词的概率分布。
相比 N-gram,神经网络语言模型有几个重要进步:
- 可以泛化到没见过的组合:即使“我 喜欢 机器学习”没有在训练集中出现过,模型也能借助“机器学习”和其他相关词的向量关系做出判断。
- 词具有连续表示:词不再只是编号,而是有了可学习的语义位置。
- 参数共享:相似上下文可以共享模型参数,而不是为每个词组单独存一条统计记录。
但早期 NNLM 通常仍然依赖固定窗口。例如只看前 5 个词或前 10 个词,因此它虽然解决了语义表示问题,却还没有真正解决长距离依赖问题。
循环神经网络RNN
RNN(Recurrent Neural Network)进一步放宽了固定窗口限制。它的想法是:模型按时间顺序读入 token,每读一个词,就把当前状态传递给下一个时间步。
其中:
- $x_t$ 是当前词的输入向量。
- $h_t$ 是当前位置的隐藏状态。
- $h_{t-1}$ 是上一个位置传下来的历史信息。
- f是激活函数,一般取tanh
从形式上看,RNN 不再只看固定的 $N-1$ 个词,而是可以把历史信息不断压缩进隐藏状态 $h_t$ 中。
例如读句子:
我 昨天 在 图书馆 看 了一 本 书
RNN 会从左到右依次更新状态:
理论上,最后的隐藏状态可以包含前面所有词的信息。这样模型就能处理任意长度的序列,这对语言建模、机器翻译、语音识别等任务都非常重要。
RNN 的优势是:
- 天然适合序列数据:文本、语音、时间序列都可以按时间步处理。
- 参数量不随序列长度增长:同一组参数在每个时间步重复使用。
- 可以建模上下文历史:比固定窗口 NNLM 更灵活。
但普通 RNN 有一个严重问题:长距离依赖很难学。
反向传播时,梯度需要沿着时间链条一层层传回去。如果序列很长,梯度会不断乘以同一个权重矩阵,容易出现两种情况:
- 如果连乘结果越来越小,就会发生梯度消失,模型学不到很早之前的信息。
- 如果连乘结果越来越大,就会发生梯度爆炸,训练变得不稳定。
RNN 容易梯度消失或爆炸,是因为它在时间维度上递归传播隐藏状态。反向传播时,梯度需要经过很多时间步,每一步都会乘上隐藏状态转移矩阵 $W_h$和激活函数导数,因此整体梯度近似是多个矩阵的连乘。如果这些乘积的谱半径小于 1,梯度会指数级衰减;如果大于 1,梯度会指数级放大。
Transformer 不采用时间递归结构,而是通过 self-attention 让不同位置的 token 直接交互,信息传播路径更短,不需要沿序列长度反复连乘同一个状态转移矩阵。同时 Transformer 中的残差连接和 LayerNorm 也能稳定梯度传播。所以 Transformer 不是完全没有梯度问题,但它不会像普通 RNN 那样因为长序列递归而特别容易梯度消失或爆炸。
这就是为什么普通 RNN 在短句子上还可以,但遇到长文本时经常“记不住前文”。
长短时记忆网络 (LSTM)
LSTM(Long Short-Term Memory)是为了解决 RNN 长距离依赖问题而提出的结构。它的核心改进是:在普通隐藏状态之外,引入一条更稳定的记忆通道,也就是 cell state。
RNN 长距离依赖问题分为梯度消失和梯度爆炸两种,其中梯度爆炸可以通过梯度裁剪解决,但是梯度消失是无解的。
普通 RNN 像是每一步都要重新改写记忆,而 LSTM 更像是给记忆加了几个门,决定哪些信息保留、哪些信息遗忘、哪些信息输出。

LSTM 主要有三个门:
- 遗忘门:决定上一时刻的记忆 $c_{t-1}$ 保留多少。
- 输入门:决定当前输入产生的新信息写入多少。
- 输出门:决定当前记忆有多少暴露给隐藏状态 $h_t$。
公式可以概括为:
其中最关键的是这条更新:
它让记忆可以沿着时间方向比较稳定地传递,而不是每一步都被完全重写。这样 LSTM 就能比普通 RNN 更好地保存长期信息。
举个例子:
我出生在中国,后来去了很多国家旅行,但我最熟悉的语言仍然是中文。
如果要预测最后的“中文”,模型需要记住很早之前出现的“中国”。普通 RNN 可能在中间一长串词之后逐渐忘掉这个信息,而 LSTM 的 cell state 可以通过门控机制把它保留下来。
LSTM 的优点是:
- 缓解梯度消失:cell state 提供了更直接的信息流。
- 适合中长序列:比普通 RNN 更能记住远距离上下文。
- 门控机制可控:模型可以学习什么时候记忆、什么时候遗忘。
但 LSTM 仍然没有彻底解决序列建模的效率问题:
- 它仍然需要按时间步顺序计算,难以大规模并行。
- 序列很长时,信息仍然要经过很多步传递。
- 每个 token 对其他 token 的访问是间接的,不像注意力机制那样可以直接建立两两关系。
这也是后来 Transformer 取代 RNN/LSTM 成为主流语言模型架构的重要原因。
小结
语言模型的演化可以粗略概括为下面这条路线:
| 阶段 | 核心思想 | 解决的问题 | 主要限制 |
|---|---|---|---|
| N-gram | 数频次,查条件概率表 | 简单可解释 | 数据稀疏,窗口固定 |
| NNLM | 用词向量表示 token | 语义泛化能力更强 | 上下文通常仍然固定 |
| RNN | 用隐藏状态传递历史 | 支持变长序列 | 长距离依赖困难 |
| LSTM | 用门控和 cell state 保存记忆 | 缓解梯度消失 | 计算难并行,长文本仍受限 |
| Transformer | 用注意力直接建模 token 关系 | 并行、高效、长依赖更强 | 注意力计算随长度平方增长 |
从 N-gram 到 LSTM,模型一步步从“统计词组频率”走向“学习连续语义表示”和“建模序列记忆”。而 Transformer 的出现,则进一步把“按顺序传递信息”改成了“所有 token 之间直接交互”,这也是现代大语言模型的基础。
