Jak działa warstwa „Osadzanie” Keras?

69

Musisz zrozumieć działanie warstwy „Osadzanie” w bibliotece Keras. Wykonuję następujący kod w Pythonie

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)

co daje następujący wynik

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]]]

Rozumiem, że każda wartość w tablicy_wejściowej jest odwzorowana na wektor 2-elementowy w tablicy_wyjściowej, więc wektor 1 X 4 daje wektory 1 X 4 X 2. Ale w jaki sposób obliczane są odwzorowane wartości?

prashanth
źródło
1
Może dobry początek: github.com/fchollet/keras/issues/3110 ?
fnl
W tym blogu słowo osadzanie za pomocą warstwy osadzania Keras jest uważane za learn-neural-networks.com/world-embedding-by-keras
Фаиль Гафаров

Odpowiedzi:

86

W rzeczywistości wektory wyjściowe nie są obliczane na podstawie danych wejściowych przy użyciu jakiejkolwiek operacji matematycznej. Zamiast tego każda liczba całkowita wejściowa służy jako indeks umożliwiający dostęp do tabeli zawierającej wszystkie możliwe wektory. Z tego powodu musisz określić rozmiar słownictwa jako pierwszy argument (aby można było zainicjować tabelę).

Najczęstszym zastosowaniem tej warstwy jest przetwarzanie tekstu. Zobaczmy prosty przykład. Nasz zestaw szkoleniowy składa się tylko z dwóch fraz:

Mam nadzieję, że zobaczymy się wkrótce

Miło cię znowu widzieć

Możemy więc zakodować te frazy, przypisując każdemu słowu unikalną liczbę całkowitą (na przykład według kolejności pojawienia się w naszym zestawie danych szkoleniowych). Następnie nasze frazy można przepisać jako:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Teraz wyobraźmy sobie, że chcemy wyszkolić sieć, której pierwsza warstwa jest warstwą osadzającą. W takim przypadku powinniśmy zainicjować go w następujący sposób:

Embedding(7, 2, input_length=5)

Pierwszy argument (7) to liczba różnych słów w zestawie treningowym. Drugi argument (2) wskazuje rozmiar wektorów osadzania. Input_length argumet oczywiście określa wielkość każdej sekwencji wejściowej.

Po przeszkoleniu sieci możemy uzyskać wagi warstwy osadzania, która w tym przypadku będzie miała rozmiar (7, 2) i można ją uznać za tabelę używaną do mapowania liczb całkowitych na wektory osadzania:

+------------+------------+
|   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] |
+------------+------------+

Tak więc, zgodnie z tymi osadzeniami, nasza druga fraza treningowa będzie reprezentowana jako:

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

