[PYTHON] Vorverarbeitung zum Erstellen eines seq2seq-Modells unter Verwendung der Funktions-API von keras

Was für ein Artikel?

Für diejenigen, die dies oder jenes für Deep-Learning-Modellierung ausprobieren möchten, aber nicht wissen, wie sie es implementieren sollen Verwendung der funktionalen API von keras als Framework, das relativ flexibel und angemessen abstrahiert ist Versuchen Sie, seq2seq, das mit sequentiellen Funktionen schwierig ist, so einfach wie möglich zu implementieren

Inhaltsverzeichnis

  1. Übersicht
  2. Vorbehandlung (Imakoko)
  3. Modellbau & Lernen
  4. Inferenz
  5. Modellverbesserung (noch nicht gemacht)

Motivation für diesen Artikel

Es stellt sich heraus, dass Keras verwendet werden können, um tiefes Lernen zu implementieren. Ich verstehe, dass tiefes Lernen eine Vorverarbeitung beinhaltet. Wie kann ich die Daten in ein Format konvertieren, das die Deep-Learning-Funktion von Keras nutzen kann? Die Hauptantwort ist das.

Was Sie für die Vorverarbeitung benötigen

Gewährung von Start- / End-Token

Wenn das Übersetzungsmodell das erste Wort eines Satzes ableitet, wird das Starttoken \ für das virtuelle Wort als Eingabe verwendet. Wenn das Übersetzungsmodell schätzt, dass das nächste Wort das End-Token ist, geben Sie das End-Token \ an, damit der Satz dort enden kann.

Digitalisierung von Wortketten

Um in das Modell des maschinellen Lernens einzugeben, müssen die geladenen Zeichenkettendaten auf irgendeine Weise quantifiziert werden. Wortsack und One-Hot-Codierung jedes Wortes sind berühmte Methoden. Dieses Mal möchte ich die Einbettungsschicht von Keras am Anfang des Netzwerks verwenden, also weise ich dem Wort eine Wort-ID zu und konvertiere sie in eine Spalte mit einer Wort-ID.

Einbettungsschicht https://keras.io/ja/layers/embeddings/

Vereinheitlichung der Wortfolgenlänge

Wenn möglich, vereinheitlichen Sie die Länge der Wortzeichenfolge innerhalb des Datasets, um die Eingabe in das spätere LSTM zu erleichtern. Dieses Mal wird die Länge der Wortzeichenfolge durch Auffüllen angepasst, um der maximalen Länge im Datensatz zu entsprechen.

Verarbeitung zum Erzwingen von Lehrern

Beim Erlernen des seq2seq-Modells wird der Lehrer als Technik erzwungen. Ursprünglich verwendet der Decodierer das Schätzergebnis des vorherigen Wortes, um das nächste Wort zu schätzen. Da die richtigen Antwortdaten während des Lernens verwendet werden können, wird das nächste Wort unter Verwendung des vorherigen richtigen Antwortworts anstelle des vorherigen Schätzergebnisses geschätzt. In der Figur ist der Fluss wie folgt. LSTM-Page-2.png Selbst wenn die Schlussfolgerungen von "das" und "dies" und "Stift" und "Bleistift" falsch sind, wird die nächste Eingabe auf die richtigen Antwortdaten korrigiert. Um dies zu erreichen, bereiten Sie eine Wortfolge vor, bei der nur ein Wort von der Zielwortfolge als Eingabe des Decoders verschoben ist.

Beispiel Wenn das Schätzziel "Dies ist ein Stift. \ " ist Bereiten Sie die Wortfolge "\ Dies ist ein Stift" als Eingabe für den Decoder vor

Zusammenfassung des Verarbeitungsablaufs

Der obige Fluss kann wie folgt zusammengefasst werden.

  1. Fügen Sie am Anfang und am Ende spezielle Wörter \ und \ hinzu, damit das Modell den Anfang und das Ende des Satzes bestimmen kann.
  2. Definieren Sie eine Konvertierungsregel, die ein Wort in eine ID konvertiert, die eine Eins-zu-Eins-Entsprechung mit dem Wort aufweist, und konvertieren Sie die Wortzeichenfolge in eine Wort-ID-Zeichenfolge.
  3. Passen Sie die Länge der Wortzeichenfolge an die maximale Länge im Datensatz mit Null-Auffüllung an.
  4. Da die Eingabe in den Decoder eine Lerntechnik verwendet, die als Lehrer-Forcen bezeichnet wird, wird die Position in Bezug auf die korrekten Antwortdaten der Decoderausgabe verschoben.

Wenn beispielsweise die obige Verarbeitung durchgeführt wird, wird eine solche Konvertierung durchgeführt. Datensatzwortzeichenfolge <start> i can 't tell who will arrive first . <end> ↓ Word ID-Spalte \ [2, 6, 42, 20, 151, 137, 30, 727, 234, 4, 3, 0, 0, 0, 0, 0, 0, 0](18 Elemente)

