1. 从零构建Transformer中英翻译模型实战
2017年,Google Brain团队发表的《Attention Is All You Need》论文彻底改变了自然语言处理领域的格局。这篇论文提出的Transformer架构,仅依靠注意力机制就超越了当时主流的RNN和LSTM模型。如今,Transformer已成为NLP领域的基石架构,从BERT到GPT-3,几乎所有最先进的模型都基于它构建。
作为一名长期从事NLP开发的工程师,我最近用PyTorch完整实现了一个中英翻译模型。这个项目不仅帮助我深入理解了Transformer的核心机制,也让我积累了不少实战经验。下面我将详细分享整个实现过程,包括数据处理、模型构建、训练技巧等关键环节。
提示:本文完整代码约500行,建议在GPU环境下运行。即使你是PyTorch新手,只要按照步骤操作,也能在2小时内完成模型训练并看到翻译效果。
1.1 环境准备与数据概览
首先确保安装以下核心依赖:
- PyTorch 1.8+
- pandas
- scikit-learn
- nltk
bash复制pip install torch pandas scikit-learn nltk
我们使用的中英平行语料库包含29,155条句子对,数据格式如下:
| 英文 | 中文 |
|---|---|
| Hi. | 嗨。 |
| Run! | 你用跑的! |
| Wait! | 等等! |
数据预处理的第一步是将原始文本分割为训练集和测试集。这里我采用80-20的比例划分:
python复制import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('./data/cmn.txt', sep='\t', header=None,
usecols=[0,1], names=['en','zh'])
train_df, test_df = train_test_split(data, test_size=0.2)
1.2 中英文分词器设计
中英文在分词处理上有显著差异:
- 英文有天然的空格分隔,适合按单词切分
- 中文没有明确分隔符,更适合按字符切分
为此,我分别实现了两种Tokenizer:
python复制from nltk.tokenize.treebank import TreebankWordTokenizer, TreebankWordDetokenizer
class ChineseTokenizer:
@staticmethod
def tokenize(text: str) -> List[str]:
return list(text) # 中文字符级切分
class EnglishTokenizer:
tokenizer = TreebankWordTokenizer()
detokenizer = TreebankWordDetokenizer()
@classmethod
def tokenize(cls, text: str) -> List[str]:
return cls.tokenizer.tokenize(text) # 英文单词级切分
def decode(self, indices: List[int]) -> str:
tokens = [self.index2word.get(idx, '<unk>') for idx in indices]
return self.detokenizer.detokenize(tokens)
注意:英文Tokenizer使用了NLTK的Treebank分词器,它能正确处理缩写("don't")和标点符号等特殊情况。
1.3 词表构建与文本编码
构建词表时需要考虑几个特殊token:
<pad>:填充token(索引0)<unk>:未知词(索引1)<start>:句子开始(索引2)- `<en
