Подтвердить что ты не робот

Что такое вложение в Keras?

Документация Keras не совсем понятна, что это на самом деле. Я понимаю, что мы можем использовать это, чтобы сжать пространство ввода в меньший. Но как это делается с точки зрения нервного дизайна? Является ли это автономентером, RBM?

4b9b3361

Ответ 1

Насколько мне известно, слой Embedding - это простое матричное умножение, которое преобразует слова в соответствующие им вложения слов.

Массы слоя Embedding имеют форму (vocabulary_size, embedding_dimension). Для каждого учебного образца его ввод представляет собой целые числа, которые представляют собой определенные слова. Целые числа находятся в диапазоне размера словаря. Уровень Embedding преобразует каждое целое число я в i-ю строку матрицы вложений.

Чтобы быстро сделать это как матричное умножение, входные целые числа не сохраняются как список целых чисел, а как однострунная матрица. Поэтому форма ввода (nb_words, vocabulary_size) с одним ненулевым значением на строку. Если вы умножаете это на весы внедрения, вы получаете результат в форме

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

Таким образом, при простом матричном умножении все слова в образце преобразуются в соответствующие словарные вложения.

Ответ 2

Слой Keras Embedding не выполняет умножение матриц, а только:

1. создает весовую матрицу размеров (vocabulary_size) x (embedding_dimension)

2. индексирует эту весовую матрицу


Всегда полезно взглянуть на исходный код, чтобы понять, что делает класс. В этом случае мы посмотрим на class Embedding, который наследуется от class базового слоя под названием Layer.

(1) - Создание весовой матрицы измерений (vocabulary_size) x (embedding_dimension):

Это происходит в функции build Embedding:

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

Если вы посмотрите на базовый класс Layer, то увидите, что функция add_weight выше, просто создает матрицу обучаемых весов (в данном случае измерений (vocabulary_size) x (embedding_dimension)):

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) - Индексирование этой весовой матрицы

Это происходит при call функции Embedding:

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

Эта функция возвращает выходные данные слоя Embedding который является K.gather(self.embeddings, inputs). Что именно делает tf.keras.backend.gather, так это индексирует матрицу весов self.embeddings (см. Функцию build выше) в соответствии с inputs которые должны быть списками натуральных чисел.

Эти списки могут быть получены, например, если вы передадите свои входные данные для ввода текста/слов в функцию one_hot Keras, которая кодирует текст в список индексов слов размером n (это НЕ одно горячее кодирование - см. Также этот пример для получения дополнительной информации: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/).


Поэтому и все. Матричного умножения нет.

Наоборот, слой Keras Embedding полезен только потому, что именно он избегает выполнения умножения матриц и, следовательно, экономит некоторые вычислительные ресурсы.

В противном случае вы можете просто использовать слой Keras Dense (после того, как вы закодировали свои входные данные), чтобы получить матрицу обучаемых весов (из измерений (vocabulary_size) x (embedding_dimension)), а затем просто выполнить умножение, чтобы получить результат, который будет точно так же с выходом слоя Embedding.

Ответ 3

Чтобы лучше понять любую функцию, полезно взглянуть на исходный код. Вот для встраивания Так что в основном это обучаемая таблица поиска.

Ответ 4

В Keras слой Embedding - это не просто слой умножения матриц, а слой справочной таблицы (см. Функцию вызова ниже или исходное определение).

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

Что он делает, так это отображает каждое известное целое число n во inputs на вектор обучаемых элементов W[n], размерность которого представляет собой так называемую длину встроенного элемента.

Ответ 5

Говоря простыми словами (с точки зрения функциональности), это кодер с одним подключением и полностью подключенный уровень. Вес слоя можно тренировать.