1. 从零实现Seq2Seq机器翻译模型:原理与实战解析
在自然语言处理领域,序列到序列(Sequence to Sequence,简称Seq2Seq)模型是一种经典的架构,广泛应用于机器翻译、文本摘要、对话系统等任务。本文将基于PyTorch框架,从零开始构建一个完整的英译中Seq2Seq模型,并深入解析其核心原理与实现细节。
1.1 编码器-解码器架构解析
Seq2Seq模型的核心思想是编码器-解码器(Encoder-Decoder)架构。编码器将输入序列(如英文句子)编码为一个固定维度的上下文向量(context vector),解码器则基于该向量生成目标序列(如中文句子)。
这种架构特别适合处理输入输出长度不定的序列转换任务。在机器翻译场景中:
- 编码器接收英文单词序列作为输入
- 解码器输出对应的中文汉字序列
- 两个序列的长度通常不相同
关键理解:上下文向量本质上是输入序列的"语义摘要",它需要包含足够的信息供解码器生成正确的输出序列。
1.2 模型组件详解
1.2.1 编码器实现
我们使用GRU(Gated Recurrent Unit)作为编码器的核心组件。相比基础RNN,GRU通过门控机制更好地捕捉长距离依赖关系。
python复制class Seq2SeqEncoder(Encoder):
def __init__(self, vocab_size, embed_size, num_hiddens, num_layers, dropout=0):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_size)
self.rnn = nn.GRU(embed_size, num_hiddens, num_layers, dropout=dropout)
def forward(self, X):
# X形状: (batch_size, num_steps)
X = self.embedding(X) # (batch_size, num_steps, embed_size)
X = X.permute(1, 0, 2) # (num_steps, batch_size, embed_size)
output, state = self.rnn(X)
return output, state
编码器输出包含两个部分:
output:所有时间步的隐藏状态(形状:num_steps × batch_size × num_hiddens)state:最后一个时间步的隐藏状态(形状:num_layers × batch_size × num_hiddens)
1.2.2 解码器实现
解码器同样使用GRU结构,但在每个时间步会接收编码器的上
