В документации Keras неясно, что это на самом деле. Я понимаю, что мы можем использовать это для сжатия входного пространства функций в меньшее. Но как это сделать с точки зрения нейронного дизайна? Это автоэнокдер, RBM?
В документации Keras неясно, что это на самом деле. Я понимаю, что мы можем использовать это для сжатия входного пространства функций в меньшее. Но как это сделать с точки зрения нейронного дизайна? Это автоэнокдер, RBM?
Ответы:
Насколько мне известно, слой Embedding представляет собой простое матричное умножение, которое преобразует слова в соответствующие им вложения слов.
Веса слоя Embedding имеют форму (vocabulary_size, embedding_dimension). Для каждой обучающей выборки входными данными являются целые числа, которые представляют определенные слова. Целые числа находятся в диапазоне размера словаря. Слой внедрения преобразует каждое целое число i в i-ю строку матрицы весов внедрения.
Чтобы быстро сделать это как матричное умножение, входные целые числа сохраняются не как список целых чисел, а как горячая матрица. Следовательно, входная форма (nb_words, dictionary_size) с одним ненулевым значением в строке. Если вы умножите это на веса вложения, вы получите результат в форме
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
Таким образом, с помощью простого матричного умножения вы преобразуете все слова в образце в соответствующие вложения слов.
Keras
Embedding
Слой не выполняет никакого умножения матриц , но это только:
1. создает весовую матрицу размеров (Dictionary_size) x (embedding_dimension)
2. индексирует эту весовую матрицу
Всегда полезно взглянуть на исходный код, чтобы понять, что делает класс. В этом случае мы рассмотрим class
встраивание, которое наследуется от базового слоя, class
называемого Layer .
(1) - Создание весовой матрицы размеров (Dictionary_size) x (embedding_dimension) :
Это происходит при build
функции встраивания :
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
функции встраивания :
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
плотный слой (после того, как вы закодировали свои входные данные), чтобы получить матрицу обучаемых весов ( размеров (Dictionary_size) x (embedding_dimension) ), а затем просто выполнить умножение, чтобы получить результат, который будет точно то же самое с выводом Embedding
слоя.
Чтобы лучше понять любую функцию, рекомендуется взглянуть на исходный код. Вот для встраивания. По сути, это обучающая справочная таблица.
В 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]
, размерность которого является так называемой длиной встроенного признака.
Embedding
слой является действительно умножение матриц.
Проще говоря (с точки зрения функциональности), это простой кодировщик и полносвязный слой . Вес слоя можно тренировать.