Co to jest osadzanie w Keras?


97

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?

keras 

7
Jest to tabela przeglądowa, którą można trenować
gokul_uf

1
Po prostu tworzy i indeksuje macierz wag; zobacz moją szczegółową odpowiedź poniżej ( stackoverflow.com/a/53101566/9024698 ).
Outcast

3
Chociaż najczęściej głosowana odpowiedź mówi, że jest to mnożenie macierzy, kod źródłowy i inne odpowiedzi pokazują, że w rzeczywistości są one tylko możliwą do nauczenia macierzą. Wprowadzane słowa po prostu wybierają odpowiedni wiersz w tej macierzy.
Daniel Möller

Odpowiedzi:


67

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

(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)

Tak więc za pomocą prostego mnożenia macierzy przekształcasz wszystkie słowa w próbce w odpowiadające im osadzenia słów.


3
Zdecydowanie poprawne podejście (patrz częściowo nadzorowane uczenie się sekwencji ). Możesz również nauczyć się osadzania za pomocą autoenkodera, a następnie użyć ich jako inicjalizacji warstwy osadzania, aby zmniejszyć złożoność sieci neuronowej (zakładam, że robisz coś innego po warstwie osadzania).
Lorrit,

3
Oto fajny post na blogu o osadzaniu słów i ich zaletach.
sietschie

3
W przypadku, który przedstawiłem, każde wejście treningowe to zestaw słów (może to być zdanie). Każde słowo jest reprezentowane jako jeden gorący wektor i osadzone w gęstym wektorze. Wadą tego podejścia jest to, że ponieważ dane wejściowe muszą mieć stałą długość, wszystkie zdania muszą mieć taką samą liczbę słów. Alternatywą byłyby wektory akapitowe , które mogą osadzać zdania, akapity, a nawet dokumenty w wektorach.
Lorrit

4
Warstwa osadzania po prostu zoptymalizuje swoje wagi, aby zminimalizować straty. Może to oznacza, że ​​rozważy podobieństwo semantyczne, a może nie. Nigdy nie wiadomo z sieciami neuronowymi. Jeśli chcesz mieć pewność, że osadzanie jest zgodne z określoną formułą (np. W2v), użyj wzoru. Jeśli masz wystarczającą ilość danych, możesz chcieć użyć warstwy Osadzanie i nauczyć osadzania. Po prostu spróbuj i sprawdź, czy podobają Ci się wyniki.
Lorrit,

2
Zgadzam się z user36624 (odpowiedź poniżej). To NIE jest proste mnożenie macierzy.
Daniel Möller

21

Keras EmbeddingWarstwa 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 podstawowej classzwanej Warstwą .

(1) - Tworzenie macierzy wag o wymiarach (vocabulary_size) x (embedding_dimension) :

To jest występujących w buildfunkcji Osadzanie :

def build(self, input_shape):
    self.embeddings = self.add_weight(
        shape=(self.input_dim, self.output_dim),
        initializer=self.embeddings_initializer,
        name='embeddings',
        regularizer=self.embeddings_regularizer,
        constraint=self.embeddings_constraint,
        dtype=self.dtype)
    self.built = True

Jeśli spojrzysz na warstwę bazową klasy Layer , zobaczysz, że add_weightpowyższa funkcja po prostu tworzy macierz możliwych do nauczenia wag (w tym przypadku (vocabulary_size) x (embedding_dimension) wymiarów):

def add_weight(self,
               name,
               shape,
               dtype=None,
               initializer=None,
               regularizer=None,
               trainable=True,
               constraint=None):
    """Adds a weight variable to the layer.
    # Arguments
        name: String, the name for the weight variable.
        shape: The shape tuple of the weight.
        dtype: The dtype of the weight.
        initializer: An Initializer instance (callable).
        regularizer: An optional Regularizer instance.
        trainable: A boolean, whether the weight should
            be trained via backprop or not (assuming
            that the layer itself is also trainable).
        constraint: An optional Constraint instance.
    # Returns
        The created weight variable.
    """
    initializer = initializers.get(initializer)
    if dtype is None:
        dtype = K.floatx()
    weight = K.variable(initializer(shape),
                        dtype=dtype,
                        name=name,
                        constraint=constraint)
    if regularizer is not None:
        with K.name_scope('weight_regularizer'):
            self.add_loss(regularizer(weight))
    if trainable:
        self._trainable_weights.append(weight)
    else:
        self._non_trainable_weights.append(weight)
    return weight

(2) - Indeksowanie tej macierzy wag

To jest występujących w callfunkcji Osadzanie :

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

Ta funkcja zwraca wynik Embeddingwarstwy, która jest K.gather(self.embeddings, inputs). To, co dokładnie robi tf.keras.backend.gather , to indeksowanie macierzy wag self.embeddings(patrz buildfunkcja powyżej) zgodnie z inputslistą 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ściem Embeddingwarstwy.


5

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ć.


4

W Keras ta Embeddingwarstwa NIE jest prostą warstwą mnożenia macierzy, ale warstwą tabeli przeglądowej (patrz funkcja wywołania poniżej lub oryginalna definicja ).

def call(self, inputs):
    if K.dtype(inputs) != 'int32':
        inputs = K.cast(inputs, 'int32')
    out = K.gather(self.embeddings, inputs)
    return out

To, co robi, polega na odwzorowaniu każdej znanej liczby całkowitej nw inputsmożliwym do trenowania wektorze cech W[n], którego wymiar to tak zwana długość osadzonej cechy.


Cóż, kiedy pomnożymy jeden-gorący zestaw wektorów za pomocą macierzy, iloczyn staje się wyszukiwaniem. Zatem Embeddingwarstwa jest rzeczywiście mnożeniem macierzy.
yannis

Tyle że nigdzie keras nie wykonuje takiego mnożenia. Po prostu definiuje "osadzanie = możliwą do nauczenia macierz" i używa indeksów wejściowych do zbierania słów z macierzy.
Daniel Möller

Tak więc to osadzanie oszczędza dużo pamięci, po prostu nie tworząc żadnej gorącej wersji danych wejściowych.
Daniel Möller

1

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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.