跳转至

序列到序列 (Seq2Seq) 与注意力

Seq2Seq 模型的基本架构是怎样的?Encoder 和 Decoder 分别起什么作用?

image.png

Seq2Seq(Sequence-to-Sequence)模型 是一种通用的端到端序列变换框架,用于将一个输入序列映射为一个输出序列,输入和输出长度可以不同。其最经典的实现基于 RNN(LSTM/GRU)。

基本架构

由两部分组成:编码器(Encoder) 和 解码器(Decoder)。

image.png

作用总结

  • 编码器:负责理解输入序列,将其信息压缩到上下文向量中。

  • 解码器:负责生成输出序列,从上下文向量解码出目标序列,逐步预测下一个词。


在 Seq2Seq 中,上下文向量(Context Vector)是如何产生的?存在什么瓶颈?

上下文向量的产生

在最原始的 Seq2Seq 模型(Cho et al., 2014; Sutskever et al., 2014)中,编码器最后一个时间步的隐藏状态直接被作为上下文向量:

image.png

或者通过一个简单的变换(如 tanh⁡tanh 层)。无论输入序列多长,所有信息都必须压缩到这个固定维度的向量中。

瓶颈

  1. 容量限制:固定大小的向量难以完整保留长序列的全部语义和细节信息,尤其是序列很长时。这会导致信息丢失,对长句输入表现较差。

  2. 梯度问题:长序列中,编码器后部的信号需要通过很多时间步反向传播到前端,导致梯度消失/爆炸,使得模型难以学习长距离依赖。

  3. 对齐困难:解码器在每个生成时刻都只看到同一个全局向量,无法有选择地关注输入的不同部分。在翻译、摘要等任务中,输出词往往只与输入的局部片段相关,全局上下文向量无法提供这种细粒度的对齐。

  4. 性能退化:随着输入长度增加,模型性能(如 BLEU)明显下降,尤其在机器翻译中,超过一定长度后准确率骤降。

解决方案

注意力机制(Bahdanau et al., 2015)的引入打破了这一瓶颈:解码器不再依赖单一的固定上下文向量,而是在每个时间步动态地生成一个加权上下文向量,有重点地读取编码器的各个隐藏状态。


Teacher Forcing 是什么?它在训练 Seq2Seq 时如何工作?有什么优缺点?

Teacher Forcing(教师强制)

Teacher Forcing 是一种训练自回归模型的标准策略。在训练 Seq2Seq 解码器时,不使用模型自己上一步预测的词作为下一步的输入,而是强制使用真实标签(目标序列中的词) 作为下一时间步的输入。

工作机制

image.png

这样,损失的梯度可以从每个时间步直接回传,因为输入不依赖于模型的采样,计算图是确定性的,且可以高效地并行训练(通过右移目标序列作为输入,一次性计算所有时间步的预测)。

优点

  • 加速收敛:模型始终看到正确的上下文,避免错误累积,梯度更稳定。

  • 训练高效:可以通过矩阵运算同时计算整个序列的损失,而不必逐个时间步串行。

缺点

  • 曝光偏差(Exposure Bias):训练时模型一直看到的是真实数据分布(地面实况),推理时却只能看到自己生成的、可能有错误的词。如果模型在早期生成了一个错误的词,这个错误会作为后续的输入,导致误差累积,甚至完全跑偏。

  • 泛化能力受限:模型从未学习过如何在“有噪声的、自己的预测”下恢复,因此对推理时的错误非常敏感。

缓解方法:

课程学习(Scheduled Sampling)逐步用模型预测替代真实标签;使用强化学习直接优化序列级指标;或者改用 Transformer,其并行生成不需要 Teacher Forcing 的推理依赖问题,但训练时仍然常用 Teacher Forcing 和交叉熵损失。


推理时,Decoder 的输入是什么?如何解决曝光偏差(Exposure Bias)?

推理时的输入

推理(测试/生成)时,没有真实标签可用。解码器必须使用自己上一步预测出的词作为下一步的输入。流程:

  1. 输入 <sos>,模型产生词汇表上的概率分布。

image.png

曝光偏差的解决方案

