跳转到主要内容

为机器翻译系统安排训练

项目描述

OpusTrainer

该训练器的目的是为用户提供一种灵活的方式来安排各种输入数据源,以及通过标题化、全部大写等来增强训练数据。当您有多个数据源,并且想首先在反向翻译数据上预训练模型,然后逐渐添加其他数据源,并最终一次性微调时,这特别有用。

此外,该工具特别适合训练多语言模型,因为它提供了一个简单的方式来定义来自不同语言来源的数据集的所需混合。

安装

您有两种选择:直接从PyPI安装

pip install opustrainer

或克隆此存储库,并在可编辑模式下安装它,这样您可以更改源,但仍可以使用所有命令

git clone git@github.com:hplt-project/opustrainer.git
cd opustrainer
pip install -e .

用法

% ./trainer.py --help
usage: trainer.py [-h] --config CONFIG [--temporary-directory TEMPORARY_DIR] [--state STATE_FILE] [--do-not-resume] [--sync] [trainer-command [arguments]]

Feeds marian tsv data for training.

options:
  -h, --help            show this help message and exit
  --config CONFIG, -c CONFIG
                        YML configuration input.
  --temporary-directory TEMPORARY_DIR, -t TEMPORARY_DIR
                        Temporary dir, used for shuffling and tracking state
  --state STATE_FILE    Path to trainer state file which stores how much of
                        each dataset has been read. Defaults to ${CONFIG}.state
  --sync                Do not shuffle in the background
  --do-not-resume, -d   Do not resume from the previous training state
  --no-shuffle, -n      Do not shuffle, for debugging

一旦您在配置文件中修复了路径,train_config.yml 您可以通过执行以下操作运行测试用例:

./trainer.py -c train_config.yml /path/to/marian -c marian_config --any --other --flags

您可以在/tmp/test中检查生成的混合文件。如果您的神经网络训练器不支持从stdin进行训练,您可以使用此工具生成训练数据集,然后在您的训练器实现中禁用数据重新排序或洗牌,因为您的训练输入应该是平衡的。

训练开始时,所有数据集都会被打乱。每次到达数据集的末尾,它都会重新打乱。在系统临时目录中打乱(点击查看),但可以使用--temporary-directoryTMPDIR环境变量重新定位。默认情况下,训练状态与配置文件保存在同一位置。如果训练中断,重新运行训练器应从上次中断的位置继续(具体取决于您的神经网络训练器已缓冲了多少,该部分将被跳过)。

配置文件

通过配置文件定义您的训练过程。您在上面定义数据集,然后是阶段,然后为每个阶段定义一个混合标准和阶段终止标准。以下是一个示例配置文件。trainer的路径是任何支持以stdin作为训练输入格式的神经网络训练器的路径。

# Datasets are already TSV files. We support reading gzip'd files, as well as multiple dataset file per name
datasets:
  clean: test/data/clean
  medium: test/data/medium
  dirty: test/data/dirty

stages:
  - start
  - mid
  - end

start:
  - clean 0.8
  - medium 0.2
  - dirty 0
  - until clean 2 # Until two epochs of clean

mid:
  - clean 0.6
  - medium 0.3
  - dirty 0.1
  - until medium 1

end:
  - clean 0.4
  - medium 0.3
  - dirty 0.3
  - until dirty 5 # use `inf` to mean until forever

modifiers:
- UpperCase: 0.05 # Apply uppercase randomly to 5% of sentences. See below
- TitleCase: 0.05

seed: 1111
trainer: /path/to/trainer/run.py

扩展阶段配置

如果您想更改特定阶段使用的修饰符,可以使用扩展阶段配置格式。如果在此处提到了modifiers,它将仅为此阶段覆盖整个课程定义的modifiers

在扩展格式中,数据集列表定义在mix键中。您可以可选地添加一个modifiers键。例如

