¿Cómo funciona la capa de 'incrustación' de Keras?

70

Necesita comprender el funcionamiento de la capa 'Incrustación' en la biblioteca Keras. Ejecuto el siguiente código en 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)

que da el siguiente resultado

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]]]

Entiendo que cada valor en input_array se asigna a un vector de 2 elementos en output_array, por lo que un vector 1 X 4 proporciona vectores 1 X 4 X 2. Pero, ¿cómo se calculan los valores mapeados?

prashanth
fuente
1
Tal vez un buen comienzo: github.com/fchollet/keras/issues/3110 ?
fnl
En este blog, una palabra incrustada usando la capa de incrustación Keras se considera learn-neural-networks.com/world-embedding-by-keras
Фаиль Гафаров

Respuestas:

87

De hecho, los vectores de salida no se calculan a partir de la entrada utilizando ninguna operación matemática. En cambio, cada entero de entrada se utiliza como índice para acceder a una tabla que contiene todos los vectores posibles. Esa es la razón por la que necesita especificar el tamaño del vocabulario como primer argumento (para que la tabla se pueda inicializar).

La aplicación más común de esta capa es para el procesamiento de texto. Veamos un ejemplo simple. Nuestro conjunto de entrenamiento consta solo de dos frases:

Espero verte pronto

Qué gusto verte de nuevo

Por lo tanto, podemos codificar estas frases asignando a cada palabra un número entero único (por orden de aparición en nuestro conjunto de datos de entrenamiento, por ejemplo). Entonces nuestras frases podrían reescribirse como:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Ahora imagine que queremos entrenar una red cuya primera capa es una capa de inserción. En este caso, deberíamos inicializarlo de la siguiente manera:

Embedding(7, 2, input_length=5)

El primer argumento (7) es el número de palabras distintas en el conjunto de entrenamiento. El segundo argumento (2) indica el tamaño de los vectores de incrustación. El argumento input_length, por supuesto, determina el tamaño de cada secuencia de entrada.

Una vez que la red ha sido entrenada, podemos obtener los pesos de la capa de incrustación, que en este caso será de tamaño (7, 2) y puede considerarse como la tabla utilizada para asignar enteros a los vectores de incrustación:

+------------+------------+
|   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] |
+------------+------------+

Entonces, de acuerdo con estas incrustaciones, nuestra segunda frase de entrenamiento se representará como:

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

Puede parecer contradictorio al principio, pero los motores de diferenciación automática subyacentes (por ejemplo, Tensorflow o Theano) logran optimizar estos vectores asociados a cada entero de entrada como cualquier otro parámetro de su modelo. También es interesante utilizar las incrustaciones aprendidas por otros métodos / personas en diferentes dominios (consulte https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) como hecho en [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG y Corchado, JM Hibridación de aprendizaje métrico y razonamiento basado en casos para la detección de clickbait adaptable. Inteligencia Aplicada, 1-16.

Daniel López
fuente
44
Gracias por la respuesta. Solo una consulta sobre cómo se obtienen los pesos de la capa de incrustación. Al igual que para el índice 0, ¿cómo se obtiene [1.2, 3.1].
prashanth
55
El contenido de la tabla que relaciona los índices con los vectores de incrustación (es decir, los pesos de la capa de incrustación) se inicializa al azar y luego se optimiza mediante el algoritmo de entrenamiento (p. Ej., Descenso de gradiente).
Daniel López
3
Gracias. Todavía no estoy claro a qué se enfrentará el optimizador. Como, ¿cuál es la "respuesta correcta" que le permite calcular una función de pérdida? O dicho de otra manera, ¿qué está haciendo para el pase hacia adelante y hacia atrás?
bwest87
2
así que ... la incrustación es básicamente una subred de la arquitectura general que reduce cualquier entrada codificada en caliente en menos entradas, un hecho ...
Mike Campbell
1
Dado que la capa de incrustación es entrenable, ¿qué tan sensible es a los valores que faltan en el conjunto de entrenamiento? Digamos que tengo diez palabras en el conjunto de entrenamiento y cinco más en el conjunto de prueba: mi vocabulario es de 15 ... pero la capa en realidad nunca se activa por esas cinco palabras de 'prueba' durante el entrenamiento. ¿Podría por favor explicar esta situación?
mikalai
6

También tuve la misma pregunta y después de leer un par de publicaciones y materiales, creo que descubrí cuál es el papel de la capa de incrustación.

Creo que esta publicación también es útil para entender, sin embargo, realmente encuentro la respuesta de Daniel conveniente para digerir. Pero también tuve la idea detrás de esto principalmente al comprender las palabras incrustadas .

Creo que es incorrecto decir que las capas de incrustación reducen la entrada de codificación en caliente a menos entradas. Después de todo, el vector caliente es un dato unidimensional y, de hecho, se convierte en 2 dimensiones en nuestro caso. Es mejor decir que

la capa de incrustación aparece con una relación de las entradas en otra dimensión

Ya sea en 2 dimensiones o incluso más.

También encuentro una similitud muy interesante entre la incrustación de palabras con el Análisis de componentes principales. Aunque el nombre puede parecer complicado, el concepto es sencillo. Lo que PCA hace es definir un conjunto de datos basado en algunas reglas generales (los llamados componentes principales). Entonces es como tener un dato y quieres describirlo pero usando solo 2 componentes. Lo que en este sentido es muy similar a las incrustaciones de palabras. Ambos hacen el mismo trabajo en un contexto diferente. Puedes encontrar más aquí . Espero que comprender PCA ayude a comprender la incorporación de capas mediante analogía.

Para concluir, la respuesta a la pregunta original de la publicación que " ¿cómo calcula el valor? " Sería:

  • Básicamente, nuestra red neuronal captura la estructura subyacente de las entradas (nuestras oraciones) y pone la relación entre las palabras de nuestro vocabulario en una dimensión superior (digamos 2) mediante la optimización.
  • Una comprensión más profunda diría que la frecuencia de cada palabra que aparece con otra palabra de nuestro vocabulario influye (en un enfoque muy ingenuo podemos calcularlo a mano)
  • La frecuencia mencionada anteriormente podría ser una de las muchas estructuras subyacentes que NN puede capturar
  • Puede encontrar la intuición en el enlace de youtube que explica las incrustaciones de palabras
Novin Shahroudi
fuente
77
Bonito punto de vista. Sin embargo, creo que vale la pena señalar que, si bien las técnicas de incrustación de palabras como word2vec intentan capturar el significado completo de las palabras en la incrustación resultante, la capa de incrustación en una red supervisada podría no aprender una representación semánticamente rica y general. Por ejemplo, si su red está capacitada para clasificar los sentimientos, probablemente solo agrupará / agrupará palabras en la incrustación de acuerdo con su carga "emocional". Sin embargo, según mi experiencia, a menudo es útil inicializar su capa de incrustación con los pesos aprendidos por word2vec en un gran corpus.
Daniel López
2
el vector one-hot no son datos unidimensionales. Su dimensión es el tamaño del vocabulario.
Binu Jasim
2
@ BinuJasim tienes razón. Los vectores unidireccionales que representan un vocabulario no son datos unidimensionales. Pero la información que representa es de hecho unidimensional y cada entidad dentro del vocabulario es un dato unidimensional. Es cierto que tenemos elementos n * w (n = tamaño de vocabulario, w = número de bits), pero cada valor binario representa un vector que, de nuevo, es una entrada unidimensional.
Novin Shahroudi
@NovinShahroudi Brilliant, gracias por la explicación.
Benyamin Jafari