NLP学习笔记11:序列到序列模型——从 Encoder-Decoder 到 Attention

作者:Ye Shun
日期:2026-04-19

一、前言

在自然语言处理任务中,我们经常会遇到这样一类问题:

  • 输入是一段序列
  • 输出也是一段序列
  • 输入和输出的长度还不一定相同

例如:

  • 机器翻译:中文句子 → 英文句子
  • 文本摘要:长文本 → 短摘要
  • 对话生成:用户输入 → 系统回复
  • 问题生成:文章片段 → 问题

这类任务最经典的建模方式之一,就是序列到序列模型(Sequence-to-Sequence, Seq2Seq)

Seq2Seq 的核心思想非常直观:
先把输入序列“读懂”,再把它“写出来”。

也就是说:

  • 前半部分负责理解输入
  • 后半部分负责生成输出

这篇笔记将围绕以下几个问题展开:

  1. 什么是 Seq2Seq 模型
  2. 编码器和解码器分别在做什么
  3. 为什么基础 Seq2Seq 会遇到瓶颈
  4. Attention 是如何改进 Seq2Seq 的
  5. Seq2Seq 在机器翻译、摘要和对话中的典型应用
  6. 如何用代码实现一个最小 Seq2Seq 模型

二、什么是序列到序列模型

Seq2Seq 模型是一种把一个输入序列映射为另一个输出序列的神经网络架构。

它通常采用 Encoder-Decoder(编码器-解码器) 结构:

  • 编码器(Encoder):读取输入序列,并将其编码成内部表示
  • 解码器(Decoder):根据编码结果逐步生成输出序列
    在这里插入图片描述

如果以机器翻译为例:

  • 输入序列:我 喜欢 自然语言处理
  • 输出序列:I love natural language processing

这里输入和输出:

  • 长度不同
  • 词汇空间不同
  • 语序可能不同

因此,普通的分类模型并不适合,而 Seq2Seq 天然适合这种“序列到序列”的转换任务。

三、Seq2Seq 的基础架构

1. 编码器(Encoder)

编码器的任务是按顺序读取输入 token,并逐步更新隐藏状态。

在早期 Seq2Seq 模型中,编码器通常由:

  • RNN
  • LSTM
  • GRU

来实现。

假设输入序列为:

x1,x2,x3,...,xTx_1, x_2, x_3, ..., x_Tx1,x2,x3,...,xT

那么编码器在每个时间步都会更新隐藏状态:

ht=f(xt,ht−1)h_t = f(x_t, h_{t-1})ht=f(xt,ht1)

最终,最后一个隐藏状态会被视作整个输入序列的语义表示,也就是所谓的 上下文向量(context vector)

2. 解码器(Decoder)

解码器的任务是根据上下文向量,逐步生成输出序列:

y1,y2,y3,...,yNy_1, y_2, y_3, ..., y_Ny1,y2,y3,...,yN

解码器在每一步通常会接收:

  • 上一步生成的 token
  • 上一步的隐藏状态
  • 编码器提供的上下文信息

然后预测当前时刻最可能的输出 token。

3. 基本流程

一个标准的 Seq2Seq 工作过程如下:

  1. 编码器读取整个输入序列
  2. 得到上下文向量
  3. 解码器以该向量初始化状态
  4. 从起始标记 <SOS> 开始逐步生成输出
  5. 当生成结束标记 <EOS> 时停止

这就是最基础的 Encoder-Decoder 思路。

四、基础 Seq2Seq 的问题:固定长度上下文瓶颈

早期 Seq2Seq 最大的问题在于:
整个输入序列的信息,要被压缩进一个固定长度向量中。

这在短句上也许还行,但当输入很长时,就会出现明显问题:

  • 前面的信息容易被遗忘
  • 长距离依赖难以保留
  • 输入越长,压缩越困难

例如在长句翻译中,句尾的信息可能还能保留,但句首的细节很容易丢失。

