实践中的知识转移和神经机器翻译

神经机器翻译(NMT)的发展非常迅速。 今天,为了组装您的翻译器,您不需要接受两次高等教育。 但是,为了训练模型,您需要一个大型的并行语料库(该语料库中源语言的翻译与该句子相关联)。 实际上,我们正在谈论至少一百万对句子。 甚至还有一个单独的大范围的IMF,探索使用少量电子数据来教学语言对的方法(英语低资源NMT)。

我们正在收集Chuvash-Russian军团,同时我们正在研究可用数据量能做什么。 在此示例中,使用了90,000个句子对。 目前最好的结果是通过知识转移的方法(英语:转移学习)获得的,本文将对此进行讨论。 本文的目的是给出一个易于复制的实现示例。

培训计划如下。 我们需要建造一个大型(父)建筑物,在其上训练神经模型,然后训练我们的子模型。 此外,翻译的目标语言将相同:俄语。 直观地讲,这可以与学习第二种语言相提并论。 会说一种外语会更容易学习。 看起来还像是学习一小部分外语,例如英语的医学术语:首先,您需要学习英语。

作为亲子兵,我们尝试从英俄平行兵团中提取 100万对句子 从哈萨克斯坦-俄罗斯兵团中获取100万对句子。 哈萨克语数据中有500万个句子。 其中,只有柔顺系数(第二列)大于2的那些被采用,哈萨克语版本的结果略好。 从直觉上看,这是可以理解的,因为楚瓦什语和哈萨克语彼此更为相似。 但是实际上,这还没有得到证实,并且在很大程度上还取决于案件的质量。 有关选择父母身的更多详细信息,请参见本文 。 关于90,000对要约的子公司,您可以在此处查找并索取示例数据。

现在到代码。 如果您没有自己的快速图形卡,则可以在Colab网站上训练模型。 为了进行培训,我们使用了Sockeye库。 假定已经安装了Python3。

pip install sockeye 

您可能还需要单独修补MXNet ,后者负责处理视频卡。 Colab需要额外的库安装

 pip install mxnet-cu100mkl 

关于神经网络,通常认为它们足以按原样提供数据,并且它们会弄清楚。 但实际上并非总是如此。 因此,在我们的情况下,身体需要进行预处理。 首先,我们将其标记化,以便模型更容易理解“ cat!”和“ cat”是同一件事。 例如,仅python标记器即可。

 from nltk.tokenize import WordPunctTokenizer def tokenize(src_filename, new_filename): with open(src_filename, encoding="utf-8") as src_file: with open(new_filename, "w", encoding="utf-8") as new_file: for line in src_file: new_file.write("%s" % ' '.join(WordPunctTokenizer().tokenize(line))) new_file.write("\n") 

结果,我们输入以下形式的句子对

   ӗ  ҫ ӳ ӑӑ. ӑ ӑ ӑ ӑӗ, ӑ ӑӑӗ,   ӑ  ӗӗ -ӑ ӗӗҫ,  ҫӗ ӗ ӗҫ ӑӑ ӑӑ, ҫ ӗ ӗ   ӑ ӑ ӑӑ ӑ . 



      .  , ,       , ,    ,        . 

输出是以下标记化报价:

   ӗ  ҫ ӳ ӑӑ . ӑ ӑ ӑ ӑӗ , ӑ ӑӑӗ ,   ӑ  ӗӗ  - ӑ ӗӗҫ ,  ҫӗ ӗ ӗҫ ӑӑ ӑӑ , ҫ ӗ ӗ   ӑ ӑ ӑӑ ӑ  . 

和俄语

       .   ,  ,        ,  ,     ,         . 

在我们的案例中,我们需要父案例和子案例的组合字典,因此我们将创建公共文件:

 cp kk.parent.train.tok kkchv.all.train.tok cat chv.child.train.tok >> kk.parent.train.tok cp ru.parent.train.tok ru.all.train.tok cat ru.child.train.tok >> ru.all.train.tok 

