查看全课大纲(第 38 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

从统计机器翻译到神经机器翻译

小象实战讲义 · 自然语言处理

在掌握了句法分析和早期机器翻译的概率模型基础后,我们迎来了机器翻译领域的一次范式革命。本节将作为关键衔接,回顾统计机器翻译(SMT)的核心思想与局限,并系统性地引入神经机器翻译(NMT)的基本框架。我们将看到,从基于短语和语法的复杂统计系统,到端到端的神经网络模型,不仅是技术路径的转变,更是对“翻译”这一任务认知的深化。本节是理解后续注意力机制、Transformer乃至大模型在翻译任务上演进的重要基石。

💡 核心导读

  • 统计机器翻译的遗产:理解基于噪声信道模型和短语对齐的 SMT 如何将翻译分解为翻译模型、语言模型等子问题,并认识其工程复杂性与误差传播的局限。
  • 神经机器翻译的范式:掌握编码器-解码器(Seq2Seq)这一核心架构,理解其如何将源语言句子编码为固定维度的上下文向量,再解码为目标语言序列。
  • 从 RNN 到注意力:初步了解基于 RNN 的 Seq2Seq 模型在处理长序列时的“信息瓶颈”问题,为下一节深入讲解注意力机制做好铺垫。
  • 时代的过渡:明确 SMT 与早期 NMT 各自的优势与挑战,理解为何注意力机制成为 NMT 崛起的关键。

统计机器翻译:基于噪声信道的工程杰作

统计机器翻译将翻译问题形式化为一个噪声信道解码问题:给定一个目标语言(例如英语)句子 ee,我们观察到它经过一个“噪声信道”后变成了源语言(例如中文)句子 ff。我们的任务是找到最可能生成该观测 ff 的原始句子 ee。根据贝叶斯定理: e^=arg⁡max⁡eP(e∣f)=arg⁡max⁡eP(f∣e)P(e)\hat{e} = \arg\max_{e} P(e|f) = \arg\max_{e} P(f|e)P(e) 其中:

  • P(f∣e)P(f|e) 是翻译模型,衡量将目标句子 ee 翻译为源句子 ff 的可能性。它通常通过对齐的双语语料库学习得到。
  • P(e)P(e) 是语言模型,衡量目标句子 ee 本身在目标语言中的流畅度。通常使用 n-gram 语言模型。

IBM 模型系列(Model 1-5)是早期构建翻译模型 P(f∣e)P(f|e) 的奠基性工作(Brown 等,The Mathematics of Statistical Machine Translation: Parameter Estimation,Computational Linguistics, 1993)。它们引入了词对齐(Word Alignment)的概念:对齐是一个从源句位置到目标句位置的映射,每个源语言词恰对应一个目标语言词(或空位 NULL);反过来,一个目标词可以生成多个源词,这种一对多关系要到 Model 3 才由 fertility 显式建模。例如,在句子对 (我 爱 你, I love you) 中,可能的学习对齐是 我-I,爱-love,你-you。

这五个模型不是并列的五种方案,而是一条逐步补短板的演进线:

  • Model 1:只学词汇翻译概率 t(f∣e)t(f|e),对齐在所有长度相容的位置上均匀分布,不区分远近;
  • Model 2:在 Model 1 之上加入非均匀的位置对齐概率,开始偏好位置相近的词互译;
  • Model 3:引入 fertility(一个目标词生成几个源词)与 distortion(调序),一对多与词序第一次被显式建模;
  • Model 4:把调序改写成相对位置描述,更适合刻画整个词组一起移动;
  • Model 5:修补前几代的对齐缺陷,避免把概率质量分给“同一位置被多个词占用”这类不可能的对齐。

这条演进线正是 SMT 从“词对词”走向“短语对短语”的铺垫。

随着发展,更实用的 SMT 系统采用了基于短语的翻译。它不再局限于单词对齐,而是学习短语对(Phrase Pair)的翻译概率。一个短语是连续的词序列。系统首先从词对齐的双语语料中抽取所有一致的短语对,然后为每个短语对 (fˉ,eˉ)( \bar{f}, \bar{e} ) 估计翻译概率 ϕ(fˉ∣eˉ)\phi(\bar{f}|\bar{e}) 和 ϕ(eˉ∣fˉ)\phi(\bar{e}|\bar{f})。解码时,系统将源句子分割成若干短语,为每个短语选择候选翻译,再把这些特征(短语翻译概率、语言模型、调序、词惩罚等)以对数线性模型(log-linear model)加权求和,权重由最小错误率训练(MERT)在开发集上调出;代表系统是 Moses(Koehn 等,2007)。

SMT 解码过程示意图(以短语为例):
源句: [我] [爱] [自然语言处理]
        |     |     |
短语表: (我, I) (爱, love) (自然语言处理, natural language processing)
        |     |     |
候选翻译: I   love   natural language processing
        \          /
语言模型评分 & 调序: -> I love natural language processing.

SMT 是一个典型的分而治之的工程系统,每个组件(分词器、对齐工具、翻译模型、语言模型、调序模型、解码器)都可以独立优化。它的优势在于可解释性强,能有效利用大量单语数据(训练语言模型)和双语词典。然而,其缺点也非常明显:

  1. 误差传播:流水线中上游组件的错误会直接影响下游。
  2. 特征工程复杂:需要精心设计多个子模型和特征函数,并调整其权重。
  3. 泛化能力有限:系统严重依赖于从平行语料中观察到的短语对,对于未登录词或复杂句式处理能力弱。
  4. 上下文建模不足:n-gram 语言模型只能捕捉局部依赖,翻译决策缺乏对句子整体语义的把握。

神经机器翻译:端到端的语义学习

神经机器翻译旨在用一个单一的、大型的神经网络模型,直接学习从源语言序列到目标语言序列的映射 P(e∣f)P(e|f),实现端到端的训练。其核心思想是编码器-解码器(Encoder-Decoder)架构,也称为序列到序列(Seq2Seq)模型。

编码器-解码器(Seq2Seq)框架

  1. 编码器:读取整个源语言句子 f=(f1,f2,...,fT)f = (f_1, f_2, ..., f_T),并将其编码成一个固定维度的上下文向量(Context Vector)cc。这个向量旨在捕获源句子的全部语义信息。
  2. 解码器:以一个特殊的开始符号 <sos> 和上下文向量 cc 作为初始输入,逐步生成目标语言序列 e=(e1,e2,...,eT)e = (e_1, e_2, ..., e_{T}),直到生成结束符号 <eos>。在每一步 ii,解码器根据当前状态、上一步生成的词以及上下文向量 cc,预测下一个词的概率分布 P(ei∣e<i,c)P(e_i | e_{<i}, c)。

基于 RNN 的 Seq2Seq

最初的 NMT 使用循环神经网络(RNN),特别是长短期记忆网络(LSTM)或门控循环单元(GRU)作为编码器和解码器的基础单元。这一架构由两组工作几乎同时提出:Sutskever 等(NIPS 2014)用多层 LSTM 实现序列到序列学习,Cho 等(EMNLP 2014)提出 RNN Encoder–Decoder 并引入 GRU。

  • 编码器(RNN):逐个处理源语言词 ftf_t 的嵌入向量,最后一个时间步的隐藏状态 hTh_T 被用作上下文向量 cc。
    源句: f1   f2   f3   ...   fT
           ↓    ↓    ↓         ↓
          RNN → RNN → RNN ... → RNN
                               |
                               c = h_T
  • 解码器(RNN):在训练时,使用教师强制(Teacher Forcing),即将真实的目标序列词作为上一步输入。第一步的隐藏状态初始化为 cc,输入为 <sos>。
    解码步骤:
    初始: s0 = c, 输入 = <sos>
    第1步: s1 = RNN(s0, emb(<sos>)), 输出概率 P(e1|...)
    第2步: s2 = RNN(s1, emb(e1_true)), 输出概率 P(e2|...)
    ...
    损失函数是每一步预测词与真实词之间的交叉熵损失之和。

下面用 numpy 跑一个极简的 RNN 编码器,把不同长度的句子压成同一个固定维度的上下文向量——这正是后面“信息瓶颈”说法的来源。

import numpy as np

# 隐藏维度固定为 4,与句子长度无关
HIDDEN = 4
VOCAB = 10
np.random.seed(42)

embed = np.random.randn(VOCAB, HIDDEN) * 0.1   # 词嵌入
W_xh = np.random.randn(HIDDEN, HIDDEN) * 0.1   # 输入到隐藏
W_hh = np.random.randn(HIDDEN, HIDDEN) * 0.1   # 隐藏到隐藏

def encode(seq):
    """逐词读入,返回最后一个时间步的隐藏状态 c"""
    h = np.zeros(HIDDEN)
    for w in seq:
        h = np.tanh(W_xh @ embed[w] + W_hh @ h)
    return h

for name, seq in [("短句(3词)", [1, 2, 3]), ("长句(8词)", [1, 2, 3, 4, 5, 6, 7, 8])]:
    c = encode(seq)
    print(f"{name} -> 上下文向量维度 {c.shape[0]},前两维 {c[:2].round(4)}")
短句(3词) -> 上下文向量维度 4,前两维 [0.0019 0.013 ]
长句(8词) -> 上下文向量维度 4,前两维 [ 0.0015 -0.0098]

两个长度差近三倍的句子,最终都只剩同样 4 个数。这个演示只说明一件事:输入长度在变,上下文向量的维度不变——源句的全部信息都必须挤进这个固定槽位。它并没有测量“保留了多少信息”,所以不能据此推断句子越长就丢得越多。能确定的是:当长句的细节超出这个向量的容量、又超出训练时见过的句长分布,解码器就拿不到足够信息,翻译质量随之下降——这正是后面要讲的信息瓶颈。

RNN Seq2Seq 的瓶颈与注意力的萌芽

基于 RNN 的 Seq2Seq 模型存在一个根本性缺陷:信息瓶颈。编码器必须将整个源句子的信息压缩到一个固定维度的上下文向量 cc 中。对于长句子,这个向量很难保留所有细节,导致解码器在生成后续词时信息不足,翻译质量下降。

此外,解码器在生成每一个目标词时,都使用同一个上下文向量 cc。这意味着无论当前要生成什么词,模型所依赖的源句子信息是静态的、全局的。这显然不符合翻译的直觉:翻译当前词时,我们通常只重点关注源句子中的某一部分(例如当前短语)。

注意力机制(Attention Mechanism)正是为了解决这个问题而被引入(Bahdanau 等,ICLR 2015)。其核心思想是:在解码器的每一步 ii,动态地计算一个新的上下文向量 cic_i。cic_i 是编码器所有时间步隐藏状态的加权和,权重 αij\alpha_{ij}(注意力分数)表示在生成第 ii 个目标词时,对源句子第 jj 个词的关注程度。这样,模型在生成每个词时都能“回顾”整个源序列,并聚焦于最相关的部分。

ci=∑j=1Tαijhj,αij=exp⁡(eij)∑k=1Texp⁡(eik)c_i = \sum_{j=1}^{T} \alpha_{ij} h_j, \quad \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T} \exp(e_{ik})} 其中 eije_{ij} 是一个对齐模型,用于评估解码器状态 si−1s_{i-1} 与编码器状态 hjh_j 之间的匹配程度,例如 eij=vTtanh⁡(W1hj+W2si−1)e_{ij} = v^T \tanh(W_1 h_j + W_2 s_{i-1})。

