语言模型最核心的问题其实很简单:给定前面的词,预测下一个词。

$$ P(w_1,w_2,\dots,w_T)=\prod_{t=1}^{T}P(w_t\mid w_1,\dots,w_{t-1}) $$

但难点在于:上下文可能很长,词表可能很大,语言里还存在大量没有见过的新组合。因此语言模型的发展,基本就是一条不断扩大上下文、改进表示方式、增强长期依赖建模能力的路线。

语言模型演化路线

N-gram模型

N-gram 是最早期、也最直观的统计语言模型。它的核心假设是:预测当前词时,不需要看完整历史,只需要看前面固定长度的 $N-1$ 个词。

例如三元模型(trigram)会把句子概率近似为:

$$ P(w_t\mid w_1,\dots,w_{t-1})\approx P(w_t\mid w_{t-2},w_{t-1}) $$

也就是说,如果我们要预测“学习”,模型只看前面的两个词:

N-gram窗口

N-gram 的训练方式非常朴素:在语料库里数频次。

$$ P(w_t\mid w_{t-2},w_{t-1})= \frac{count(w_{t-2},w_{t-1},w_t)} {count(w_{t-2},w_{t-1})} $$

比如语料中“我 喜欢 学习”出现 10 次,“我 喜欢”出现 20 次,那么:

$$ P(\text{学习}\mid \text{我},\text{喜欢})=\frac{10}{20}=0.5 $$

这种方法的优点是可解释、实现简单、训练成本低。但它也有明显缺陷:

  • 上下文太短:$N$ 固定,模型无法利用更远处的信息。
  • 数据稀疏:词表很大时,很多合理组合在训练集中根本没出现过。
  • 无法理解语义相似性:模型不知道“汽车”和“轿车”语义接近,只会把它们当作两个完全不同的符号。
  • 存储开销大:$N$ 越大,需要统计的组合数量越爆炸。

所以 N-gram 本质上是一个基于“记忆表”的模型:见过的组合能处理,没见过的组合就很难泛化。

神经网络语言模型与词嵌入

神经网络语言模型(Neural Network Language Model, NNLM)试图解决 N-gram 最大的问题:词与词之间没有可学习的语义关系。

它不再把词看作离散符号,而是把每个词映射成一个连续向量,也就是词嵌入(word embedding)。

词嵌入示意

词嵌入的关键思想是:语义相近的词,在向量空间里也应该更接近。比如“猫”和“狗”都经常出现在“宠物”“动物”“喂养”等上下文中,所以它们的向量会逐渐靠近。

NNLM 的基本流程可以写成:

$$ token \rightarrow embedding \rightarrow hidden\ layer \rightarrow softmax $$

输入是前面若干个词,模型先把它们转换成词向量,再经过神经网络,最后输出下一个词的概率分布。

相比 N-gram,神经网络语言模型有几个重要进步:

  • 可以泛化到没见过的组合:即使“我 喜欢 机器学习”没有在训练集中出现过,模型也能借助“机器学习”和其他相关词的向量关系做出判断。
  • 词具有连续表示:词不再只是编号,而是有了可学习的语义位置。
  • 参数共享:相似上下文可以共享模型参数,而不是为每个词组单独存一条统计记录。

但早期 NNLM 通常仍然依赖固定窗口。例如只看前 5 个词或前 10 个词,因此它虽然解决了语义表示问题,却还没有真正解决长距离依赖问题。

循环神经网络RNN

RNN(Recurrent Neural Network)进一步放宽了固定窗口限制。它的想法是:模型按时间顺序读入 token,每读一个词,就把当前状态传递给下一个时间步。

$$ h_t=f(W_xx_t+W_hh_{t-1}+b) $$
$$ y_t = Softmax(W_yh_t) $$

其中:

  • $x_t$ 是当前词的输入向量。
  • $h_t$ 是当前位置的隐藏状态。
  • $h_{t-1}$ 是上一个位置传下来的历史信息。
  • f是激活函数,一般取tanh

RNN展开结构

从形式上看,RNN 不再只看固定的 $N-1$ 个词,而是可以把历史信息不断压缩进隐藏状态 $h_t$ 中。

例如读句子:

我 昨天 在 图书馆 看 了一 本 书

RNN 会从左到右依次更新状态:

$$ h_1 \rightarrow h_2 \rightarrow h_3 \rightarrow \dots \rightarrow h_T $$

理论上,最后的隐藏状态可以包含前面所有词的信息。这样模型就能处理任意长度的序列,这对语言建模、机器翻译、语音识别等任务都非常重要。

RNN 的优势是:

  • 天然适合序列数据:文本、语音、时间序列都可以按时间步处理。
  • 参数量不随序列长度增长:同一组参数在每个时间步重复使用。
  • 可以建模上下文历史:比固定窗口 NNLM 更灵活。

但普通 RNN 有一个严重问题:长距离依赖很难学。

反向传播时,梯度需要沿着时间链条一层层传回去。如果序列很长,梯度会不断乘以同一个权重矩阵,容易出现两种情况:

$$ \frac{\partial L}{\partial h_{t-k}} \approx \frac{\partial L}{\partial h_t} \prod_{i=t-k+1}^{t} \frac{\partial h_i}{\partial h_{i-1}} $$
  • 如果连乘结果越来越小,就会发生梯度消失,模型学不到很早之前的信息。
  • 如果连乘结果越来越大,就会发生梯度爆炸,训练变得不稳定。

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 更像是给记忆加了几个门,决定哪些信息保留、哪些信息遗忘、哪些信息输出。

1783601106915

LSTM 主要有三个门:

  • 遗忘门:决定上一时刻的记忆 $c_{t-1}$ 保留多少。
  • 输入门:决定当前输入产生的新信息写入多少。
  • 输出门:决定当前记忆有多少暴露给隐藏状态 $h_t$。

公式可以概括为:

$$ f_t=\sigma(W_f[x_t,h_{t-1}]+b_f) $$
$$ i_t=\sigma(W_i[x_t,h_{t-1}]+b_i) $$
$$ \tilde{c}_t=\tanh(W_c[x_t,h_{t-1}]+b_c) $$
$$ c_t=f_t\odot c_{t-1}+i_t\odot \tilde{c}_t $$
$$ o_t=\sigma(W_o[x_t,h_{t-1}]+b_o) $$
$$ h_t=o_t\odot\tanh(c_t) $$

其中最关键的是这条更新:

$$ c_t=f_t\odot c_{t-1}+i_t\odot \tilde{c}_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 之间直接交互”,这也是现代大语言模型的基础。