start:
  mix:
  - clean 0.8
  - medium 0.2
  - dirty 0
  - until clean 2 # Until two epochs of clean
  modifiers:
    - UpperCase: 0.05
    - TitleCase: 0.05

请注意,如果您愿意,可以使用YAML引用来广泛组合全局和局部修饰符。

修饰符

修饰符随机应用于进入训练器的句子。每个修饰符都有一个与之关联的概率,表示句子被修饰符修饰的机会。例如,概率为0.05的修饰符将影响大约每20个句子中的一个。

修饰符依次应用,按照您定义的顺序,所有修饰符都有自己的概率,而不考虑之前已应用的修饰符。例如,如果您有以下配置

modifiers:
- UpperCase: 0.05
- TitleCase: 0.05

这意味着每20个句子中有一个将被转换为大写,每20个句子中有一个将被转换为标题大小写。并且实际上是0.05 * 0.05,所以每400个句子中第一个将被转换为大写,然后是标题大小写。

UpperCase

将整个源句和目标句转换为大写,例如'heLLo'变为'HELLO'。

modifiers:
  - UpperCase: 0.05

TitleCase

将每个单词的第一个字母转换为大写,其余字母转换为小写。单词通过空格分割。例如'heLLo'变为'Hello'。

modifiers:
  - TitleCase: 0.05

Typos

在句子对的源侧引入错误。

修饰符本身的概率是句子受影响的概率。每种类型的错误的概率描述了单词受影响的概率。每种类型的错误在每个句子中最多出现一次。

您可以分别为每个修饰符指定一个概率。如果省略了任何错误类别,则其概率为0。或者,您可以省略所有错误类别。然后,所有错误类别都将有默认的10%概率。

modifiers:
- Typos: 0.05
  char_swap:     0.1 # Swaps two random consecutive word characters in the string.
  missing_char:  0.1 # Skips a random word character in the string.
  extra_char:    0.1 # Adds an extra, keyboard-neighbor, letter next to a random word character.
  nearby_char:   0.1 # Replaces a random word character with keyboard-neighbor letter.
  similar_char:  0.1 # Replaces a random word character with another visually similar character.
  skipped_space: 0.1 # Skips a random space from the string.
  random_space:  0.1 # Adds a random space in the string.
  repeated_char: 0.1 # Repeats a random word character.
  unichar:       0.1 # Replaces a random consecutive repeated letter with a single letter. 

Tags

向源句添加一个占位符标签,该标签可用于由模型提示如何翻译该词。要提示的单词从目标句中随机选择。只有具有源和目标之间一对一映射的单词才被考虑。

此修饰符需要训练数据中的第三列包含每个单词的对齐信息。

- Tags: 0.05
  custom_detok_src: null
  custom_detok_trg: zh
  template: "__source__ {src} __target__ {trg} __done__"

所有选项都是可选的。

如果您从使用Moses分词器分词的数据集中读取,可以使用custom_detok_srccustom_detok_trg指定自定义分词语言。对于不使用空格来分隔单词的语言,这可能是有帮助的。默认的分词策略是通过空格分割/连接。

告诉翻译模型以特定方式翻译单词的格式可以通过template来控制。在这里,{src}{trg}被句子对源端和目标端选定的单词所替换。

前缀

在源句之前添加目标句的一个随机子句。

这对于教会模型在用户绝对确信特定字符串必须出现在输出时强制解码该字符串非常有用。例如,I like pie. Me gustan los pasteles.变为__start__ los pasteles __end__ I like pie. Me gustan los pasteles.

注意:前缀修饰符必须始终作为最后一个修饰符使用,但理想情况下不应与“标签”一起使用。

modifiers:
 - Prefix: 0.5
   min_words: 2
   max_words: 5
   template: "__start__ {trg} __end__ "

Tags

