机器翻译的输入一般是源语言的句子。但在很多实际系统中,比如语音识别系统的输出或者基于拼音的文字输入,源语言句子一般包含很多同音字错误, 这会导致翻译出现很多意想不到的错误。由于可以同时获得发音信息,我们提出了一种在输入端加入发音信息,进而在模型的嵌入层 融合文字信息和发音信息的翻译方法,大大提高了翻译模型对同音字错误的抵抗能力。
文章地址:https://arxiv.org/abs/1810.06729
我们使用LDC Chinese-to-English数据集训练。中文词典用的是DaCiDian。 在newstest2006上进行评测,效果如下所示:
beta=0 | beta=0.50 | beta=0.85 | beta=0.95 |
---|---|---|---|
47.96 | 48.71 | 48.85 | 48.46 |
beta代表发音信息的权重。这表明,即使将绝大部分权重放在发音信息上,翻译的效果依然很好。与此同时,翻译系统对同音字错误的抵抗力大大提高。
-
数据格式
数据格式和Paddle机器翻译的格式一致。为了获得输入句子的发音信息,需要额外提供源语言的发音基本单元和发音的词典。
A) 发音基本单元文件
中文的发音基本单元是拼音,将所有的拼音放在一个文件,类似:
bo
li
。。。
B)发音词典
根据DaCiDian,对bpe后的源语言中的token赋予一个或者几个发音,类似:
▁玻利维亚 bo li wei ya
▁举行 ju xing
▁总统 zong tong
▁与 yu
巴斯 ba si
▁这个 zhei ge|zhe ge
。。。
-
训练模型
数据准备完成后,可以使用
train.py
脚本进行训练。例子如下:
python train.py \
--src_vocab_fpath nist_data/vocab_all.28000 \
--trg_vocab_fpath nist_data/vocab_all.28000 \
--train_file_pattern nist_data/nist_train.txt \
--phoneme_vocab_fpath nist_data/zh_pinyins.txt \
--lexicon_fpath nist_data/zh_lexicon.txt \
--batch_size 2048 \
--use_token_batch True \
--sort_type pool \
--pool_size 200000 \
--use_py_reader False \
--enable_ce False \
--fetch_steps 1 \
pass_num 100 \
learning_rate 2.0 \
warmup_steps 8000 \
beta2 0.997 \
d_model 512 \
d_inner_hid 2048 \
n_head 8 \
weight_sharing True \
max_length 256 \
save_freq 10000 \
beta 0.85 \
model_dir pinyin_models_beta085 \
ckpt_dir pinyin_ckpts_beta085
上述命令中设置了源语言词典文件路径(src_vocab_fpath
)、目标语言词典文件路径(trg_vocab_fpath
)、训练数据文件(train_file_pattern
,支持通配符), 发音单元文件路径(phoneme_vocab_fpath
), 发音词典路径(lexicon_fpath
)等数据相关的参数和构造 batch 方式(use_token_batch
指定了数据按照 token 数目或者 sequence 数目组成 batch)等 reader 相关的参数。有关这些参数更详细的信息可以通过执行以下命令查看:
python train.py --help
更多模型训练相关的参数则在 config.py
中的 ModelHyperParams
和 TrainTaskConfig
内定义;ModelHyperParams
定义了 embedding 维度等模型超参数,TrainTaskConfig
定义了 warmup 步数等训练需要的参数。这些参数默认使用了 Transformer 论文中 base model 的配置,如需调整可以在该脚本中进行修改。另外这些参数同样可在执行训练脚本的命令行中设置,传入的配置会合并并覆盖 config.py
中的配置.
注意,如训练时更改了模型配置,使用 infer.py
预测时需要使用对应相同的模型配置;另外,训练时默认使用所有 GPU,可以通过 CUDA_VISIBLE_DEVICES
环境变量来设置使用指定的 GPU。
使用以上提供的数据和模型,可以按照以下代码进行预测,翻译结果将打印到标准输出:
python infer.py \
--src_vocab_fpath nist_data/vocab_all.28000 \
--trg_vocab_fpath nist_data/vocab_all.28000 \
--test_file_pattern nist_data/nist_test.txt \
--phoneme_vocab_fpath nist_data/zh_pinyins.txt \
--lexicon_fpath nist_data/zh_lexicon.txt \
--batch_size 32 \
model_path pinyin_models_beta085/iter_200000.infer.model \
beam_size 5 \
max_out_len 255 \
beta 0.85