曝光偏差的根本原因是训练和推理时解码器输入分布不匹配。解决方法主要包括:

  1. Scheduled Sampling(计划采样) 在训练时,以概率 ϵ 使用模型自己的预测作为下一输入,以概率 1−ϵ 使用真实标签。ϵ 通常从 0 逐步增加到某个值。这使得模型在训练期间就学会了处理自己产生的错误。缺点是可能破坏 RNN 的时间结构,且可能引入偏差。

  2. 序列级训练目标 使用 REINFORCE 算法或最小风险训练直接优化 BLEU/ROUGE 等序列级指标,推理时用模型生成序列然后计算奖励。这能直接降低推理时的误差,但训练不稳定,常与交叉熵预训练结合。

  3. 教授强制中的“教学”感知 Professor Forcing 使用 GAN 的思想,让判别器区分真实隐藏状态轨迹和由模型自回归生成的隐藏状态轨迹,引导模型的自回归状态接近教师强制状态。

  4. 更好的网络结构 Transformer 在训练时虽然也使用 Teacher Forcing(并行输入真实前缀),但推理时自回归解码,通过大规模数据和强表示能力缓解了曝光偏差的实际影响。此外,Copy mechanism 也能帮助模型直接从输入复制标记,减少错误生成。

  5. 桥接分布 BERT 等预训练模型的引入使得 Seq2Seq 在微调时具有更强的泛化能力,间接减轻曝光偏差。


注意力机制最初是为解决 Seq2Seq 的什么问题而提出的?

注意力机制(Attention Mechanism)最初由 Bahdanau et al. (2015) 提出,旨在解决传统 Seq2Seq 模型中将所有输入信息压缩为单一固定长度上下文向量所带来的瓶颈问题。具体包括:

  • 信息丢失:长序列的细节无法被一个向量完全编码。

  • 缺乏对齐能力:生成每个目标词时无法有选择地关注输入序列的不同部分。例如,翻译 “the black cat” 时,生成“黑”应主要关注“black”,生成“猫”应关注“cat”,但固定上下文向量无法提供这种位置敏感性。

  • 长句性能骤降:随着输入长度增加,模型性能(如 BLEU)急剧下降。

注意力机制通过让解码器在每个时间步动态地构建一个加权上下文向量,能够访问编码器的所有隐藏状态,并根据当前解码状态自适应地分配权重(注意力分数),从而打破信息瓶颈,显著提升长序列处理能力。


Bahdanau Attention(加性注意力)的计算流程是怎样的?画出结构图并写出公式。

Bahdanau Attention(Additive/Concatenative Attention) 是第一种被用于 Seq2Seq 的注意力机制。

计算公式

image.png

对齐分数(能量):

image.png

注意力权重(通过 softmax 归一化):

image.png

上下文向量(加权和):

image.png

解码器状态更新:

将上下文向量与解码器隐藏状态结合(通常拼接):

image.png

结构图(文字描述)

image.png

Luong Attention 与 Bahdanau Attention 的主要区别是什么?(全局/局部,得分函数)

主要区别

Luong et al. (2015) 提出了几种注意力变体,与 Bahdanau Attention 的核心差异在于:

  1. 注意力计算时机

image.png

  1. 得分函数(Score Functions)

Bahdanau 只使用了加性(concat/additive)分数。

Luong 提出了三种不同的对齐分数:

image.png

  1. 全局 vs 局部注意力

Bahdanau 只关注全局注意力(对所有编码器状态加权)。

image.png

总结:Luong 的注意力更加模块化(先算 RNN,后算注意力),提供了多种得分函数和局部注意力选项;Bahdanau 的注意力深度融合在解码器循环中。两种方式在性能上接近。


注意力权重是如何计算的?对齐分数有哪几种常见计算方式?

注意力权重计算

image.png


什么是“软注意力”和“硬注意力”?软注意力如何求导?

软注意力 (Soft Attention)

image.png

硬注意力 (Hard Attention) 硬注意力不是加权平均,而是随机采样一个位置 ii(根据概率分布 αα 采样),然后将该位置的隐藏状态作为上下文向量:c=hic=hi。采样操作是不可微的。

  • 求导问题:采样操作无法直接进行反向传播。训练通常需要使用强化学习(如 REINFORCE 算法)或变分推理(如使用 Gumbel-Softmax 重参数化来近似梯度)来估计梯度。

  • 优点:减少了计算量(只访问一个位置),在某些任务(如图像描述)中可能更锐利。

  • 缺点:训练复杂,方差大,收敛慢。

