Co to jest warstwa osadzająca w sieci neuronowej?

91

W wielu bibliotekach sieci neuronowych istnieją „warstwy osadzania”, jak w Keras lub Lasagne .

Nie jestem pewien, czy rozumiem jego funkcję, pomimo przeczytania dokumentacji. Na przykład w dokumentacji Keras napisano:

Zamień dodatnie liczby całkowite (indeksy) na wektory den o stałym rozmiarze, np. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Czy osoba kompetentna może wyjaśnić, co robi i kiedy z niej skorzystasz?


EDYCJA: Jeśli chodzi o wklejanie w dokumentacji, nie ma wiele do wklejenia z dokumentacji, stąd moje pytanie. Nie rozumiem transformacji, której dokonuje, ani dlaczego należy jej używać.

W każdym razie tak to wyjaśniono w Keras:

Osadzanie

keras.layers.embeddings.Embedding (input_dim, output_dim, init = 'uniform', input_length = None, weight = None, W_regularizer = None, W_constraint = None, mask_zero = False) Zamień liczby całkowite (indeksy) na wektory o stałym rozmiarze np. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Kształt wejściowy: tensor 2D o kształcie: (nb_samples, sekwencja_długość). Kształt wyjściowy: tensor 3D o kształcie: (nb_samples, sekwencja_długość, wyjście_dim). Argumenty:

input_dim: int> = 0. Rozmiar słownictwa, tj. 1 + maksymalny wskaźnik liczb całkowitych występujących w danych wejściowych. output_dim: int> = 0. Wymiar gęstego osadzania

A oto jak to wyjaśniono w Lasagne:

Warstwa do osadzania słów. Dane wejściowe powinny być zmiennymi Tensor typu liczb całkowitych.

Parametry: przychodzące: instancja warstwy lub krotka

Warstwa podawana do tej warstwy lub oczekiwany kształt wejściowy.

input_size: int

Liczba różnych osadzeń. Ostatnie osadzenie będzie miało indeks rozmiar_wejściowy - 1.

rozmiar_wyjściowy: int

Rozmiar każdego osadzenia.

W: Theano wspólna zmienna, wyrażenie, tablica numpy lub możliwość wywołania

Wartość początkowa, wyrażenie lub inicjator macierzy osadzania. Powinna to być macierz o kształcie (rozmiar_wejściowy, rozmiar_wyjściowy). Aby uzyskać więcej informacji, zobacz lasagne.utils.create_param ().

Przykłady

>>> 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)
Francesco
źródło
1
Wklej w odpowiednim kontekście, aby zrozumieć i odpowiedzieć na twoje pytanie. Ludzie nie będą chcieli iść gdzie indziej i czytać dokumentacji, aby odpowiedzieć na twoje pytanie.
gung
1
Wprowadziłem zmiany, o które prosiłeś
Francesco,
Miałem te same wątpliwości i znalazłem kilka dokumentów, które o tym mówią. Oto kilka interesujących: cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/... fromthebottomoftheheap.net/2011/01/21/... Najwyraźniej stosuje opóźnienia w wprowadzonych szeregach czasowych i weź pod uwagę, że opóźnienia jako nowe wektory.
abutremutante
Obejrzyj wideo: youtube.com/watch?v=bvZnphPgz74 . Około 30 minut mówi o osadzaniu.
Pieter

Odpowiedzi:

69

Związek z Word2Vec

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

Word2Vec na prostym zdjęciu:

word2vec pic

Bardziej szczegółowe wyjaśnienie:

Uważam, że jest to związane z ostatnią innowacją Word2Vec w przetwarzaniu języka naturalnego. Z grubsza, Word2Vec oznacza, że ​​nasze słownictwo jest dyskretne i nauczymy się mapy, która osadzi każde słowo w ciągłej przestrzeni wektorowej. Korzystanie z tego wektora reprezentacji przestrzeni pozwoli nam mieć ciągłą, rozproszoną reprezentację naszych słów słownictwa. Jeśli na przykład nasz zestaw danych składa się z n-gramów, możemy teraz korzystać z funkcji ciągłego słowa, aby utworzyć rozproszoną reprezentację naszych n-gramów. W trakcie szkolenia modelu językowego poznamy mapę osadzania słów. Mamy nadzieję, że dzięki ciągłej reprezentacji nasze osadzanie zamapuje podobne słowa na podobne regiony. Na przykład w przełomowym artykule Rozproszone reprezentacje słów i zwrotów oraz ich skład, zauważ w tabelach 6 i 7, że niektóre frazy mają bardzo dobre zwroty najbliższego sąsiada z semantycznego punktu widzenia. Przekształcanie się w tę ciągłą przestrzeń pozwala nam wykorzystywać ciągłe pojęcia podobieństwa do oceny jakości semantycznej naszego osadzania.

Wyjaśnienie za pomocą kodu Lasagne

Podzielmy fragment kodu Lasagne:

x = T.imatrix()

x jest macierzą liczb całkowitych. Dobrze, nie ma problemu. Każde słowo w słowniku może być reprezentowane liczbą całkowitą lub 1-gorącym kodowaniem rzadkim. Więc jeśli x wynosi 2x2, mamy dwa punkty danych, każdy o gramaturze 2.

l_in = InputLayer((3, ))

w0,w1,w2

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

To jest nasza matryca do osadzania słów. Jest to matryca 3 wiersze na 5 kolumn z wpisami od 0 do 14.

w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

Należy zauważyć, że ze względu na to, że używamy jednego gorącego kodowania rzadkiego, jest to również określane jako wyszukiwanie tabel.

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

Warstwa osadzania

 output = get_output(l1, x)

Symboliczne wyrażenie Theano do osadzania.

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

Funkcja Theano, która oblicza osadzanie.

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

(w0,w2)(w1,w2)

(w0,w2)W

f(x_test) 

zwroty:

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

Aby przekonać cię, że 3 rzeczywiście reprezentuje rozmiar słownictwa, spróbuj wprowadzić macierz x_test = [[5, 0], [1, 2]]. Zobaczysz, że powoduje to błąd nieprawidłowego dopasowania matrycy.

Indie AI
źródło
2
ta odpowiedź jest dobra. Mam jedno rozszerzenie tego pytania, w jaki sposób warstwa osadzona przekształca próbkę nastroju Imdb (lub dowolnego innego zestawu danych) na wektor. To zbiór słów.
przeczucie
1

W https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ próbowałem przygotować przykład, używając 2 zdań, tekstów keras_to_sekwencji

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

i osadzanie warstwy. Na podstawie tego, jak działa warstwa „Osadzanie” Keras? warstwa osadzania najpierw inicjuje losowo wektor osadzania, a następnie używa optymalizatora sieci, aby zaktualizować go w podobny sposób, jak w przypadku każdej innej warstwy sieci w 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]

Powyżej byłby jakiś początkowy wektor osadzania dla zdania (maksymalnie) 6 słów i output_dim 3.

Vaasha
źródło