Como a camada 'Incorporação' de Keras funciona?

70

Precisa entender o funcionamento da camada 'Incorporação' na biblioteca Keras. Eu executo o seguinte código em 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 fornece a seguinte saída

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

Eu entendo que cada valor na matriz de entrada é mapeado para um vetor de 2 elementos na matriz de saída, portanto, um vetor de 1 x 4 fornece 1 x 4 x 2 vetores. Mas como são calculados os valores mapeados?

prashanth
fonte
11
Talvez seja um bom começo: github.com/fchollet/keras/issues/3110 ?
Fnl 4/04
Neste blog, uma incorporação de palavras usando a camada de incorporação de Keras é considerada learn-neural-networks.com/world-embedding-by-keras
Фаиль Гафаров

Respostas:

87

De fato, os vetores de saída não são calculados a partir da entrada usando nenhuma operação matemática. Em vez disso, cada número inteiro de entrada é usado como índice para acessar uma tabela que contém todos os vetores possíveis. Essa é a razão pela qual você precisa especificar o tamanho do vocabulário como o primeiro argumento (para que a tabela possa ser inicializada).

A aplicação mais comum dessa camada é para processamento de texto. Vamos ver um exemplo simples. Nosso conjunto de treinamento consiste apenas de duas frases:

Espero vê-lo em breve

Prazer em vê-lo novamente

Assim, podemos codificar essas frases atribuindo a cada palavra um número inteiro único (por ordem de aparência no nosso conjunto de dados de treinamento, por exemplo). Em seguida, nossas frases podem ser reescritas como:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Agora imagine que queremos treinar uma rede cuja primeira camada seja uma camada de incorporação. Nesse caso, devemos inicializá-lo da seguinte maneira:

Embedding(7, 2, input_length=5)

O primeiro argumento (7) é o número de palavras distintas no conjunto de treinamento. O segundo argumento (2) indica o tamanho dos vetores de incorporação. O argumento input_length, é claro, determina o tamanho de cada sequência de entrada.

Depois que a rede for treinada, podemos obter os pesos da camada de incorporação, que neste caso terá tamanho (7, 2) e pode ser pensada como a tabela usada para mapear números inteiros para vetores de incorporação:

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

Portanto, de acordo com esses embeddings, nossa segunda frase de treinamento será representada como:

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

Pode parecer contra-intuitivo no começo, mas os mecanismos de diferenciação automática subjacentes (por exemplo, Tensorflow ou Theano) conseguem otimizar esses vetores associados a cada número inteiro de entrada, como qualquer outro parâmetro do seu modelo. Também é interessante usar os embeddings aprendidos por outros métodos / pessoas em diferentes domínios (consulte https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) como feito em [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG e Corchado, JM Hibridizando o aprendizado métrico e o raciocínio baseado em casos para detecção de clickbait adaptável. Inteligência aplicada, 1-16.

Daniel López
fonte
4
Obrigado pela resposta. Apenas uma consulta que mostra como são obtidos os pesos da camada de incorporação. Como no índice 0, como é obtido [1,2, 3,1].
precisa saber é o seguinte
5
O conteúdo da tabela que relaciona índices a vetores de incorporação (ou seja, os pesos da camada de incorporação) são inicializados aleatoriamente e, em seguida, otimizados pelo algoritmo de treinamento (por exemplo, descida de gradiente).
Daniel López
3
Obrigado. Ainda estou um pouco claro contra o que o otimizador seria otimizador? Como, qual é a "resposta correta" que permite calcular uma função de perda? Ou dito de outra maneira, o que está fazendo com o passe para frente e para trás?
bwest87
2
assim ... incorporação é, basicamente, apenas uma sub-rede da arquitectura global que reduz quaisquer entradas de um quentes codificado para baixo em menos entradas, AFAICT ..
Mike Campbell
11
Como a camada de incorporação é treinável, qual é a sensibilidade aos valores ausentes no conjunto de treinamento? Digamos, eu tenho dez palavras no conjunto de treinamento e mais cinco no conjunto de testes - meu comprimento de vocabulário é 15 ... mas a camada nunca é ativada por essas cinco palavras de 'teste' durante o treinamento. Poderia, por favor, explicar esta situação?
Mikalai #
6

Também tive a mesma pergunta e, depois de ler algumas postagens e materiais, acho que descobri qual é o papel da camada de incorporação.

Acho que este post também é útil para entender, no entanto, acho realmente a resposta de Daniel conveniente para digerir. Mas eu também entendi a idéia principalmente por entender as palavras incorporadas .

Acredito que seja impreciso dizer que a incorporação de camadas reduz a entrada de codificação one-hot para menos entradas. Afinal, o vetor quente é um dado unidimensional e, de fato, é transformado em duas dimensões no nosso caso. Melhor dizer que

camada de incorporação surge com uma relação das entradas em outra dimensão

Seja em duas dimensões ou até mais.

Também encontro uma semelhança muito interessante entre a incorporação de palavras na Análise de Componentes Principais. Embora o nome possa parecer complicado, o conceito é direto. O que o PCA faz é definir um conjunto de dados com base em algumas regras gerais (os chamados componentes principais). Portanto, é como ter dados e você deseja descrevê-los, mas usando apenas 2 componentes. Que, nesse sentido, é muito parecido com o uso de palavras. Ambos fazem o mesmo trabalho em um contexto diferente. Você pode descobrir mais aqui . Espero que talvez o entendimento do PCA ajude a entender as camadas de incorporação por analogia.

Para finalizar, a resposta à pergunta original da postagem que " como calcula o valor? " Seria:

  • Basicamente, nossa rede neural captura a estrutura subjacente das entradas (nossas sentenças) e coloca a relação entre palavras em nosso vocabulário em uma dimensão superior (digamos 2) por otimização.
  • Um entendimento mais profundo diria que a frequência de cada palavra que aparece com outra palavra de nosso vocabulário influencia (em uma abordagem muito ingênua, podemos calculá-la manualmente)
  • A frequência acima mencionada pode ser uma das muitas estruturas subjacentes que o NN pode capturar
  • Você pode encontrar a intuição no link do youtube que explica a palavra incorporação
Novin Shahroudi
fonte
7
Bom ponto de vista. No entanto, acho que vale a pena notar que, enquanto técnicas de incorporação de palavras como o word2vec tentam capturar o significado completo das palavras na incorporação resultante, a camada de incorporação em uma rede supervisionada pode não aprender uma representação tão semanticamente rica e geral. Por exemplo, se sua rede for treinada para classificar sentimentos, provavelmente agrupará / agrupará palavras na incorporação de acordo com a carga "emocional". No entanto, com base na minha experiência, geralmente é útil inicializar sua camada de incorporação com pesos aprendidos pelo word2vec em um grande corpus.
Daniel López
2
um vetor quente não é um dado dimensional. Sua dimensão é o tamanho do vocabulário.
precisa saber é o seguinte
2
@BinuJasim você está certo. Os vetores unidimensionais que representam um vocabulário não são dados unidimensionais. Mas a informação que ela representa é de fato unidimensional e toda entidade do vocabulário é unidimensional. É verdade que temos n * w (n = tamanho do vocabulário, w = número de bits), mas cada valor binário representa um vetor que, novamente, é uma entrada unidimensional.
Novin Shahroudi
@NovinShahroudi Brilliant, obrigado pela explicação.
Benyamin Jafari 11/10