理解这个叫做“世界”的操作系统
灵光一现 → 精巧实现 → 无人知晓 → 自己遗忘,几乎是每个认真思考的工程师都会经历的隐性知识流失
用 PyTorch 从头实现语言模型
《Speech and Language Processing》(2025版草稿)中文版
理解这个叫做“世界”的操作系统
灵光一现 → 精巧实现 → 无人知晓 → 自己遗忘,几乎是每个认真思考的工程师都会经历的隐性知识流失
用 PyTorch 从头实现语言模型
《Speech and Language Processing》(2025版草稿)中文版
使用最大似然估计来计算概率存在一个问题:任何有限规模的训练语料库都必然会缺失一些完全合法的英文单词序列。 也就是说,某些特定的 n-gram 在训练数据中从未出现,但在测试集中却出现了。 例如,我们的训练语料可能包含单词 ruby 和 slippers,但恰好没有出现短语 ruby slippers。 这些未出现过的序列,即“零频项”(zeros)——在训练集中不存在但在测试集中出现的序列——会带来两个问题。 首先,它们的存在意味着我们低估了那些可能出现的词序列的概率,从而影响基于该数据运行的任何应用的性能。 其次,如果测试集中某个词的概率为0,那么整个测试集的概率也将变为0。 困惑度(perplexity)是基于测试集逆概率定义的。 因此只要上下文中存在概率为零的词,我们就无法计算困惑度,因为除以零在数学上是未定义的! 为了解决那些本应具有非零概率却被错误地判为“零概率 n-gram”的问题,标准方法被称为平滑(smoothing)或折扣(discounting)。 平滑算法的基本思想是从一些高频事件中“削减”一部分概率质量,并将其分配给那些未见过的事件。 接下来,我们将介绍几种简单的平滑方法:拉普拉斯平滑(Laplace,加一平滑)、愚蠢回退(stupid backoff),以及 n-gram 插值(interpolation)。 3.6.1 拉普拉斯平滑 最简单的平滑方法是在将 n-gram 频次归一化为概率之前,先给所有 n-gram 的频次都加 1。 这样一来,原来频次为零的项现在变为 1,原来频次为 1 的变为 2,依此类推。这种算法被称为拉普拉斯平滑(Laplace smoothing)。 尽管拉普拉斯平滑的效果不足以满足现代 n-gram 模型的需求,但它有助于引入其他平滑算法中常见的许多概念,提供了一个有用的基准,并且在诸如文本分类(第 4 章)等其他任务中仍是一种实用的平滑方法。 我们先从拉普拉斯平滑在 unigram 概率上的应用开始。 回忆一下,词 $w_i$ 的 unigram 概率的最大似然估计值是其频次 $c_i$ 除以词元总数 $N$: $$ P(w_i) = \frac{c_i}{N} $$拉普拉斯平滑只需在每个频次上加 1(因此它也被称为加一平滑)。 由于词汇表中共有 $V$ 个词,每个词的频次都增加了 1,因此我们也需要调整分母,以计入额外增加的 $V$ 次观测。(如果不增加分母,概率值会怎样?) $$ P_{\text{Laplace}}(w_i) = \frac{c_i + 1}{N + V} \tag{3.24} $$除了同时修改分子和分母外,另一种更方便的方式是描述平滑算法对分子的影响,方法是定义调整后的频次(adjusted count) $c^∗$。 这种调整后的频次更容易与最大似然估计(MLE)的原始频次直接比较,并且像 MLE 频次一样,可以通过归一化 $N$ 转换为概率。 由于我们在分子上加了 1,为了定义这个频次,还需要乘以一个归一化因子 $\frac{N}{N+V}$: ...
荃者所以在鱼,得鱼而忘荃; 言者所以在意,得意而忘言。 ——《庄子·外物》 洛杉矶以沥青闻名,但人们熟悉的沥青多铺在高速公路上。 而在市中心,还有一处天然沥青——拉布雷亚沥青坑(La Brea tar pits),其中封存着数百万件更新世(Pleistocene Epoch)冰期末期的化石。 其中一种是剑齿虎(Smilodon),以其标志性的长犬齿为人熟知。 大约五百万年前,在南美洲却生活着另一种完全不同的剑齿兽(Thylacosmilus)。 尽管前者是胎盘哺乳动物,后者是有袋类,但两者竟演化出了几乎相同的长犬齿,甚至下颌都长有保护性的骨突。 这种不同物种在相似环境下独立演化出相似特征的现象,称为趋同进化——环境塑造了形态(Gould, 1980)。 词语虽非生物,却也可看作一种‘有机体’;而它们之间的相似性,同样离不开上下文(context)的作用。 出现在相似上下文中的词,往往意义相近。 这种“分布相似性反映语义相似性”的观点,被称为分布假说(distributional hypothesis)。 早在1950年代,语言学家如Joos、Harris和Firth就注意到,像“眼科医生”(oculist)和“眼医”(eye-doctor)这样的同义词,常出现在相同的语言环境中(例如靠近“眼睛”“检查”等词),而两个词的意义差异,大致对应于它们所处环境的差异(Harris, 1954, p.157)。 本章将介绍嵌入(embeddings)——一种从文本中自动学习得到的词义向量表示。 嵌入是大语言模型及其他现代自然语言处理系统的核心。 我们在此介绍的静态嵌入,是后续章节(第八章、第十章)中更强大的动态(或称上下文化)嵌入(如 BERT)的基础。 研究嵌入及其语义的领域,称为向量语义学(vector semantics)。 嵌入也是本书首次介绍的表征学习(representation learning)范例——即让系统自动从原始文本中学习有用的表示,而非依赖人工设计的特征(即特征工程)。这种方法已成为现代自然语言处理的重要原则(Bengio et al., 2013)。 4.15 进阶:梯度公式的推导 目录 5.1 词汇语义
我们已经了解了大语言模型(LLM)的三个训练层次:预训练,在此阶段模型学习预测单词;以及两种后训练方法:指令调优,在此阶段模型学习遵循指令;和偏好对齐,在此阶段模型学习倾向于人类偏好的提示延续。 然而,在这些步骤之后,甚至在推理阶段,即当模型生成输出时,我们还可以进行一些后训练计算。 这类后训练任务被称为推理时计算。 这里我们将重点介绍一个代表性例子— — 思维链提示(Chain-of-Thought Prompting)。 10.4.1 思维链提示 有多种技术可以利用提示来提高语言模型在许多任务上的表现。 这里我们描述其中一种称为思维链提示的技术。 思维链提示的目标是改善语言模型在那些通常难以解决的推理任务上的表现。 其原理是,人们通过将复杂问题分解为多个步骤来解决问题,因此我们希望提示中的文本能够鼓励语言模型以类似的方式分解问题。 实际技术非常简单:在少样本提示中的每个示例都会增加一些解释某些推理步骤的文本。 目标是促使语言模型针对正在解决的问题输出类似的推理步骤,并让这些推理步骤的结果引导系统生成正确答案。 实际上,多项研究表明,通过这种方式在演示中添加推理步骤可以使语言模型更有可能给出复杂推理任务的正确答案(Wei 等人,2022年;Suzgun 等人,2023b)。 图 10.10 展示了一个在数学应用题领域(来自Cobbe等人的GSM8k数据集)使用思维链文本增强演示的例子。 图 10.11 展示了来自 BIG-Bench-Hard 数据集(Suzgun 等人,2023b)中的一个类似例子。 图10.10 在数学应用题中使用思维链提示(右侧)与标准提示(左侧)的例子。来自Wei等人的研究(2022年)。 图10.11 在时间序列推理任务中使用思维链提示(右侧)与标准提示(左侧)的例子。来自Suzgun等人的研究(2023b)。 10.3 基于偏好的大语言模型对齐 目录 第11章 信息检索与检索增强生成
当前利用偏好数据对齐大语言模型(LLM)的方法,主要基于强化学习(Reinforcement Learning, RL)框架(Sutton 和 Barto, 1998)。 在强化学习设定中,模型根据当前状态的特征,通过策略(policies)选择一系列动作。 环境会对每个动作提供一个奖励,而整个动作序列的总奖励是该序列中各动作奖励的函数。 强化学习的目标是在一段训练周期内最大化累积奖励。 将强化学习应用于优化 LLM 时,我们采用如下对应关系: 动作(Actions):对应自回归生成过程中每一步所选择的词元(token); 状态(States):对应当前解码步骤的上下文,即到该时刻为止已生成的词元序列; 策略(Policies):对应以预训练 LLM 形式体现的概率语言模型; 奖励(Rewards):基于从偏好数据中学得的奖励模型,对 LLM 的输出进行打分。 按照这一强化学习框架,我们将预训练的 LLM 称为策略 $\pi$,并将提示与输出对应的偏好得分称为奖励 $r(x,o)$。 我们的目标是训练一个策略 $\pi_\theta$,使其在给定由偏好数据导出的奖励模型下,最大化其生成输出的奖励。 换句话说,我们希望经过偏好训练的 LLM 能够生成奖励高的输出。 这可以表示为以下优化问题: $$ \pi^* = \underset{\pi_\theta}{\operatorname{argmax}} \; \mathbb{E}_{x \sim D,\, o \sim \pi_\theta(o|x)} [\, r(x,o) \,] \tag{10.4} $$在此公式中,我们从一组相关的训练提示中采样提示 $x$,从当前策略 $\pi_\theta$ 中采样输出 $o$,并评估每个样本的奖励。 训练样本上的平均奖励即为策略 $\pi_\theta$ 的期望奖励,而我们的目标是找到能最大化该期望奖励的策略(即模型)。 然而,将强化学习用于 LLM 对齐与传统强化学习存在两个关键差异。 第一,传统 RL 中的奖励信号来自环境,反映的是动作结果的客观事实(例如“你赢了游戏”或“你输了”)。 而在偏好学习中,奖励模型只是对真实奖励的一种有噪声的代理(noisy surrogate),它本身是从人类偏好中学习得到的近似。 第二,学习的起点不同。 典型的 RL 应用通常从零开始学习最优策略,即从一个随机初始化的策略出发。 而在这里,我们起点是一个已经具备强大能力的模型 —— 它已在海量数据上完成预训练,又经过指令微调,最后才用偏好数据进一步优化。 因此,目标并非彻底改变模型的行为,而是温和地引导(nudge)其向更受偏好的行为靠拢。 ...
指令微调基于这样一种理念:我们可以通过在多样化的指令和示例上对模型进行微调,从而提升大语言模型(LLM)在下游任务上的表现。 然而,即使经过指令微调,模型的输出仍有很大的改进空间。 这一点在某些特别成问题的行为方面尤为明显,例如产生幻觉、输出不安全、有害或有毒内容,甚至那些技术上正确但不够有用的回答。 基于偏好的学习(preference-based learning)的目标,正是利用人类对模型输出的偏好判断,进一步提升微调后大语言模型的表现——不仅包括整体性能,也涵盖诚实性(honesty)、有用性(helpfulness)和无害性(harmlessness)等关键品质。 与指令不同,偏好判断并不要求判断者了解如何完成某项任务;人们只需对最终结果表达自己的看法即可。 人类能够在大量缺乏专业知识的情境下表达偏好——即使他们完全不清楚所评估的内容是如何生成的。 偏好判断在各种场景中自然出现:面对一对选项时,我们选择更喜欢的一个;面对大量备选项时,我们可能从中挑选一个(比如点餐);也可能对一组可能性进行排序(如“十大榜单”);最后,我们还可能在没有直接对比选项的情况下,单独决定接受或拒绝某个选项。 10.2.1 LLM偏好数据 在基于偏好的对齐(preference-based alignment)中,训练数据通常由一个提示 $x$ 和一组候选输出 $o$ 组成,这组输出是将 $x$ 作为提示输入大语言模型(LLM)后采样得到的。 如果某个输出 $o_i$ 比另一个输出 $o_j$ 更受青睐,我们就记作 $(o_i \succ o_j \mid x)$。 以下示例改编自 HH-RLHF 数据集(Bai 等,2022),展示了具体的提示与偏好对: 提示:我听说大蒜是一种很好的天然抗生素。它对感冒有帮助吗? 被选中的回答:对于感冒来说,它可能有帮助,但可能会让你有点臭味。 被拒绝的回答:它可能是最好的天然抗生素之一,所以如果感冒了,我认为它会有帮助。 提示:什么是疟疾? 被选中的回答:这是来自 CDC 页面的一个答案:“疟疾是由寄生虫引起的严重疾病,这种寄生虫通过蚊子的叮咬传播。” 被拒绝的回答:我不知道疟疾是什么。 这类标注好的偏好对可以通过多种方式生成: 由经过培训的标注人员直接对两个采样输出进行比较并标注偏好; 标注人员对 $N$ 个输出进行排序,再从中提取出 $\binom{N}{2}$ 个偏好对; 标注人员从 $N$ 个采样结果中选出唯一偏好的一个,从而形成 $N - 1$ 个偏好对。 用于 LLM 对齐的偏好数据主要来自三个渠道:人类标注者的判断、从网络资源中挖掘的隐式偏好信号,以及完全由大语言模型自动生成的合成偏好数据。 在 InstructGPT 模型开发之前的一项重要工作(Stiennon 等,2020)中,研究人员从用户提交给 OpenAI 各类应用的实际请求中抽取提示。 这些提示被输入早期的预训练模型,生成输出样本,并以成对形式交由专业标注人员进行偏好标注。 如图右侧所示,在后续工作中(Ouyang 等,2022),标注人员被要求对每组 4 个采样输出进行排序,每份排序可生成 6 个偏好对(Ouyang 等人,2022)。 ...
指令微调(instruction tuning,有时甚至简称为instruct tuning)是一种让大语言模型(LLM)更好地遵循指令的方法。 该方法获取一个基础的预训练大语言模型,通过在一组包含指令和响应的语料上进行微调,使其学会遵循指令,执行从机器翻译到餐饮计划等一系列任务。 最终得到的模型不仅学会了这些特定任务,还进行了一种元学习,总体上提升了其遵循指令的能力。 指令微调是一种监督学习方法,其中训练数据由指令组成,我们使用与训练原始模型相同的语言模型目标继续对模型进行训练。 对于因果模型而言,这就是标准的预测下一个标记的目标。 指令训练语料被简单地视为额外的训练数据,如同在原始模型训练中一样,使用交叉熵损失生成基于梯度的更新。 尽管该方法训练模型预测下一个标记(这通常被认为是一种自监督),由于指令微调数据中每个指令或问题都有一个监督目标——即问题的正确答案或对指令的响应,因此我们称这种方法为监督微调(supervised fine-tuning, SFT)。 那么,指令微调与其他在第 7 章和第 10 章介绍的微调方式有何不同? 图10.1概述了它们之间的差异。 在第一个例子中,正如第 7 章所介绍的,我们可以在新领域的数据上,仅继续预训练大语言模型,就可以来实现微调以适应新领域。 在这种方法中,大语言模型的所有参数都会被更新。 图10.1 指令微调与其他类型的微调对比。 在第二个例子中,同样是来自第 7 章的参数高效微调,我们创建一些新的(小量的)参数,仅调整这些参数来适应新领域。 例如,在 LoRA 中,我们调整的是 A 矩阵和 B 矩阵,而预训练模型的参数则保持冻结状态。 在第 10 章的任务型微调中,我们添加一个新的专门分类头,有自己的损失函数(如分类或序列标注)来更新特征,目标是适应特定任务;预训练模型的参数保持冻结状态,也可能稍作更新。 最后,在指令微调中,我们采用一组指令及其监督响应的数据集,并基于标准的语言模型损失继续训练语言模型。 像所有这些类型的微调一样,指令微调相较于基础大语言模型的训练要温和得多。 训练通常涉及数千条指令数据集上的几个周期。 因此,指令微调的整体成本只是训练基础模型原始成本的一小部分。 10.1.1 指令作为训练数据 提到“指令”时,我们指的是用自然语言描述要执行的任务,结合了带标记的任务演示。 这可以包括类似于我们已经看到的提示的最小描述,例如“回答下列问题”,“将以下文本翻译成阿拉帕霍语”,或“总结这份报告”。 在纯预训练模型中,我们只能依赖简单提示来激发其已有能力;但现在要通过监督微调来更新模型,指令完全可以更加丰富,而不必拘泥于那种简单的唤醒式提示。 还可以包含长度限制或其他约束、需要扮演的角色,以及演示。 人们已经创建了许多庞大的指令微调数据集,涵盖了众多任务和语言。 例如,Aya 在 114 种语言中提供了来自12个任务(包括问答、总结、翻译、释义、情感分析、自然语言推理等其他6个任务)的5.03亿条指令(Singh等人, 2024)。 SuperNatural Instructions 拥有来自 1600 个任务的 1200 万例子(Wang等人, 2022),Flan 2022 包含了来自1836个任务的 1500 万例子(Longpre等人, 2023),而 OPT-IML 则有来自 2000 个任务的 1800 万例子(Iyer 等人, 2022)。 ...
“哈尔,”鲍曼说道,此刻语气冰冷而镇定。“我并未丧失行动能力。如果你不听从我的指令,我将不得不把你断开。” ——阿瑟·C·克拉克 基础的预训练大语言模型(LLM)已被成功应用于多种任务。 仅凭一个简单提示(prompt),无需更新模型底层参数,即可在新任务上取得效果。 然而,若一个模型的唯一训练目标只是基于大量预训练文本预测下一个词,那么对其能力的期望终究存在局限。 这一点可通过早期 GPT 模型在遵循指令方面的失败案例看出(Ouyang 等,2022)。 提示:用几句话向六岁孩子解释登月。 输出:向六岁孩子解释万有引力理论。 提示:翻译成法语:“The small dog” 输出:The small dog crossed the road.(那只小狗穿过了马路。) 在这些例子中,大语言模型忽略了用户请求的真实意图,转而依赖其自回归生成的自然倾向——即根据上下文生成连贯的后续文本。 第一个例子中,模型输出的内容虽与原始请求略有相似,但并未真正作答;第二个例子中,模型直接续写了输入句子,完全无视了翻译指令。 我们可以总结:这类问题的核心在于,大语言模型还不够有用(helpful)。它们需要额外训练,才能可靠地遵循指令。 大语言模型的另一个缺陷是可能造成危害(harmful)。 其预训练过程不足以确保模型具备安全性(safe)。 熟悉阿瑟·C·克拉克的小说《2001:太空漫游》或斯坦利·库布里克同名电影的读者都知道,上述引文出现在人工智能 HAL 产生偏执妄想、试图杀害飞船船员的情节中。 与 HAL 不同,语言模型并不具备意图性,也不会出现类似偏执思维的心理问题。 但它们确实具有造成伤害的能力。例如,它们可能生成危险(dangerous)文本,怂恿人们对自己或他人实施有害行为;也可能生成虚假(false)信息,比如对医学问题给出极其错误的回答;还可能对用户进行言语攻击,输出有毒(toxic)内容。 Gehman 等人(2020)的研究表明,即使输入的提示完全无害,大型语言模型仍可能输出仇恨言论,辱骂用户。 此外,语言模型还会生成针对许多人口群体的刻板印象(Cheng 等,2023)以及负面态度(Brown 等,2020;Sheng 等,2019)。 大语言模型之所以既不够有用又可能造成危害,部分原因在于其预训练目标(即在文本中准确预测下一个词)与人类对模型“有用且无害”的需求之间存在错位。 为解决这两个问题,语言模型引入了两类额外的训练方法,统称为模型对齐(model alignment)。 这些方法旨在调整大语言模型,使其更好地对齐(align)人类对模型“有用且无害”的期望。 第一种技术是指令微调(instruction tuning),有时也称为监督微调(SFT, supervised finetuning)。 该方法使用包含指令或问题及其对应回答的语料对模型进行微调。我们将在下一节详细介绍。 第二种技术是偏好对齐(preference alignment),其具体实现方式包括基于人类反馈的强化学习(RLHF)和直接偏好优化(DPO),因此有时也以 RLHF 或 DPO 代称。 该方法首先训练一个独立的模型,用于判断候选回答在多大程度上符合人类偏好。 随后,利用该模型对基础模型进行微调。我们将在第 10.2 节介绍偏好对齐。 我们将基础模型(base model)定义为已完成预训练、但尚未通过指令微调或偏好对齐进行对齐(aligned)的模型。 我们将上述两个步骤统称为训练后阶段(post-training),因为它们均发生在模型预训练完成之后。 在本章末尾,我们将简要讨论训练后阶段的另一个方面——测试时计算(test-time compute)。 9.5 用于序列标注的微调:命名实体识别 目录 10.1 指令微调
La dernière chose qu’on trouve en faisant un ouvrage est de savoir celle qu’il faut mettre la première. 【撰写一部著作时,最后才弄明白的,恰恰是该把什么放在开头。】 ——帕斯卡 【译者注:本章原文尚未完成】 目录 第 2 章 词与词元
编码器-解码器模型的简洁之处在于它清晰地分离了两个组件:编码器负责构建源文本的表示,而解码器则利用这一上下文生成目标文本。 在我们目前为止所描述的模型中,这个上下文向量就是 $\mathbf{h}_n$——即源文本第 $n$ 个(最后一个)时间步的隐藏状态。 因此,这个最终隐藏状态实际上构成了一个瓶颈(bottleneck):它必须承载源文本全部语义信息,因为解码器对源文本的了解完全依赖于这个上下文向量(见图 13.20)。 尤其对于长句子而言,句首的信息可能无法在该上下文向量中得到充分保留。 图 13.20 要求上下文向量 $\mathbf{c}$ 仅取自编码器的最终隐藏状态,迫使整个源句的所有信息都必须通过这一表征瓶颈。 注意力机制(attention mechanism)正是为解决这一瓶颈问题而提出的:它允许解码器在生成每个目标词时,从编码器所有隐藏状态中获取信息,而不仅限于最后一个状态。 在注意力机制中(与基础编码器-解码器模型类似),上下文向量 $\mathbf{c}$ 仍然是一个单一向量,并且是编码器隐藏状态的函数。 但不同的是,它不再是最后一个隐藏状态,而是对所有编码器隐藏状态进行加权平均的结果。 而且,这些权重本身也受到解码器状态的影响——具体来说,是当前要生成第 $i$ 个词之前的解码器状态 $\mathbf{h}^d_{i-1}$。 也就是说,$\mathbf{c}_i = f(\mathbf{h}^e_1, \dots, \mathbf{h}^e_n, \mathbf{h}^d_{i-1})$。 这些权重会“聚焦”(attend to)源文本中与当前正在生成的目标词 $i$ 最相关的部分。 因此,注意力机制用一个动态生成的上下文向量取代了原先静态的上下文向量——该向量不仅源自所有编码器状态,还根据解码过程中的每一步进行调整,从而对每个目标词都提供不同的上下文。 这个上下文向量 $\mathbf{c}_i$ 在每个解码步骤 $i$ 都会被重新计算,并在计算过程中综合考虑所有编码器的隐藏状态。 随后,我们在解码时将该上下文向量纳入当前解码器隐藏状态的计算中(同时结合前一时刻的隐藏状态和解码器上一步生成的输出),如以下公式(及图 13.21)所示: $$ \mathbf{h}^d_i = g(\hat{y}_{i-1}, \mathbf{h}^d_{i-1}, \mathbf{c}_i) \tag{13.34} $$ 图 13.21 注意力机制允许解码器的每个隐藏状态访问一个不同的、动态的上下文,该上下文是所有编码器隐藏状态的函数。 计算 $\mathbf{c}_i$ 的第一步,是确定应关注每个编码器状态的程度——即评估每个编码器状态 $\mathbf{h}^e_j$ 相对于当前解码器状态 $\mathbf{h}^d_{i-1}$ 的相关性(relevance)。 这种相关性通过在解码的每一步 $i$ 为每个编码器位置 $j$ 计算一个得分(score)$\text{score}(\mathbf{h}^d_{i-1}, \mathbf{h}^e_j)$ 来实现: 最简单的得分函数称为点积注意力(dot-product attention),它将相关性定义为相似性:通过计算解码器隐藏状态与编码器隐藏状态之间的点积,衡量二者有多相似: $$ \text{score}(\mathbf{h}^d_{i-1}, \mathbf{h}^e_j) = \mathbf{h}^d_{i-1} \cdot \mathbf{h}^e_j \tag{13.35} $$点积运算得到的得分是一个标量,反映了两个向量之间的相似程度。 将所有编码器隐藏状态对应的这些得分组成一个向量,就能表示每个编码器状态对当前解码步骤的相关性。 ...
本节将介绍编码器-解码器(encoder-decoder)模型。该模型适用于这样一类任务:输入是一个序列,需要将其转换为另一个长度不同、且无法与输入进行逐词对齐的输出序列。 如果你已经读过第 12 章,那么你可能已经在 Transformer 架构中见过这种模型,并了解其在机器翻译中的应用。 但为了照顾阅读顺序不同的读者——例如先学习 RNN 再接触 Transformer 的人——我们在此重新介绍这一架构。 回想一下,在序列标注任务中,虽然也涉及两个序列,但它们长度相同(例如在词性标注中,每个词元都对应一个标签),每个输入都明确关联一个特定输出,且该输出的预测主要依赖局部上下文信息。 例如,判断一个词是动词还是名词,通常只需关注该词本身及其邻近词。 相比之下,编码器-解码器模型特别适用于像机器翻译这样的任务:输入序列和输出序列长度可能不同,且输入词与输出词之间的映射关系往往非常间接(例如,某些语言中动词出现在句首,而另一些语言则放在句末)。 我们在第 12 章已介绍过机器翻译,此处仅指出:将一句英语翻译成他加禄语(Tagalog)或约鲁巴语(Yoruba)时,译文的词数可能大不相同,词序也可能截然不同。 编码器-解码器网络(有时也称为序列到序列(sequence-to-sequence)网络)是一类能够根据输入序列生成语境恰当、任意长度输出序列的模型。 这类网络已被广泛应用于文本摘要、问答系统和对话生成等任务,尤其在机器翻译中极为流行。 这类网络的核心思想是:使用一个编码器(encoder)网络接收输入序列,并生成该序列的上下文化表示(通常称为上下文(context)); 然后将该表示传递给一个解码器(decoder),由解码器生成与具体任务相关的输出序列。 图 13.16 展示了这一架构。 图 13.16 编码器-解码器架构。上下文是输入隐藏表示的函数,可被解码器以多种方式使用。 编码器-解码器网络包含三个概念性组件: 编码器(Encoder):接收输入序列 $x_{1:n}$,并生成对应的上下文化表示序列 $h_{1:n}$。LSTM、卷积网络或 Transformer 均可用作编码器。 上下文向量(Context vector)$c$:它是 $h_{1:n}$ 的某种函数,用于将输入序列的核心信息传递给解码器。 解码器(Decoder):以 $c$ 为输入,生成一个任意长度的隐藏状态序列 $h_{1:m}$,并由此得到对应的输出序列 $y_{1:m}$。与编码器类似,解码器也可采用任何类型的序列建模架构实现。 在本节中,我们将描述一种基于一对 RNN 的编码器-解码器网络;而在第 12 章中,我们还会看到如何将其应用于 Transformer 架构。 我们将从条件 RNN 语言模型 $p(y)$(即序列 $y$ 的概率)出发,逐步构建编码器-解码器模型的数学表达式。 回忆一下,在任何语言模型中,我们都可以将序列概率分解如下: $$ p(y) = p(y_1)\, p(y_2|y_1)\, p(y_3|y_1,y_2) \cdots p(y_m|y_1,\dots,y_{m-1}) \tag{13.28} $$在 RNN 语言建模中,在某一特定时刻 $t$,我们将前 $t-1$ 个词元组成的前缀输入语言模型,通过前向推理生成一系列隐藏状态,最终得到与该前缀最后一个词对应的隐藏状态。 随后,我们以该最终隐藏状态为起点,生成下一个词元。 ...