神经机器翻译(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。 在翻译示例中,差异也可见。 因此,当我们继续组装表壳时,我们将使用此模型。