Comment fonctionne la couche «Enrobage» de Keras?

70

Besoin de comprendre le fonctionnement de la couche 'Enrobage' dans la bibliothèque Keras. J'exécute le code suivant 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)

ce qui donne la sortie suivante

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

Je comprends que chaque valeur du tableau input_array est mappée sur un vecteur de 2 éléments dans le tableau output_array, un vecteur 1 X 4 donne donc 1 X 4 X 2 vecteurs. Mais comment sont calculées les valeurs mappées?

prashanth
la source
1
Peut-être un bon début: github.com/fchollet/keras/issues/3110 ?
Fin
Dans ce blog, un mot incorporant à l'aide de la couche Keras Embedding est considéré comme learn-neural-networks.com/world-embedding-by-keras
аиль Гафаров

Réponses:

87

En fait, les vecteurs de sortie ne sont pas calculés à partir de l'entrée en utilisant une opération mathématique. Au lieu de cela, chaque entier en entrée est utilisé comme index pour accéder à une table contenant tous les vecteurs possibles. C'est la raison pour laquelle vous devez spécifier la taille du vocabulaire en tant que premier argument (afin que la table puisse être initialisée).

L'application la plus courante de cette couche concerne le traitement de texte. Voyons un exemple simple. Notre ensemble de formation ne comprend que deux phrases:

a bientôt, j'espère

C'est un plaisir de vous revoir

Nous pouvons donc coder ces expressions en attribuant à chaque mot un nombre entier unique (par ordre d'apparition dans notre jeu de données d'apprentissage, par exemple). Ensuite, nos phrases pourraient être réécrites comme suit:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Imaginons maintenant que nous voulions former un réseau dont la première couche est une couche d'intégration. Dans ce cas, nous devrions l'initialiser comme suit:

Embedding(7, 2, input_length=5)

Le premier argument (7) est le nombre de mots distincts dans l'ensemble d'apprentissage. Le deuxième argument (2) indique la taille des vecteurs d'inclusion. Le input_length argumet, bien sûr, détermine la taille de chaque séquence d'entrée.

Une fois le réseau formé, nous pouvons obtenir les poids de la couche d’incorporation qui, dans ce cas, sera de taille (7, 2) et peuvent être considérés comme la table utilisée pour mapper des entiers sur des vecteurs d’incorporation:

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

Donc, selon ces intégrations, notre deuxième phrase de formation sera représentée par:

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

Cela peut sembler contre-intuitif au début, mais les moteurs de différenciation automatique sous-jacents (Tensorflow ou Theano, par exemple) parviennent à optimiser ces vecteurs associés à chaque entier saisi, comme tout autre paramètre de votre modèle. Il est également intéressant d’utiliser les intégrations apprises par d’autres méthodes / personnes de différents domaines (voir https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) en tant que fait dans [1].

[1] D. López-Sánchez, JR Herrero, AG Arrieta et JJ Corchado. Hybridizing metric learning et raisonnement par cas pour la détection de clickbait adaptable. Intelligence appliquée, 1-16.

Daniel López
la source
4
Merci pour la réponse. Juste une requête demandant comment les poids de la couche d’incorporation sont obtenus. Comme pour l'indice 0, comment obtenir [1.2, 3.1].
Prashanth
5
Le contenu de la table qui relie les index aux vecteurs d'intégration (c'est-à-dire les poids de la couche d'intégration) est initialisé de manière aléatoire, puis optimisé par l'algorithme d'apprentissage (par exemple, Descente de gradient).
Daniel López
3
Merci. Je ne sais toujours pas à quoi l'optimiseur ferait face. Comme, quelle est la "réponse correcte" qui lui permet de calculer une fonction de perte? Ou dit autrement, que fait-il pour les passes en avant et en arrière?
bwest87
2
Alors ... l'intégration est fondamentalement juste un sous-réseau de l'architecture globale qui réduit toutes les entrées codées à chaud dans un nombre d'entrées moindre, afaict ..
Mike Campbell
1
Comme la couche d’incorporation peut être formée, quelle est sa sensibilité aux valeurs manquantes dans le jeu de formation? Disons que j'ai 10 mots dans le set d'apprentissage et cinq autres dans le test - ma longueur de vocabulaire est de 15 ... mais la couche n'est en réalité jamais activée par ces cinq mots "test" pendant la formation. Pourriez-vous s'il vous plaît expliquer cette situation?
Mikalai
6

