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 ÜbersetzungsmodellWä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 AusgangsprojektionWie 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])
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 PolsternZusä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 ausUm 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.