Wie kann man die Einbettungsschicht von Keras richtig verwenden?

7

Ich bin etwas verwirrt über die ordnungsgemäße Verwendung der Einbettungsebene in Keras für seq2seq-Zwecke (ich möchte das Tutorial zur maschinellen Übersetzung von TensorFlow se2seq in Keras rekonstruieren ). Meine Fragen sind folgende:

Ich verstehe, dass durch das Einbetten von Ebenen Wortwerte in einem Satz in eine Darstellung mit fester Dimension umgewandelt werden. Ich beobachte jedoch zwei unterschiedliche Verwendungsmöglichkeiten von Einbettungsebenen: Eine auf der einen Seite (wie dieses Tutorial im Keras-Blog ) verwendet externe vorab trainierte word2vec-Vektoren über den weightsParameter:

from keras.layers import Embedding

embedding_layer = Embedding(len(word_index) + 1,
  EMBEDDING_DIM,
  weights=[embedding_matrix],
  input_length=MAX_SEQUENCE_LENGTH,
  trainable=False)`

In anderen Fällen gibt es keine solche externe Ausgabe, aber die Benutzer verlassen einfach die Einbettungsebene, um die Darstellungsvektoren zu bestimmen. Ich verstehe nicht, was der wirkliche Unterschied zwischen diesen Ansätzen in Bezug auf das gewünschte Ergebnis ist. Vielleicht ist die nur interne Lösung keine semantische Darstellung? Was bringt es, eine Einbettungsschicht auf eine externe Matrix anzuwenden, deren Zeilen bereits eine feste Länge haben?

Was ist außerdem der Zweck / die Wirkung des trainableParameters der Einbettungsschicht? Bin ich richtig davon ausgegangen, dass diese Einstellung auf True die Einbettungsebene die importierten word2vec-Gewichte fein abstimmen lässt, um die tatsächlichen Trainingsbeispiele zu berücksichtigen?

Wie kann man die Einbettungsschicht anweisen, "Metazeichen" richtig zu codieren? Wenn Sie den mask_zeroParameter True setzen, kann er Auffüllnullen enthalten, aber was ist mit UNK (unbekannt), EOS (Ende des Satzes)? (Übrigens kann ich nicht verstehen, wozu das Satzende in einer satzbasierten Eingabe explizit signiert werden soll ...)

Und schließlich: Wie könnte ein Modell die Übersetzung eines Wortes vorhersagen, das nicht im Trainingssatz enthalten ist? Versucht es, es mit dem "nächsten" im Vokabular zu approximieren?

Hendrik
quelle

Antworten:

4

Sie haben einige sehr gute Punkte angesprochen. Lassen Sie uns das alles durchgehen:

Eine Worteinbettung ist eine mathematische Darstellung eines Wortes. Dies ist erforderlich, da wir nicht mit Text als einfache Eingabe arbeiten können.

Um diese Worteinbettungen zu erhalten, gibt es verschiedene Methoden, Methoden und Einstellungen, wie man sie berechnet. Bogen, Sprunggramm und so weiter.

Es gibt verschiedene vorgefertigte Worteinbettungen, z

Dies ist nur ein Auszug der bekanntesten. Wie Sie sehen können, verwendeten sie unterschiedliche Datensätze - also unterschiedliche Wortvokabeln bzw. Worteinbettungen.

Ich verstehe nicht, was der wirkliche Unterschied zwischen diesen Ansätzen in Bezug auf das gewünschte Ergebnis ist. Vielleicht ist die nur interne Lösung keine semantische Darstellung? Was bringt es, eine Einbettungsschicht auf eine externe Matrix anzuwenden, deren Zeilen bereits eine feste Länge haben?

Keras ist eine großartige Toolbox und die Einbettungsebene ist eine sehr gute Möglichkeit, um die Dinge ziemlich schnell zum Laufen zu bringen. Konvertieren Sie den Text in eine One-Hot / Count-Matrix, verwenden Sie ihn als Eingabe in die Worteinbettungsebene, und schon sind Sie fertig.

Wenn Sie dagegen vorab trainierte Wortvektoren verwenden, konvertieren Sie jedes Wort in einen Vektor und verwenden diesen als Eingabe für Ihr neuronales Netzwerk. Dieser Ansatz bietet Ihnen mehr Flexibilität beim Feature-Engineering.

Wie oben erwähnt, erhielten vorab trainierte Wortvektoren meist allgemeine Textdatensätze. Möglicherweise stoßen Sie auf einen Punkt, an dem Sie bestimmte Daten (z. B. Tweets) haben, an denen Personen anders schreiben oder sich anders verhalten. Sie können also versuchen, Ihre eigenen Einbettungen anhand Ihres eigenen Datensatzes zu trainieren - letztendlich hängt dies von Ihrer Aufgabe / Ihrem Problem und den Metriken ab, auf die Sie sich einstellen.

Was ist außerdem der Zweck / die Wirkung des trainierbaren Parameters der Einbettungsschicht?

Wie Sie richtig gesagt haben, müssen Sie die Gewichte der Einbettungen mit dem von Ihnen verwendeten Datensatz neu trainieren.

Ich kann nicht verstehen, worum es geht, das Ende eines Satzes in einer satzbasierten Eingabe explizit zu unterschreiben

Eines der wichtigsten Dinge in NLP ist das Feature-Engineering. Es ist dasselbe wie wenn Sie in der Schule sitzen und eine Sprache lernen, was berücksichtigt werden muss, Wortschatz, Grammatik und Regeln. Dinge, die es Ihnen als Mensch leichter machen, die Sprache zu verstehen. Gleiches gilt hier. Sie können es als einen Teil des Feature-Engineerings betrachten, alles summiert sich zum Gesamtbild.

Und schließlich: Wie könnte ein Modell die Übersetzung eines Wortes vorhersagen, das nicht im Trainingssatz enthalten ist?

Entweder konvertieren Sie das nicht gefundene Wort in ein <UNK>Token (unbekanntes Wort), das dann seine Gruppe darstellt. Es erfordert jedoch, dass das <UNK>Token in den trainierten Worteinbettungen enthalten ist. Oder Sie können eine Fasttext-Binärdatei verwenden, die Wortvektoren im laufenden Betrieb für unbekannte Wörter berechnet.

PSc
quelle
1
In Bezug auf Ihren letzten Vorschlag besteht eine weitere Option darin, Worteinbettungen mithilfe einer RNN zu lernen, die eine Folge von n-Gramm als Eingabe verwendet. Diese Art von Modell lernt effektiv etymologische Darstellungen (Wurzeln, Affixe) und toleriert Wörter außerhalb des Wortschatzes. Schauen Sie sich dieses Papier an: cc.gatech.edu/~ypinter3/papers/…
David Marx