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 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.