J'avais aussi la même question et après avoir lu quelques articles et matériels, je pense avoir compris le rôle du rôle de la couche intégrée.

Je pense que ce message est également utile à comprendre, cependant, je trouve vraiment la réponse de Daniel commode à digérer. Mais j'ai aussi eu l'idée derrière cela principalement en comprenant les mots enchâssés .

Je pense qu’il est inexact de dire que l’incorporation de couches réduit le nombre d’entrées à codage unique à un nombre réduit d’entrées. Après tout, le vecteur one-hot est une donnée unidimensionnelle et il est en effet transformé en 2 dimensions dans notre cas. Mieux vaut dire que

couche d'inclusion vient avec une relation des entrées dans une autre dimension

Que ce soit en 2 dimensions ou même plus.

Je trouve également une similitude très intéressante entre l’intégration de mots dans l’analyse en composantes principales. Bien que le nom puisse paraître compliqué, le concept est simple. L’ACP définit un ensemble de données sur la base de règles générales (appelées composantes principales). Donc, c'est comme si vous aviez des données et que vous voulez les décrire mais en utilisant seulement 2 composants. Ce qui, dans ce sens, ressemble beaucoup à l’incorporation de mots. Ils font tous deux le même travail dans un contexte différent. Vous pouvez en savoir plus ici . J'espère que peut-être comprendre la PCA aide à comprendre l'intégration des couches par analogie.

Pour conclure, la réponse à la question initiale du message " Comment calcule-t-il la valeur? " Serait:

  • Fondamentalement, notre réseau de neurones capture la structure sous-jacente des entrées (nos phrases) et place la relation entre les mots de notre vocabulaire dans une dimension supérieure (disons 2) par optimisation.
  • Une compréhension plus profonde dirait que la fréquence de chaque mot apparaissant avec un autre mot de nos influences de vocabulaire (dans une approche très naïve, nous pouvons le calculer à la main)
  • La fréquence susmentionnée pourrait être l’une des nombreuses structures sous-jacentes que NN peut capturer
  • Vous pouvez trouver l'intuition sur le lien youtube expliquant le mot "embarquements"
Novin Shahroudi
la source
7
Beau point de vue. Cependant, je pense qu’il est intéressant de noter que si des techniques d’incorporation de mots telles que word2vec tentent de saisir le sens complet des mots dans l’incorporation résultante, la couche d’incorporation dans un réseau supervisé pourrait ne pas apprendre une représentation aussi riche et sémantique. Par exemple, si votre réseau est formé à la classification des sentiments, il ne fera probablement que regrouper / regrouper des mots dans l’incorporation en fonction de leur charge "émotionnelle". Néanmoins, sur la base de mon expérience, il est souvent utile d’initialiser votre couche d’incorporation avec les poids appris par word2vec sur un grand corpus.
Daniel López
2
Un vecteur à chaud n'est pas une donnée unidimensionnelle. Sa dimension est la taille du vocabulaire.
Binu Jasim
2
@ BinuJasim vous avez raison. Les vecteurs one-hot représentant un vocabulaire ne sont pas des données unidimensionnelles. Mais l’information qu’elle représente est bien une dimension et chaque entité du vocabulaire est une donnée unidimensionnelle. Il est vrai que nous avons n * w (n = taille du vocabulaire, w = nombre de bits), mais chaque valeur binaire représente un vecteur qui est à nouveau une entrée unidimensionnelle.
Novin Shahroudi
@NovinShahroudi Brilliant, merci pour l'explication.
Benyamin Jafari