1. 项目概述
在自然语言处理领域,机器翻译一直是一个经典且具有挑战性的任务。本文将从零开始,详细讲解如何使用PyTorch构建一个基于seq2seq架构的英汉翻译模型。这个项目不仅适合NLP初学者理解机器翻译的基本原理,也为有经验的开发者提供了一个可扩展的代码框架。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构解析
2.1 编码器-解码器架构
编码器-解码器(Encoder-Decoder)架构是处理序列到序列(seq2seq)任务的经典框架。在这个架构中:
- 编码器负责将输入序列(如英文句子)编码为一个固定维度的上下文向量(context vector)
- 解码器则根据这个上下文向量逐步生成输出序列(如中文句子)
这种架构特别适合机器翻译任务,因为它能够处理变长输入和输出的序列转换问题。
2.2 具体实现细节
在我们的实现中,编码器和解码器都使用GRU(Gated Recurrent Unit)作为基础单元。相比传统的RNN,GRU通过引入门控机制,能够更好地捕捉长距离依赖关系,同时计算效率也比LSTM更高。
编码器的输出包含两部分:
- 所有时间步的隐藏状态(output)
- 最后一个时间步的隐藏状态(h_n)
解码器的输入则是:
- 起始符(BOS)
- 编码器输出的隐藏状态
3. 数据准备与预处理
3.1 数据集介绍
我们使用的是来自http://www.manythings.org/anki/的cmn-eng.zip数据集。这个数据集包含大量中英文对照的句子对,格式如下:
code复制I try. 我试试。
I won! 我赢了。
Oh no! 不会吧。
由于计算资源限制(使用NVIDIA RTX 3060 12GB显卡),我们只使用前2000条数据进行训练和测试。
3.2 文本预处理流程
- 读取数据:从文件中读取原始文本,提取中英文句子对
- 分词处理:将英文句子按空格分词,中文句子按字符分割
- 构建词表:为英文和中文分别创建词汇表,将词语映射到数字索引
- 序列填充:将所有句子填充/截断到相同长度,便于批量处理
关键预处理代码如下:
python复制def tokenize(lines, token='char'):
source_tokenize, target_tokenize = [], []
source_line, target_line = [], []
for line in lines:
s = line[0]
t = line[1]
source_line.append(s)
target_line.append(t)
source_tokenize.append(s.split(' '))
target_tokenize.append([word for word in t])
return source_tokenize, target_tokenize, source_line, target_line
4. 模型构建
4.1 编码器实现
编码器由以下部分组成:
- 嵌入层(Embedding):将词语索引转换为密集向量
- 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.
