Sequenz-zu-Sequenz-Teil-2-Modelle

Hallo allerseits!

Der zweite Teil der Übersetzung, den wir vor einigen Wochen veröffentlicht haben, bereitet den Start des zweiten Streams des Kurses „Data Scientist“ vor . Ahead ist ein weiteres interessantes Material und eine offene Lektion.

In der Zwischenzeit gingen wir weiter in den Dschungel der Models.

Neuronales Übersetzungsmodell

Während der Kern des Sequenz-zu-Sequenz-Modells durch Funktionen aus tensorflow/tensorflow/python/ops/seq2seq.py , gibt es in unserem Übersetzungsmodell in models/tutorials/rnn/translate/seq2seq_model.py noch einige Tricks erwähnenswert.



Sampled Softmax und Ausgangsprojektion

Wie oben erwähnt, möchten wir den abgetasteten Softmax verwenden, um mit einem großen Ausgabewörterbuch zu arbeiten. Um daraus zu dekodieren, müssen Sie die Projektion der Ausgabe verfolgen. Sowohl der abgetastete Softmax-Verlust als auch die Ausgabeprojektion werden durch den folgenden Code in seq2seq_model.py .

 if num_samples > 0 and num_samples < self.target_vocab_size: w_t = tf.get_variable("proj_w", [self.target_vocab_size, size], dtype=dtype) w = tf.transpose(w_t) b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype) output_projection = (w, b) def sampled_loss(labels, inputs): labels = tf.reshape(labels, [-1, 1]) # We need to compute the sampled_softmax_loss using 32bit floats to # avoid numerical instabilities. local_w_t = tf.cast(w_t, tf.float32) local_b = tf.cast(b, tf.float32) local_inputs = tf.cast(inputs, tf.float32) return tf.cast( tf.nn.sampled_softmax_loss( weights=local_w_t, biases=local_b, labels=labels, inputs=local_inputs, num_sampled=num_samples, num_classes=self.target_vocab_size), dtype) 

Beachten Sie zunächst, dass wir nur dann gesampelten Softmax erstellen, wenn die Anzahl der Samples (standardmäßig 512) unter der Zielwörterbuchgröße liegt. Für Wörterbücher kleiner als 512 ist es besser, den Standard-Softmax-Verlust zu verwenden.

Erstellen Sie dann eine Projektion der Ausgabe. Dies ist ein Paar, das aus einer Matrix von Gewichten und einem Verschiebungsvektor besteht. Bei Verwendung gibt die rnn-Zelle die Formvektoren der Anzahl der Trainingsmuster nach size und nicht die Anzahl der Trainingsmuster nach target_vocab_size . Um Protokolle wiederherzustellen, müssen Sie sie mit der Gewichtungsmatrix multiplizieren und einen Versatz hinzufügen, der in den Zeilen 124-126 in seq2seq_model.py .

 if output_projection is not None: for b in xrange(len(buckets)): self.outputs[b] = [tf.matmul(output, output_projection[0]) + output_projection[1] for ...] 

Schaufeln und Polstern

Zusätzlich zum abgetasteten Softmax verwendet unser Übersetzungsmodell auch Bucketing , eine Methode, mit der Sie Sätze unterschiedlicher Länge effizient verwalten können. Erklären Sie zunächst das Problem. Bei der Übersetzung vom Englischen ins Französische haben wir englische Sätze unterschiedlicher Länge L1 am Eingang und französische Sätze unterschiedlicher Länge L1 am Ausgang. Da der englische Satz als encoder_inputs wird und der französische Satz als decoder_inputs (mit dem GO-Symbolpräfix) angezeigt wird, muss für jedes Paar (L1, L2 + 1) von Längen englischer und französischer Sätze ein seq2seq-Modell erstellt werden. Als Ergebnis erhalten wir ein riesiges Diagramm, das aus vielen ähnlichen Untergraphen besteht. Auf der anderen Seite können wir jeden Satz mit speziellen PAD-Zeichen „auffüllen“. Und dann brauchen wir nur ein seq2seq-Modell für "gepackte" Längen. Ein solches Modell ist jedoch in kurzen Sätzen unwirksam - Sie müssen viele nutzlose PAD-Zeichen codieren und decodieren.

