Dokumentacja Keras nie jest jasna, co to właściwie jest. Rozumiem, że możemy użyć tego do skompresowania przestrzeni funkcji wejściowych do mniejszej. Ale jak to się robi z perspektywy projektowania neuronowego? Czy to jest autoenocder, RBM?
97
Odpowiedzi:
O ile wiem, warstwa osadzania to proste mnożenie macierzy, które przekształca słowa w odpowiadające im osadzenia słów.
Wagi warstwy Osadzanie mają kształt (rozmiar_cisku, wymiar_ osadzenia). Dla każdej próbki treningowej jej dane wejściowe to liczby całkowite, które reprezentują określone słowa. Liczby całkowite mieszczą się w zakresie rozmiaru słownika. Warstwa osadzania przekształca każdą liczbę całkowitą i do i-tego wiersza macierzy wag osadzania.
Aby szybko zrobić to jako mnożenie macierzy, wejściowe liczby całkowite nie są przechowywane jako lista liczb całkowitych, ale jako jedna gorąca macierz. Dlatego kształt wejściowy to (nb_words, vocabulary_size) z jedną niezerową wartością w każdym wierszu. Jeśli pomnożymy to przez wagi osadzania, otrzymamy wynik w kształcie
Tak więc za pomocą prostego mnożenia macierzy przekształcasz wszystkie słowa w próbce w odpowiadające im osadzenia słów.
źródło
Keras
Embedding
Warstwa nie wykonuje żadnego mnożenia macierzy, ale nie tylko:1. Tworzy to macierz masy (vocabulary_size) x (embedding_dimension) wymiary
2. indeksuje tę macierz wag
Zawsze warto przyjrzeć się kodowi źródłowemu, aby zrozumieć, co robi klasa. W tym przypadku przyjrzymy się
class
osadzaniu, które dziedziczy z warstwy podstawowejclass
zwanej Warstwą .(1) - Tworzenie macierzy wag o wymiarach (vocabulary_size) x (embedding_dimension) :
To jest występujących w
build
funkcji Osadzanie :Jeśli spojrzysz na warstwę bazową klasy Layer , zobaczysz, że
add_weight
powyższa funkcja po prostu tworzy macierz możliwych do nauczenia wag (w tym przypadku (vocabulary_size) x (embedding_dimension) wymiarów):(2) - Indeksowanie tej macierzy wag
To jest występujących w
call
funkcji Osadzanie :Ta funkcja zwraca wynik
Embedding
warstwy, która jestK.gather(self.embeddings, inputs)
. To, co dokładnie robi tf.keras.backend.gather , to indeksowanie macierzy wagself.embeddings
(patrzbuild
funkcja powyżej) zgodnie zinputs
listą dodatnich liczb całkowitych.Listy te można pobrać, na przykład, jeśli przekażesz wprowadzone dane / słowa do funkcji one_hot Keras, która koduje tekst do listy indeksów słów o rozmiarze n (NIE jest to jedno gorące kodowanie - zobacz także ten przykład, aby uzyskać więcej informacji: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).
Dlatego to wszystko. Nie ma mnożenia macierzy.
Wręcz przeciwnie, warstwa jest tylko użyteczne, ponieważ dokładnie unika wykonywania mnożenia macierzy i dlatego oszczędza na niektórych zasobów obliczeniowych.
Keras
Embedding
W przeciwnym razie możesz po prostu użyć
Keras
Gęstej warstwy (po zakodowaniu danych wejściowych), aby uzyskać macierz możliwych do nauczenia wag (o wymiarach (rozmiar_ słownika) x ( wymiar osadzony) ), a następnie po prostu wykonać mnożenie, aby uzyskać wynik, który będzie dokładnie to samo z wyjściemEmbedding
warstwy.źródło
Aby lepiej zrozumieć jakąkolwiek funkcję, dobrym zwyczajem jest spojrzenie na kod źródłowy. Tutaj jest do osadzania Więc w zasadzie jest to tabela wyszukiwania, którą można trenować.
źródło
W Keras ta
Embedding
warstwa NIE jest prostą warstwą mnożenia macierzy, ale warstwą tabeli przeglądowej (patrz funkcja wywołania poniżej lub oryginalna definicja ).To, co robi, polega na odwzorowaniu każdej znanej liczby całkowitej
n
winputs
możliwym do trenowania wektorze cechW[n]
, którego wymiar to tak zwana długość osadzonej cechy.źródło
Embedding
warstwa jest rzeczywiście mnożeniem macierzy.W prostych słowach (z punktu widzenia funkcjonalności) jest to jeden gorący enkoder i w pełni połączona warstwa . Wagi warstw można trenować.
źródło