Sequenz-zu-Sequenz-Teil-1-Modelle

Guten Tag an alle!

Und wir haben wieder einen neuen Stream für den überarbeiteten Data Scientist- Kurs geöffnet: einen weiteren hervorragenden Lehrer , ein leicht verfeinertes Programm, das auf Updates basiert. Nun, wie immer interessante offene Lektionen und Sammlungen interessanter Materialien. Heute beginnen wir mit der Analyse von seq2seq-Modellen aus Tensor Flow.

Lass uns gehen.

Wie bereits im RNN-Lernprogramm erläutert (wir empfehlen, dass Sie sich vor dem Lesen dieses Artikels damit vertraut machen), können wiederkehrende neuronale Netze zur Modellierung der Sprache unterrichtet werden. Und es stellt sich eine interessante Frage: Ist es möglich, das Netzwerk auf bestimmte Daten zu trainieren, um eine aussagekräftige Antwort zu erhalten? Können wir zum Beispiel einem neuronalen Netzwerk beibringen, von Englisch nach Französisch zu übersetzen? Es stellt sich heraus, dass wir können.

Diese Anleitung zeigt Ihnen, wie Sie ein solches End-to-End-System erstellen und trainieren. Kopieren Sie das Tensor Flow-Kernrepository und das TensorFlow-Modellrepository von GitHub . Anschließend können Sie das Übersetzungsprogramm starten:

cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory] 



Sie wird die Daten für die Übersetzung vom Englischen ins Französische von der WMT'15-Website herunterladen , sie für das Training vorbereiten und trainieren. Dies erfordert ungefähr 20 GB auf der Festplatte und viel Zeit zum Herunterladen und Vorbereiten, sodass Sie den Vorgang jetzt starten und dieses Tutorial weiterlesen können.

Das Handbuch greift auf folgende Dateien zu:

DateiWas ist drin?
tensorflow / tensorflow / python / ops / seq2seq.pyBibliothek zum Erstellen von Sequenz-zu-Sequenz-Modellen
models / tutorials / rnn / translate / seq2seq_model.pyNeuronale Translationsmodelle von Sequenz zu Sequenz
models / tutorials / rnn / translate / data_utils.pyHilfsfunktionen zur Vorbereitung von Übersetzungsdaten
models / tutorials / rnn / translate / translate.pyDie Binärdatei, die das Übersetzungsmodell trainiert und ausführt

Grundlagen von Sequenz zu Sequenz

Das von Cho et al., 2014 ( pdf ) vorgestellte grundlegende Sequenz-zu-Sequenz-Modell besteht aus zwei wiederkehrenden neuronalen Netzen (RNNs): einem Codierer (Codierer), der die Eingabedaten verarbeitet, und einem Decodierer (Decodierer), der die Daten generiert Ausgabe. Die grundlegende Architektur ist unten dargestellt:



Jedes Rechteck im obigen Bild repräsentiert eine Zelle im RNN, normalerweise eine GRU-Zelle - einen kontrollierten Wiederholungsblock oder eine LSTM-Zelle - Langzeit-Kurzzeitgedächtnis (lesen Sie das RNN-Tutorial , um mehr darüber zu erfahren). Encoder und Decoder können gemeinsame Gewichte haben oder häufiger unterschiedliche Parametersätze verwenden. Mehrschichtzellen wurden erfolgreich in Sequenz-zu-Sequenz-Modellen verwendet, um beispielsweise Sutskever et al., 2014 ( pdf ) zu übersetzen.

In dem oben beschriebenen Grundmodell muss jeder Eingang in einen Zustandsvektor fester Größe codiert werden, da dies das einzige ist, was an den Decoder übertragen wird. Um dem Decoder einen direkteren Zugriff auf Eingabedaten zu ermöglichen, wurde in Bahdanau et al., 2014 ( pdf ) ein Aufmerksamkeitsmechanismus eingeführt. Wir werden nicht auf Details des Aufmerksamkeitsmechanismus eingehen (dazu können Sie sich hier mit der Arbeit vertraut machen); Es genügt zu sagen, dass es dem Decodierer ermöglicht, bei jedem Decodierungsschritt in die Eingabedaten zu schauen. Ein mehrschichtiges Sequenz-zu-Sequenz-Netzwerk mit LSTM-Zellen und dem Aufmerksamkeitsmechanismus im Decoder ist wie folgt:



TensorFlow-Bibliothek seq2seq

Wie Sie oben sehen können, gibt es verschiedene Sequenz-zu-Sequenz-Modelle. Alle von ihnen können unterschiedliche RNN-Zellen verwenden, aber alle akzeptieren Encoder-Eingangsdaten und Decoder-Eingangsdaten. Dies ist die Basis der TensorFlow seq2seq-Bibliotheksschnittstelle (tensorflow / tensorflow / python / ops / seq2seq.py). Dieses grundlegende RNN-, Codec-Sequenz-zu-Sequenz-Modell funktioniert wie folgt.

 outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell) 

