Microsoft UniLM 项目中的机器翻译模型使用与训练指南
2025-07-05 07:38:32作者:苗圣禹Peter
项目概述
Microsoft UniLM 是一个统一预训练语言模型项目,其中的机器翻译模块提供了多种先进的神经机器翻译模型实现。本文将详细介绍如何使用预训练翻译模型以及如何训练新的翻译模型。
预训练模型介绍
该项目提供了多种基于不同架构的预训练翻译模型:
卷积神经网络模型
- conv.wmt14.en-fr:基于WMT14英法数据集训练的卷积模型
- conv.wmt14.en-de:基于WMT14英德数据集训练的卷积模型
- conv.wmt17.en-de:基于WMT17英德数据集训练的卷积模型
Transformer模型
- transformer.wmt14.en-fr:基于WMT14英法数据集的Transformer模型
- transformer.wmt16.en-de:基于WMT16英德数据集的Transformer模型
- transformer.wmt18.en-de:WMT18比赛获胜模型
- transformer.wmt19系列:包括英德、德英、英俄、俄英四个方向的WMT19比赛获胜模型
这些模型在各自的数据集上都取得了state-of-the-art的翻译效果。
使用预训练模型
环境准备
使用前需要安装必要的Python依赖:
pip install fastBPE sacremoses subword_nmt
通过PyTorch Hub使用
可以通过PyTorch Hub方便地加载预训练模型进行交互式翻译:
import torch
# 加载WMT16英德翻译模型
en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt16.en-de',
tokenizer='moses', bpe='subword_nmt')
en2de.eval() # 设置为评估模式
en2de.cuda() # 使用GPU加速
# 单句翻译
print(en2de.translate('Hello world!')) # 输出: Hallo Welt!
# 批量翻译
print(en2de.translate(['Hello world!', 'The cat sat on the mat.']))
对于WMT19模型,需要使用fastBPE而不是subword_nmt:
en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-de',
checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt',
tokenizer='moses', bpe='fastbpe')
加载自定义模型
可以从本地加载自定义训练的模型:
from fairseq.models.transformer import TransformerModel
zh2en = TransformerModel.from_pretrained(
'/path/to/checkpoints',
checkpoint_file='checkpoint_best.pt',
data_name_or_path='data-bin/wmt17_zh_en_full',
bpe='subword_nmt',
bpe_codes='data-bin/wmt17_zh_en_full/zh.code'
)
训练新模型
IWSLT'14 德英翻译 (Transformer)
- 数据准备:
cd examples/translation/
bash prepare-iwslt14.sh
cd ../..
TEXT=examples/translation/iwslt14.tokenized.de-en
fairseq-preprocess --source-lang de --target-lang en \
--trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \
--destdir data-bin/iwslt14.tokenized.de-en \
--workers 20
- 模型训练:
CUDA_VISIBLE_DEVICES=0 fairseq-train \
data-bin/iwslt14.tokenized.de-en \
--arch transformer_iwslt_de_en --share-decoder-input-output-embed \
--optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \
--lr 5e-4 --lr-scheduler inverse_sqrt --warmup-updates 4000 \
--dropout 0.3 --weight-decay 0.0001 \
--criterion label_smoothed_cross_entropy --label-smoothing 0.1 \
--max-tokens 4096 \
--eval-bleu \
--eval-bleu-args '{"beam": 5, "max_len_a": 1.2, "max_len_b": 10}' \
--eval-bleu-detok moses \
--eval-bleu-remove-bpe \
--eval-bleu-print-samples \
--best-checkpoint-metric bleu --maximize-best-checkpoint-metric
- 模型评估:
fairseq-generate data-bin/iwslt14.tokenized.de-en \
--path checkpoints/checkpoint_best.pt \
--batch-size 128 --beam 5 --remove-bpe
WMT'14 英德翻译 (卷积网络)
- 数据准备:
cd examples/translation/
bash prepare-wmt14en2de.sh
cd ../..
TEXT=examples/translation/wmt17_en_de
fairseq-preprocess \
--source-lang en --target-lang de \
--trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \
--destdir data-bin/wmt17_en_de --thresholdtgt 0 --thresholdsrc 0 \
--workers 20
- 模型训练:
mkdir -p checkpoints/fconv_wmt_en_de
fairseq-train \
data-bin/wmt17_en_de \
--arch fconv_wmt_en_de \
--dropout 0.2 \
--criterion label_smoothed_cross_entropy --label-smoothing 0.1 \
--optimizer nag --clip-norm 0.1 \
--lr 0.5 --lr-scheduler fixed --force-anneal 50 \
--max-tokens 4000 \
--save-dir checkpoints/fconv_wmt_en_de
多语言翻译
项目还支持训练多语言翻译模型。以下是训练德英和法英多语言模型的示例:
- 数据准备:
cd examples/translation/
bash prepare-iwslt17-multilingual.sh
cd ../..
- 模型训练:
mkdir -p checkpoints/multilingual_transformer
CUDA_VISIBLE_DEVICES=0 fairseq-train data-bin/iwslt17.de_fr.en.bpe16k/ \
--max-epoch 50 \
--ddp-backend=legacy_ddp \
--task multilingual_translation --lang-pairs de-en,fr-en \
--arch multilingual_transformer_iwslt_de_en \
--share-decoders --share-decoder-input-output-embed \
--optimizer adam --adam-betas '(0.9, 0.98)' \
--lr 0.0005 --lr-scheduler inverse_sqrt \
--warmup-updates 4000 --warmup-init-lr '1e-07' \
--label-smoothing 0.1 --criterion label_smoothed_cross_entropy \
--dropout 0.3 --weight-decay 0.0001 \
--save-dir checkpoints/multilingual_transformer \
--max-tokens 4000 \
--update-freq 8
总结
Microsoft UniLM项目提供了强大的机器翻译功能,无论是使用预训练模型进行快速部署,还是训练自定义的翻译模型,都能满足不同场景的需求。通过本文介绍的步骤,开发者可以轻松实现高质量的机器翻译应用。