软注意力求导:

image.png


注意力机制为什么能提高长句翻译的质量?

在传统的 Seq2Seq 中,编码器必须将整个输入句子(无论多长)压缩为一个固定尺寸的向量,再由此向量解码整个目标句。当源句很长时,信息必然被稀释或丢失。注意力机制在每个解码时间步都生成一个动态的上下文向量,只关注源句中最相关的部分,这带来了以下好处:

  • 直接访问局部信息:解码时,如生成某个目标词,模型可以直接“看”到源句中对应位置的单词(如源句的后半部分),而不受句子总长度的限制。

  • 绕过瓶颈:不需要在单个向量中保存所有信息,编码器所有时间步的隐藏状态都可被解码器直接使用。

  • 缓解梯度消失:解码器的梯度可以直接通过注意力权重路径传递给编码器相关的浅层时间步,缩短了反向传播路径。

  • 改善长句对齐:对于语序差异大的语言对,注意力能学到非单调的对齐,即使目标词对应的源词在很远处也能准确捕获。

实验结果(Bahdanau et al. 2015)显示,加入注意力后,翻译质量随句子长度增加而稳定或下降缓慢,而未加注意力的模型在长句上性能骤降。这证明了注意力在处理长序列上的有效性。


在解码时,注意力是如何实现“动态上下文向量”的?每一步的上下文都不同,这有什么好处?

实现机制

image.png

好处

  • 精准对齐:生成不同的目标词时,模型可以关注源句的不同部分。例如,翻译“He bought a car”时,生成“他”关注“He”,生成“买了”关注“bought”,生成“车”关注“car”。这种“选择性阅读”极大提高了正确性。

  • 信息解耦:每个输出步骤不需要携带所有源信息,上下文向量只包含当前最相关的特征,使得解码器可以专注于生成正确词,降低了学习难度。

  • 灵活处理变长序列:无论输入多长,注意力都能通过权重分布选出重点,不会因为序列拉长而稀释关键信息。

  • 可解释性:注意力权重可视化后,可以直观看到源和目标之间的对齐关系。

因此,动态上下文向量是 Seq2Seq 模型跨越“固定长度瓶颈”的关键创新。


多头注意力在序列模型中的应用,与标准注意力相比有何提升?

多头注意力(Multi-Head Attention) 最初在 Transformer 中提出,将查询、键、值通过 h 组不同的线性投影映射到多个子空间,在每个子空间独立计算点积注意力,然后将所有头的输出拼接并再投影。

与标准注意力的区别

  • 标准注意力:在一个表示空间中计算,只有一种相似度度量方式。

  • 多头注意力:在多个不同的表示子空间中并行计算,每个头可以关注不同的特征或位置关系。

提升

  1. 多维度信息提取:不同头可以学习不同类型的依赖关系,例如一个头关注句法依存,另一个头关注语义相关,第三个头关注位置距离。这增强了模型的表达能力。

  2. 联合处理不同位置:多个头允许模型同时关注来自不同位置的信息,不会因为混合在一起而模糊。比如,一个头专门捕获长距离依赖,另一个头捕获局部词组。

  3. 训练稳定且更高效:虽然总计算量类似,但多头后每个头的维度减小(dk=dmodel/hdk=dmodel/h),实际计算可以通过矩阵分块高效实现。

  4. 更好的泛化:实验表明,多头注意力在小到大规模任务上都一致优于单头注意力,尤其是对复杂序列任务(如机器翻译、语言模型)。

应用

在 Transformer 中,编码器的自注意力和解码器的交叉注意力都使用了多头注意力。在基于 LSTM 的 Seq2Seq 中,也可以加入多头注意力(如将编码器状态线性投影后,用多个头加权求和然后拼接),但不如 Transformer 那样普遍。多头注意力已成为现代深度序列模型的基础模块。


自注意力机制是如何应用于序列的?与 Seq2Seq 中的交叉注意力有何不同?