这个问题通常被称为:

  • 信息瓶颈
  • 固定上下文向量问题

这也是为什么 Seq2Seq 很快引入了一个关键改进:Attention 机制

五、Attention 如何改进 Seq2Seq

Attention 的核心思想是:

解码器在生成每个输出词时,不必只依赖一个固定的上下文向量,而是可以动态地“回头看”输入序列中的不同位置。

也就是说,解码器在生成第 ttt 个词时,会对编码器所有隐藏状态:

h1,h2,...,hTh_1, h_2, ..., h_Th1,h2,...,hT

计算一组权重:

αt,1,αt,2,...,αt,T\alpha_{t,1}, \alpha_{t,2}, ..., \alpha_{t,T}αt,1,αt,2,...,αt,T

这些权重表示:

  • 当前输出更应该关注输入序列中的哪些位置

然后得到一个动态上下文向量:

ct=∑i=1Tαt,ihic_t = \sum_{i=1}^{T}\alpha_{t,i} h_ict=i=1Tαt,ihi

这样带来的好处非常明显:

  • 不再只依赖单个固定向量
  • 长句性能显著提升
  • 模型更容易建立输入和输出之间的对齐关系

例如在机器翻译中,当模型生成“processing”时,它可以重点关注中文中的“处理”。

六、Seq2Seq 中常见的关键技术

1. Teacher Forcing

在训练解码器时,常用 Teacher Forcing(教师强制) 技术。

它的做法是:

  • 训练时,把真实的上一个输出词作为当前步输入
  • 而不是把模型自己预测的词再喂回去

好处是训练更稳定、收敛更快。

但也会带来一个问题:

  • 训练时看到的是真实历史
  • 测试时只能依赖自己生成的历史

这会造成 训练与推理不一致,也叫 曝光偏差(Exposure Bias)

2. Greedy Search 与 Beam Search

在生成时,最简单的方法是:

  • 每一步都选概率最高的 token

这叫 贪心解码(Greedy Search)

但贪心策略并不一定能得到全局最优结果,因此常用 Beam Search

  • 同时保留多个候选序列
  • 每一步扩展这些候选
  • 最后选择整体概率更高的输出

Beam Search 往往可以显著提升机器翻译和摘要生成质量。

3. 双向编码器

为了更好地理解输入序列,编码器常常使用 双向 RNN(BiRNN / BiLSTM / BiGRU)

它会同时考虑:

  • 从左到右的上下文
  • 从右到左的上下文

从而让每个输入位置的表示更完整。

七、Seq2Seq 的典型应用场景

1. 机器翻译

机器翻译是 Seq2Seq 最经典的应用场景之一。

特点:

  • 输入输出都为文本序列
  • 两种语言长度不一致
  • 需要处理语义、语法和词序变化

常见改进包括:

  • Attention
  • 子词切分(BPE、WordPiece)
  • Beam Search
  • Transformer 编码器-解码器

2. 文本摘要

文本摘要中的生成式摘要,本质上也是 Seq2Seq:

  • 输入:原文
  • 输出:摘要

与翻译不同的是,摘要要求模型:

  • 压缩信息
  • 保留核心内容
  • 避免重复

因此常见扩展包括:

  • Pointer-Generator(指针生成网络)
  • Coverage Mechanism(覆盖机制)

3. 对话生成

对话系统中,模型需要根据用户输入生成回复:

  • 输入:当前对话上下文
  • 输出:回复文本

这同样属于 Seq2Seq 范式。

不过对话生成比翻译更难,因为它通常:

  • 开放性更强
  • 标准答案不唯一
  • 更容易生成空泛回答,如“好的”“我明白了”

因此很多对话系统会加入:

  • 人设信息
  • 对话状态
  • 情感控制
  • 检索增强

八、Seq2Seq 与 Transformer 的关系

很多初学者会误以为:

  • Seq2Seq 是一种具体模型
  • Transformer 是另一种完全不同的东西

