历史脉络:从统计语言模型到神经网络的范式转移
语言模型的发展史,本质上是一部人类不断突破“序列建模效率”与“长程依赖捕获能力”之间根本矛盾的历史。从基于计数的统计方法到深度神经网络,每一次范式转移都源于对前代模型核心瓶颈的深刻反思。本章将系统梳理这一演进脉络,剖析n-gram、神经网络语言模型(NNLM)、循环神经网络(RNN)及其变体(LSTM/GRU)的原理与内在局限,并考察Word2Vec、ELMo、GPT-1等里程碑工作如何在前架构时代进行关键探索。通过揭示这些模型在长距离上下文建模与并行计算效率上的共同困境,我们将自然引出注意力机制与Transformer架构诞生的历史必然性,为理解后续的革命性突破奠定坚实的历史视角。
统计语言模型:n-gram的基石与局限
语言模型的核心任务是估计一个词序列的概率:$P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_1, ..., w_{t-1})$。在计算能力有限的早期,基于n-gram的统计语言模型成为主流解决方案。其核心假设是马尔可夫假设:当前词的出现仅依赖于前n-1个词。例如,二元模型(bigram)假设$P(w_t | w_1, ..., w_{t-1}) \approx P(w_t | w_{t-1})$,三元模型(trigram)则依赖于前两个词。
n-gram模型通过大规模语料库中的频率计数来估计条件概率:$P(w_t | w_{t-n+1}^{t-1}) = \frac{C(w_{t-n+1}^{t-1}, w_t)}{C(w_{t-n+1}^{t-1})}$,其中$C(\cdot)$表示序列出现的计数。为了处理未在训练集中出现的n-gram(零概率问题),研究者引入了多种平滑技术,如加一平滑(Laplace smoothing)、Kneser-Ney平滑等,将部分概率质量分配给未见事件。
n-gram模型在早期语音识别和机器翻译系统中取得了实用成功,但其根本缺陷随着应用复杂度的提升而日益凸显:
1. 数据稀疏与维度灾难:语言词汇量V通常达数万至数十万,n-gram的组合空间高达$V^n$,即使使用千亿词级别的语料,绝大多数n-gram的计数为零。平滑技术只能缓解,无法根治。Bengio等人(2003)在经典论文中明确指出,n-gram模型的泛化能力严格受限于其n-1阶前缀的精确匹配,无法捕捉词汇之间的语义相似性。例如,“猫吃鱼”和“狗吃骨”在n-gram眼中是完全无关的序列,尽管“猫”与“狗”、“鱼”与“骨”在语义上具有关系。 2. 长程依赖的彻底缺失:n-gram的上下文窗口是固定的(通常n=3或5),模型完全无法利用超过窗口长度的历史信息。对于“我昨天去了银行,然后从账户里取了钱”这样的句子,要理解第二个“银行”是金融机构而非河岸,需要跨越多个词的长距离推理,n-gram无能为力。 3. 存储与计算开销:存储所有n-gram计数需要巨大内存。对于常用n(如n=5),即使使用哈希表,模型大小也常达到数十GB,这限制了其在资源受限环境下的部署。
这些局限性表明,基于离散计数的统计模型在表示能力和泛化性上存在本质天花板,为神经网络语言模型的兴起铺平了道路。
神经网络语言模型:分布式表示的曙光
2003年,Bengio等人提出的神经网络语言模型(Neural Network Language Model, NNLM)开创性地将神经网络引入语言建模,其核心贡献是引入了分布式表示(distributed representation)的概念,即每个词被映射为一个低维、稠密的实数向量(词向量),语义相似的词在向量空间中距离相近。
NNLM的架构通常包含四个部分: 1. 输入层:将上下文中的n-1个词(如$w_{t-n+1}, ..., w_{t-1}$)通过查找表(lookup table)转换为对应的词向量$\mathbf{e}(w_i) \in \mathbb{R}^m$,其中m是词向量维度(通常50-500)。 2. 连接层:将n-1个词向量拼接(concatenate)成一个长向量$\mathbf{x} = [\mathbf{e}(w_{t-n+1}); ...; \mathbf{e}(w_{t-1})] \in \mathbb{R}^{(n-1)m}$。 3. 隐藏层:通过非线性变换$\mathbf{h} = \tanh(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)$,其中$\mathbf{W}_1 \in \mathbb{R}^{h \times (n-1)m}$,h是隐藏层维度。 4. 输出层:计算下一个词$w_t$的条件概率:$P(w_t | \text{context}) = \frac{\exp(\mathbf{y}_{w_t})}{\sum_{w \in V} \exp(\mathbf{y}_w)}$,其中$\mathbf{y} = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2 \in \mathbb{R}^{|V|}$是未归一化的分数(logits),$\mathbf{W}_2 \in \mathbb{R}^{|V| \times h}$。由于词汇表V巨大,计算全连接softmax成本高昂,NNLM通常采用负采样(negative sampling)或分层Softmax(hierarchical softmax)来近似。
NNLM的革命性在于:
- **词向量学习**:通过反向传播,模型在训练过程中自动学习到富含语义信息的词向量。这些向量可以捕捉词与词之间的类比关系(如“国王 - 男人 + 女人 ≈ 女王”),这是n-gram完全不具备的能力。
- **泛化能力**:即使某个特定的n-gram序列未在训练集中出现,只要其组成词的向量相似,模型也能给出非零概率,实现了基于语义的泛化。
然而,NNLM继承了n-gram的固定窗口限制,上下文长度由n-1决定(通常n≤10)。更重要的是,其架构设计导致训练效率低下:
- **输出层归一化瓶颈**:即使使用负采样,每次参数更新仍需处理数百个负样本,而词汇表V巨大,导致计算量主要消耗在输出层。
- **无法有效利用长上下文**:增加n会线性增长连接层的维度,使模型参数量剧增,训练更困难。
- **未解决序列建模的根本问题**:虽然引入了分布式表示,但模型本质上仍是一个**前馈网络**,无法对可变长度序列进行迭代处理,更无法建模序列中词与词之间的复杂时序依赖。
NNLM证明了神经网络在语言建模上的潜力,但其架构本身并未真正解决长程依赖和计算效率的核心矛盾。这一任务落在了循环神经网络(RNN)的肩上。
循环神经网络的兴起:理论上的无限记忆
循环神经网络(Recurrent Neural Network, RNN)通过引入循环连接,为序列建模提供了理论上处理任意长度序列的能力。其核心思想是:在每一步t,RNN不仅接收当前输入$x_t$,还接收上一步的隐藏状态$h_{t-1}$,并输出当前隐藏状态$h_t$和可能的预测$y_t$:
$$h_t = f(W_{xh} x_t + W_{hh} h_{t-1} + b_h)$$
其中$f$通常为tanh或ReLU激活函数。隐藏状态$h_t$可以视为截至当前时刻所有历史信息的压缩表示,理论上可以保留无限久远的记忆。这种时序展开(unfolding)结构使RNN能够处理变长序列,并在每一步共享参数$W_{xh}, W_{hh}$,大大减少了参数量。
RNN在理论上完美契合语言建模的需求:将$h_{t-1}$作为历史上下文,计算$P(w_t | w_{<t}) = \text{softmax}(W_{hy} h_t + b_y)$。然而,在实践中,标准RNN遭遇了严重的梯度消失/爆炸(vanishing/exploding gradient)问题,导致其难以学习长期依赖。
梯度问题的数学根源
通过链式法则,损失函数对参数$W_{hh}$的梯度涉及多个时间步的雅可比矩阵乘积:$\frac{\partial L}{\partial W_{hh}} = \sum_{t} \frac{\partial L}{\partial h_t} \cdot \prod_{k=1}^{t} \frac{\partial h_k}{\partial h_{k-1}}$。其中$\frac{\partial h_k}{\partial h_{k-1}} = \text{diag}(f'(h_{k-1})) W_{hh}$。若$W_{hh}$的特征值绝对值小于1,连乘会导致梯度指数级衰减至0(消失);若大于1,则梯度指数级增长(爆炸)。对于长序列(t很大),梯度几乎必然消失,使模型无法更新早期时间步的参数,从而只能学习短期模式。
LSTM与GRU:门控机制的尝试
1997年提出的长短期记忆网络(Long Short-Term Memory, LSTM)是应对梯度问题的里程碑。LSTM通过精心设计的门控机制和细胞状态(cell state)$c_t$,旨在创建一条贯穿时间步的、梯度几乎恒定的“高速公路”。
LSTM单元包含三个门: 1. 遗忘门(forget gate)$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$:决定从$c_{t-1}$中丢弃哪些信息。 2. 输入门(input gate)$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$:决定哪些新信息存入$c_t$。 3. 输出门(output gate)$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$:决定从$c_t$中输出哪些信息到$h_t$。
细胞状态更新和隐藏状态计算为: $$c_t = f_t \odot c_{t-1} + i_t \odot \tanh(W_c \cdot [h_{t-1}, x_t] + b_c)$$ $$h_t = o_t \odot \tanh(c_t)$$
其中$\odot$表示逐元素乘法。关键在于遗忘门和输入门的乘法操作:若遗忘门接近1,输入门接近0,则$c_t \approx c_{t-1}$,梯度在时间步间几乎无衰减地传播,理论上可保留长期记忆。
门控循环单元(Gated Recurrent Unit, GRU)是LSTM的简化变体,将遗忘门和输入门合并为更新门(update gate)$z_t$,并引入重置门(reset gate)$r_t$,减少了参数,训练更快,但在某些任务上表现与LSTM相当。
LSTM/GRU在诸多序列任务(如文本生成、语音识别)上显著优于标准RNN,perplexity(语言模型评价指标,越低越好)大幅下降。例如,在Penn Treebank数据集上,早期RNN的perplexity可能超过150,而LSTM可降至约100以下。
然而,LSTM/GRU并未彻底解决长程依赖问题:
- **梯度仍可能消失**:虽然细胞状态提供了梯度通路,但输出门$o_t$和tanh的梯度仍可能小于1,长期依赖的梯度仍会衰减。实际中,LSTM对几十步的依赖尚可,但对数百步的依赖仍然困难。
- **门控的饱和问题**:sigmoid门在极端值时梯度接近0,可能导致门控失效。
- **记忆容量有限**:细胞状态是单一向量,其容量有限,难以存储海量历史信息。
- **串行计算不可并行**:这是**最致命的效率瓶颈**。RNN/LSTM的每一步计算依赖于前一步的隐藏状态,必须严格按时间顺序执行,无法利用GPU的并行计算能力。训练一个100步的序列需要100次连续运算,而现代GPU的数千个核心无法同时工作,导致训练速度极慢,成为制约模型规模和数据量的关键因素。
下表对比了各代模型在关键维度上的表现:
| 模型 | 长程依赖能力 | 并行计算能力 | 训练效率 | 表示能力 | |------|-------------|-------------|---------|---------| | n-gram | 无(固定窗口) | 极高(纯计数) | 极高(但存储大) | 离散,无泛化 | | NNLM | 无(固定窗口) | 高(前馈) | 中(输出层瓶颈) | 词向量,有限泛化 | | RNN | 理论上无限,实际短期 | 极低(严格串行) | 低(梯度问题) | 动态隐藏状态 | | LSTM/GRU | 中等(数十步) | 极低(严格串行) | 低(串行+门控) | 门控选择记忆 | | Transformer | 无限(全局) | 极高(完全并行) | 高(自注意力) | 多头注意力,丰富表示 |
预训练词向量的演进:从静态到上下文相关
在序列模型架构演进的同时,词向量表示的获取方式也在经历深刻变革。Word2Vec的提出,使高质量的词向量可以脱离语言模型任务,独立预训练并迁移到下游任务,大幅提升了NLP任务的基线性能。
Word2Vec:高效的静态嵌入
Mikolov等人(2013)提出的Word2Vec包含两种模型:
- **Skip-gram**:给定中心词$w_t$,预测其上下文窗口内的词$w_{t \pm j}$。目标函数为最大化对数似然:$\sum_{t} \sum_{-c \leq j \leq c, j \neq 0} \log P(w_{t+j} | w_t)$。
- **Continuous Bag-of-Words (CBOW)**:给定上下文词,预测中心词。
为了在巨大词汇表上高效训练,Word2Vec引入了两项关键技巧: 1. 负采样(Negative Sampling):将多分类问题转化为二分类(正样本 vs 负采样噪声词),每次更新仅需处理$k$个负样本(如k=5-20),而非整个词汇表。 2. 层次Softmax(Hierarchical Softmax):使用二叉霍夫曼树将输出层计算复杂度从$O(|V|)$降至$O(\log_2 |V|)$。
Word2Vec训练速度快,生成的词向量质量高,在类比任务上表现惊人。然而,其静态性是根本缺陷:每个词在任何上下文中都只有一个固定向量。例如,“银行”在“ river bank”和“ bank account”中应具有不同语义,但Word2Vec只能输出同一个向量,强制模型在下游任务中自行消化这种多义性,增加了学习负担。
ELMo:上下文相关表示的突破
2018年,Peters等人提出的ELMo(Embeddings from Language Models)首次实现了深度上下文的词向量表示。ELMo的核心是使用双向LSTM(Bi-LSTM)语言模型预训练一个深度网络,然后根据输入句子,为每个词提取其所在上下文对应的隐藏层表示,作为该词的动态向量。
具体而言,ELMo同时训练两个方向的语言模型:正向(从左到右)和反向(从右到左)。对于词$w_t$,其ELMo表示是双向所有层隐藏状态的加权和:$\text{ELMo}_t = \gamma \sum_{l=0}^{L} s_l h_{t}^{(l)}$,其中$h_{t}^{(l)}$是第l层在位置t的隐藏状态,$s_l$是可学习的权重,$\gamma$是缩放因子。这种设计允许模型整合不同层的语义信息(底层捕捉语法,高层捕捉语义)。
ELMo在发布时刷新了多项NLP任务(如问答、情感分析)的state-of-the-art,证明了预训练+微调范式的有效性,以及上下文相关表示的巨大价值。然而,ELMo也存在明显局限:
- **双向架构与生成任务不兼容**:训练时使用了双向上下文,但生成任务(如文本生成)是单向的,必须进行修改或近似。
- **LSTM架构的效率瓶颈**:尽管比前代LSTM有所优化,但Bi-LSTM的串行计算本质仍限制了训练和推理速度,难以扩展到超大规模数据和模型。
- **任务特定融合**:ELMo表示需要与下游任务模型结合,且其加权和参数$\gamma, s_l$需针对任务学习,增加了使用复杂度。
ELMo的贡献在于指明了方向:真正的上下文感知表示是提升模型性能的关键。但架构本身的计算效率问题,呼唤着一种既能保持全局依赖建模、又能实现高效并行的新机制。
单向Transformer的启航:GPT-1的范式创新
2018年,OpenAI发布的GPT(Generative Pre-trained Transformer)首次将Transformer架构应用于大规模语言建模,开启了预训练语言模型的新纪元。GPT-1的核心创新是:完全摒弃RNN/LSTM,采用Transformer的解码器(仅含掩码自注意力层)作为核心组件,实现了并行计算与全局依赖建模的统一。
Transformer解码器:掩码自注意力的力量
Transformer原论文(Vaswani et al., 2017)设计了编码器-解码器架构,其中自注意力(self-attention)是核心。自注意力允许序列中任意两个位置直接交互,无论距离多远,一步即可捕获全局依赖。其计算为:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$
其中$Q, K, V$由输入线性变换得到。对于语言建模,必须防止当前位置偷看到未来信息,因此使用掩码(mask):将softmax输入中未来位置的得分设为$-\infty$,确保预测$w_t$仅依赖于$w_{<t}$。GPT-1完全基于这种掩码自注意力层堆叠而成,层间加入前馈神经网络和残差连接。
GPT-1的优势与局限
GPT-1(1.17亿参数)在Zero-Shot迁移设置下,在多个NLP基准上取得显著提升,展示了Transformer架构的强大潜力:
- **并行计算**:自注意力对所有位置对的计算可完全并行,训练速度比LSTM快一个数量级。这使得在更大数据(如BooksCorpus)上训练更大模型成为可能。
- **长程依赖建模
梯度问题的定量审视与LSTM的实证表现
为了深刻理解LSTM/GRU为何未能彻底解决长程依赖问题,我们需要对梯度消失现象进行定量分析。考虑一个简化的RNN,其隐藏状态更新为 $h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t)$。假设权重矩阵 $W_{hh}$ 的特征值均为 $\lambda$,且激活函数 $\tanh$ 的导数最大为1(在0点处)。则梯度