Як працює шар "Вбудовування" Кераса?


70

Потрібно зрозуміти, як працює шар «Вбудовування» у бібліотеці Кераса. Я виконую наступний код у Python

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

що дає наступний вихід

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

Я розумію, що кожне значення в масиві input_array відображається на 2 елементних елементів у масиві output_array, тому вектор 1 X 4 дає 1 X 4 X 2 вектори. Але як обчислюються відображені значення?


1
Може, вдалий початок: github.com/fchollet/keras/isissue/3110 ?
fnl

У цьому блозі слово вбудовування за допомогою Keras Embedding вважається шаром Learn-neural-networks.com/world-embedding-by-keras
Фаїль Гафаров

Відповіді:


87

Фактично, вихідні вектори не обчислюються з вхідних даних, використовуючи будь-яку математичну операцію. Натомість кожне вхідне ціле число використовується як індекс для доступу до таблиці, що містить усі можливі вектори. Саме тому вам потрібно вказати розмір лексики в якості першого аргументу (щоб таблицю можна було ініціалізувати).

Найбільш поширене застосування цього шару для обробки тексту. Подивимося простий приклад. Наш навчальний набір складається лише з двох фраз:

Сподіваємося побачити Вас найближчим часом

Приємно бачити вас знову

Таким чином, ми можемо кодувати ці фрази, присвоївши кожному слову унікальне ціле число (за порядком появи у нашому навчальному наборі даних, наприклад). Тоді наші фрази можна переписати як:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

А тепер уявімо, що ми хочемо навчити мережу, перший шар якої - вбудовуючий шар. У цьому випадку ми повинні ініціалізувати його наступним чином:

Embedding(7, 2, input_length=5)

Перший аргумент (7) - це кількість різних слів у навчальному наборі. Другий аргумент (2) вказує на розмір вбудованих векторів. Input_length argumet, звичайно, визначає розмір кожної вхідної послідовності.

Після того, як мережа буде навчена, ми можемо отримати ваги вкладеного шару, який у цьому випадку буде розміром (7, 2) і може розглядатися як таблиця, яка використовується для відображення цілих чисел на вбудовування векторів:

+------------+------------+
|   index    |  Embedding |
+------------+------------+
|     0      | [1.2, 3.1] |
|     1      | [0.1, 4.2] |
|     2      | [1.0, 3.1] |
|     3      | [0.3, 2.1] |
|     4      | [2.2, 1.4] |
|     5      | [0.7, 1.7] |
|     6      | [4.1, 2.0] |
+------------+------------+

Отже, згідно з цими вкладеннями, друга наша навчальна фраза буде представлена ​​як:

[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]

Спочатку це може здатися протилежним інтуїтивно зрозумілим, але основні механізми автоматичної диференціації (наприклад, Tensorflow або Theano) вдається оптимізувати ці вектори, пов'язані з кожним цілим вхідним числом, як і будь-який інший параметр вашої моделі. Також цікаво використовувати вбудовування, вивчені іншими методами / людьми в різних областях (див. Https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) як зроблено в [1].

[1] Лопес-Санчес, Д., Герреро, Ж.Р., Аррієта, А.Г., і Корчадо, Дж. М. Гібридизація метричного навчання та обгрунтування на основі випадків адаптивного виявлення кліків. Прикладна розвідка, 1-16.


4
Дякую за відповідь. Всього один запит про те, як отримані ваги вкладеного шару. Як і для індексу 0, як виходить [1.2, 3.1].
Prashanth

5
Вміст таблиці, що пов'язує індекси з векторами вбудовування (тобто вагами вкладеного шару), ініціалізується випадковим чином, а потім оптимізується алгоритмом тренувань (наприклад, Gradient Descent).
Даніель Лопес

3
Дякую. Мені все ще незрозуміло, проти чого оптимізатор би оптимізатор? Мовляв, яка «правильна відповідь» дозволяє йому обчислити функцію втрат? Або сказати іншим способом: що це робиться для переходу вперед і назад?
bwest87

2
тож ... вбудовування - це в основному підмережа загальної архітектури, яка зменшує будь-які гарячі закодовані входи на меншу кількість входів, афакт ..
Майк Кемпбелл

1
Оскільки вбудовувальний шар проходить навчання, наскільки він чутливий до значень, відсутніх у навчальному наборі? Скажімо, у мене в навчальному наборі десять слів і ще п’ять у тестовому наборі - моя довжина лексики становить 15 ... але шар насправді ніколи не активується цими п’ятьма тестовими словами під час тренування. Не могли б ви пояснити цю ситуацію?
mikolai

6

У мене теж було таке питання, і, прочитавши пару публікацій та матеріалів, я думаю, я зрозумів, що таке роль шару вбудовування.

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

Я вважаю, що неправильно сказати, що вбудовані шари зменшують введення кодування гарячим до меншої кількості входів. Зрештою, один гарячий вектор - це одновимірні дані, і він справді перетворюється на 2 виміри в нашому випадку. Краще це сказати

шар вбудовування придумує відношення входів в іншому вимірі

Будь то в 2 вимірах або навіть вище.

Я також знаходжу дуже цікаву схожість між вбудовою слова до аналізу основних компонентів. Хоча назва може виглядати складною, концепція відверта. Що PCA робить, це визначити набір даних на основі деяких загальних правил (так званих принципових компонентів). Таким чином, це як би мати дані, і ви хочете описати їх, але використовуючи лише 2 компоненти. Що в цьому сенсі дуже схоже на вкладення слів. Вони обидва виконують однакову роботу в іншому контексті. Ви можете дізнатися більше тут . Я сподіваюся, що, можливо, розуміння PCA допоможе зрозуміти вбудовування шарів за допомогою аналогії.

Щоб завершити, відповідь на початкове запитання, що " як обчислює значення? ", Буде:

  • В основному, наша нейронна мережа фіксує основну структуру вхідних даних (наших пропозицій) і ставить відношення між словами в нашому словнику у вищий вимір (скажімо 2) шляхом оптимізації.
  • Більш глибоке розуміння сказало б, що частота кожного слова, що з’являється з іншим словом з нашого словника, впливає (за дуже наївного підходу ми можемо обчислити це вручну)
  • Вищезгадана частота може бути однією з багатьох базових структур, яку може охопити NN
  • Інтуїцію можна знайти на посиланні youtube, що пояснює вбудовування слова

7
Приємна точка зору. Однак я вважаю, що варто відзначити, що хоча методи вбудовування слів, такі як word2vec, намагаються зафіксувати повне значення слів у результаті вбудовування, вбудовуваний шар у контрольованій мережі може не навчитися такому семантично багатому та загальному уявленню. Наприклад, якщо ваша мережа навчена робити класифікацію настроїв, вона, ймовірно, просто групує / кластеризує слова у вкладанні відповідно до їх "емоційного" навантаження. Тим не менш, виходячи з мого досвіду, часто корисно ініціалізувати ваш вкладений шар вагами, вивченими word2vec на великому корпусі.
Даніель Лопес

2
один гарячий вектор - це не одновимірні дані. Його розмір - розмір словникового запасу.
Біну Ясим

2
@BinuJasim ти маєш рацію. В одній гарячі вектори , що представляють словниковий запас не є одновимірним даних. Але інформація, яку вона представляє, справді є одновимірною, і кожна сутність в словнику - це одновимірні дані. Це правда, що у нас є n * w (n = розмір словника, w = кількість біт) елементів, але кожне бінарне значення являє собою вектор, який знову є одновимірним входом.
Новін Шахроуді

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