注意力机制极大地提升了早期 NMT 的长句翻译质量,并使得对齐信息得以可视化,增加了模型的可解释性,为后续 NMT 成为主流奠定了基础;但 Bahdanau 2015 本身并未证明 NMT 已全面超越 SMT,NMT 的广泛主流地位是在 Transformer、大规模语料与算力等后续条件下形成的。

SMT 与 NMT 的对比与演进

特性统计机器翻译 (SMT)神经机器翻译 (NMT)
核心思想噪声信道模型,贝叶斯分解端到端序列到序列学习
模型结构模块化流水线(翻译模型、语言模型等)单一神经网络(编码器-解码器)
数据利用需要词/短语对齐的双语语料;可大量利用单语语料直接需要句子对齐的双语语料;单语语料利用早期较难
特征工程重度依赖,需要设计多个子模型和特征轻度依赖,神经网络自动学习特征表示
上下文建模局部(n-gram),缺乏长程依赖全局(通过RNN/注意力),能捕捉长程语义
泛化能力对未登录短语/句式弱较强,能生成未在训练中出现的合理词序
可解释性较强(词对齐、短语表可查看)较弱,但注意力图提供部分对齐可视化
工程复杂度高,组件多,调参复杂相对低,模型统一,训练端到端

从 SMT 到 NMT 的过渡并非一蹴而就。早期 NMT 在资源丰富的语种上迅速展现优势,但在低资源场景下,SMT 因其能更好地利用单语数据和词典先验,仍有一定竞争力。此外,将 SMT 的领域知识(如术语表)融入 NMT 系统,也是研究的一个方向。然而,随着注意力机制的完善、Transformer 架构的出现以及大规模预训练模型的普及,NMT 已成为绝对的主流,SMT 则主要存在于特定历史系统或作为某些混合系统的组件。

