Seq2Seq模型概述
Seq2Seq(Sequence-to-Sequence)是一种基于深度学习的序列生成模型,主要用于处理输入和输出均为序列的任务,如机器翻译、文本摘要、对话生成等。其核心思想是将可变长度的输入序列映射为另一个可变长度的输出序列。
核心结构
Seq2Seq模型通常由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器将输入序列压缩为一个固定长度的上下文向量(Context Vector),解码器根据该向量逐步生成输出序列。
- 编码器:通常是一个循环神经网络(RNN),如LSTM或GRU,逐时间步处理输入序列,最终隐藏状态作为上下文向量。
- 解码器:另一个RNN,以编码器的上下文向量为初始状态,逐步生成输出序列的每个元素。
注意力机制
传统Seq2Seq的瓶颈在于上下文向量的固定长度限制了模型处理长序列的能力。注意力机制(Attention)通过动态分配权重解决这一问题:
- 解码器在每一步生成时,会关注编码器所有时间步的隐藏状态,而非仅依赖单一上下文向量。
- 注意力权重计算通常采用点积、加性或乘性方式,例如:
其中,为编码器隐藏状态,
为解码器隐藏状态,
、
、
为可学习参数。
典型应用场景
- 机器翻译:输入源语言句子,输出目标语言句子。
- 文本摘要:输入长文本,输出概括性短文本。
- 语音识别:输入音频特征序列,输出文本序列。
- 对话系统:输入用户语句,生成系统回复。
改进与变体
- Transformer:完全基于自注意力机制的架构,摒弃RNN结构,提升并行计算能力。
- 指针网络(Pointer Networks):解决输出词汇来自输入序列的任务,如抽取式摘要。
- 双向编码器:结合正向和反向RNN,增强上下文理解能力。
代码示例(PyTorch实现片段)
import torch
import torch.nn as nnclass Seq2Seq(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super().__init__()self.encoder = nn.LSTM(input_dim, hidden_dim)self.decoder = nn.LSTM(hidden_dim, hidden_dim)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, src, trg):# 编码器处理输入_, (hidden, cell) = self.encoder(src)# 解码器逐步生成outputs = []for t in range(trg.shape[0]):out, (hidden, cell) = self.decoder(trg[t].unsqueeze(0), (hidden, cell))outputs.append(self.fc(out.squeeze(0)))return torch.stack(outputs)
挑战与局限性
- 长序列依赖:尽管注意力机制有所改善,超长序列仍可能导致性能下降。
- 曝光偏差(Exposure Bias):训练时使用真实标签,推理时依赖模型自身预测,累积误差可能放大。
- 计算效率:RNN的串行特性限制了训练速度,部分场景需改用Transformer等架构。