自注意力(Self-Attention)

image.png

输出序列的每一个位置都融合了整个序列的上下文信息。自注意力可以堆叠多层,使每个位置的表示通过逐层的全局交互不断丰富。

应用

  • 在编码器中:仅使用自注意力,将输入序列的所有词进行两两交互,得到上下文感知的表示。

  • 在解码器中:通常包含掩码自注意力(防止关注未来位置)和交叉注意力。

与交叉注意力(Cross-Attention)的不同

  • 输入来源 自注意力:Q,K,V 源自同一序列(编码器或解码器的自身隐藏状态)。 交叉注意力:Q 来自解码器(当前要生成的序列),KV 来自编码器(源序列)。

  • 目的 自注意力旨在捕获序列内部的词间依赖(语法、指代、修饰),构建更丰富的特征表示。 交叉注意力旨在将源序列信息注入到解码过程中,实现跨序列的对齐和信息融合。

  • 在 Seq2Seq 中的角色 Seq2Seq 的编码器可全部用自注意力(Transformer 编码器);解码器用掩码自注意力处理已生成序列,再用交叉注意力读取编码器输出。传统的 RNN Seq2Seq 没有自注意力,而是用循环状态捕获内部依赖。

总结:自注意力建模单个序列的内在结构,交叉注意力桥接两个序列。两者结合构成的 Transformer 完全替代了 RNN,实现了高效的并行计算和更优的长期依赖建模。


在自注意力中,如何计算 Q、K、V?为什么需要这三个投影?

Q、K、V 的计算

image.png

为什么需要这三个投影?

  • 查询和键:用于计算输入序列中每对位置之间的相似度/对齐分数。QK 实际上构成了一个“信息检索”系统:查询 Q 代表“我想要找什么”,键 K 代表“我有什么内容”。它们的点积度量匹配程度,生成注意力权重。

  • 值:携带实际要聚合的信息。根据查询-键匹配的权重,对 V 进行加权求和。V 可以与 K 相同,但通过不同的投影,网络可以解耦“用于比较的特征”(K)和“需要传递的特征”(V)。例如,K 可以关注位置或语义,V 则可以保留具体的单词信息。

  • 增强表达能力:若不投影(即直接使用原始输入作为 Q, K, V),模型就只能依赖原始特征空间的相似度,无法灵活变换。投影让模型学习到最适合对齐的子空间,不同头还可以学习不同的投影,提取不同类型的依赖。

image.png

一句话总结:Q、K、V 投影使得自注意力能够以可学习的方式灵活衡量输入序列自身各部分之间的关联,并据此选择性聚合信息,是实现上下文感知表示的核心机制。


在序列生成中,Top-k 采样和 Top-p(Nucleus)采样如何增加多样性?

传统解码的局限

在序列生成模型(如文本生成)中,贪心解码(每次选最高概率词)往往产生枯燥、重复、低多样性的文本。束搜索(Beam Search)在一定程度上能提升整体概率,但依然倾向于生成安全、常见但缺乏惊喜的序列。

Top-k 采样

  • 原理:在每个生成步骤,从概率最高的 k 个词中按归一化后的概率随机采样。概率分布被截断,排除了低概率的“尾部”词,避免模型选用完全不相关的词,同时通过随机性引入多样性。

  • 效果:相比于固定选取 argmax,Top-k 采样能够在保持一定连贯性的同时,产生更丰富多变的表达。

  • 缺点:k 是固定值,不随分布形状变化。对于平坦分布(很多词都有一点概率),k 可能太小而错失合理候选;对于尖锐分布(高概率词集中),k 可能又包含了一些极低概率的不合适词。

Top-p(核采样)

  • 原理:由 Holtzman et al. (2020) 提出。在每个时间步,从小到大累加概率值,选择累计概率刚好超过阈值 p(如 0.9)的最小候选集。候选词的数量是动态的。

image.png

  • 优势:自适应地调整候选集大小。当模型对下一个词很确定(分布尖锐)时,候选集小,保持准确性;当模型不确定(分布平坦)时,候选集扩大,增加多样性,同时仍过滤掉长尾的噪声。

  • 常见用法:结合温度采样(temperature scaling)进一步平滑或锐化分布,然后应用 Top-p 采样,已广泛用于 GPT 等模型的开放式文本生成。