📝 动手练一练

  1. 概念辨析:在基于 RNN 的 Seq2Seq 机器翻译模型中,编码器最后一个隐藏状态作为上下文向量 cc。请简要分析这种设计在处理长句子时可能遇到的主要问题是什么?注意力机制是如何从原理上解决这个问题的?
👉 点击查看参考答案

主要问题:信息瓶颈。编码器需要将整个源句子的所有信息压缩到一个固定维度的向量 cc 中。对于长句子,尤其是包含复杂结构或大量信息的句子,cc 的容量可能不足以无损地编码所有必要信息,导致信息丢失。解码器在生成目标序列时,只能基于这个可能已失真的、全局的摘要向量,因此长句翻译质量会下降。

注意力机制的解决原理:注意力机制允许解码器在生成每一个目标词时,动态地访问编码器的所有隐藏状态,而不仅仅是最后的 cc。具体来说,解码器在每一步 ii 会计算一个注意力分布 αij\alpha_{ij},该分布表示当前生成步骤应对源句子中第 jj 个词赋予多少“注意力”。然后,用这个分布对编码器所有隐藏状态进行加权求和,得到一个与当前生成步骤强相关的、动态的上下文向量 cic_i。这样,模型就不再依赖于一个固定的信息瓶颈,而是可以根据需要,在生成不同目标词时灵活地聚焦于源句子的不同部分。

  1. 手算理解:假设一个极简的编码器-解码器模型,源句子长度为3,编码器隐藏状态分别为 h1=[1,0]h_1 = [1, 0], h2=[0,1]h_2 = [0, 1], h3=[1,1]h_3 = [1, 1]。在解码的某一步,计算出的对齐分数(未归一化)为 e=[2,1,0]e = [2, 1, 0]。请计算此步骤的注意力分布 α\alpha 和最终的上下文向量 cc。