Implementierung vor der Verarbeitung

Gewährung von Start- / End-Token

Definieren Sie die folgenden zwei Funktionen, lesen Sie Daten aus dem Datensatz für jede Zeile und geben Sie Start- / End-Token.

def preprocess_sentence(w):
    w = w.rstrip().strip()

    #Fügen Sie Start- und End-Token für Anweisungen hinzu
    #Damit das Modell weiß, wann die Vorhersage gestartet und beendet werden soll
    w = '<start> ' + w + ' <end>'
    return w

def create_dataset(path, num_examples):
    with open(path) as f:
        word_pairs = f.readlines()
    word_pairs = [preprocess_sentence(sentence) for sentence in word_pairs]

    return word_pairs[:num_examples]

Obwohl es preprocess_sentence heißt, gibt es nur Start- / End-Token, was für eine Funktion kein sehr guter Name ist. Die Variable in create_dataset ist word_pairs, da der Beispielcode von TensorFlow, auf den ich verwiesen habe, noch vorhanden ist. Es sind überhaupt keine Paare, sondern es werden num_examples-Wortzeichenfolgen mit Start- / End-Token zurückgegeben.

Definieren Sie die Konvertierungsregel in die Wort-ID

In eine Spalte mit Wort-IDs konvertieren

Hier ist Keras 'keras.preprocessing.text.Tokenizer` sehr praktisch und Sie können eine Pause machen.

def tokenize(lang):
    lang_tokenizer = keras.preprocessing.text.Tokenizer(filters='', oov_token='<unk>')
    lang_tokenizer.fit_on_texts(lang)

    tensor = lang_tokenizer.texts_to_sequences(lang)

    tensor = keras.preprocessing.sequence.pad_sequences(tensor, padding='post')

    return tensor, lang_tokenizer

Bestimmen Sie die Konvertierungsregel zwischen Wörtern und Wort-IDs aus der Liste der Wortzeichenfolgen, die mit der Methode fit_on_texts eingegeben wurden. Mit der Methode "text_to_sequences" können Sie die Liste der eingegebenen Wortzeichenfolgen in eine Liste der Wort-ID-Zeichenfolgen konvertieren. Das Auffüllen von 0 erfolgt auch mit keras.preprocessing.sequence.pad_sequences.

Verarbeitung zum Erzwingen von Lehrern

Eingabewort-ID-Zeichenfolge, die durch Verarbeiten von "input_tensor" mit der obigen Methode erhalten wird Verarbeiten Sie target_tensor als die richtige Wort-ID-Zeichenfolge, die von der obigen Methode wie folgt verarbeitet wird.

encoder_input_tensor = input_tensor
decoder_input_tensor = target_tensor[:,:-1]
decoder_target_tensor = target_tensor[:,1:] #Dies verwirklicht das Erzwingen von Lehrern

Sie haben jetzt die Daten, die im seq2seq-Modell verwendet werden sollen. Wir werden im nächsten Artikel modellieren und lernen.

Referenz

Der Vorbehandlungsteil ist wie folgt Neuronale maschinelle Übersetzung mit Aufmerksamkeit https://www.tensorflow.org/tutorials/text/nmt_with_attention

Die Codebasis für den Lern- / Inferenzteil ist wie folgt Sequence to sequence example in Keras (character-level). https://keras.io/examples/lstm_seq2seq/

Die zum Lernen verwendeten Daten sind wie folgt https://github.com/odashi/small_parallel_enja

Das Repository mit dem Code für diesen Artikel https://github.com/nagiton/simple_NMT

Recommended Posts

Vorverarbeitung zum Erstellen eines seq2seq-Modells unter Verwendung der Funktions-API von keras
Erstellen eines seq2seq-Modells unter Verwendung der funktionalen API-Inferenz von keras
Erstellen Sie ein seq2seq-Modell mit dem Functional API Model Building & Learning von keras
Erstellen eines seq2seq-Modells mithilfe der Funktions-API-Übersicht von keras
Multi-Input / Multi-Output-Modell mit funktionaler API
Massenposting an Qiita: Team mit Qiita API
Versuchen Sie, XOR mit der Keras Functional API zu implementieren
Anwenden der Bayes'schen Optimierung auf das Keras-DNN-Modell
Vorgehensweise zur Verwendung der WEG-API von TeamGant (mit Python)
Erstellen Sie einfach einen API-Server mit dem Modul go-json-rest
So erhalten Sie Artikeldaten mithilfe der Qiita-API
[PyTorch] Beispiel ⑧ ~ So erstellen Sie ein komplexes Modell ~