Na początku może się to wydawać sprzeczne z intuicją, ale bazowe silniki automatycznego różnicowania (np. Tensorflow lub Theano) potrafią zoptymalizować te wektory powiązane z każdą liczbą całkowitą wejściową, tak jak każdy inny parametr modelu. Interesujące jest również stosowanie osadzeń poznanych przez inne metody / osoby w różnych domenach (patrz https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) jako zrobione w [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG i Corchado, JM Hybridizing metric learning i oparte na analizie przypadków uzasadnienie adaptowalnego wykrywania kliknięć. Inteligencja stosowana, 1-16.

Daniel López
źródło
4
Dziękuję za Twoją odpowiedź. Tylko jedno zapytanie, w jaki sposób uzyskano wagi warstwy osadzania. Jak dla indeksu 0, w jaki sposób uzyskuje się [1.2, 3.1].
prashanth
5
Zawartość tabeli, która odnosi indeksy do wektorów osadzania (tj. Wagi warstwy osadzania), jest inicjowana losowo, a następnie optymalizowana przez algorytm uczący (np. Opadanie gradientu).
Daniel López
3
Dzięki. Nadal jestem trochę niejasny, przeciwko czemu optymalizator by optymalizował? Na przykład, jaka jest „poprawna odpowiedź”, która pozwala jej obliczyć funkcję straty? Lub powiedział inny sposób, co to robi dla podania do przodu i do tyłu?
bwest87
2
więc ... osadzanie jest w zasadzie tylko podsiecią ogólnej architektury, która redukuje wszelkie zakodowane na gorąco dane wejściowe do mniejszej liczby wejść, afaict ..
Mike Campbell
1
Ponieważ warstwa osadzania jest możliwa do wyuczenia, jak wrażliwa jest na wartości brakujące w zestawie treningowym? Powiedzmy, że mam dziesięć słów w zestawie treningowym i pięć kolejnych w zestawie testowym - moja długość słownictwa wynosi 15 ... ale warstwa faktycznie nigdy nie jest aktywowana przez te pięć słów „testowych” podczas treningu. Czy mógłbyś wyjaśnić tę sytuację?
mikalai
6

Miałem również to samo pytanie i po przeczytaniu kilku postów i materiałów, chyba zdałem sobie sprawę, jaką rolę odgrywa warstwa osadzania.

Myślę, że ten post jest również pomocny w zrozumieniu, jednak naprawdę uważam, że odpowiedź Daniela jest wygodna do strawienia. Ale wpadłem na ten pomysł przede wszystkim dzięki zrozumieniu osadzonych słów .

Uważam, że niedopuszczalne jest stwierdzenie, że osadzanie warstw redukuje jeden sygnał wejściowy kodowania do mniejszej liczby danych wejściowych. W końcu ten jeden gorący wektor jest danymi jednowymiarowymi i faktycznie w naszym przypadku jest on zamieniany na 2 wymiary. Lepiej to powiedzieć

warstwa osadzająca wymyśla relację danych wejściowych w innym wymiarze

Czy to w 2 wymiarach, czy nawet wyżej.

Znajduję również bardzo interesujące podobieństwo między osadzaniem słów a analizą głównych składników. Chociaż nazwa może wydawać się skomplikowana, koncepcja jest prosta. PCA polega na zdefiniowaniu zestawu danych na podstawie pewnych ogólnych zasad (tak zwanych składników zasad). To tak, jakby mieć dane i chcesz je opisać, ale używając tylko 2 składników. Który w tym sensie jest bardzo podobny do osadzania słów. Obaj wykonują tę samą pracę w innym kontekście. Możesz dowiedzieć się więcej tutaj . Mam nadzieję, że zrozumienie PCA pomaga zrozumieć osadzanie warstw przez analogię.

Podsumowując, odpowiedź na pierwotne pytanie tego postu brzmiała: „ jak to oblicza wartość? ” Brzmiałaby:

  • Zasadniczo nasza sieć neuronowa przechwytuje leżącą u podstaw strukturę danych wejściowych (nasze zdania) i umieszcza relację między słowami w naszym słowniku w wyższym wymiarze (powiedzmy 2) poprzez optymalizację.
  • Głębsze zrozumienie powiedziałoby, że częstotliwość każdego słowa pojawiającego się z innym słowem z naszego słownika wpływa (w bardzo naiwnym podejściu możemy to obliczyć ręcznie)
  • Wspomniana częstotliwość może być jedną z wielu podstawowych struktur, które NN może przechwycić
  • Intuicyję można znaleźć na linku youtube wyjaśniającym osadzanie słów
Novin Shahroudi
źródło
7
Ładny punkt widzenia. Myślę jednak, że warto zauważyć, że podczas gdy techniki osadzania słów, takie jak word2vec, próbują uchwycić pełne znaczenie słów w wynikowym osadzaniu, warstwa osadzania w nadzorowanej sieci może nie nauczyć się tak bogatej semantycznie i ogólnej reprezentacji. Na przykład, jeśli twoja sieć jest przeszkolona w zakresie klasyfikacji nastrojów, prawdopodobnie po prostu grupuje / grupuje słowa w osadzaniu zgodnie z ich obciążeniem „emocjonalnym”. Niemniej jednak, w oparciu o moje doświadczenie, często przydatne jest zainicjowanie warstwy osadzania za pomocą wag wyuczonych przez word2vec na dużym korpusie.
Daniel López
2
wektor gorący nie jest danymi jednowymiarowymi. Jego wymiar to wielkość słownictwa.
Binu Jasim
2
@BinuJasim masz rację. W jednym gorące wektorów reprezentujących słownika nie ma danych jednowymiarowych. Ale informacje, które reprezentują, są w rzeczywistości jednowymiarowe, a każda istota w słowniku to jednowymiarowe dane. To prawda, że ​​mamy n * w (n = rozmiar słownictwa, w = liczba bitów), ale każda wartość binarna reprezentuje wektor, który ponownie jest jednowymiarowym wejściem.
Novin Shahroudi
@NovinShahroudi Genialne, dzięki za wyjaśnienie.
Benyamin Jafari,