git clone https://github.com/pytorch/fairseq
cd fairseq
pip install --editable ./
2.下载 subword-nmt(BPE)
git clone https://github.com/rsennrich/subword-nmt.git
3.下载 Moses (SMT工具)
git clone https://github.com/moses-smt/mosesdecoder.git
WMT(Conference on Machine Translation)由SIGMT主办,是一个涉及机器翻译多种任务的综合性会议,包括多领域翻译评测任务、质量评价任务。现在WMT已经成为机器翻译领域的旗舰评测会议,很多研究工作都以WMT评测结果作为基准。WMT涉及的语言范围较广,包括英语、德语、芬兰语、捷克语、罗马尼亚语等十多种语言,翻译方向一般以英语为核心,探索英语与其他语言之间的翻译性能,领域包括新闻、信息技术、生物医学。2017年,WMT与中国机器翻译评测大会CWMT合作,提供了中英机器翻译数据集。
https://www.statmt.org/wmt17/
“AI Challenger全球AI挑战赛”将开放超过1000万条中英文翻译数据、70万个人体动作分析标注数据、30万张图片场景标注和语义描述数据,是国内迄今公开的规模最大的科研数据集。
https://download.csdn.net/download/qq_38361589/85929897?spm=1001.2014.3001.5501
pip install jieba
python -m jieba -d " " 分词前数据名 > 分词后数据名
3.使用其他分词工具(北京大学 语言计算与机器学习研究组开发)
如:pkuseg 是基于论文Luo et. al, 2019 (点击下载)的工具包。其简单易用,支持细分领域分词,有效提升了分词准确度。
使用Moses工具包中的normalize-punctuation.perl
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en </home/demo/fanyi/nmt/data/raw.en> /home/demo/fanyi/nmt/data/norm.en
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l zh </home/demo/fanyi/nmt/data/raw.zh> /home/demo/fanyi/nmt/data/norm.zh
1.将英文单词与标点符号用空格分开
2.将多个连续空格简化为一个空格
3.将很多符号替换成转义字符,如:把"替换成"、把can't替换成can 't
使用Moses工具包中的tokenizer.perl
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < /home/demo/fanyi/nmt/data/norm.en > /home/demo/fanyi/nmt/data/norm.tok.en
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/tokenizer.perl -l zh < /home/demo/fanyi/nmt/data/norm.seg.zh > /home/demo/fanyi/nmt/data/norm.seg.tok.zh
字节对编码(BPE, Byte Pair Encoder),又称 digram coding 双字母组合编码,是一种数据压缩算法,用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效,因而目前它是最流行的方法。(可理解为细粒度分词处理)。
使用subword-nmt的learn_joint_bpe_and_vocab.py和apply_bpe.py
python /home/demo/fanyi/subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /home/demo/fanyi/nmt/data/norm.tok.true.en -s 32000 -o /home/demo/fanyi/nmt/data/bpecode.en --write-vocabulary /home/demo/fanyi/nmt/data/voc.en
python /home/demo/fanyi/subword-nmt/subword_nmt/apply_bpe.py -c /home/demo/fanyi/nmt/data/bpecode.en --vocabulary /home/demo/fanyi/nmt/data/voc.en < /home/demo/fanyi/nmt/data/norm.tok.true.en > /home/demo/fanyi/nmt/data/norm.tok.true.bpe.en
python /home/demo/fanyi/subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /home/demo/fanyi/nmt/data/norm.seg.tok.zh -s 32000 -o /home/demo/fanyi/nmt/data/bpecode.zh --write-vocabulary /home/demo/fanyi/nmt/data/voc.zh
python /home/demo/fanyi/subword-nmt/subword_nmt/apply_bpe.py -c /home/demo/fanyi/nmt/data/bpecode.zh --vocabulary /home/demo/fanyi/nmt/data/voc.zh < /home/demo/fanyi/nmt/data/norm.seg.tok.zh > /home/demo/fanyi/nmt/data/norm.seg.tok.bpe.zh
mv /home/demo/fanyi/nmt/data/norm.seg.tok.bpe.zh /home/demo/fanyi/nmt/data/toclean.zh
mv /home/demo/fanyi/nmt/data/norm.tok.true.bpe.en /home/demo/fanyi/nmt/data/toclean.en
perl /home/demo/fanyi/mosesdecoder/scripts/training/clean-corpus-n.perl /home/demo/fanyi/nmt/data/toclean zh en /home/demo/fanyi/nmt/data/clean 1 512
perl /home/demo/fanyi/mosesdecoder/scripts/training/clean-corpus-n.perl /home/demo/fanyi/nmt/data/clean zh en /home/demo/fanyi/nmt/data/lean 1 512
python /home/demo/fanyi/nmt/utils/split.py /home/demo/fanyi/nmt/data/clean.zh /home/demo/fanyi/nmt/data/clean.en /home/demo/fanyi/nmt/data/
fairseq-preprocess --source-lang zh --target-lang en --trainpref /home/demo/fanyi/nmt/data/train --validpref /home/demo/fanyi/nmt/data/valid --testpref /home/demo/fanyi/nmt/data/test --destdir /home/demo/fanyi/nmt/data/
本次使用Transformer模型进行训练,如需使用其他神经网络模型请参照模型篇,在–arch 后更换自定义的模型。
模型详细参数如下:
Transformer模型中编码器和解码器层数选择6层,多头注意力机制的头数为8,模型维度d_model设置为512维,前馈神经网络维度d_ff设置为1024维,dropout概率取0.1,集束搜索宽度beam_width设置为4,标签平滑设置为0.1。模型训练时激活函数使用ReLU,优化器采用Adam[32]。Adam优化器训练过程中会动态调整学习率,首先设置warm_step,在warm_step内,学习率会线性上升,经过warm_step后,学习率会逐渐衰减,Adam优化器相关参数设置如表所示。
CUDA_VISIBLE_DEVICES=0 fairseq-train /home/demo/fanyi/nmt/data/ --arch transformer --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 --no-progress-bar --log-interval 20 --save-dir /home/demo/fanyi/nmt/checkpoints/tf1/ --keep-interval-updates 20 --tensorboard-logdir Fairseq_Data-transformer | tee Fairseq_Data-transformer.log --fp16
fairseq-generate /home/demo/fanyi/nmt/data --path /home/demo/fanyi/nmt/checkpoints/tf1/checkpoint_best.pt --batch-size 128 --beam 8 > /home/demo/fanyi/nmt/data/result/bestbeam8.txt
grep ^H /home/demo/fanyi/nmt/data/result/bestbeam8.txt | cut -f3- > /home/demo/fanyi/nmt/data/result/predict.tok.true.bpe.en
grep ^T /home/demo/fanyi/nmt/data/result/bestbeam8.txt | cut -f2- > /home/demo/fanyi/nmt/data/result/answer.tok.true.bpe.en
sed -r 's/(@@ )| (@@ ?$)//g' < ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.bpe.en > ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.en
sed -r 's/(@@ )| (@@ ?$)//g' < ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.bpe.en > ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.en
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl < ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.en > ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.en
perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl < ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.en > ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.en
perl /home/demo/fanyi/mosesdecoder/scripts/generic/multi-bleu.perl -lc /home/demo/fanyi/nmt/data/result/answer.tok.en < /home/demo/fanyi/nmt/data/result/predict.tok.en
同时可用tensorboard汇出LOSS曲线,观察训练中的情况及时调整参数,达到最优的效果。