序列到序列模型:Encoder-Decoder架构、注意力机制的本质
点击“AladdinEdu你的AI学习实践工作坊”注册即送-H卡级别算力沉浸式云原生集成开发环境80G大显存多卡并行按量弹性计费教育用户更享超低价。1. 引言从分类到生成的范式跃迁在自然语言处理的早期发展阶段大多数任务被巧妙地转化为分类或序列标注问题情感分析是二分类或多分类命名实体识别是对每个词的标签分类词性标注亦然。这种范式虽然在特定任务上取得了成功却始终无法触及语言智能的核心——生成。人类使用语言不仅仅是给既定文本贴上标签更是不断地创造新的句子翻译一种语言为另一种语言、将长文提炼为摘要、根据对话上文生成恰当的回复。序列到序列Sequence-to-Sequence, Seq2Seq模型的诞生标志着NLP从“理解-分类”范式向“理解-生成”范式的重大跃迁。它提供了一个优雅的框架能够将任意长度的输入序列映射为任意长度的输出序列从而统一了机器翻译、文本摘要、对话生成、代码生成等一系列生成任务。Seq2Seq模型的核心架构是编码器-解码器Encoder-Decoder。编码器读取输入序列将其压缩为一个固定维度的上下文向量解码器则依据该向量逐词生成输出序列。这一设计简洁而强大但固定长度上下文向量的信息瓶颈迅速成为制约性能的阿喀琉斯之踵。注意力机制Attention Mechanism的出现如同为模型装上了可以自由审视输入序列的“眼睛”。它允许解码器在生成每一个词时动态地回顾输入序列的不同部分赋予不同的关注权重从而彻底打破了固定向量的信息束缚。注意力机制不仅是Seq2Seq模型的救赎更以其内在的“查询-键-值”Query-Key-Value抽象成为Transformer架构的理论基石引领了后续预训练大模型的浪潮。本文将对Seq2Seq模型和注意力机制进行一场深度解剖。我们将从Encoder-Decoder的基本数学形式出发推导其训练与推理过程剖析信息瓶颈的本质引出注意力机制的设计动机我们将重点阐释注意力机制的QKV抽象揭示其作为“软寻址”操作的本质进而梳理注意力机制的变体——从全局注意力到局部注意力从交叉注意力到自注意力最后我们将以Transformer中的自注意力和多头注意力为例展示注意力思想如何重塑了整个NLP领域。全文将贯穿数学推导与PyTorch代码示例力求为读者呈现一幅从Seq2Seq到Transformer的连续技术演进图景。2. Encoder-Decoder架构序列映射的基本范式2.1 问题形式化Seq2Seq模型处理的是序列到序列的映射问题给定输入序列 (\mathbf{x} (x_1, x_2, \dots, x_{T_x}))生成输出序列 (\mathbf{y} (y_1, y_2, \dots, y_{T_y}))。注意(T_x) 和 (T_y) 可以不同且输入和输出的词汇表也通常不同如翻译任务。模型需要建模条件概率 (P(\mathbf{y} \mid \mathbf{x}))。由于 (\mathbf{y}) 是变长序列通常将其分解为有序的条件概率乘积自回归方式[P(\mathbf{y} \mid \mathbf{x}) \prod_{t1}^{T_y} P(y_t \mid y_1, \dots, y_{t-1}, \mathbf{x})]Seq2Seq模型使用编码器和解码器来参数化这一条件概率。2.2 编码器将输入序列压缩为上下文向量编码器的任务是将变长的输入序列编码为一个固定长度的上下文向量Context Vector(\mathbf{c})该向量理论上包含了输入序列的全部语义信息。编码器通常由循环神经网络RNN、LSTM或GRU实现。以LSTM为例编码器按时间步依次读入输入序列的词嵌入 (\mathbf{e}(x_t))更新隐藏状态[\mathbf{h}t^{\text{enc}} \text{LSTM}{\text{enc}}(\mathbf{e}(x_t), \mathbf{h}_{t-1}^{\text{enc}})]输入完毕后上下文向量 (\mathbf{c}) 通常取最后一个时间步的隐藏状态或细胞状态或二者的组合[\mathbf{c} \mathbf{h}_{T_x}^{\text{enc}}]如果是双向LSTM则 (\mathbf{h}_{T_x}^{\text{enc}}) 通常为前向和后向最后隐藏状态的拼接。2.3 解码器从上下文向量生成输出序列解码器同样是RNN但其初始状态由上下文向量 (\mathbf{c}) 初始化。在训练阶段解码器以“教师强制”Teacher Forcing方式接收前一个真实目标词作为输入预测当前目标词的概率分布[\mathbf{s}t^{\text{dec}} \text{LSTM}{\text{dec}}(\mathbf{e}(y_{t-1}), \mathbf{s}{t-1}^{\text{dec}}, \mathbf{c})][P(y_t \mid y{t}, \mathbf{x}) \text{softmax}(\mathbf{W}_o \mathbf{s}_t^{\text{dec}} \mathbf{b}_o)]其中 (\mathbf{s}_0^{\text{dec}} \mathbf{c})或经过一个线性变换。损失函数为每个时间步的交叉熵之和。2.4 推理阶段的束搜索Beam Search在推理生成时模型需要自回归地生成序列无法使用教师强制。贪心解码每步选概率最大的词易陷入局部最优束搜索则在每一步保留 (B) 个最优的候选序列Beam以在搜索空间和计算开销之间取得平衡。束搜索不是本文重点但它是Seq2Seq模型完整工作流中不可或缺的环节。2.5 信息瓶颈固定长度上下文向量的致命缺陷Encoder-Decoder架构看似完美却隐含着一个致命假设整个输入序列的语义可以被无损地压缩为一个固定长度的向量 (\mathbf{c})。对于短句子这或许可行但对于长句子或需要细粒度对齐的任务单一向量不可避免地成为信息瓶颈。考虑一个极端例子将一段长达百词的英文段落翻译为中文。编码器LSTM的最后一个隐藏状态需要“记住”段落中所有人名、数字、时态、语态、修饰关系。实验表明随着输入序列长度增加基础Seq2Seq模型的性能以BLEU值衡量急剧下降尤其是在长句子上。解码器在生成每个词时只能依赖一个全局的、静态的上下文向量。它无法在生成“bank”时特别关注输入中的“river”或“money”因为在上下文向量中这些信息已经被混合压缩在一起。模型迫切需要一种机制能够根据解码器的当前状态动态地选择输入序列的相关部分。这种机制就是注意力。3. 注意力机制解码器的“可聚焦眼睛”3.1 生物学隐喻与直觉“注意力”一词源于人类视觉系统的工作方式我们无法同时处理视野中的所有细节而是根据当前任务将有限的认知资源聚焦于特定的区域。当阅读一段文字时目光会依次扫过关键词语当翻译一个词时译者会反复参考源语言中的相关片段。在Seq2Seq框架中注意力机制允许解码器在生成每一个目标词时“回顾”输入序列的所有隐藏状态并计算一个权重分布表示当前时刻对每个输入位置的关注程度。然后用这个权重对输入隐藏状态进行加权求和得到一个动态的上下文向量专门服务于当前词的生成。3.2 全局注意力Global Attention的数学定义Bahdanau等人2015首次将注意力机制引入神经机器翻译Luong等人2015进一步将其形式化并提出了多种变体。这里以Luong的全局注意力为例。设编码器在所有时间步的输出隐藏状态为 (\bar{\mathbf{h}}_1, \bar{\mathbf{h}}2, \dots, \bar{\mathbf{h}}{T_x})通常为双向LSTM的前后向拼接。在解码时间步 (t)解码器的隐藏状态为 (\mathbf{s}_t)。注意力机制执行以下三步第一步计算注意力分数Alignment Score对每个输入位置 (i 1, \dots, T_x)计算一个分数 (e_{t,i})表示解码器状态 (\mathbf{s}_t) 与编码器状态 (\bar{\mathbf{h}}_i) 的匹配程度[e_{t,i} \text{score}(\mathbf{s}_t, \bar{\mathbf{h}}_i)]常见的打分函数有三种Luong et al., 2015点积Dot(\text{score}(\mathbf{s}_t, \bar{\mathbf{h}}_i) \mathbf{s}_t^\top \bar{\mathbf{h}}_i)通用General(\text{score}(\mathbf{s}_t, \bar{\mathbf{h}}_i) \mathbf{s}_t^\top \mathbf{W}_a \bar{\mathbf{h}}_i)拼接Concat(\text{score}(\mathbf{s}_t, \bar{\mathbf{h}}_i) \mathbf{v}_a^\top \tanh(\mathbf{W}_a [\mathbf{s}_t; \bar{\mathbf{h}}_i]))其中 (\mathbf{W}_a) 和 (\mathbf{v}_a) 是可训练参数。第二步计算注意力权重Attention Weights将分数向量通过softmax归一化得到概率分布 (\boldsymbol{\alpha}t (\alpha{t,1}, \dots, \alpha_{t,T_x}))[\alpha_{t,i} \frac{\exp(e_{t,i})}{\sum_{j1}^{T_x} \exp(e_{t,j})}](\alpha_{t,i}) 解释为在生成第 (t) 个目标词时输入位置 (i) 的重要性权重。第三步计算动态上下文向量Context Vector用权重 (\boldsymbol{\alpha}_t) 对编码器状态进行加权求和得到当前时刻的上下文向量 (\mathbf{c}_t)[\mathbf{c}t \sum{i1}^{T_x} \alpha_{t,i} \bar{\mathbf{h}}_i]最后将 (\mathbf{c}_t) 与解码器状态 (\mathbf{s}_t) 拼接或相加通过全连接层和softmax产生目标词概率分布[\tilde{\mathbf{s}}_t \tanh(\mathbf{W}_c [\mathbf{c}_t; \mathbf{s}t])][P(y_t \mid y{t}, \mathbf{x}) \text{softmax}(\mathbf{W}_o \tilde{\mathbf{s}}_t \mathbf{b}_o)]3.3 注意力机制的直观效果注意力机制的引入使模型性能实现了巨大飞跃。在长句翻译上带有注意力的Seq2Seq模型能够保持较高的BLEU值不再随输入长度增加而显著衰减。更令人兴奋的是注意力权重 (\boldsymbol{\alpha}_t) 具有极强的可解释性通过可视化权重矩阵我们可以清晰地看到源语言和目标语言之间的词对齐关系即便模型从未被显式教过对齐。3.4 局部注意力与自适应的窗口全局注意力需要为每一个目标词计算对所有输入位置的权重复杂度为 (O(T_x \cdot T_y))。对于极长的输入序列如整篇文档摘要这一计算量可能过大。局部注意力Luong et al., 2015提出在生成目标词时先预测一个输入序列上的对齐中心位置 (p_t)然后仅在一个窗口 ([p_t - D, p_t D]) 内计算注意力权重。这既降低了计算量又在长序列任务中避免了注意力过于分散的问题。预测对齐位置 (p_t) 的方式可以是通过一个简单的前馈网络基于 (\mathbf{s}_t) 进行预测或者使用单调对齐假设如语音识别中输入和输出序列大致单调对应。4. 注意力机制的本质查询-键-值的软寻址4.1 QKV抽象的统一视角注意力机制看似复杂但若用**查询-键-值Query-Key-Value, QKV**框架重新诠释其本质将变得异常清晰。这一抽象由Vaswani等人在Transformer论文中正式化但同样适用于描述RNN中的注意力。将注意力操作视为一个**软寻址Soft Addressing**过程查询Query(\mathbf{q})表示“当前需要什么信息”。在Seq2Seq中查询就是解码器的当前状态 (\mathbf{s}_t)。键Key(\mathbf{k}_i)表示输入序列中每个位置的“索引标签”或“内容摘要”。在Seq2Seq中键就是编码器隐藏状态 (\bar{\mathbf{h}}_i)。值Value(\mathbf{v}_i)表示输入序列中每个位置实际存储的“内容”。在Seq2Seq中值通常与键相同即 (\bar{\mathbf{h}}_i)。注意力过程分为两步计算查询与所有键的匹配度(\text{score}(\mathbf{q}, \mathbf{k}_i))作为“该值被取出的概率”的对数。用归一化后的匹配度作为权重对值进行加权求和得到最终的读出内容。用数学公式表达即[\text{Attention}(\mathbf{q}, \mathbf{K}, \mathbf{V}) \sum_{i} \frac{\exp(\text{score}(\mathbf{q}, \mathbf{k}_i))}{\sum_j \exp(\text{score}(\mathbf{q}, \mathbf{k}_j))} \mathbf{v}_i]在Transformer中打分函数固定为缩放点积Scaled Dot-Product[\text{score}(\mathbf{q}, \mathbf{k}_i) \frac{\mathbf{q}^\top \mathbf{k}_i}{\sqrt{d_k}}]其中 (d_k) 是键向量的维度。除以 (\sqrt{d_k}) 是为了防止点积值过大导致softmax进入梯度饱和区。4.2 注意力作为软检索的类比将注意力机制类比为数据库检索你有一个键-值存储键是书的标题值是书的内容。你提出一个查询“与机器学习相关的书”。系统计算查询与每个键标题的相关性得分。系统不是返回单一最相关的书而是返回所有书的加权平均内容权重正比于相关性得分。这种“软”检索的特性使得整个操作可微从而可以通过反向传播端到端地训练。注意力权重 (\alpha_i) 成为了一个可解释的副产品展示了模型在做出决策时所依据的信息源。4.3 自注意力序列自身的内部交互将QKV抽象进一步泛化如果查询、键、值全部来自同一个序列会发生什么这就是自注意力Self-Attention也称为内部注意力Intra-Attention。在自注意力中输入序列的每个位置的表示被线性投影为查询、键、值三个向量[\mathbf{q}_i \mathbf{W}_Q \mathbf{x}_i, \quad \mathbf{k}_i \mathbf{W}_K \mathbf{x}_i, \quad \mathbf{v}_i \mathbf{W}_V \mathbf{x}_i]然后对于每个位置 (i)计算它对所有位置 (j)包括自身的注意力得到更新后的表示[\mathbf{z}i \sum{j} \alpha_{ij} \mathbf{v}j, \quad \alpha{ij} \text{softmax}_j\left(\frac{\mathbf{q}_i^\top \mathbf{k}_j}{\sqrt{d_k}}\right)]自注意力的魅力在于它使序列中的每个元素都能够直接与序列中的任何其他元素交互无需通过RNN的逐步传递。这既解决了长距离依赖问题又为并行计算打开了大门。4.4 多头注意力集成多个注意力子空间单一的注意力头可能只捕捉一种类型的依赖关系如主谓关系。多头注意力Multi-Head Attention通过并行运行多个独立的注意力头每个头拥有自己的投影矩阵 (\mathbf{W}_Q^h, \mathbf{W}_K^h, \mathbf{W}_V^h)然后将各头输出拼接并再次投影[\text{MultiHead}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) \text{Concat}(\text{head}_1, \dots, \text{head}_H) \mathbf{W}_O][\text{head}_h \text{Attention}(\mathbf{Q}\mathbf{W}_Q^h, \mathbf{K}\mathbf{W}_K^h, \mathbf{V}\mathbf{W}_V^h)]多头注意力赋予模型从不同表示子空间共同关注信息的能力显著增强了表示容量。5. 从注意力到Transformer架构演进5.1 为什么需要Transformer尽管带有注意力的Seq2Seq模型取得了成功其编码器和解码器仍依赖于RNN。RNN的顺序计算本质带来了两个问题无法并行化训练时时间步必须按顺序计算无法充分利用GPU的并行能力。长距离梯度路径依然曲折尽管注意力在编码器和解码器之间架起了直通桥但RNN内部的信息传递仍需经过多个时间步。TransformerVaswani et al., 2017的提出彻底抛弃了RNN完全基于注意力机制构建序列编码器和解码器。它的核心创新包括自注意力作为主要编码工具取代RNN的循环连接。位置编码为弥补注意力机制本身对位置不敏感的缺陷。残差连接与层归一化保障深层网络的稳定训练。5.2 Transformer中的三种注意力Transformer架构中注意力机制以三种形态出现编码器自注意力编码器中的每一层输入序列的每个位置关注所有位置以生成上下文感知的表示。查询、键、值均来自编码器前一层的输出。解码器掩码自注意力解码器中为确保自回归生成的因果性未来位置的信息被屏蔽Masked即计算权重时强制将 (j i) 的分数设为 (-\infty)。编码器-解码器交叉注意力解码器每一层在自注意力之后会执行一次交叉注意力。其中查询来自解码器键和值来自编码器的最终输出。这正是经典Seq2Seq注意力机制的Transformer版本。5.3 位置编码赋予注意力以时序感自注意力对输入序列的任何排列都是等变的Permutation Equivariant即它本身不感知词序。为了注入位置信息Transformer在输入端将词嵌入与**位置编码Positional Encoding**相加。原始Transformer使用正弦/余弦函数生成确定性的位置编码[PE_{(pos, 2i)} \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)][PE_{(pos, 2i1)} \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)]后续工作如BERT使用了可学习的位置嵌入。无论哪种形式位置编码都是Transformer能够理解词序的关键。5.4 代码示例缩放点积注意力实现importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimportmathdefscaled_dot_product_attention(Q,K,V,maskNone): Q: (batch_size, num_heads, seq_len_q, d_k) K: (batch_size, num_heads, seq_len_k, d_k) V: (batch_size, num_heads, seq_len_v, d_v) mask: (batch_size, 1, seq_len_q, seq_len_k) or broadcastable d_kQ.size(-1)# 计算注意力分数scorestorch.matmul(Q,K.transpose(-2,-1))/math.sqrt(d_k)# 应用掩码如padding掩码或未来掩码ifmaskisnotNone:scoresscores.masked_fill(mask0,-1e9)# 权重attn_weightsF.softmax(scores,dim-1)# 加权和outputtorch.matmul(attn_weights,V)returnoutput,attn_weightsclassMultiHeadAttention(nn.Module):def__init__(self,d_model,num_heads):super().__init__()assertd_model%num_heads0self.d_kd_model//num_heads self.num_headsnum_heads self.W_Qnn.Linear(d_model,d_model)self.W_Knn.Linear(d_model,d_model)self.W_Vnn.Linear(d_model,d_model)self.W_Onn.Linear(d_model,d_model)defforward(self,Q,K,V,maskNone):batch_sizeQ.size(0)# 线性投影并分割多头Qself.W_Q(Q).view(batch_size,-1,self.num_heads,self.d_k).transpose(1,2)Kself.W_K(K).view(batch_size,-1,self.num_heads,self.d_k).transpose(1,2)Vself.W_V(V).view(batch_size,-1,self.num_heads,self.d_k).transpose(1,2)# 缩放点积注意力attn_out,_scaled_dot_product_attention(Q,K,V,mask)# 合并多头并投影attn_outattn_out.transpose(1,2).contiguous().view(batch_size,-1,self.num_heads*self.d_k)returnself.W_O(attn_out)6. 注意力机制的变体与前沿6.1 稀疏注意力与线性注意力标准自注意力的复杂度为 (O(T^2))限制了其在超长序列上的应用。为此研究者提出了多种稀疏注意力变体滑动窗口注意力每个位置只关注附近固定窗口内的位置如Longformer。空洞注意力间隔采样扩大感受野如Sparse Transformer。低秩投影注意力通过将Q、K投影到低维空间将复杂度降为 (O(T))如Linformer。核方法与线性注意力利用核函数特性重写注意力公式避免显式计算 (T \times T) 矩阵如Performer。6.2 交叉注意力与多模态融合交叉注意力的QKV分别来自不同模态天然适合多模态任务。例如在图像描述生成中Q来自文本解码器K和V来自图像区域特征在视觉问答中Q来自问题文本K和V来自图像区域。交叉注意力已成为多模态融合的标准范式。6.3 注意力机制的局限性缺乏归纳偏置纯粹的注意力不包含任何卷积或循环的局部性、平移等变性先验需要大量数据才能学到这些规律。对位置编码的依赖位置信息完全由外加的位置编码提供对于需要精细时序建模的任务如语音可能不如RNN/CNN自然。可解释性的双刃剑虽然注意力权重提供了一定的可解释性但近年研究表明注意力权重与模型的真实决策依据并非总是一致存在“注意力假象”现象。7. 结语注意力即一切但一切并非仅注意力从Seq2Seq的固定上下文向量到Transformer的自注意力机制我们见证了NLP领域一次深刻的思想解放。注意力机制赋予了模型动态聚焦的能力使其摆脱了RNN的循环枷锁和固定向量的信息瓶颈开启了大规模并行训练和超长序列建模的新纪元。QKV的抽象将各种注意力变体统一在简洁的框架下展现了软寻址作为一种计算范式的普适性。Transformer及其自注意力已成为现代NLP的基石BERT、GPT、T5等预训练模型无不基于此构建。然而我们也应保持清醒注意力并非万能。在处理严格时序关系、需要强归纳偏置的领域RNN和CNN仍有其生命力在超长序列建模上稀疏和线性注意力仍是活跃的研究前沿。回顾Seq2Seq到Transformer的演进之路我们看到的不仅是技术的迭代更是对“序列信息如何被表示、传递和转换”这一根本问题的持续追问。理解Encoder-Decoder架构与注意力机制的本质就是掌握了打开当代NLP大门的钥匙。点击“AladdinEdu你的AI学习实践工作坊”注册即送-H卡级别算力沉浸式云原生集成开发环境80G大显存多卡并行按量弹性计费教育用户更享超低价。