Что такое слой внедрения в нейронной сети?

92

Во многих библиотеках нейронных сетей есть «встраиваемые слои», как в Keras или Lasagne .

Я не уверен, что понимаю его функцию, несмотря на чтение документации. Например, в документации Keras говорится:

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

Может ли знающий человек объяснить, что он делает и когда вы его используете?


РЕДАКТИРОВАТЬ: Что касается вставки в документацию, там не так много, чтобы вставить из документации, поэтому мой вопрос. Я не понимаю преобразование, которое это делает, и почему это должно использоваться.

Во всяком случае, это объясняется в Керасе:

Встраивание

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

Форма ввода: 2D-тензор с формой: (nb_samples, sequence_length). Форма вывода: 3D-тензор с формой: (nb_samples, sequence_length, output_dim). Аргументы:

input_dim: int> = 0. Размер словаря, т.е. 1 + максимальный целочисленный индекс, встречающийся во входных данных. output_dim: int> = 0. Размер плотного вложения

И вот как это объясняется в лазаньи:

Слой для встраивания слов. На входе должна быть переменная Tensor целочисленного типа.

Параметры: входящий: экземпляр слоя или кортеж

Слой, подающий в этот слой, или ожидаемая входная форма.

input_size: int

Количество различных вложений. Последнее вложение будет иметь индекс input_size - 1.

output_size: int

Размер каждого вложения.

W: общая переменная Theano, выражение, массив numpe или вызываемый

Начальное значение, выражение или инициализатор для матрицы встраивания. Это должна быть матрица с формой (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)
Francesco
источник
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 pic

Более подробное объяснение:

Я считаю, что это связано с недавним нововведением Word2Vec в обработке естественного языка. Грубо говоря, Word2Vec означает, что наш словарь дискретен, и мы изучим карту, которая будет встраивать каждое слово в непрерывное векторное пространство. Использование этого представления в векторном пространстве позволит нам иметь непрерывное распределенное представление словарных слов. Если, например, наш набор данных состоит из n-грамм, мы можем теперь использовать наши непрерывные функции слова, чтобы создать распределенное представление наших n-грамм. В процессе обучения языковой модели мы выучим эту карту встраивания слов. Надежда состоит в том, что при использовании непрерывного представления наше вложение отобразит похожие слова в похожие регионы. Например, в историческом документе « Распределенные представления слов и фраз и их композиционность».Обратите внимание, что в таблицах 6 и 7 некоторые фразы имеют очень хорошие фразы о ближайшем соседе с семантической точки зрения. Преобразование в это непрерывное пространство позволяет нам использовать непрерывные метрические понятия подобия для оценки семантического качества нашего вложения.

Объяснение с использованием кода лазаньи

Давайте разберем фрагмент кода лазаньи:

x = T.imatrix()

х - это матрица целых чисел. Хорошо, без проблем. Каждое слово в словаре может быть представлено целым числом или кодированием с 1-кратным разрежением. Поэтому, если x равен 2x2, у нас есть две точки данных, каждая по 2 грамма.

l_in = InputLayer((3, ))

w0,w1,w2

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

Это наша матрица встраивания слов. Это матрица 3 на 5 столбцов с записями от 0 до 14.

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')

(w0,w2)(w1,w2)

(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]]. Вы увидите, что это вызывает ошибку несоответствия матрицы.

Инди AI
источник
2
этот ответ хорош. У меня есть одно расширение этого вопроса, каким образом встроенный слой преобразует образец настроения Imdb (или любой другой набор данных) в вектор. Это сборник слов.
предчувствие
1

В https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ я попытался подготовить пример, используя 2 предложения, тексты keras

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

и встраивание слоя. Основано на том, как работает слой «Встраивание» Keras? Уровень внедрения сначала инициализирует вектор внедрения случайным образом, а затем использует сетевой оптимизатор для его обновления аналогично тому, как это делается для любого другого сетевого уровня в кератах.

[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.

Vaasha
источник