Що таке шар вбудовування в нейронну мережу?


92

У багатьох бібліотеках нейронної мережі є "вбудовувальні шари", як у Кераса або Лазанья .

Я не впевнений, що розумію його функцію, незважаючи на те, що я читав документацію. Наприклад, у документації Keras написано:

Перетворіть додатні цілі числа (індекси) у вектори денс фіксованого розміру, наприклад. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Чи могла б людина, яка знає, пояснити, що вона робить, і коли ви це використаєте?


EDIT: Що стосується вставки в документацію, з документації не потрібно багато вставити, звідси і моє запитання. Я не розумію трансформації, яку вона робить, і чому її слід використовувати.

У будь-якому випадку це пояснюється в Керасі:

Вбудовування

keras.layers.embeddings.Embedding (input_dim, output_dim, init = 'рівномірний', input_length = Немає, ваги = Ні, W_regularizer = Ні, W_constraint = Ні, mask_zero = Неправильно) Перетворити додатні цілі числа (індекси) у вектори денс фіксованого розміру , напр. [[4], [20]] -> [[0,25, 0,1], [0,6, -0,2]]

Форма вводу: 2D тензор з формою: (nb_зразки, послідовність_ довжина). Форма виводу: 3D-тензор із формою: (nb_зразки, довжина_ послідовності, вихід_dim). Аргументи:

input_dim: int> = 0. Розмір лексики, тобто. 1 + максимальний цілий індекс, що виникає у вхідних даних. output_dim: int> = 0. Розмір щільного вбудовування

І ось, як це пояснено в Лазаньї:

Шар для вбудовування слів. Вхід повинен бути цілочисельною змінною тензора.

Параметри: вхідні: екземпляр шару або кортеж

Шар, що подається в цей шар, або очікувана форма введення.

input_size: int

Кількість різних вкладок. Останнє вбудовування матиме індекс input_size - 1.

output_size: int

Розмір кожного вбудовування.

W: Theano має загальну змінну, вирази, нумерований масив або дзвонить

Початкове значення, вираз або ініціалізатор матриці вбудовування. Це має бути матриця з формою (input_size, output_size). Додаткову інформацію див. У розділі lasagne.utils.create_param ().

Приклади

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
Будь ласка, вставте будь-який контекст, необхідний для розуміння та відповіді на ваше запитання. Люди не хочуть їхати кудись ще й читати документацію, щоб відповісти на ваше запитання.
gung

1
Я вніс зміни, про які ви запитували
Франческо

Я був з тим же сумнівом і знайшов кілька документів, які говорять про це. Ось кілька цікавих: cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/… fromthebottomoftheheap.net/2011/01/21/… Мабуть, він застосовує затримки в обчисленому часовому ряду, і врахуйте, що затримки як нові вектори.
abutremutante

Подивіться це відео: youtube.com/watch?v=bvZnphPgz74 . Близько 30 хвилин він розповідає про вбудовування.
Пітер

Відповіді:


69

Ставлення до Word2Vec

============================================

Word2Vec в простому малюнку:

word2vec рис

Більш поглиблене пояснення:

Я вважаю, що це пов’язано з останніми нововведеннями Word2Vec в природній обробці мови. Приблизно Word2Vec означає, що наш словниковий запас дискретний, і ми вивчимо карту, яка буде вбудовувати кожне слово в безперервний векторний простір. Використання цього векторного космічного подання дозволить нам мати постійне, розподілене представлення слів нашого словника. Якщо, наприклад, наш набір даних складається з n-грамів, ми можемо використовувати наші безперервні функції слова для створення розподіленого представлення наших n-грамів. У процесі навчання мовної моделі ми вивчимо карту вбудовування цього слова. Сподіваємось, що, використовуючи суцільне подання, наше вбудовування відобразить схожі слова на подібні регіони. Наприклад, у важливій роботі Розподілені зображення слів і фраз та їх композиційність, зауважте в Таблицях 6 і 7, що певні фрази мають дуже хороші фрази найближчого сусіда з семантичної точки зору. Перетворення в цей безперервний простір дозволяє використовувати безперервні метричні поняття подібності для оцінки смислової якості нашого вбудовування.

Пояснення за допомогою коду Лазанья

Розберемо фрагмент коду Лазанья:

x = T.imatrix()

x - матриця цілих чисел. Гаразд, без проблем. Кожне слово в словнику може бути представлене цілим числом або 1-гарячим розрідженим кодуванням. Отже, якщо х є 2х2, у нас є дві точки даних, кожна з яких - 2-грамова.

l_in = InputLayer((3, ))

Вхідний шар. 3 представляє розмір нашого словника. Отже, у нас є слова наприклад.w0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

Це наша матриця вбудовування слова. Це матриця 3 рядків за 5 стовпцями із записами від 0 до 14.

До цих пір ми маємо наступне тлумачення. Наш словник має 3 слова, і ми вбудуємо наші слова у 5-мірний векторний простір. Наприклад, ми можемо представляти одне слово , а інше слово та інше слово , наприклад, як гарячі рідкісні кодування. Ми можемо розглянути матрицю як вбудовування цих слів через матричне множення. Тому перше словоSimmilarly . w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

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

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

Шар вбудовування

 output = get_output(l1, x)

Символічний вираз Теано для вбудовування.

f = theano.function([x], output)

Функція Theano, яка обчислює вбудовування.

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

Тут варто зробити паузу, щоб обговорити, що саме означає x_test. Спочатку зауважте, що всі записи x_test знаходяться в {0, 1, 2}, тобто діапазоні (3). x_test має 2 точки даних. Перша точка даних [0, 2] являє собою 2-грам а друга точка даних являє собою 2-грам .( w 1 , w 2 )(w0,w2)(w1,w2)

Ми хочемо вбудувати наші 2-грамові, використовуючи наш слово вбудований шар зараз. Перш ніж ми зробимо це, давайте переконаємось, що ми зрозуміли, що має повернути наша функція вбудовування f. 2 грам еквівалентний матриці [[1, 0, 0], [0, 0, 1]]. Застосовуючи нашу матрицю вбудовування W до цієї розрідженої матриці, слід отримати: [[0, 1, 2, 3, 4], [10, 11, 12, 13, 14]]. Зверніть увагу, щоб розмноження матриці вийшло, ми повинні застосувати слово вбудовування матриці через правильне множення до розрідженого матричного зображення нашого 2-грамового.W(w0,w2)W

f(x_test) 

повертає:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

Щоб переконати вас, що 3 дійсно представляє розмір словникового запасу, спробуйте ввести матрицю x_test = [[5, 0], [1, 2]]. Ви побачите, що він викликає помилку невідповідності матриці.


2
ця відповідь хороша. У мене є одне розширення цього питання, яким чином вбудований шар перетворює зразок настроїв Imdb (або будь-якого іншого набору даних) у векторний. Це збірка слів.
голова

1

У https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ я спробував підготувати приклад, використовуючи 2 речення, тексти керасу_to_ наслідки

'This is a text' --> [0 0 1 2 3 4]

і вбудовувальний шар. На основі того, як працює шар "Вбудовування" Кераса? шар вбудовування спочатку ініціалізує вбудовуваний вектор навмання, а потім використовує мережевий оптимізатор для його оновлення аналогічно, як це зробить будь-який інший мережевий шар у керах.

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

Вище було б деякий початковий вектор вставки для речення (максимум) 6 слів і output_dim з 3.

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