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.