总结:Top-k 是简单有效的截断采样,Top-p 则在它基础上实现了“自适应截断”,更好地平衡了连贯性与多样性,因此逐渐成为主流。


解释 Attention 中的“覆盖率”(Coverage)机制,它解决了什么问题?

解决的问题

在 Seq2Seq + 注意力的序列生成(如翻译、摘要)中,模型容易产生过翻译(某个源词被重复关注,生成多个对应词)或漏翻译(某些源词从未被充分关注)。这源于注意力没有记忆,每步独立计算,无法追踪已被翻译过的部分。

覆盖率机制(Tu et al., 2016)

引入覆盖率向量(coverage vector)来记录历史注意力的累积,并利用它来影响当前步的注意力,鼓励模型关注尚未充分覆盖的源位置,惩罚重复关注。

具体实现

  1. 维护一个覆盖率向量 ctct,它是过去所有时间步注意力权重之和:

image.png

  1. 覆盖率损失:额外增加一个正则项,惩罚注意力分配的不均匀。常用形式为:

image.png

对所有时间步求和,作为总损失的一部分。它会惩罚当前注意力与历史覆盖的“重叠”,从而显式地使注意力散开,避免重复关注同一位置。

效果

覆盖率机制显著减少了重复生成和漏词现象,在神经机器翻译(NMT)中提高了 BLEU 值,尤其对长句和需要准确对齐的语言对效果明显。


如何可视化 Seq2Seq 模型中的注意力权重?这对模型调试有什么帮助?

可视化方法

image.png

对调试的帮助

  • 检查对齐质量:对于翻译,良好的注意力应呈现近似单调的对角线模式(源词和目标词顺序大致对应),可见模型是否正确找到了对应的词。若热力图混乱或发散,说明注意力训练不佳。

  • 发现过翻译或漏翻译:若某源词对应的列持续高亮(覆盖过度),或某列几乎全白(被忽略),可识别重复或遗漏。

  • 验证词对齐:将注意力与人工对齐对比,评估模型对短语、词序的捕捉能力。

  • 诊断模式崩溃:观察是否所有注意力都集中在少数位置(如句首句尾),有助于判断模型是否未充分利用源信息。

  • 提升可解释性:让开发者相信模型是基于合理的输入部分做出决策,而不会依赖虚假相关。

示例代码(伪):

plt.imshow(attn_weights, cmap='hot', interpolation='nearest')
plt.xticks(range(len(src_tokens)), src_tokens, rotation=90)
plt.yticks(range(len(tgt_tokens)), tgt_tokens)
plt.show()

Seq2Seq 模型如何实现多模态输入(如图像描述生成)?

图像描述生成是典型的多模态 Seq2Seq 任务,输入为图像,输出为描述文本。

架构

将 Seq2Seq 的编码器替换为卷积神经网络(CNN),解码器仍为 RNN。整体分为:

  1. 图像编码器:使用预训练的 CNN(如 VGG、ResNet、Inception)提取图像特征,通常取全连接层之前的特征图(H×W×D)或最终的全连接向量。对于简单的 Show and Tell 模型,直接用 CNN 最后一层隐藏状态经线性变换作为解码器的初始状态。

image.png

  1. 加入注意力:Show, Attend and Tell 模型进一步使用空间特征图(比如 14×14×512)作为编码器状态,解码器每一步用注意力动态加权求和这些位置的特征向量,得到当前步的上下文向量。这使模型在生成每个词时,能关注图像的对应区域(如生成“狗”时关注图像中的狗)。注意力计算类似于标准的 Bahdanau 注意力,只是查询为解码器状态,键和值为图像区域特征。

训练

最小化生成文本的负对数似然,通常使用 Teacher Forcing。损失为交叉熵。

其他多模态 Seq2Seq 变体

  • 视频描述:编码器用 3D CNN 或时序模型提取特征序列,再用注意力解码器。

  • 语音识别:编码器为声学模型(RNN/CNN),解码器输出文字。 核心都是保持编码器-解码器-注意力框架,仅改变编码器的输入模态和结构。


