Was ist eine Einbettungsschicht in einem neuronalen Netzwerk?


92

In vielen neuronalen Netzwerkbibliotheken gibt es eingebettete Ebenen, wie in Keras oder Lasagne .

Ich bin mir nicht sicher, ob ich seine Funktion verstehe, obwohl ich die Dokumentation gelesen habe. In der Keras-Dokumentation heißt es beispielsweise:

Positive ganze Zahlen (Indizes) in Dichtevektoren fester Größe umwandeln, z. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Könnte eine sachkundige Person erklären, was es tut und wann Sie es verwenden würden?


EDIT: Bezüglich des Einfügens in die Dokumentation gibt es nicht viel aus der Dokumentation einzufügen, daher meine Frage. Ich verstehe die Transformation nicht und auch nicht, warum sie verwendet werden sollte.

Wie auch immer, so wird es in Keras erklärt:

Einbetten

keras.layers.embeddings.Embedding (input_dim, output_dim, init = 'uniform', input_length = None, weight = None, W_regularizer = None, W_constraint = None, mask_zero = False) Wandelt positive ganze Zahlen (Indizes) in Dichtevektoren fester Größe um , z.B. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Eingabeform: 2D-Tensor mit Form: (nb_samples, sequence_length). Ausgabeform: 3D-Tensor mit Form: (nb_samples, sequence_length, output_dim). Argumente:

input_dim: int> = 0. Größe des Wortschatzes, dh. 1 + maximaler ganzzahliger Index, der in den Eingabedaten vorkommt. output_dim: int> = 0. Dimension der dichten Einbettung

Und so wird es in Lasagne erklärt:

Eine Ebene für Worteinbettungen. Die Eingabe sollte eine Tensor-Variable vom Typ Integer sein.

Parameter: incoming: eine Layer-Instanz oder ein Tupel

Die Ebene, die in diese Ebene eingespeist wird, oder die erwartete Eingabeform.

input_size: int

Die Anzahl der verschiedenen Einbettungen. Die letzte Einbettung hat den Index input_size - 1.

output_size: int

Die Größe jeder Einbettung.

W: Die gemeinsam genutzte Variable, der Ausdruck, das Numpy-Array oder die aufrufbare Variable

Anfangswert, Ausdruck oder Initialisierer für die Einbettungsmatrix. Dies sollte eine Matrix mit Form sein (input_size, output_size). Weitere Informationen finden Sie unter lasagne.utils.create_param ().

Beispiele

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
Bitte fügen Sie den Kontext ein, der zum Verständnis und zur Beantwortung Ihrer Frage erforderlich ist. Die Leute werden nicht woanders hingehen und die Dokumentation lesen wollen, um Ihre Frage für Sie zu beantworten.
gung

1
Ich habe die Änderungen vorgenommen, die Sie gefragt haben
Francesco

Ich war mit dem gleichen Zweifel und fand ein paar Dokumente, die darüber sprechen. Hier sind einige interessante: cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/… fromthebottomoftheheap.net/2011/01/21/… Anscheinend kommt es zu Verzögerungen in den eingegebenen Zeitreihen, und berücksichtigen Sie dies Verzögerungen als neue Vektoren.
abutremutante

Schauen Sie sich dieses Video an: youtube.com/watch?v=bvZnphPgz74 . Etwa 30 Minuten spricht er über Einbettungen.
Pieter

Antworten:


69

Beziehung zu Word2Vec

========================================

Word2Vec in einem einfachen Bild:

word2vec Bild

Ausführlichere Erklärung:

Ich glaube, es hängt mit der jüngsten Word2Vec-Innovation in der Verarbeitung natürlicher Sprachen zusammen. In etwa bedeutet Word2Vec, dass unser Wortschatz diskret ist und wir eine Karte lernen, die jedes Wort in einen zusammenhängenden Vektorraum einbettet. Durch die Verwendung dieser Vektorraumdarstellung erhalten wir eine kontinuierliche, verteilte Darstellung unserer Vokabeln. Wenn unser Datensatz beispielsweise aus n-Gramm besteht, können wir jetzt unsere fortlaufenden Wortmerkmale verwenden, um eine verteilte Darstellung unserer n-Gramme zu erstellen. Während des Trainings eines Sprachmodells lernen wir diese Worteinbettungskarte. Die Hoffnung ist, dass durch die Verwendung einer kontinuierlichen Darstellung ähnliche Wörter ähnlichen Regionen zugeordnet werden. Zum Beispiel im Leitartikel Verteilte Darstellungen von Wörtern und Phrasen und deren ZusammensetzungBeachten Sie in den Tabellen 6 und 7, dass bestimmte Phrasen aus semantischer Sicht sehr gute Nachbarphrasen haben. Die Transformation in diesen kontinuierlichen Raum ermöglicht es uns, kontinuierliche metrische Ähnlichkeitsbegriffe zu verwenden, um die semantische Qualität unserer Einbettung zu bewerten.

Erklärung mit Lasagne-Code

Lassen Sie uns das Lasagne-Code-Snippet aufschlüsseln:

x = T.imatrix()

x ist eine Matrix von ganzen Zahlen. Okay kein Problem. Jedes Wort im Vokabular kann als Ganzzahl oder als 1-Hot-Sparse-Codierung dargestellt werden. Wenn also x 2x2 ist, haben wir zwei Datenpunkte, von denen jeder ein 2-Gramm-Wert ist.

l_in = InputLayer((3, ))

w0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

Dies ist unsere Wort-Einbettungsmatrix. Es handelt sich um eine Matrix mit 3 Zeilen und 5 Spalten mit den Einträgen 0 bis 14.

w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Wdiese Wörter über Matrixmultiplikation. Daher das erste Wortw0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

Aufgrund der von uns verwendeten One-Hot-Sparse-Codierung wird dies auch als Tabellensuche bezeichnet.

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

Die Einbettungsschicht

 output = get_output(l1, x)

Symbolischer Theano-Ausdruck für die Einbettung.

f = theano.function([x], output)

Die Funktion, die die Einbettung berechnet.

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

(w0,w2)(w1,w2)

(w0,w2)W

f(x_test) 

kehrt zurück:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

Versuchen Sie, eine Matrix einzugeben, um Sie zu überzeugen, dass die 3 tatsächlich die Vokabulargröße darstellt x_test = [[5, 0], [1, 2]]. Sie werden sehen, dass ein Matrixfehler auftritt.


2
Diese Antwort ist gut. Ich habe eine Erweiterung dieser Frage, inwiefern eingebettete Schichten Imdb-Stimmungsproben (oder andere Datensätze) in Vektoren umwandeln. Dies sind eine Sammlung von Wörtern.
Hunch

1

In https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ habe ich versucht, ein Beispiel mit 2 Sätzen zu erstellen, keras 'texts_to_sequences

'This is a text' --> [0 0 1 2 3 4]

und Einbettungsschicht. Basierend auf Wie funktioniert die Keras-Ebene "Einbetten"? Die Einbettungsebene initialisiert den Einbettungsvektor zunächst nach dem Zufallsprinzip und aktualisiert ihn dann mithilfe des Netzwerkoptimierers auf ähnliche Weise wie jede andere Netzwerkebene in Keras.

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

Oben wäre ein anfänglicher Einbettungsvektor für einen Satz von (maximal) 6 Wörtern und output_dim von 3.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.