Документация Keras не совсем понятна, что это на самом деле. Я понимаю, что мы можем использовать это, чтобы сжать пространство ввода в меньший. Но как это делается с точки зрения нервного дизайна? Является ли это автономентером, RBM?
Что такое вложение в Keras?
Ответ 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
Говоря простыми словами (с точки зрения функциональности), это кодер с одним подключением и полностью подключенный уровень. Вес слоя можно тренировать.