能否使用双向 Encoder 和单向 Decoder?为什么通常这样设计?

可以,且这是标准设计。绝大多数 Seq2Seq 模型(RNN 或 Transformer)均采用双向/无掩码编码器和单向/因果掩码解码器。

原因

  • 编码器需要完整上下文:编码器的目标是理解整个输入序列,双向建模能同时捕捉前向和后向的信息,对每个位置生成更丰富的语义表示。这对于机器翻译中的词义消歧、句子结构解析至关重要。

  • 解码器必须保持自回归的因果性:解码器在训练和推理时都是逐词生成的,当前时刻不能看到未来词。因此,解码器的自注意力或循环状态必须是单向的(或带掩码的),以确保不泄露后续目标词,训练时也使用 Teacher Forcing 和掩码。

  • 如果解码器也用双向,训练时会看到全部目标序列,导致信息泄露,推理时没有未来信息可用,造成训练-推理不一致(曝光偏差外,还有信息利用方式的不同),模型无法正常工作。

特殊例外:某些非自回归生成模型(如掩码语言模型式的生成、迭代精炼)可以在解码器中使用双向注意力,但这是截然不同的生成范式。

因此,双向 Encoder + 单向 Decoder 的搭配是 Seq2Seq 的自然且最优的设计,兼顾了源端的充分理解和目标端的自回归约束。


在机器翻译中,如何处理低频词?BPE 与 Seq2Seq 如何结合?

低频词的挑战

词汇表过大会导致 softmax 计算量大且参数多,过小则产生大量 OOV(未登录词)。低频词单独作为 token 难以学到好的词向量,且容易造成稀疏问题。

子词分割方法 BPE(Byte Pair Encoding)

BPE 通过迭代合并语料中最常出现的字符对(或子词对)来构建子词词表。流程:

  1. 准备初始词表(所有字符)。

  2. 统计训练语料中所有符号对的共现频率,合并频率最高的一对,将其作为新符号加入词表。

  3. 重复直到达到预设的词表大小。 这样,单词被切分为高频子词单元,如 “low” → “low”,但 “lower” 可能变成 “low @@er” (或 “low” “er”),其中 @@ 表示子词连接。BPE 能有效共享子词,罕见词可通过已知子词组合表示,几乎消除 OOV。

BPE 与 Seq2Seq 结合

  • 在数据预处理阶段,分别或联合对源语言和目标语言进行 BPE 学习,将文本全部切分为子词序列(例如使用 SentencePiece 或 Subword-NMT)。

  • 构建词表时,子词单元数量可控(通常几千到几万)。编码器/解码器的嵌入矩阵和输出投影层大小对应子词词表。

  • 训练时,输入和目标都是子词序列,模型学习预测下一个子词。

  • 推理时,解码器生成子词序列,然后通过去除特殊连接符(如 @@ 空格)还原成正常单词。

其他方法:WordPiece(用于 BERT)、Unigram Language Model(SentencePiece 的另一种模式)等。子词化已成为现代 NMT 和预训练模型的标准。


什么是基于注意力机制的指针网络(Pointer Network)?它适用于什么任务?

指针网络 (Pointer Network, Vinyals et al., 2015) 指针网络是 Seq2Seq 模型的变体,其输出不是从固定词表中选择,而是从输入序列中的元素中挑选。它利用注意力机制来生成一个指向输入位置的概率分布,输出类别数等于输入序列长度(可变)。 数学上,解码器第 tt 步的输出概率分布为:

image.png

适用任务

  • 输出集合来自于输入:任务要求输出是输入的一个排列或子集。

  • 经典应用:

  • 旅行商问题(TSP):输入为城市坐标序列,输出为访问城市的顺序(一个排列)。
  • 凸包问题、Delaunay 三角剖分。
  • 排序问题。
  • 自然语言处理中的抽取式摘要(直接从原文抽取句子)、指代消解(指出先行词在文本中的位置)、阅读理解的答案抽取。
  • 需要从源端精确复制罕见词或实体时,常与生成式指针混合使用。

指针网络的参数数量不随输入长度变化,对组合优化问题有很好的泛化能力,但输出严格来源于输入,不能生成新词。