OpenNMT-py 低 BLEU 分数用于德语翻译
OpenNMT-py low BLEU scores for translators to German
我在 Europarl 上训练了从英语到德语以及从意大利语到德语的 OpenNLP-py 模型,我得到的 BLEU 分数非常低:英语 -> 德语为 8.13,意大利语 -> 德语为 4.79。
由于我还不是神经网络专家,所以我采用了库提供的默认配置。在这两种情况下,训练 13 个 epoch 大约需要 20 个小时。在这两种情况下,我都将 80% 的数据集用于训练,10% 用于验证,10% 用于测试。
以下是我用于创建意大利 -> 德国模型的命令,我对其他模型使用了类似的命令序列。任何人都可以就如何提高我的模型的有效性给我任何建议吗?
# $ wc -l Europarl.de-it.de
# 1832052 Europarl.de-it.de
head -1465640 Europarl.de-it.de > train_de-it.de
head -1465640 Europarl.de-it.it > train_de-it.it
tail -n 366412 Europarl.de-it.de | head -183206 > dev_de-it.de
tail -n 366412 Europarl.de-it.it | head -183206 > dev_de-it.it
tail -n 183206 Europarl.de-it.de > test_de-it.de
tail -n 183206 Europarl.de-it.it > test_de-it.it
perl tokenizer.perl -a -no-escape -l de < ../data/train_de-it.de > ../data/train_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/dev_de-it.de > ../data/dev_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/test_de-it.de > ../data/test_de-it.atok.de
perl tokenizer.perl -a -no-escape -l it < ../data/train_de-it.it > ../data/train_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/dev_de-it.it > ../data/dev_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/test_de-it.it > ../data/test_de-it.atok.it
python3 preprocess.py \
-train_src ../data/train_de-it.atok.it \
-train_tgt ../data/train_de-it.atok.de \
-valid_src ../data/dev_de-it.atok.it \
-valid_tgt ../data/dev_de-it.atok.de \
-save_data ../data/europarl_de_it.atok.low \
-lower
python3 train.py \
-data ../data/europarl_de_it.atok.low.train.pt \
-save_model ../models_en_de/europarl_it_de_models \
-gpus 0
您可以在 Training Romance Multi-Way model and also Training English-German WMT15 NMT engine 获得很多提示。主要思想是 运行 在串联的 XXYY 训练语料库上进行 BPE 标记化,然后使用学习到的 BPE 模型对训练语料库进行标记化。
字节对编码标记化应该对德语有益,因为它是复合的,该算法有助于将词分割成子词单元。诀窍在于您需要在包含源和目标的单个训练语料库上训练 BPE 模型。见 Jean Senellart's comment:
The BPE model should be trained on the training corpus only - and ideally, you train one single model for source and target so that the model learns easily to translate identical word fragments from source to target.
So I would concatenate source and target training corpus - then train tokenize it once, then learn a BPE model on this single corpus, that you then use for tokenization of test/valid/train corpus in source and target.
另一个想法是用 -case_feature
标记化。对于字母可以有不同大小写的所有语言来说,这也是一个好主意。见 Jean's comment:
in general using -case_feature
is a good idea for almost all languages (with case) - and shows good performance for dealing and rendering in target case variation in the source (for instance all uppercase/lowercase, or capitalized words, ...).
要提高机器翻译质量,您也可以试试
- 获取更多语料库(例如 WMT16 语料库)
- 使用 in-domain training
进行调整
我在 Europarl 上训练了从英语到德语以及从意大利语到德语的 OpenNLP-py 模型,我得到的 BLEU 分数非常低:英语 -> 德语为 8.13,意大利语 -> 德语为 4.79。
由于我还不是神经网络专家,所以我采用了库提供的默认配置。在这两种情况下,训练 13 个 epoch 大约需要 20 个小时。在这两种情况下,我都将 80% 的数据集用于训练,10% 用于验证,10% 用于测试。
以下是我用于创建意大利 -> 德国模型的命令,我对其他模型使用了类似的命令序列。任何人都可以就如何提高我的模型的有效性给我任何建议吗?
# $ wc -l Europarl.de-it.de
# 1832052 Europarl.de-it.de
head -1465640 Europarl.de-it.de > train_de-it.de
head -1465640 Europarl.de-it.it > train_de-it.it
tail -n 366412 Europarl.de-it.de | head -183206 > dev_de-it.de
tail -n 366412 Europarl.de-it.it | head -183206 > dev_de-it.it
tail -n 183206 Europarl.de-it.de > test_de-it.de
tail -n 183206 Europarl.de-it.it > test_de-it.it
perl tokenizer.perl -a -no-escape -l de < ../data/train_de-it.de > ../data/train_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/dev_de-it.de > ../data/dev_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/test_de-it.de > ../data/test_de-it.atok.de
perl tokenizer.perl -a -no-escape -l it < ../data/train_de-it.it > ../data/train_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/dev_de-it.it > ../data/dev_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/test_de-it.it > ../data/test_de-it.atok.it
python3 preprocess.py \
-train_src ../data/train_de-it.atok.it \
-train_tgt ../data/train_de-it.atok.de \
-valid_src ../data/dev_de-it.atok.it \
-valid_tgt ../data/dev_de-it.atok.de \
-save_data ../data/europarl_de_it.atok.low \
-lower
python3 train.py \
-data ../data/europarl_de_it.atok.low.train.pt \
-save_model ../models_en_de/europarl_it_de_models \
-gpus 0
您可以在 Training Romance Multi-Way model and also Training English-German WMT15 NMT engine 获得很多提示。主要思想是 运行 在串联的 XXYY 训练语料库上进行 BPE 标记化,然后使用学习到的 BPE 模型对训练语料库进行标记化。
字节对编码标记化应该对德语有益,因为它是复合的,该算法有助于将词分割成子词单元。诀窍在于您需要在包含源和目标的单个训练语料库上训练 BPE 模型。见 Jean Senellart's comment:
The BPE model should be trained on the training corpus only - and ideally, you train one single model for source and target so that the model learns easily to translate identical word fragments from source to target. So I would concatenate source and target training corpus - then train tokenize it once, then learn a BPE model on this single corpus, that you then use for tokenization of test/valid/train corpus in source and target.
另一个想法是用 -case_feature
标记化。对于字母可以有不同大小写的所有语言来说,这也是一个好主意。见 Jean's comment:
in general using
-case_feature
is a good idea for almost all languages (with case) - and shows good performance for dealing and rendering in target case variation in the source (for instance all uppercase/lowercase, or capitalized words, ...).
要提高机器翻译质量,您也可以试试
- 获取更多语料库(例如 WMT16 语料库)
- 使用 in-domain training 进行调整