title: 编码器-解码器模型

编码器-解码器模型

编码器-解码器(Encoder-Decoder)架构是seq2seq任务的基础框架,通过将输入序列编码为上下文向量,然后解码生成目标序列,为机器翻译、文本摘要等任务提供了有力支持。

概念与架构

编码器-解码器模型设计用于处理序列到序列(Sequence-to-Sequence,简称seq2seq)任务,这类任务需要将一个序列转换为另一个可能长度不同的序列。

编码器-解码器架构包含两个主要组件:

  • 编码器(Encoder):将输入序列压缩为固定长度的上下文向量(context vector)
  • 解码器(Decoder):基于上下文向量生成目标序列

编码器-解码器结构

工作原理

  1. 编码阶段:编码器逐步处理输入序列中的每个元素,并更新其隐藏状态。处理完整个序列后,最终的隐藏状态被用作上下文向量。

  2. 解码阶段:解码器接收上下文向量作为初始隐藏状态,然后递归地生成输出序列中的每个元素。每一步,它使用先前生成的元素和当前隐藏状态来预测下一个元素。

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任务:

应用场景输入输出示例
机器翻译源语言文本目标语言文本英文→中文
文本摘要长文本摘要新闻→标题
问答系统问题答案知识库查询
对话生成对话历史回复聊天机器人

局限性

尽管编码器-解码器模型取得了显著成功,但仍存在一些主要局限性:

  1. 信息瓶颈:固定长度的上下文向量难以捕获长序列中的所有信息
  2. 梯度消失问题:在处理长序列时,远距离依赖关系难以学习
  3. 顺序解码限制:自回归解码过程限制了生成效率

"编码器-解码器架构建立了序列转换的基础框架,但其最大的瓶颈是将整个序列压缩为固定向量,这在长序列任务中表现不佳。" —— Yoshua Bengio

改进方向

为解决上述问题,研究者提出了多种改进方案:

  1. 注意力机制:允许解码器关注输入序列的不同部分,缓解信息瓶颈
  2. Transformer架构:完全基于注意力机制的架构,解决了RNN的顺序处理限制
  3. 预训练模型:如BART和T5,将编码器-解码器框架与预训练范式结合

小结

编码器-解码器架构为处理序列转换任务奠定了基础,尽管存在局限性,但其核心思想仍然影响着现代语言模型的设计。Transformer的出现通过注意力机制解决了传统编码器-解码器模型的主要问题,开创了NLP领域的新时代。