Als Kompromiss zwischen dem Erstellen eines Diagramms für jedes Längenpaar und dem Füllen auf eine einzelne Länge verwenden wir eine bestimmte Anzahl von Eimern und füllen jeden Satz auf die Länge der obigen Gruppe. In translate.py wir standardmäßig die folgenden Gruppen.

 buckets = [(5, 10), (10, 15), (20, 25), (40, 50)] 


Wenn also ein englischer Satz mit 3 Token am Eingang ankommt und der entsprechende französische Satz 6 Token am Ausgang enthält, gehen sie in die erste Gruppe und werden am Eingang des Codierers auf Länge 5 und am Eingang des Decoders auf Länge 10 gefüllt. Und wenn das englische Angebot 8 Token enthält und die entsprechenden französischen 18, fallen sie nicht in die Gruppe (10, 15) und werden an die Gruppe (20, 25) übertragen, dh das englische Angebot erhöht sich auf 20 Token und das französische auf 25.

Denken Sie daran, dass wir beim Erstellen des Decoder-Eingangs dem Eingang das Sonderzeichen GO hinzufügen. Dies geschieht in der Funktion get_batch() in seq2seq_model.py , die auch den englischen Satz seq2seq_model.py . Das Umdrehen der Eingabe trug dazu bei, die Ergebnisse des neuronalen Übersetzungsmodells von Sutskever et al., 2014 (pdf) zu verbessern . Um es endlich herauszufinden, stellen Sie sich vor, dass es einen Satz "Ich gehe" gibt. An der Eingabe, aufgeteilt in Token ["I", "go", "."] Und an der Ausgabe gibt es einen Satz "Je vais.", Gebrochen in Token ["Je", "vais", "."] . Sie werden der Gruppe (5, 10) mit einer Darstellung des Eingangscodierers [PAD PAD "." "go" "I"] hinzugefügt [PAD PAD "." "go" "I"] [PAD PAD "." "go" "I"] und Decodereingang [GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD] [GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD] .

Führen Sie es aus

Um das oben beschriebene Modell zu trainieren, benötigen Sie ein großes anglo-französisches Korps. Für das Training werden wir das 10 ^ 9 französisch-englische Korps von der WMT'15-Website verwenden und Nachrichten von derselben Site als Arbeitsprobe testen. Beide Datensätze werden beim nächsten Befehl in train_dir geladen.

 python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --en_vocab_size=40000 --fr_vocab_size=40000 

Sie benötigen 18 GB Festplattenspeicher und mehrere Stunden, um das Schulungsgebäude vorzubereiten. Der Fall wird entpackt, Wörterbuchdateien werden in data_dir, und danach wird der Fall tokenisiert und in ganzzahlige Bezeichner konvertiert. Achten Sie auf die Parameter, die für die Größe des Wörterbuchs verantwortlich sind. Im obigen Beispiel werden alle Wörter außerhalb der 40.000 am häufigsten verwendeten Wörter in ein UNK-Token konvertiert, das ein unbekanntes Wort darstellt. Wenn Sie also die Größe des Wörterbuchs ändern, reformiert die Binärdatei das Gehäuse durch die Token-ID neu. Nach der Datenvorbereitung beginnt das Training.

Die in translate angegebenen Werte sind standardmäßig sehr hoch. Große Modelle, die lange lernen, zeigen gute Ergebnisse, aber es kann zu viel Zeit oder zu viel GPU-Speicher dauern. Sie können ein kleineres Modelltraining angeben, wie im folgenden Beispiel.

 python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --size=256 --num_layers=2 --steps_per_checkpoint=50 