因为子模型的进一步训练是在同一词典上进行的。

现在是一个小而重要的题外话。 在MP中,句子以单词的形式分为原子,然后以单词序列的形式对句子进行操作。 但这通常是不够的,因为一次在语料库中出现的单词会形成一条巨大的尾巴。 为他们建立一个概率模型是困难的。 对于形态已发展(大小写,性别,数字)的语言尤其如此。 俄语和楚瓦什语都是这样的语言。 但是有一个解决方案。 您可以将句子分为较低的级别,分为子单词。 我们使用字节对编码。

 git clone https://github.com/rsennrich/subword-nmt.git 

我们得到大约这样的子词序列

 @@   ӗ  ҫ ӳ@@  ӑӑ . @@ ӑ ӑ ӑ @@ ӑӗ , ӑ ӑӑ@@ ӗ ,   ӑ@@  @@  ӗӗ  - ӑ@@  ӗ@@ ӗҫ ,  ҫӗ@@  ӗ ӗҫ@@ @@  ӑӑ ӑӑ , ҫ@@ @@ @@  ӗ ӗ @@ @@  @@  ӑ ӑ ӑӑ ӑ  . 



 @@    @@  @@   . @@  @@ @@ @@ @@  , @@  , @@ @@  @@    @@  @@ @@  @@ @@ @@ @@  ,  ,  @@  @@ @@ @@  @@ @@ @@  ,       @@ @@  @@ @@ @@  . 

可以看出,词缀与单词有很好的区别:长时间不使用@@和使用@@很好。
为此,请准备bpe词典

 python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input kkchv.all.train.tok ru.all.train.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.kkchv bpe.vocab.ru 

并将它们应用于令牌,例如:

 python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.kkchv --vocabulary-threshold 50 < kkchv.all.train.tok > kkchv.all.train.bpe !python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.ru --vocabulary-threshold 50 < ru.all.train.tok > ru.all.train.bpe 

以此类推,您需要对所有文件进行处理:训练,验证和测试父子模型。

现在我们直接转向神经模型的训练。 首先,您需要准备通用模型词典:

 python -m sockeye.prepare_data -s kk.all.train.bpe -t ru.all.train.bpe -o kkru_all_data 

接下来,训练父模型。 在Sockeye页面上更详细地描述了一个简单的示例。 从技术上讲,该过程包括两个步骤:使用先前创建的模型词典准备数据

 python -m sockeye.prepare_data -s kk.parent.train.bpe -t ru.parent.train.bpe -o kkru_parent_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json 

和学习本身

 python -m sockeye.train -d kkru_parent_data -vs kk.parent.dev.bpe -vt ru.parent.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o kkru_parent_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10 

在Colab设施进行的培训大约需要一天的时间。 模型的训练完成后,您可以将其翻译为

 python -m sockeye.translate --input kk.parent.test.bpe -m kkru_parent_model --output ru.parent.test_kkru_parent.bpe 

训练孩子模型
 python -m sockeye.prepare_data -s chv.child.train.bpe -t ru.child.train.bpe -o chvru_child_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json 

培训开始代码如下所示

 python -m sockeye.train -d chvru_child_data -vs chv.child.dev.bpe -vt ru.child.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o ruchv_150K_skv_dev19_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10 --config kkru_parent_model/args.yaml --params kkru_parent_model/params.best 

添加了指示将父模型的配置和权重用作起点的参数。 该示例的详细信息来自Sockeye 。 学习儿童模型大约需要12个小时。

总结一下,比较一下结果。 常用的机器翻译模型产生的质量为24.96 BLEU,而知识转移模型的质量为32.38 BLEU。 在翻译示例中,差异也可见。 因此,当我们继续组装表壳时,我们将使用此模型。

Source: https://habr.com/ru/post/zh-CN475750/


All Articles