Wie funktioniert die Keras-Einbettungsebene?

70

Muss die Funktionsweise der Ebene "Einbetten" in der Keras-Bibliothek verstehen. Ich führe den folgenden Code in Python aus

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

was die folgende Ausgabe ergibt

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

Ich verstehe, dass jeder Wert im input_array auf einen 2-Element-Vektor im output_array abgebildet wird, so dass ein 1 × 4-Vektor 1 × 4 × 2-Vektoren ergibt. Aber wie werden die abgebildeten Werte berechnet?

Prashanth
quelle
1
Vielleicht ein guter Anfang: github.com/fchollet/keras/issues/3110 ?
Fnl
In diesem Blog wird eine Worteinbettung
Фаиль Гафаров

Antworten:

87

Tatsächlich werden die Ausgabevektoren nicht unter Verwendung einer mathematischen Operation aus der Eingabe berechnet. Stattdessen wird jede Eingabe-Ganzzahl als Index verwendet, um auf eine Tabelle zuzugreifen, die alle möglichen Vektoren enthält. Aus diesem Grund müssen Sie als erstes Argument die Größe des Vokabulars angeben (damit die Tabelle initialisiert werden kann).

Die häufigste Anwendung dieser Ebene ist die Textverarbeitung. Schauen wir uns ein einfaches Beispiel an. Unser Trainingsset besteht nur aus zwei Sätzen:

Hoffe dich bald zu sehen

Schön dich wieder zu sehen

Wir können diese Sätze also codieren, indem wir jedem Wort eine eindeutige Ganzzahl zuweisen (z. B. nach der Reihenfolge des Auftretens in unserem Trainingsdatensatz). Dann könnten unsere Sätze umgeschrieben werden als:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Stellen Sie sich nun vor, wir möchten ein Netzwerk trainieren, dessen erste Schicht eine Einbettungsschicht ist. In diesem Fall sollten wir es wie folgt initialisieren:

Embedding(7, 2, input_length=5)

Das erste Argument (7) ist die Anzahl der unterschiedlichen Wörter im Trainingssatz. Das zweite Argument (2) gibt die Größe der Einbettungsvektoren an. Das Argument input_length bestimmt natürlich die Größe jeder Eingabesequenz.

Sobald das Netzwerk trainiert wurde, können wir die Gewichte der Einbettungsschicht ermitteln, die in diesem Fall die Größe (7, 2) haben und als Tabelle für die Zuordnung von Ganzzahlen zu Einbettungsvektoren dienen können:

+------------+------------+
|   index    |  Embedding |
+------------+------------+
|     0      | [1.2, 3.1] |
|     1      | [0.1, 4.2] |
|     2      | [1.0, 3.1] |
|     3      | [0.3, 2.1] |
|     4      | [2.2, 1.4] |
|     5      | [0.7, 1.7] |
|     6      | [4.1, 2.0] |
+------------+------------+

Entsprechend diesen Einbettungen wird unsere zweite Trainingsphrase folgendermaßen dargestellt:

[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]

