La documentation Keras n'est pas claire de quoi il s'agit. Je comprends que nous pouvons l'utiliser pour compresser l'espace des fonctionnalités d'entrée dans un espace plus petit. Mais comment cela se fait-il du point de vue de la conception neuronale? Est-ce un autoenocder, RBM?
97
Réponses:
Autant que je sache, la couche Embedding est une simple multiplication matricielle qui transforme les mots en leurs embeddings de mots correspondants.
Les poids de la couche Embedding sont de la forme (vocabulary_size, embedding_dimension). Pour chaque échantillon d'apprentissage, ses entrées sont des entiers, qui représentent certains mots. Les nombres entiers sont dans la plage de la taille du vocabulaire. La couche Embedding transforme chaque entier i en la ième ligne de la matrice des poids d'incorporation.
Afin d'effectuer rapidement cette opération sous forme de multiplication matricielle, les entiers d'entrée ne sont pas stockés sous forme de liste d'entiers mais sous forme de matrice à un instantané. Par conséquent, la forme d'entrée est (nb_words, vocabulary_size) avec une valeur non nulle par ligne. Si vous multipliez cela par les poids d'incorporation, vous obtenez la sortie sous la forme
Ainsi, avec une simple multiplication matricielle, vous transformez tous les mots d'un échantillon dans les embeddings de mots correspondants.
la source
La
Keras
Embedding
couche n'effectue aucune multiplication matricielle mais seulement:1. crée une matrice de poids de (vocabulary_size) x (embedding_dimension) dimensions
2. indexe cette matrice de poids
Il est toujours utile de jeter un œil au code source pour comprendre ce que fait une classe. Dans ce cas, nous allons jeter un œil à l'
class
incorporation qui hérite de la couche de baseclass
appelée Layer .(1) - Création d'une matrice de poids de dimensions (vocabulary_size) x (embedding_dimension) :
Cela se produit au niveau de la
build
fonction d' incorporation :Si vous regardez la classe de base Layer, vous verrez que la fonction
add_weight
ci-dessus crée simplement une matrice de poids entraînables (dans ce cas de dimensions (vocabulary_size) x (embedding_dimension) ):(2) - Indexation de cette matrice de poids
Cela se produit au niveau de la
call
fonction d' incorporation :Cette fonction renvoie la sortie de la
Embedding
couche qui estK.gather(self.embeddings, inputs)
. Ce que fait exactement tf.keras.backend.gather est d'indexer la matrice de poidsself.embeddings
(voir labuild
fonction ci-dessus) en fonction de ceinputs
qui devrait être des listes d'entiers positifs.Ces listes peuvent être récupérées par exemple si vous passez vos entrées texte / mots à la fonction one_hot de Keras qui encode un texte dans une liste d'index de mots de taille n (ce n'est PAS un encodage à chaud - voir aussi cet exemple pour plus d'informations: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).
Par conséquent, c'est tout. Il n'y a pas de multiplication matricielle.
Au contraire, la
Keras
Embedding
couche n'est utile que parce qu'elle évite justement d'effectuer une multiplication matricielle et donc elle économise certaines ressources de calcul.Sinon, vous pouvez simplement utiliser une couche
Keras
dense (après avoir encodé vos données d'entrée) pour obtenir une matrice de poids pouvant être entraînés (de dimensions (vocabulary_size) x (embedding_dimension) ) et ensuite simplement faire la multiplication pour obtenir la sortie qui sera exactement la même chose avec la sortie de laEmbedding
couche.la source
Pour mieux comprendre une fonction, c'est une bonne habitude de regarder le code source. Voici pour l' intégration Donc, fondamentalement, c'est une table de consultation entraînable.
la source
Dans Keras, la
Embedding
couche n'est PAS une simple couche de multiplication matricielle, mais une couche de table de consultation (voir la fonction d'appel ci-dessous ou la définition d' origine ).Ce qu'il fait est de cartographier chacun un nombre entier connu
n
dansinputs
un vecteur de caractéristique trainableW[n]
, dont la dimension est la longueur de fonction intégrée que l' on appelle.la source
Embedding
couche est donc bien une multiplication matricielle.En termes simples (du point de vue de la fonctionnalité), il s'agit d'un encodeur unique et d' une couche entièrement connectée . Les poids des couches peuvent être entraînés.
la source