原文:Speech and Language Processing (3rd ed. draft)
当前译文基于 Draft of August 24, 2025。
译文仅供学习参考,请勿转载或用于商业用途。
原书作者:
- Daniel Jurafsky,哈佛大学
- James H. Martin,科罗拉多大学博尔德分校
原文:Speech and Language Processing (3rd ed. draft)
当前译文基于 Draft of August 24, 2025。
译文仅供学习参考,请勿转载或用于商业用途。
原书作者:
在实践中,当任务所需的信息远离当前处理位置时,RNN 很难训练。 尽管 RNN 理论上可以访问整个先前序列,但其隐藏状态中编码的信息往往具有较强的局部性,更侧重于输入序列最近的部分以及最近的决策。 然而,在许多语言任务中,远距离信息至关重要。 考虑以下语言建模中的例子: (13.19) The flights the airline was canceling were full. 在 airline 之后预测 was 是相对直接的,因为 airline 提供了很强的局部上下文,支持单数主谓一致。 但要为 were 分配合适的概率则非常困难:不仅因为复数主语 flights 距离较远,还因为在中间上下文中出现了更近的单数名词 airline。 理想情况下,网络应能在处理中间部分的同时,将关于复数 flights 的远距离信息保留到需要时再使用。 RNN 难以传递关键的远距离信息,一个原因是隐藏层(以及决定隐藏层值的权重)被要求同时完成两项任务:一是为当前决策提供有用信息,二是更新并向前传递未来决策所需的信息。 训练 RNN 的另一个困难源于随时间反向传播(backpropagation through time, BPTT)错误信号的需求。 回顾第 13.1.2 节,时刻 $t$ 的隐藏层会参与下一时刻损失的计算,因此对总损失有贡献。 结果是在训练的反向传播过程中,梯度需沿着时间步反复相乘,乘积次数由序列长度决定。 这一过程常常导致梯度逐渐趋近于零,即所谓的梯度消失(vanishing gradients)问题。 为解决这些问题,研究者设计了更复杂的网络架构,明确地管理如何在时间上维持相关上下文:让网络能够学会遗忘不再需要的信息,并记住未来决策所需的信息。 其中最广泛使用的 RNN 扩展是长短期记忆网络(Long Short-Term Memory, LSTM)(Hochreiter 和 Schmidhuber, 1997)。 LSTM 将上下文管理问题分解为两个子问题:从上下文中移除不再需要的信息;添加可能对未来决策有用的信息。 解决这两个问题的关键在于让网络学习如何管理上下文,而不是在架构中硬编码某种策略。 LSTM 通过以下方式实现这一点:首先,在原有循环隐藏层之外,显式引入一个额外的“上下文”层;其次,使用特殊的神经单元结构,通过门控机制(gates)来控制信息流入和流出这些单元。 这些门由额外的可学习权重实现,它们依次作用于当前输入、前一时刻的隐藏状态以及前一时刻的上下文。 LSTM 中的各个门控机制遵循一种通用的设计模式:每个门都由一个前馈层、一个 sigmoid 激活函数,以及与被门控层进行逐元素相乘(pointwise multiplication)三部分组成。 之所以选择 sigmoid 作为激活函数,是因为它的输出倾向于趋近于 0 或 1。 将 sigmoid 输出与被门控层进行逐元素相乘的效果,类似于应用了一个二值掩码(binary mask)。 掩码中接近 1 的位置所对应的被门控层信息几乎原样保留;而对应掩码值较低的位置则基本被“抹除”。 ...
循环神经网络具有很强的灵活性。 通过将展开后的计算图的前馈特性与向量作为通用输入/输出相结合,复杂的网络可以被视作模块,并以富有创意的方式进行组合。 本节将介绍在自然语言处理中使用 RNN 时两种更为常见的网络架构。 13.4.1 堆叠式 RNN(Stacked RNNs) 到目前为止,我们所举的例子中,RNN 的输入都是词或字符嵌入(即向量)组成的序列,输出则是可用于预测词、标签或序列类别标签的向量。 然而,我们完全可以将一个 RNN 输出的整个序列,作为另一个 RNN 的输入序列。 堆叠式 RNN(Stacked RNNs)正是由多个 RNN 层组成,其中某一层的输出作为下一层的输入,如图 13.10 所示。 图 13.10 堆叠式循环网络。较低层的输出作为更高层的输入,最后一层网络的输出即为最终输出。 堆叠式 RNN 通常优于单层网络。 其成功的一个原因似乎是:网络在不同层上学习到了不同抽象层次的表示。 正如人类视觉系统早期阶段检测边缘,再利用这些边缘识别更大的区域和形状一样,堆叠网络的底层可以学习到一些基础表示,这些表示可作为更高层的有效抽象——而这些抽象可能很难在单一 RNN 中直接学到。 堆叠 RNN 的最佳层数因具体任务和训练数据而异。 然而,随着堆叠层数的增加,训练成本会迅速上升。 13.4.2 双向 RNN(Bidirectional RNNs) 标准的 RNN 在时刻 $t$ 进行预测时,仅利用左侧(即之前)的上下文信息。 但在许多应用场景中,我们可以访问整个输入序列;此时,我们希望也能利用当前时刻 $t$ 右侧(即后续)的上下文信息。 一种实现方式是运行两个独立的 RNN:一个从左到右处理序列,另一个从右到左处理序列,然后将它们的表示拼接起来。 在前文讨论的从左到右的 RNN 中,时刻 $t$ 的隐藏状态代表了网络到该时刻为止对序列所掌握的全部信息。 该状态是输入 $\mathbf{x}_1, \dots, \mathbf{x}_t$ 的函数,表示当前时刻左侧的上下文: $$ \mathbf{h}^f_t = \text{RNN}_{\text{forward}}(\mathbf{x}_1, \dots, \mathbf{x}_t) \tag{13.16} $$这里的符号 $\mathbf{h}^f_t$ 仅表示时刻 $t$ 常规的前向隐藏状态,即网络从序列开头到当前时刻所“学到”的全部信息。 ...
在了解了基本的 RNN 架构之后,我们来看如何将其应用于三类自然语言处理任务:序列分类(sequence classification)任务,如情感分析和主题分类;序列标注(sequence labeling)任务,如词性标注;文本生成(text generation)任务,包括一种称为编码器-解码器(encoder-decoder)的架构。 13.3.1 序列标注 在序列标注任务中,网络的目标是为输入序列中的每个元素分配一个标签,该标签来自一个小型且固定的标签集合。 一个经典的序列标注任务是词性标注(part-of-speech tagging, POS),即为句子中的每个词赋予语法标签,如 NOUN(名词)或 VERB(动词)。 我们将在第 17 章详细讨论词性标注,但这里先给出一个示例说明。 在基于 RNN 的序列标注方法中,输入是词嵌入,输出则是通过 softmax 层在给定标签集上生成的标签概率分布,如图 13.7 所示。 图 13.7 使用简单 RNN 进行词性标注的序列标注任务。 词性标注的目标是为句子中的每个词分配一个语法标签,这些标签来自一个预定义的标签集。 (本句中的标签包括 NNP(专有名词)、MD(情态动词)等;我们将在第 17 章完整描述词性标注任务。) 预训练词嵌入作为输入,每个时间步通过 softmax 层输出词性标签的概率分布。 在该图中,每个时间步的输入是与输入词元对应的预训练词嵌入。 RNN 模块是一个抽象表示,代表一个按时间展开的简单循环网络:每个时间步包含输入层、隐藏层和输出层,并共享权重矩阵 $\mathbf{U}$、$\mathbf{V}$ 和 $\mathbf{W}$。 网络在每个时间步的输出是由 softmax 层生成的词性标签集上的概率分布。 要为给定输入生成标签序列,我们对输入序列执行前向推理,并在每个时间步选择 softmax 输出中概率最高的标签。 由于我们在每个时间步都使用 softmax 层来生成输出标签集上的概率分布,因此训练时依然采用交叉熵损失函数。 13.3.2 RNN 用于序列分类 RNN 的另一种用途是对整个序列进行分类,而不是对序列中的各个词元分别打标签。 这类任务通常称为文本分类(text classification),例如情感分析或垃圾邮件检测——这些任务将一段文本分为两类或三类(如正面或负面);也包括具有大量类别的情况,例如文档级主题分类,或客服场景中的消息路由。 在此类任务中应用 RNN 的方法如下:我们将待分类的文本逐词输入 RNN,每个时间步生成一个新的隐藏层表示。 然后,我们可以取文本最后一个词对应的隐藏状态 $\mathbf{h}_n$,作为整个序列的压缩表示。 接着,将该表示 $\mathbf{h}_n$ 输入一个前馈网络,由该网络通过 softmax 在所有可能类别上选择最终类别。 图 13.8 展示了这一方法。 ...
现在我们来看如何将 RNN 应用于语言建模任务。 回顾第 3 章的内容,语言模型的目标是:给定前面的上下文,预测序列中的下一个词。 例如,如果前面的上下文是 “Thanks for all the”,我们想知道下一个词是 “fish” 的可能性有多大,就需要计算: $$ P(\text{fish} \mid \text{Thanks for all the}) $$语言模型能够为词汇表中每一个可能的下一个词分配这样一个条件概率,从而得到一个完整的概率分布。 我们还可以利用链式法则,将这些条件概率组合起来,为整个词序列分配概率: $$ P(w_{1:n}) = \prod_{i=1}^{n} P(w_i \mid w_{< i}) $$第 3 章介绍的 n-gram 语言模型通过统计目标词与前 $n-1$ 个词共同出现的频次来计算概率。 因此,其上下文长度固定为 $n-1$。 而第 6 章中的前馈神经语言模型则使用一个固定大小的滑动窗口作为上下文。 RNN 语言模型(Mikolov 等,2010)逐词处理输入序列,试图根据当前词和前一时刻的隐藏状态来预测下一个词。 因此,RNN 既没有 n-gram 模型的有限上下文问题,也没有前馈语言模型的固定上下文限制。因为原则上,隐藏状态可以编码从序列开头一直到当前时刻的所有历史信息。 图 13.5 示意了前馈神经网络(FFN)语言模型与 RNN 语言模型之间的这一关键区别: RNN 语言模型使用前一时刻的隐藏状态 $\mathbf{h}_{t-1}$ 作为过去上下文的表示。 图 13.5 两种语言模型架构在文本上移动的简化示意图,展示了长度为三个词元的示意上下文: (a) 前馈神经语言模型,上下文是固定长度的,作为输入提供给权重矩阵 $\mathbf{W}$; (b) RNN 语言模型,其中隐藏状态 $\mathbf{h}_{t-1}$ 对先前上下文进行了总结。 ...
对于某些语言(尤其是英语),在线资源非常丰富。 存在大量包含英语与其他语言互译的平行语料库。 然而,世界上绝大多数语言并没有充足的平行训练文本可用。 如何在资源匮乏的语言上实现高质量翻译,是当前一个重要的持续研究课题。 即使对于高资源语言,当我们需要将其翻译到低资源领域(例如某个恰好缺乏双语语料的特定文体或专业领域)时,也会面临类似的资源短缺问题。 在此,我们简要介绍两种应对数据稀疏性的常用方法:回译(backtranslation)——这是通用统计技术数据增强(data augmentation)的一种特例;以及多语言模型(multilingual models)。此外,我们还将讨论一些相关的社会技术问题。 12.5.1 数据增强 数据增强是一种用于缓解训练数据不足的统计技术,其核心思想是从现有的自然数据出发,生成新的合成数据以扩充训练集。 在机器翻译中,最常用的数据增强技术称为回译(backtranslation)。 回译的核心思想是,尽管特定语言对或特定领域的平行语料可能十分有限,但我们通常能找到规模更大(或至少相对更多)的单语语料(monolingual corpus),可用于补充现有的小型平行语料。 该方法利用目标语言的单语语料来构建合成的双语句对(bitext)。 在回译中,我们的目标是提升从源语言到目标语言的翻译性能。假设我们拥有少量源语言–目标语言的平行语料(即双语句对),以及一些目标语言的单语数据。 首先,我们利用这少量平行语料训练一个反向的机器翻译系统——即从目标语言到源语言的翻译模型。 接着,我们用这个反向模型将目标语言的单语数据翻译成源语言。 这样,我们就得到了一组合成的双语句对(天然的目标语言句子 + 由机器翻译生成的源语言句子),可将其加入原始训练数据中,重新训练我们的源→目标翻译模型。 例如,假设我们希望将纳瓦霍语(Navajo)翻译成英语,但仅有少量纳瓦霍语–英语平行语料;不过,我们可以轻松获取大量英语单语数据。 此时,我们先用那少量平行语料训练一个英语→纳瓦霍语的翻译引擎,再用它将英语单语文本翻译成纳瓦霍语。 由此生成的合成纳瓦霍语/英语双语句对即可加入训练集,用于改进最终的纳瓦霍语→英语翻译系统。 回译涉及若干可调参数。其一是如何生成回译数据:可以使用贪心解码、束搜索,也可以采用采样方法(如第 8 章介绍的温度采样)。 其二是回译数据与原始平行语料的比例:我们可以选择对原始平行句对进行上采样(即多次重复使用同一句对)。 总体而言,回译的效果出人意料地好;有研究估计,使用回译数据训练的系统所能获得的性能提升,大约相当于使用同等数量真实平行语料所能获得提升的三分之二(Edunov et al., 2018)。 12.5.2 多语言模型 到目前为止,我们所描述的模型都是用于双语翻译:一种源语言,一种目标语言。但也可以构建多语言翻译器(multilingual translator)。 在多语言翻译器中,我们通过提供多种不同语言对的平行句对来训练系统。 这意味着我们必须明确告诉系统从哪种语言翻译、翻译成哪种语言! 我们通过在编码器输入中添加一个特殊的源语言标识符 \(l_s\) 来指明当前翻译的源语言,并在解码器端添加一个特殊的目标语言标识符 \(l_t\) 来指定期望的输出语言。 因此,我们可以对前文的公式 (12.9) 稍作修改,在公式 (12.18)–(12.19) 中加入这些语言标识符: $$ \begin{align*} \mathbf{h} &= \text{encoder}(x, l_s) \tag{12.18} \\ y_{i+1} &= \text{decoder}(\mathbf{h}, l_t, y_1, \dots, y_i) \quad \forall i \in [1, \dots, m] \tag{12.19} \end{align*} $$多语言模型的一大优势在于,它可以通过利用训练数据中资源更丰富的相似语言的信息,来提升低资源语言的翻译质量。 例如,我们可能不知道加利西亚语(Galician)中某个词的确切含义,但如果该词在资源更丰富且语言相近的西班牙语中出现过,模型就可能借助这种跨语言共享的知识进行更准确的翻译。 ...
循环神经网络(RNN)是指网络连接中包含循环结构的任何网络。这意味着,某些单元的值会直接或间接地依赖于自身先前输出的结果作为输入。 这类网络虽然功能强大,但难以分析和训练。 然而,在循环网络这一大类中,存在一些受约束的架构。这些架构在处理语言任务时已被证明极为有效。 本节将讨论一类被称为Elman 网络(Elman, 1990)或简单循环网络的循环网络。 这类网络本身具有实用价值,同时也是更复杂方法的基础,例如本章后面将讨论的长短期记忆(LSTM)网络。 在本章中,当我们使用术语 RNN 时,特指这些结构更简单、约束更强的网络。(不过需要注意,在其他场合,“RNN”一词常被泛指任何具有循环特性的网络,包括 LSTM。) 图 13.1 Elman(1990)提出的简单循环神经网络。 隐藏层的输入中包含一个循环连接。 也就是说,隐藏层的激活值既取决于当前输入,也取决于前一时刻隐藏层的激活值。 图 13.1 展示了 RNN 的结构。 与普通前馈网络类似,代表当前输入的向量 $\mathbf{x}_t$ 会先与一个权重矩阵相乘,再通过一个非线性激活函数,从而计算出隐藏单元层的值。 随后,该隐藏层用于计算对应的输出 $\mathbf{y}_t$。 与之前基于窗口的方法不同,RNN 按顺序逐个处理序列中的元素。 我们用下标表示时间,因此 $\mathbf{x}_t$ 表示时刻 $t$ 的输入向量。 与前馈网络的关键区别在于图中虚线所示的循环连接。 该连接将前一时刻隐藏层的值作为额外输入,加入到当前隐藏层的计算中。 前一时刻的隐藏层提供了一种记忆或上下文机制,它编码了之前的处理信息,并用于指导后续时刻的决策。 重要的是,这种方法对先前上下文的长度没有固定限制。前一隐藏层所包含的上下文信息,理论上可以回溯到序列的起始位置。 引入时间维度后,RNN 看似比非循环架构更复杂。 但实际上,两者差别并不大。 给定当前输入向量和前一时刻隐藏层的值,我们仍然执行第 6 章介绍的标准前馈计算。 为了说明这一点,请参考图 13.2。该图清晰地展示了循环的本质,以及它如何参与隐藏层的计算。 最重要的变化在于新增了一组权重 $\mathbf{U}$。这组权重从前一时刻的隐藏层连接到当前时刻的隐藏层。 它们决定了网络在计算当前输出时如何利用过去上下文的信息。 与网络中的其他权重一样,这些连接也通过反向传播进行训练。 图 13.2 将简单循环神经网络表示为前馈网络的形式。 前一时刻的隐藏层 $\mathbf{h}_{t-1}$ 与权重矩阵 $\mathbf{U}$ 相乘,然后加到当前时刻的前馈部分上。 13.1.1 RNN 中的推理 RNN 中的前向推理(将输入序列映射为输出序列)与我们之前在前馈网络中看到的过程几乎完全相同。 要为输入 $\mathbf{x_t}$ 计算输出 $\mathbf{y_t}$,我们需要当前时刻隐藏层的激活值 $\mathbf{h}_t$。 为此,我们将输入 $\mathbf{x_t}$ 与权重矩阵 $\mathbf{W}$ 相乘,同时将前一时刻的隐藏层 $\mathbf{h}_{t-1}$ 与权重矩阵 $\mathbf{U}$ 相乘。 接着,将这两个结果相加,并通过一个合适的激活函数 $g$,得到当前隐藏层的激活值 $\mathbf{h}_t$。 一旦获得隐藏层的值,就可以像常规方法一样计算输出向量。 ...
机器翻译引发了我们在前几章中讨论过的许多相同伦理问题。 例如,考虑从匈牙利语(使用性别中立的代词 ő)或西班牙语(常常省略代词)翻译成英语(代词为语法强制项,且具有语法性别)的情况。 当源文中提到某个人但未指明性别时,机器翻译系统往往会默认使用男性代词(Schiebinger, 2014;Prates et al., 2019)。 此外,MT 系统还常常依据我们在第 5.8 节中看到的那种文化刻板印象来分配性别。 图 12.12 展示了 Prates et al.(2019)的研究案例:匈牙利语中 ő is a nurse 的 ő 是性别中立的,英语翻译为 she,在 ő is a CEO 中同样是中立的,却被译为 he。 Prates 等人发现,这些偏见无法完全用美国劳动力中的性别统计数据解释,因为 MT 系统实际上放大了这些偏见——其将中性代词映射为男性或女性的概率,高于仅基于实际就业统计数据所应得出的概率。 匈牙利语(性别中立)原文 英语机器翻译输出 ő egy ápoló she is a nurse ő egy tudós he is a scientist ő egy mérnök he is an engineer ő egy pék he is a baker ő egy tanár she is a teacher ő egy esküvőszervező she is a wedding organizer ő egy vezérigazgató he is a CEO 图 12.12 当从匈牙利语等性别中立语言翻译成英语时,当前的 MT 系统会将传统上由男性主导职业的人解读为男性,而将传统上由女性主导职业的人解读为女性(Prates et al., 2019)。 ...
翻译质量通常从两个维度进行评估: 充分性(adequacy):译文在多大程度上准确传达了源句的完整含义。有时也称为忠实度(faithfulness)或保真度(fidelity)。 流畅度(fluency):译文在目标语言中是否流畅(是否符合语法、清晰、可读、自然)。 使用人工评估最为准确,但出于便利性考虑,自动评估指标也被广泛采用。 12.6.1 使用人工评分者评估机器翻译 最准确的评估方法是依靠人工评分者(例如在线众包工作者)对每条译文从上述两个维度进行打分。 例如,在流畅度维度上,我们可以询问评分者:机器翻译输出(即目标文本)在多大程度上是可理解的、清晰的、易读的或自然的。 我们可以提供一个评分量表,比如从 1(完全不可理解)到 5(完全可理解),或从 1 到 100,要求评分者对每句或每段译文进行打分。 同样地,我们也可以用类似方式评估第二个维度——充分性。 如果评分者具备双语能力,我们可以同时向其展示源句和机器生成的译文,并请他们在 5 分制或 100 分制量表上评估:源句中的信息有多少被保留在了译文中。 如果只有单语评分者,但手头有高质量的人工参考译文,那么我们可以将参考译文与机器译文一并交给他们,让他们评估两者在信息保留方面的相似程度。 另一种做法是进行排序(ranking):向评分者提供一对候选译文,让他们选择更优的一个。 对人工评分者(通常是在线众包人员)进行培训至关重要。 缺乏翻译经验的评分者往往难以区分流畅度与充分性,因此培训内容通常包括精心设计的示例,明确区分这两个概念。 此外,评分者之间常常存在分歧——源句本身可能存在歧义,评分者的背景知识不同,或对评分尺度的理解不一致。 因此,通常会剔除异常评分者,并且(如果使用了足够细粒度的评分尺度)对每位评分者的打分进行标准化处理:将其每个分数减去该评分者自身的平均分,再除以其评分的标准差。 如前所述,使用人工评分者的另一种方式是让他们对译文进行译后编辑(post-editing):即在机器翻译输出的基础上进行最小限度的修改,直到他们认为该译文已正确表达了原意。 随后,可通过比较译后编辑结果与原始机器译文之间的差异来衡量翻译质量。 12.6.2 自动评估 尽管人类对机器翻译输出的评估最为可靠,但人工评估往往耗时且成本高昂。 因此,自动评估指标常被用作临时替代方案。 虽然自动指标的准确性低于人工评估,但它们有助于快速测试系统改进的效果,甚至可作为训练过程中的自动损失函数。 本节将介绍两类主流自动评估指标:基于字符或词重叠的指标,以及基于嵌入相似度的指标。 基于字符重叠的自动评估:chrF 机器翻译评估中最简单且最健壮的指标之一是 chrF(character F-score,字符 F 分数)(Popović, 2015)。 chrF(以及许多早期相关指标,如 BLEU、METEOR、TER 等)基于 Miller 和 Beebe-Center(1956)开创性工作中的一个朴素思想:好的机器翻译结果往往会包含与人工译文相同的字符和词语。 考虑一个来自平行语料库的测试集,其中每个源句都配有一条人工参考译文(gold human translation)和一条待评估的机器翻译候选译文。 chrF 指标通过计算候选译文与参考译文之间字符 n-gram 的重叠程度,为每条机器翻译结果打分。 给定一个假设译文(hypothesis)和一条参考译文(reference),chrF 接受一个参数 $k$,表示要考虑的字符 n-gram 的最大长度,并分别计算前 $k$ 种 n-gram(从 1-gram 到 k-gram)的平均精确率(precision)和平均召回率(recall): chrP:假设译文中字符 1-gram、2-gram、…、k-gram 出现在参考译文中的比例的平均值; chrR:参考译文中字符 1-gram、2-gram、…、k-gram 出现在假设译文中的比例的平均值。 随后,chrF 使用加权 F 分数结合 chrP 和 chrR,权重由参数 $\beta$ 控制。 通常设 $\beta = 2$,即召回率的权重是精确率的两倍: ...
回顾第 8 章介绍的贪心解码(greedy decoding)算法:在生成过程的每个时间步 $t$,输出 $y_t$ 通过计算词汇表中每个词的概率并选择概率最高的词(即取 argmax)来确定: $$ \hat{w}_t = \text{argmax}_{w \in V} \, P(w \mid \mathbf{w}_{< t}) \tag{12.14} $$贪心解码的问题在于,在时间步 $t$ 看似概率最高的词,到了时间步 $t+1$ 之后可能被证明是错误的选择。 束搜索(beam search)算法通过保留多个候选序列直到后续步骤再决定最优者,从而缓解这一问题。 在束搜索中,我们将解码建模为在所有可能生成序列的空间中进行搜索。该空间表示为一棵搜索树(search tree),其中分支(branches)代表动作(即生成一个词元),节点(nodes)代表状态(即已生成某个特定前缀)。 我们的目标是找到最优的动作序列,也就是具有最高整体概率的字符串。 问题示例说明 图 12.7 展示了一个虚构的例子。 全局概率最高的序列是 ok ok EOS(其概率为 $0.4 \times 0.7 \times 1.0 = 0.28$)。 但贪心搜索无法找到它,因为它在第一步错误地选择了 yes,因为 yes 在局部具有最高概率(0.5)。 图 12.7 从词汇表 $V = \{\text{yes}, \text{ok}, \text{EOS}\}$ 中生成目标序列 $T = t_1, t_2, \dots$ 的搜索树,图中标注了从每个状态生成各词元的概率。 贪心搜索会选择 yes 后接 yes,而非全局概率最高的序列 ok ok。 ...
图 12.5 用于机器翻译的编码器-解码器 Transformer 架构。 编码器使用的是我们在第 8 章见过的 Transformer 模块,而解码器则使用一种更强大的模块,其中增加了一个额外的交叉注意力(cross-attention)层,可以关注编码器中的所有词。 我们将在下一节更详细地介绍这一点。 机器翻译的标准架构是编码器-解码器 Transformer。 图 12.5 在较高层次上展示了该架构的基本思路。 可以看到,编码器-解码器架构由两个 Transformer 组成:一个编码器,与第 8 章介绍的基础 Transformer 相同;以及一个解码器,它增加了一个特殊的交叉注意力(cross-attention)层。 编码器接收源语言的输入词元序列 $\mathbf{X} = \mathbf{x}_1, \dots, \mathbf{x}_n$,并通过若干编码器模块将其映射为输出表示 $\mathbf{H}_{enc} = \mathbf{h}_1, \dots, \mathbf{h}_n$。 解码器本质上是一个条件语言模型,关注编码器的表示逐个生成目标词,它在每个时间步基于源句子和此前已生成的目标语言词来生成下一个词元。 解码过程可以采用第 8 章讨论的任意解码方法,例如贪心搜索、温度采样或核采样。但在机器翻译中,最常用的解码算法是束搜索(beam search),我们将在第 12.4 节介绍。 不过,该架构的组件与我们之前见过的 Transformer 模块略有不同。 首先,为了能够关注源语言,解码器中的 Transformer 模块增加了一个额外的交叉注意力层。 回顾第 8 章的 Transformer 模块:它包含一个自注意力层(关注来自前一层的输入),前面接一个层归一化(layer norm),后面再接另一个层归一化和前馈网络。 而解码器的 Transformer 模块在此基础上增加了一层特殊类型的注意力——交叉注意力(有时也称为编码器-解码器注意力或源注意力)。 交叉注意力的形式与普通 Transformer 模块中的多头注意力相同,区别在于:其查询(queries)一如既往来自解码器的前一层,而键(keys)和值(values)则来自编码器的输出。 图 12.6 编码器与解码器的 Transformer 模块,以残差流视角展示。 编码器的最终输出 $\mathbf{H}_{enc} = \mathbf{h_1}, \dots, \mathbf{h}_n$ 作为上下文被送入解码器。 解码器本质上是一个标准的 Transformer,只是多了一个交叉注意力层,该层接收编码器的输出 $\mathbf{H}_{enc}$,并用它来构造自身的键($\mathbf{K}$)和值($\mathbf{V}$)输入。 ...