Wissenstransfer und neuronale maschinelle Übersetzung in der Praxis

Die neuronale maschinelle Übersetzung (NMT) entwickelt sich sehr schnell. Um Ihren Übersetzer zusammenzustellen, müssen Sie heute nicht mehr zwei Hochschulen haben. Zum Trainieren des Modells benötigen Sie jedoch einen großen Parallelkorpus (einen Korpus, bei dem die Übersetzung in der Ausgangssprache mit dem Satz verknüpft ist). In der Praxis sprechen wir von mindestens einer Million Satzpaaren. Es gibt sogar einen eigenen großen Bereich des IWF, in dem Methoden zum Unterrichten von Sprachpaaren mit einer kleinen Datenmenge in elektronischer Form (English Low Resource NMT) untersucht werden.

Wir sammeln das tschuwaschisch-russische Korps und prüfen gleichzeitig, was mit dem verfügbaren Datenvolumen getan werden kann. In diesem Beispiel wurde ein Fall von 90.000 Satzpaaren verwendet. Das derzeit beste Ergebnis wurde durch die Methode des Wissenstransfers (engl. Transfer Learning) erzielt und wird im Artikel diskutiert. Der Artikel soll ein praktisches Beispiel für die Implementierung geben, das leicht reproduziert werden kann.

Der Trainingsplan ist wie folgt. Wir müssen ein großes (Eltern-) Gebäude nehmen, ein neuronales Modell darauf trainieren und dann unser Tochtermodell trainieren. Darüber hinaus ist die Zielsprache der Übersetzung dieselbe: Russisch. Intuitiv kann dies mit dem Erlernen einer zweiten Sprache verglichen werden. Es ist einfacher zu lernen, eine Fremdsprache zu beherrschen. Es sieht auch so aus, als würde man einen engen Bereich einer Fremdsprache studieren, zum Beispiel die medizinische Terminologie der englischen Sprache: Zuerst muss man allgemein Englisch lernen.

Als Elternkorps versuchten sie, 1 Million Satzpaare aus dem englisch-russischen Parallelkorps und 1 Million aus dem kasachisch-russischen Korps zu nehmen . Die kasachischen Daten enthalten 5 Millionen Sätze. Von diesen wurden nur diejenigen mit einem Erfüllungskoeffizienten (dritte Spalte) von mehr als 2. Die kasachische Version ergab etwas bessere Ergebnisse. Es scheint intuitiv, dass dies verständlich ist, da die tschuwaschische und die kasachische Sprache einander ähnlicher sind. Tatsächlich ist dies jedoch nicht bewiesen und hängt auch stark von der Qualität des Gehäuses ab. Weitere Details zur Auswahl des Elternkörpers finden Sie in diesem Artikel . Über das Tochterunternehmen mit 90.000 Angebotspaaren können Sie hier Musterdaten abrufen und anfordern.

Nun zum Code. Wenn Sie keine eigene schnelle Grafikkarte haben, können Sie das Modell auf der Colab- Website trainieren. Für das Training haben wir die Sockeye- Bibliothek benutzt. Es wird davon ausgegangen, dass Python3 bereits installiert ist.

pip install sockeye 

Möglicherweise müssen Sie auch separat an MXNet basteln, das für die Arbeit mit der Grafikkarte zuständig ist. Colab benötigt eine zusätzliche Bibliotheksinstallation

 pip install mxnet-cu100mkl 

Bei neuronalen Netzen wird allgemein angenommen, dass es ausreicht, dass sie die Daten so wie sie sind einspeisen, und sie werden es herausfinden. In Wirklichkeit ist dies jedoch nicht immer der Fall. In unserem Fall muss der Körper also vorverarbeitet werden. Zuerst kennzeichnen wir es so, dass die Models leichter verstehen, dass „Katze!“ Und „Katze“ ungefähr dasselbe sind. Zum Beispiel ist nur ein Python-Tokenizer ausreichend.

 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") 

Als Ergebnis füttern wir Paare von Sätzen der Form

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

und

      .  , ,       , ,    ,        . 

Die Ausgabe umfasst die folgenden tokenisierten Angebote:

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

und auf russisch

       .   ,  ,        ,  ,     ,         . 

In unserem Fall benötigen wir die kombinierten Wörterbücher der übergeordneten und untergeordneten Fälle, sodass wir gemeinsame Dateien erstellen:

 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 

da die weiterbildung des kindmodells im selben wörterbuch erfolgt.

Nun ein kleiner aber wichtiger Exkurs. In MP werden Sätze in Form von Wörtern in Atome unterteilt und dann als Wortfolgen mit Sätzen bearbeitet. Dies reicht jedoch in der Regel nicht aus, da sich aus den Wörtern, die einmal im Korpus vorkommen, ein riesiger Schwanz bildet. Es ist schwierig, ein probabilistisches Modell für sie zu erstellen. Dies gilt insbesondere für Sprachen mit entwickelter Morphologie (Fall, Geschlecht, Anzahl). Sowohl Russisch als auch Tschuwaschisch sind solche Sprachen. Aber es gibt eine Lösung. Sie können den Satz in eine niedrigere Ebene unterteilen, in Unterwörter. Wir haben die Bytepaarkodierung verwendet .

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

Wir erhalten ungefähr solche Folgen von Unterwörtern

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

und

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

Es ist zu sehen, dass Affixe sich gut von Wörtern unterscheiden: Nicht @@ für eine lange Zeit und gut @@ dass.
Bereiten Sie dazu bpe-Wörterbücher vor

 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 

Und wenden Sie sie auf Token an, zum Beispiel:

 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 

Analog dazu müssen Sie für alle Dateien Folgendes tun: Schulung, Validierung und Test von über- und untergeordneten Modellen.

Nun wenden wir uns direkt dem Training des neuronalen Modells zu. Zuerst müssen Sie allgemeine Modellwörterbücher vorbereiten:

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

Trainieren Sie als Nächstes das übergeordnete Modell. Ein einfaches Beispiel wird auf der Sockeye-Seite genauer beschrieben . Technisch gesehen besteht der Prozess aus zwei Schritten: Vorbereiten von Daten mithilfe zuvor erstellter Modellwörterbücher

 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 

und das Lernen selbst

 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 

Das Training in den Colab-Einrichtungen dauert ungefähr einen Tag. Wenn das Training des Modells abgeschlossen ist, können Sie es damit übersetzen

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

Das Kindermodell trainieren
 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 

Der Startcode für das Training sieht folgendermaßen aus

 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 

Es werden Parameter hinzugefügt, die angeben, dass die Konfiguration und Gewichte des übergeordneten Modells als Ausgangspunkt verwendet werden sollen. Details im Beispiel mit Umschulung von Sockeye . Das Lernen eines Kindermodells läuft in ungefähr 12 Stunden zusammen.

Vergleichen Sie die Ergebnisse, um sie zusammenzufassen. Das übliche maschinelle Übersetzungsmodell ergab eine BLEU-Qualität von 24,96, während das Wissenstransfermodell 32,38 BLEU betrug. Der Unterschied ist auch optisch an Übersetzungsbeispielen erkennbar. Daher werden wir dieses Modell verwenden, während wir das Gehäuse weiter zusammenbauen.

Source: https://habr.com/ru/post/de475750/


All Articles