为了训练支持词汇“提示”的模型,我们提供了一个标签系统,其中我们利用单词对齐信息为翻译模型提供“提示”,告诉它应该在目标端产生什么。这项工作与Dinu等2019年的工作非常相似。示例。给定一个对齐增强的tsv训练行:I like pies! \t Ich mag Kuchen! \t 0-0 1-1 2-2,机器翻译训练系统会看到类似的内容:I like <tag0> mag <tag0> pies! \t Ich mag Kuchen!,其中标签的数值ID是从总标签数中随机抽取的。分配给Tags修饰符的概率决定了标签增强出现在任何给定单词上的可能性。

最后,如果你的语料库增加了对齐信息,但不想使用任何标签,只需将此修饰符的概率设置为0。

在训练前生成词汇和标签

将来,这将由训练流水线处理,但在此之前,这里提供了基本脚本

用于生成对齐增强语料库的脚本

#!/bin/bash -v

# Usage: ./align_corpus.sh source_corpus target_corpus src trg

# install fast align
mkdir -p bin

# download and compile fast_align
if [ ! -e bin/fast_align ]; then
    git clone https://github.com/clab/fast_align
    mkdir -p fast_align/build
    cd fast_align/build
    cmake ..
    make -j4
    cp fast_align atools ../../bin
    cd ../../
fi

# Prepare the corpus for fast align
test -s $2/corpus.tmp.${3}-${4}.falign ||  cat $1 | sed 's/\t/ ||| /' > $2/corpus.tmp.${3}-${4}.falign

# Align it
test -s $2/align.${3}-${4}.s2t  || bin/fast_align -vod  -i $2/corpus.tmp.${3}-${4}.falign > $2/align.${3}-${4}.s2t
test -s $2/align.${3}-${4}.t2s  || bin/fast_align -vodr -i $2/corpus.tmp.${3}-${4}.falign > $2/align.${3}-${4}.t2s

test -s $2/corpus.${3}-${4}.aln || bin/atools -i $2/align.${3}-${4}.s2t -j $2/align.${3}-${4}.t2s -c grow-diag-final-and > $2/corpus.${3}-${4}.aln

用于创建带有标签支持的词汇的脚本

#!/usr/bin/env bash
#Usage ./vocab.sh en de path-to-corpora char-cov vocab_size

char_cov=${4:-'0.9995'} # Default char coverage
vocab_size=${5:-'32000'} # Default vocab size
# Set up some constants

# Language pairs
src=$1
trg=$2
prefix="--model_prefix=model.${src}-${trg}"

# Placeholders array
placeholders="--user_defined_symbols=__source__,__target__,__done__,__start__,__end__"

# Character coverage. CJK is recommended to have 0.9995, vocab languages proabbly you want 1.
char_cov="--character_coverage=${char_cov}"

# First clone and compile SPM
spm_exec="sentencepiece/build/src/spm_train"
if [ ! -e ${spm_exec} ]; then
    git clone https://github.com/google/sentencepiece.git
    cd sentencepiece
    mkdir build
    cd build
    cmake ..
    make -j4
    cd ..
    cd ..
    if [ ! -e ${spm_exec} ]; then
        echo "Failed to compile sentencepiece"
        exit 1
    fi
fi

$spm_exec --bos_id=-1 --eos_id=0 --unk_id=1 ${placeholders} ${char_cov} ${prefix} --vocab_size=${vocab_size} --input=${3} --input_sentence_size=20000000 --byte_fallback #--input_format=tsv seems broken

未来工作

  • 术语支持(使用词典),其中增加不是通过使用对齐得分,而是从词典中取值。
  • 一键运行训练

致谢

本项目已获得欧盟“地平线欧洲”研究和创新计划的支持,合同编号101070350,以及英国研究与创新(UKRI)根据英国政府的“地平线欧洲”资金担保[合同编号10052546]的支持。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源分布

opustrainer-0.2.tar.gz (34.4 kB 查看哈希值)

上传时间

构建分布

opustrainer-0.2-py3-none-any.whl (28.0 kB 查看哈希值)

上传时间 Python 3

支持者