Es mag zunächst als nicht intuitiv erscheinen, aber die zugrunde liegenden automatischen Differenzierungs-Engines (z. B. Tensorflow oder Theano) optimieren diese Vektoren, die jeder Eingabe-Ganzzahl zugeordnet sind, genau wie alle anderen Parameter Ihres Modells. Es ist auch interessant, die Einbettungen zu verwenden, die von anderen Methoden / Personen in verschiedenen Domänen gelernt wurden (siehe https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) als fertig in [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG und Corchado, JM Angewandte Intelligenz, 1-16.

Daniel López
quelle
4
Danke für die Antwort. Nur eine Abfrage, wie werden die Gewichte der Einbettungsschicht erhalten. Wie für den Index 0, wie wird [1.2, 3.1] erhalten.
Prashanth
5
Der Inhalt der Tabelle, der Indizes zu Einbettungsvektoren in Beziehung setzt (dh die Gewichte der Einbettungsschicht), wird zufällig initialisiert und dann durch den Trainingsalgorithmus (z. B. Gradient Descent) optimiert.
Daniel López
3
Vielen Dank. Mir ist noch ein bisschen unklar, gegen was der Optimierer den Optimierer richten würde? Wie lautet die "richtige Antwort", mit der eine Verlustfunktion berechnet werden kann? Oder anders gesagt, was macht es für den Vor- und Rücklauf?
bwest87
2
Daher ist das Einbetten im Grunde genommen nur ein Teilnetz der gesamten Architektur, das alle One-Hot-codierten Eingaben auf weniger Eingaben reduziert.
Mike Campbell
1
Wie empfindlich ist die Einbettungsschicht gegenüber fehlenden Werten im Trainingssatz, da sie trainierbar ist? Nehmen wir an, ich habe zehn Wörter im Trainingsset und fünf weitere im Testset - meine Vokabellänge beträgt 15 ... aber die Ebene wird durch diese fünf "Testwörter" während des Trainings eigentlich nie aktiviert. Könnten Sie bitte diese Situation erklären?
Mikalai
6

Ich hatte auch die gleiche Frage und nachdem ich ein paar Posts und Materialien gelesen hatte, glaubte ich herauszufinden, was die Rolle der Einbettungsebene ist.

Ich denke, dieser Beitrag ist auch hilfreich, um zu verstehen, aber ich finde Daniels Antwort wirklich gut zu verdauen. Die Idee dahinter kam mir aber auch vor allem durch das Verstehen der eingebetteten Wörter .

Ich halte es für ungenau zu sagen, dass das Einbetten von Layern die One-Hot-Codierungseingabe auf weniger Eingaben reduziert. Immerhin handelt es sich bei dem One-Hot-Vektor um eindimensionale Daten, die in unserem Fall tatsächlich in zwei Dimensionen umgewandelt werden. Besser gesagt

Beim Einbetten der Ebene wird eine Beziehung der Eingaben in einer anderen Dimension erstellt

Ob in 2 Dimensionen oder noch höher.

Ich finde auch eine sehr interessante Ähnlichkeit zwischen der Worteinbettung und der Hauptkomponentenanalyse. Obwohl der Name möglicherweise kompliziert aussieht, ist das Konzept unkompliziert. PCA definiert einen Datensatz auf der Grundlage einiger allgemeiner Regeln (sogenannte Hauptkomponenten). Es ist also so, als hätten Sie Daten und möchten diese beschreiben, aber nur 2 Komponenten verwenden. Was in diesem Sinne Worteinbettungen sehr ähnlich ist. Beide machen den gleichen Job in unterschiedlichen Zusammenhängen. Sie können mehr erfahren Sie hier . Ich hoffe, dass das Verständnis von PCA das Verständnis der Einbettung von Ebenen durch Analogie unterstützt.

Zum Abschluss lautet die Antwort auf die ursprüngliche Frage des Posts " Wie berechnet es den Wert? ":

  • Grundsätzlich erfasst unser neuronales Netzwerk die zugrunde liegende Struktur der Eingaben (unsere Sätze) und versetzt die Beziehung zwischen Wörtern in unserem Vokabular durch Optimierung in eine höhere Dimension (sagen wir 2).
  • Ein tieferes Verständnis würde sagen, dass die Häufigkeit jedes Worts, das mit einem anderen Wort erscheint, von unserem Wortschatz abhängt (in einem sehr naiven Ansatz können wir es von Hand berechnen).
  • Die oben genannte Frequenz könnte eine von vielen zugrunde liegenden Strukturen sein, die NN erfassen kann
  • Die Intuition finden Sie auf dem Youtube-Link , der das Wort Einbettungen erklärt
Novin Shahroudi
quelle
7
Schöne Sicht. Ich halte es jedoch für erwähnenswert, dass während Worteinbettungstechniken wie word2vec versuchen, die vollständige Bedeutung von Wörtern in der resultierenden Einbettung zu erfassen, die Einbettungsschicht in einem überwachten Netzwerk möglicherweise nicht so eine semantisch reiche und allgemeine Darstellung erlernt. Wenn Ihr Netzwerk beispielsweise für die Stimmungsklassifizierung geschult ist, werden Wörter in der Einbettung wahrscheinlich nur entsprechend ihrer "emotionalen" Belastung gruppiert / gruppiert. Aus meiner Erfahrung heraus ist es jedoch oft nützlich, Ihre Einbettungsebene mit Gewichten zu initialisieren, die von word2vec auf einem großen Korpus gelernt wurden.
Daniel López
2
Ein heißer Vektor sind keine eindimensionalen Daten. Seine Dimension ist die Größe des Wortschatzes.
Binu Jasim
2
@BinuJasim du hast recht. Die One-Hot-Vektoren, die ein Vokabular darstellen, sind keine eindimensionalen Daten. Aber die Informationen, die es darstellt, sind tatsächlich eindimensional und jede Entität innerhalb des Vokabulars besteht aus eindimensionalen Daten. Es ist wahr, dass wir n * w (n = Vokabulargröße, w = Anzahl der Bits) Elemente haben, aber jeder Binärwert stellt einen Vektor dar, der wiederum eine eindimensionale Eingabe ist.
Novin Shahroudi
@ NovinShahroudi Genial, danke für die Erklärung.
Benyamin Jafari