In dem oben angegebenen Aufruf ist encoder_inputs eine Liste von Tensoren, die die Eingangsdaten des Encoders darstellen und den Buchstaben A, B, C aus dem obigen Bild entsprechen. In ähnlicher Weise sind decoder_inputs Tensoren, die Decoder-Eingangsdaten darstellen. GO, W, X, Y, Z vom ersten Bild.

Das cell ist eine Instanz der Klasse tf.contrib.rnn.RNNCell , die bestimmt, welche Zelle im Modell verwendet wird. Sie können vorhandene Zellen verwenden, z. B. GRUCell oder LSTMCell , oder Sie können Ihre eigenen schreiben. Darüber hinaus bietet tf.contrib.rnn Shells zum Erstellen von mehrschichtigen Zellen, zum Hinzufügen von Ausnahmen zur tf.contrib.rnn und -ausgabe oder zu anderen Transformationen. Beispiele finden Sie im RNN-Tutorial .

Der Aufruf basic_rnn_seq2seq gibt zwei Argumente zurück: outputs und states . Beide repräsentieren eine Liste von Tensoren mit der gleichen Länge wie decoder_inputs . outputs entsprechen den Decoderausgangsdaten zu jedem Zeitschritt, im ersten Bild sind es W, X, Y, Z, EOS. Die zurückgegebenen states repräsentieren den internen Zustand des Decoders zu jedem Zeitschritt.

In vielen Anwendungen, die das Sequenz-zu-Sequenz-Modell verwenden, wird der Decoderausgang zum Zeitpunkt t zum Zeitpunkt t + 1 an den Eingang zum Decodierer zurückgesendet. Während des Testens, während der Sequenzdecodierung, wird auf diese Weise eine neue erstellt. Andererseits ist es während des Trainings üblich, zu jedem Zeitschritt die richtigen Eingabedaten an den Decoder zu senden, selbst wenn der Decoder zuvor falsch war. Funktionen in seq2seq.py unterstützen beide Modi mit dem Argument feed_previous . Betrachten Sie beispielsweise die folgende Verwendung eines verschachtelten RNN-Modells.

 outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False) 

Im embedding_rnn_seq2seq Modell sind alle Eingabedaten (sowohl encoder_inputs als auch decoder_inputs ) ganzzahlige Tensoren, die diskrete Werte widerspiegeln. Sie werden in einer engen Darstellung verschachtelt (Einzelheiten zum Anhang finden Sie im num_encoder_symbols zu num_encoder_symbols diese Anhänge zu erstellen, müssen Sie jedoch die maximale Anzahl diskreter Zeichen angeben: num_encoder_symbols auf der Encoderseite und num_decoder_symbols auf der Decoderseite.

Im obigen Aufruf setzen wir feed_previous auf False. Dies bedeutet, dass der Decoder die Tensoren decoder_inputs in der Form verwendet, in der sie bereitgestellt werden. Wenn wir feed_previous auf True setzen, verwendet der Decoder nur das erste decoder_inputs Element. Alle anderen Tensoren aus der Liste werden ignoriert und stattdessen der vorherige Wert des Decoderausgangs verwendet. Dies wird verwendet, um Übersetzungen in unserem Übersetzungsmodell zu dekodieren, kann aber auch während des Trainings verwendet werden, um die Fehlerstabilität des Modells zu verbessern. Ungefähr wie bei Bengio et al., 2015 ( pdf ).

Ein weiteres wichtiges Argument, das oben verwendet wurde, ist output_projection . Ohne Klarstellung sind die Schlussfolgerungen des eingebetteten Modells Tensoren in Form der Anzahl der Trainingsmuster pro num_decoder_symbols , da sie die Logiths jedes generierten Symbols darstellen. Wenn Trainingsmodelle mit großen Ausgabewörterbüchern, beispielsweise mit großen num_decoder_symbols , num_decoder_symbols , wird das Speichern dieser großen Tensoren unpraktisch. Stattdessen ist es besser, kleinere Tensoren zurückzugeben, die anschließend mit output_projection auf den großen Tensor output_projection . Dies ermöglicht es uns, unsere seq2seq-Modelle mit abgetasteten Softmax-Verlusten zu verwenden, wie von Jean et. al., 2014 ( pdf ).

Zusätzlich zu basic_rnn_seq2seq und embedding_rnn_seq2seq gibt es in seq2seq.py mehrere weitere Sequenz-zu-Sequenz-Modelle. Achten Sie auf sie. Alle von ihnen haben eine ähnliche Oberfläche, daher werden wir uns nicht mit ihren Details befassen. Verwenden Sie für unser Übersetzungsmodell unten embedding_attention_seq2seq .

Fortsetzung folgt.

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


All Articles