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:
| Datei | Was ist drin? | 
|---|
| tensorflow / tensorflow / python / ops / seq2seq.py | Bibliothek zum Erstellen von Sequenz-zu-Sequenz-Modellen | 
| models / tutorials / rnn / translate / seq2seq_model.py | Neuronale Translationsmodelle von Sequenz zu Sequenz | 
| models / tutorials / rnn / translate / data_utils.py | Hilfsfunktionen zur Vorbereitung von Übersetzungsdaten | 
| models / tutorials / rnn / translate / translate.py | Die Binärdatei, die das Übersetzungsmodell trainiert und ausführt | 
Grundlagen von Sequenz zu SequenzDas 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
TensorFlow-Bibliothek seq2seqWie 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.