Що таке вбудовування в Keras?


97

У документації Keras незрозуміло, що це насправді. Я розумію, що ми можемо використовувати це для стиснення вхідного простору об’єктів у менший. Але як це робиться з точки зору нейронного дизайну? Це автоенцедер, RBM?

keras 

7
Це таблиця пошуку, яку можна навчити
gokul_uf

1
Він просто створює та індексує матрицю ваги; див. мою докладну відповідь нижче ( stackoverflow.com/a/53101566/9024698 ).
Вигнанець

3
Хоча відповідь, за якою найбільш голосували, це множення матриць, вихідний код та інші відповіді показують, що насправді вони просто навчальна матриця. Вхідні слова просто виберіть відповідний рядок у цій матриці.
Даніель Меллер

Відповіді:


66

Наскільки мені відомо, рівень Вбудовування - це просте матричне множення, яке перетворює слова у відповідні їм вбудовування слів.

Ваги шару Вбудовування мають форму (vocabulary_size, embedding_dimension). Для кожної навчальної вибірки його вхідними даними є цілі числа, які представляють певні слова. Цілі числа знаходяться в межах розміру словникового запасу. Шар вбудовування перетворює кожне ціле число i в i-й рядок матриці ваг вбудовування.

Для того, щоб швидко зробити це як множення матриці, цілі числа, що вводяться, зберігаються не як список цілих чисел, а як одна гаряча матриця. Тому введена фігура (nb_words, vocabulary_size) з одним ненульовим значенням на рядок. Якщо помножити це на ваги вбудовування, ви отримаєте результат у формі

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

Отже, за допомогою простого множення матриць ви перетворюєте всі слова у зразку у відповідні вбудовані слова.


3
Безумовно, дійсний підхід (див. Навчання під наглядом за послідовністю ). Ви також можете вивчити вбудовування за допомогою автокодера, а потім використовувати їх як ініціалізацію шару Вбудовування, щоб зменшити складність нейронної мережі (я припускаю, що Ви робите щось інше після шару Вбудовування).
Лорріт

3
Ось приємний допис у блозі про вбудовування слів та їх переваги.
sietschie

3
У випадку, який я представив, кожен навчальний матеріал являє собою набір слів (може бути реченням). Кожне слово представляється у вигляді одного гарячого вектора і вбудовується в щільний вектор. Недоліком цього підходу є те, що, оскільки введення має бути постійної довжини, усі ваші речення повинні мати однакову кількість слів. Альтернативою можуть бути вектори абзаців , які можуть вбудовувати речення, абзаци або навіть документи у вектори.
Лорріт

4
Вбудовуючий шар просто оптимізує свою вагу, щоб мінімізувати втрати. Можливо, це означає, що він розгляне семантичну подібність, можливо, ні. З нейронними мережами ніколи не знаєш. Якщо ви хочете бути впевнені, що вбудовування відповідає певній формулі (наприклад, w2v), використовуйте формулу. Якщо у вас достатньо даних, можливо, ви захочете скористатися шаром вбудовування та навчити вбудовування. Просто спробуйте і перевірте, чи сподобалися вам результати.
Lorrit

2
Я погоджуюсь з користувачем36624 (відповідь нижче). Це НЕ просте множення матриць.
Даніель Меллер,

21

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шару.



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], розмірність якого є так званим вбудованим повнометражним.


Добре, коли ви множите один гарячий представлений набір векторів з матрицею, продукт стає пошуком. Таким чином, Embeddingшар є дійсно множення матриць.
yannis

За винятком того, що ніде керас не виконує це множення. Він просто визначає "вбудовування = навчальна матриця" та використовує вхідні індекси для збору слів із матриці.
Даніель Меллер,

Таким чином, це вбудовування резервує багато пам'яті, просто не створюючи жодної гарячої версії входів.
Даніель Меллер,

1

Якщо говорити простими словами (з точки зору функціональності), це однокороткий кодер і повністю підключений шар . Ваги шару піддаються дресируванню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.