其实更准确地说:

  • Seq2Seq 是任务建模范式
  • Transformer 是实现 Seq2Seq 的一种更强架构

早期 Seq2Seq 常用:

  • RNN 编码器
  • RNN 解码器

后来发展为:

  • Attention-based Seq2Seq
  • Transformer Encoder-Decoder

因此,Transformer 可以看作是 Seq2Seq 思想在注意力框架下的现代化实现

例如:

  • 原始机器翻译模型:RNN Seq2Seq
  • 现代翻译模型:Transformer Seq2Seq
  • T5:典型的文本到文本 Seq2Seq Transformer

九、Seq2Seq 的训练与评估

1. 训练步骤

Seq2Seq 的训练通常包括以下流程:

  1. 构造输入序列和目标序列
  2. 对文本进行 tokenization
  3. 构建词表或子词表
  4. 编码器得到输入表示
  5. 解码器逐步预测输出
  6. 使用交叉熵损失计算误差
  7. 反向传播更新参数

2. 常见评估指标

不同任务会使用不同指标:

任务 常见指标
机器翻译 BLEU
文本摘要 ROUGE
对话生成 BLEU、Distinct、人工评估

需要注意的是,生成任务仅靠自动指标往往不够,因此人工评估仍然很重要。

十、一个最小 Seq2Seq 模型应该包含什么

如果我们要自己写一个最小可理解版 Seq2Seq,通常需要这些组件:

  • 输入嵌入层 Embedding
  • 编码器 Encoder
  • 注意力模块 Attention
  • 解码器 Decoder
  • 输出层 Linear

如果是训练模式,还需要:

  • <SOS> 起始标记
  • <EOS> 结束标记
  • Teacher Forcing

下面是一个极简示意:

class Seq2Seq(nn.Module):
    def __init__(self, encoder, decoder):
        super().__init__()
        self.encoder = encoder
        self.decoder = decoder

    def forward(self, src, tgt):
        encoder_outputs, hidden = self.encoder(src)
        outputs = self.decoder(tgt, hidden, encoder_outputs)
        return outputs

真正可用的版本还会进一步处理:

  • mask
  • padding
  • batch
  • beam search
  • attention weights

十一、实践理解:为什么 Seq2Seq 很重要

Seq2Seq 的意义不只是“能做翻译”。

更重要的是,它建立了一种统一视角:

  • 把很多 NLP 任务都看成“输入文本序列 → 输出文本序列”

这个思路后来影响了很多模型设计,例如:

  • 机器翻译
  • 摘要生成
  • 问答生成
  • 语法纠错
  • 文本改写
  • T5 的 Text-to-Text 范式

也就是说,Seq2Seq 不只是一个早期模型,而是一种非常核心的建模思想。

十二、总结

Seq2Seq 模型是自然语言处理中非常重要的一类架构,它的核心思想可以概括为:

  • 用编码器理解输入序列
  • 用解码器生成输出序列
  • 用 Attention 改善长序列建模能力

它的发展路径大致是:

  1. 基础 RNN Seq2Seq
  2. Attention-based Seq2Seq
  3. Transformer Seq2Seq

理解 Seq2Seq 的价值在于:

  • 它帮助我们真正理解“生成任务”是如何建模的
  • 它是理解机器翻译、摘要、对话系统和 T5 等模型的重要基础

如果说前面的 RNN、Attention、Transformer 是“零件”,
那么 Seq2Seq 就是在告诉我们:这些零件如何组合起来,完成一个从输入到输出的完整生成过程。

十三、参考学习方向

如果你想继续深入,可以接着学习这些主题:

  1. Bahdanau Attention 与 Luong Attention 的区别
  2. Beam Search 的具体实现
  3. Pointer-Generator 在摘要中的作用
  4. Transformer Encoder-Decoder 结构
  5. T5/BART 这类现代 Seq2Seq 预训练模型
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