Sequence-to-Sequence Models
序列到序列 (seq2seq) 模型会将输入序列映射为长度不同的输出序列,常用于翻译、摘要或语音处理。
序列到序列 (seq2seq) 模型会将一个序列转换成另一个序列,且两个序列的长度可以不同,例如把英文句子翻译成法文、把长篇文章缩写成摘要,或把音频片段转换成转录文本。大多数模型采用编码器-解码器架构:编码器读取整个输入并生成内部表示,解码器则依据这些表示以及已经生成的词元,逐个生成输出词元。这种方法于 2014 年形成现代形态:Google 的 Sutskever、Vinyals 和 Le 发表了《使用神经网络进行序列到序列学习》,Cho 等人则为机器翻译介绍了RNN 编码器-解码器。自 2017 年以来,大多数 seq2seq 模型都基于 Transformer构建。
Seq2Seq 模型的工作原理#
在 2014 年的模型中,编码器长短期记忆 (LSTM)网络逐词读取源句子,并将其压缩为一个固定长度向量;解码器 LSTM 则将这个向量展开为译文。Sutskever 等人使用了四层 LSTM,发现颠倒源句中词语的顺序能让训练更容易,并在 WMT'14 英译法测试集上取得了 34.8 的 BLEU 分数。将每个句子压缩进一个向量会损害长输入的效果,因此 Bahdanau、Cho 和 Bengio 在《通过联合学习对齐与翻译实现神经机器翻译》中加入了注意力机制,让解码器在每一步都能回看编码器的所有状态。Transformer 保留了这种编码器-解码器布局,用自注意力取代循环结构,并通过交叉注意力连接两部分。推理时,解码器会循环运行:
解码器输出结束词元时循环便会停止,因此输出长度会针对每个样本单独学习。解码通常会使用束搜索保留多个候选输出,这是机器翻译和语音识别的标准选择。
使用教师强制进行训练#
训练期间,解码器不需要循环运行。使用教师强制时,解码器接收向右移动一个位置的正确目标序列,并在一次并行前向过程中预测所有下一个词元,同时使用因果掩码确保每个位置只能看到更早的目标词元。损失是预测结果与真实下一个词元之间的交叉熵。PyTorch的 nn.Transformer实现了原始的编码器-解码器架构:
import torch
from torch import nn
torch.manual_seed(0)
src_vocab, tgt_vocab, d_model = 1000, 800, 64
embed_src, embed_tgt = nn.Embedding(src_vocab, d_model), nn.Embedding(tgt_vocab, d_model)
model = nn.Transformer(d_model, nhead=4, num_encoder_layers=2, num_decoder_layers=2, batch_first=True)
to_logits = nn.Linear(d_model, tgt_vocab)
source = torch.randint(0, src_vocab, (1, 9)) # a 9-token source sentence
target = torch.randint(0, tgt_vocab, (1, 7)) # start token + a 6-token translation
# Teacher forcing: the decoder reads the correct previous tokens and predicts every next token in parallel
decoder_input, labels = target[:, :-1], target[:, 1:]
causal_mask = nn.Transformer.generate_square_subsequent_mask(decoder_input.size(1))
logits = to_logits(model(embed_src(source), embed_tgt(decoder_input), tgt_mask=causal_mask))
loss = nn.functional.cross_entropy(logits.flatten(0, 1), labels.flatten())
print(f"Source tokens: {source.shape[1]} -> decoder logits: {tuple(logits.shape)}")
print(f"Training loss: {loss.item():.2f}")它会打印 Source tokens: 9 -> decoder logits: (1, 6, 800):针对目标词表中的 800 个词元,对 6 个目标位置分别进行预测;这些预测根据 9 个词元的源序列一次性计算得出。未训练模型的损失为 6.73,接近 ln(800) ≈ 6.68,也就是均匀猜测的损失。训练时总是输入正确的先前词元,而推理时输入的是模型自己的猜测,因此错误可能会在推理时逐步累积,这种现象称为暴露偏差。
Seq2Seq 与相关架构的比较#
- 仅编码器模型,例如 BERT:这类模型会双向读取输入,并为每个词元输出一个表示,适用于分类和标注。
- 仅解码器大型语言模型 (LLM):GPT 等模型将输入和输出放在同一个序列中,并通过续写提示来处理 seq2seq 任务;如今大多数文本生成都采用这种方式。
- 循环神经网络 (RNN)和 GRU:循环层用于 2014 年原始编码器和解码器的内部。Cho 等人在介绍编码器-解码器的同一篇论文中提出了门控循环单元。
应用场景#
Google 于 2016 年将 Google Translate 迁移到 GNMT系统,该系统采用 8 层 LSTM 编码器和解码器,并使用注意力机制;翻译仍是 seq2seq 最具代表性的任务。Google 的 T5将所有自然语言处理 (NLP)任务都视为文本到文本任务,包括文本摘要和问答。OpenAI 的 Whisper是用于语音识别的编码器-解码器 Transformer,使用 68 万小时音频进行训练。视觉模型也使用相同模式执行图像描述生成和光学字符识别 (OCR);Microsoft 的 Florence-2则通过一个 seq2seq 模型生成文本输出,完成图像描述、视觉定位和检测。Google 的 Pix2Seq将目标检测视为 seq2seq 任务,把每个物体表示为五个离散词元:四个量化坐标和一个类别。RT-DETR是百度开发、可在 Ultralytics 软件包中运行的实时检测器;它保留了编码器和交叉注意力解码器,但让解码器并行细化 300 个物体查询,因此所有边界框都能在一次处理中输出。