Der obige Befehl trainiert das Modell mit zwei Ebenen (standardmäßig gibt es 3), von denen jede 256 Einheiten hat (Standard - 1024), mit einem Prüfpunkt alle 50 Schritte (Standard - 200). Experimentieren Sie mit diesen Optionen, um festzustellen, welches Modell für Ihre GPU geeignet ist.

Während des Trainings gibt jeder Schritt der Binärdatei steps_per_checkpoin t Statistiken über vergangene Schritte aus. Bei Standardparametern (3 Schichten der Größe 1024) lautet die erste Meldung wie folgt:

 global step 200 learning rate 0.5000 step-time 1.39 perplexity 1720.62 eval: bucket 0 perplexity 184.97 eval: bucket 1 perplexity 248.81 eval: bucket 2 perplexity 341.64 eval: bucket 3 perplexity 469.04 global step 400 learning rate 0.5000 step-time 1.38 perplexity 379.89 eval: bucket 0 perplexity 151.32 eval: bucket 1 perplexity 190.36 eval: bucket 2 perplexity 227.46 eval: bucket 3 perplexity 238.66 

Beachten Sie, dass jeder Schritt etwas weniger als 1,4 Sekunden dauert, was die Trainingsprobe und die Arbeitsprobe in jeder Gruppe verwirrt. Nach ungefähr 30.000 Schritten sehen wir, wie die Verwirrungen kurzer Sätze (Gruppen 0 und 1) eindeutig werden. Das Trainingsgebäude enthält ungefähr 22 Millionen Sätze. Eine Iteration (ein Lauf von Trainingsdaten) dauert ungefähr 340.000 Schritte mit einer Anzahl von Trainingsmustern in Höhe von 64. In diesem Stadium kann das Modell verwendet werden, um englische Sätze mit der Option --decode ins Französische zu übersetzen.

 python translate.py --decode --data_dir [your_data_directory] --train_dir [checkpoints_directory] Reading model parameters from /tmp/translate.ckpt-340000 > Who is the president of the United States? Qui est le président des États-Unis ? 

Was weiter?

Das obige Beispiel zeigt, wie Sie Ihren eigenen Englisch-Französisch-Übersetzer Ende-zu-Ende erstellen. Führen Sie es aus und sehen Sie, wie das Modell funktioniert. Die Qualität ist akzeptabel, aber mit Standardparametern kann kein ideales Übersetzungsmodell erhalten werden. Hier sind einige Dinge, die Sie verbessern können.

Zunächst verwenden wir die primitive Tokenisierung, die Grundfunktion von basic_tokenizer in data_utils . Einen besseren Tokenizer finden Sie auf der WMT'15-Website . Die Verwendung und eines großen Wörterbuchs kann die Übersetzungen verbessern.

Außerdem sind die Standardparameter des Übersetzungsmodells nicht perfekt konfiguriert. Sie können versuchen, die Lerngeschwindigkeit, Dämpfung und Initialisierung der Modellgewichte zu ändern. Sie können auch den Standard- GradientDescentOptimizer in seq2seq_model.py durch etwas Fortgeschritteneres wie AdagradOptimizer . Versuchen Sie, auf bessere Ergebnisse zu achten!

Schließlich kann das oben dargestellte Modell nicht nur für die Übersetzung verwendet werden, sondern auch für jede andere Sequenz-zu-Sequenz-Aufgabe. Selbst wenn Sie eine Sequenz in einen Baum verwandeln möchten, z. B. einen Analysebaum generieren möchten, kann dieses Modell Ergebnisse auf dem neuesten Stand der Technik liefern, wie von Vinyals & Kaiser et al., 2014 (pdf) gezeigt . So können Sie nicht nur einen Übersetzer, sondern auch einen Parser, einen Chat-Bot oder ein beliebiges anderes Programm erstellen. Experimentieren Sie!

Das ist alles!

Wir warten hier auf Ihre Kommentare und Fragen oder laden Sie ein, ihren Lehrer in einer offenen Lektion zu fragen.

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


All Articles