👉 点击查看参考答案

首先,使用 softmax 函数对对齐分数 ee 进行归一化,得到注意力分布 α\alpha:

softmax(ei)=exp⁡(ei)∑jexp⁡(ej)\text{softmax}(e_i) = \frac{\exp(e_i)}{\sum_{j} \exp(e_j)}

计算:

  • exp⁡(2)≈7.389\exp(2) \approx 7.389
  • exp⁡(1)≈2.718\exp(1) \approx 2.718
  • exp⁡(0)=1\exp(0) = 1
  • 分母和:7.389+2.718+1=11.1077.389 + 2.718 + 1 = 11.107

因此:

  • α1=7.389/11.107≈0.665\alpha_1 = 7.389 / 11.107 \approx 0.665
  • α2=2.718/11.107≈0.245\alpha_2 = 2.718 / 11.107 \approx 0.245
  • α3=1/11.107≈0.090\alpha_3 = 1 / 11.107 \approx 0.090

所以注意力分布 α≈[0.665,0.245,0.090]\alpha \approx [0.665, 0.245, 0.090]。

接着,计算上下文向量 cc 作为编码器隐藏状态的加权和: c=∑j=13αjhj=0.665∗[1,0]+0.245∗[0,1]+0.090∗[1,1]c = \sum_{j=1}^{3} \alpha_j h_j = 0.665 * [1, 0] + 0.245 * [0, 1] + 0.090 * [1, 1] c=[0.665∗1+0.245∗0+0.090∗1,0.665∗0+0.245∗1+0.090∗1]c = [0.665*1 + 0.245*0 + 0.090*1, \quad 0.665*0 + 0.245*1 + 0.090*1] c=[0.665+0+0.090,0+0.245+0.090]=[0.755,0.335]c = [0.665 + 0 + 0.090, \quad 0 + 0.245 + 0.090] = [0.755, 0.335]

因此,该解码步骤的上下文向量 c≈[0.755,0.335]c \approx [0.755, 0.335]。可以看到,由于 h1h_1 的注意力权重最高,cc 的值更接近 h1h_1。

本章小结

本节我们完成了从统计机器翻译到神经机器翻译的关键跨越。我们回顾了 SMT 基于噪声信道和短语的经典框架,认识到其分治策略的工程成就与固有局限。随后,我们深入探讨了 NMT 的基石——编码器-解码器(Seq2Seq)架构,理解了其如何用单一的神经网络实现端到端的翻译。我们特别指出了早期基于 RNN 的 Seq2Seq 模型存在的“信息瓶颈”问题,这自然引出了下一节的核心:注意力机制。注意力机制通过让解码器动态地聚焦于源句子的不同部分,不仅显著提升了翻译质量,尤其是对长句的处理,也为模型提供了一定的可解释性。

📋 行动清单

  • 理清脉络:尝试用自己的话简述 SMT 的“分治”思想与 NMT 的“端到端”思想最根本的区别在哪里。
  • 理解瓶颈:明确为什么一个固定的上下文向量 cc 会成为 RNN Seq2Seq 处理长文本的瓶颈。
  • 预习衔接:基于对“信息瓶颈”的理解,预习下一节注意力机制,思考它是如何让上下文向量“动”起来的。

—— 小象教研组