title: 编码器-解码器模型
编码器-解码器模型
编码器-解码器(Encoder-Decoder)架构是seq2seq任务的基础框架,通过将输入序列编码为上下文向量,然后解码生成目标序列,为机器翻译、文本摘要等任务提供了有力支持。
概念与架构
编码器-解码器模型设计用于处理序列到序列(Sequence-to-Sequence,简称seq2seq)任务,这类任务需要将一个序列转换为另一个可能长度不同的序列。
编码器-解码器架构包含两个主要组件:
- 编码器(Encoder):将输入序列压缩为固定长度的上下文向量(context vector)
- 解码器(Decoder):基于上下文向量生成目标序列
工作原理
-
编码阶段:编码器逐步处理输入序列中的每个元素,并更新其隐藏状态。处理完整个序列后,最终的隐藏状态被用作上下文向量。
-
解码阶段:解码器接收上下文向量作为初始隐藏状态,然后递归地生成输出序列中的每个元素。每一步,它使用先前生成的元素和当前隐藏状态来预测下一个元素。
import torch
import torch.nn as nn
class EncoderRNN(nn.Module):
def __init__(self, input_size, hidden_size):
super(EncoderRNN, self).__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(input_size, hidden_size)
self.gru = nn.GRU(hidden_size, hidden_size)
def forward(self, input, hidden):
embedded = self.embedding(input).view(1, 1, -1)
output, hidden = self.gru(embedded, hidden)
return output, hidden
def init_hidden(self):
return torch.zeros(1, 1, self.hidden_size)
class DecoderRNN(nn.Module):
def __init__(self, hidden_size, output_size):
super(DecoderRNN, self).__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(output_size, hidden_size)
self.gru = nn.GRU(hidden_size, hidden_size)
self.out = nn.Linear(hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
output = self.embedding(input).view(1, 1, -1)
output, hidden = self.gru(output, hidden)
output = self.softmax(self.out(output[0]))
return output, hidden
应用场景
编码器-解码器架构广泛应用于多种NLP任务:
应用场景 | 输入 | 输出 | 示例 |
---|---|---|---|
机器翻译 | 源语言文本 | 目标语言文本 | 英文→中文 |
文本摘要 | 长文本 | 摘要 | 新闻→标题 |
问答系统 | 问题 | 答案 | 知识库查询 |
对话生成 | 对话历史 | 回复 | 聊天机器人 |
局限性
尽管编码器-解码器模型取得了显著成功,但仍存在一些主要局限性:
- 信息瓶颈:固定长度的上下文向量难以捕获长序列中的所有信息
- 梯度消失问题:在处理长序列时,远距离依赖关系难以学习
- 顺序解码限制:自回归解码过程限制了生成效率
"编码器-解码器架构建立了序列转换的基础框架,但其最大的瓶颈是将整个序列压缩为固定向量,这在长序列任务中表现不佳。" —— Yoshua Bengio
改进方向
为解决上述问题,研究者提出了多种改进方案:
- 注意力机制:允许解码器关注输入序列的不同部分,缓解信息瓶颈
- Transformer架构:完全基于注意力机制的架构,解决了RNN的顺序处理限制
- 预训练模型:如BART和T5,将编码器-解码器框架与预训练范式结合
小结
编码器-解码器架构为处理序列转换任务奠定了基础,尽管存在局限性,但其核心思想仍然影响着现代语言模型的设计。Transformer的出现通过注意力机制解决了传统编码器-解码器模型的主要问题,开创了NLP领域的新时代。