У документації Keras незрозуміло, що це насправді. Я розумію, що ми можемо використовувати це для стиснення вхідного простору об’єктів у менший. Але як це робиться з точки зору нейронного дизайну? Це автоенцедер, RBM?
У документації Keras незрозуміло, що це насправді. Я розумію, що ми можемо використовувати це для стиснення вхідного простору об’єктів у менший. Але як це робиться з точки зору нейронного дизайну? Це автоенцедер, RBM?
Відповіді:
Наскільки мені відомо, рівень Вбудовування - це просте матричне множення, яке перетворює слова у відповідні їм вбудовування слів.
Ваги шару Вбудовування мають форму (vocabulary_size, embedding_dimension). Для кожної навчальної вибірки його вхідними даними є цілі числа, які представляють певні слова. Цілі числа знаходяться в межах розміру словникового запасу. Шар вбудовування перетворює кожне ціле число i в i-й рядок матриці ваг вбудовування.
Для того, щоб швидко зробити це як множення матриці, цілі числа, що вводяться, зберігаються не як список цілих чисел, а як одна гаряча матриця. Тому введена фігура (nb_words, vocabulary_size) з одним ненульовим значенням на рядок. Якщо помножити це на ваги вбудовування, ви отримаєте результат у формі
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
Отже, за допомогою простого множення матриць ви перетворюєте всі слова у зразку у відповідні вбудовані слова.
Keras
Embedding
Шар не виконує ніякої множення матриць , але це тільки:
1. створює вагову матрицю розмірів (vocabulary_size) x (embading_dimension)
2. індексує цю матрицю ваги
Завжди корисно поглянути на вихідний код, щоб зрозуміти, що робить клас. У цьому випадку ми подивимось на class
Вбудовування, яке успадковується від базового шару class
під назвою Шар .
(1) - Створення вагової матриці розмірів (vocabulary_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
щільний шар (після того, як ви закодували свої вхідні дані), щоб отримати матрицю тренувальних ваг ( розмірів (vocabulary_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
шар є дійсно множення матриць.
Якщо говорити простими словами (з точки зору функціональності), це однокороткий кодер і повністю підключений шар . Ваги шару піддаються дресируванню.