Word embeddings

Qu’est-ce que c’est


Comment les calculer


Word2vec

Word2vec est décrit dans le papier Efficient Estimation of Word Representations in Vector Space.

  1. Convertir le corpus en liste de tokens.
    Par exemple avec le corpus suivant:

     [
         "I want a glass of orange juice",
         "You want a glass of apple juice"
     ]
    

    On garde:

     [
         ["i", "want", "a", "glass", "of", "orange", "juice"],
         ["you", "want", "a", "glass", "of", "apple", "juice"]
     ]
    
  2. Récupérer le vocabulaire du corpus:

     ["a", "apple", "glass", "i", "juice", "of", "orange", "want", "you"]
    

    Les index de cette liste serviront de base pour encoder les mots du corpus (one-hot encoding). Si le corpus contient V mots de vocabulaire, chaque vecteur encodé sera de dimension 1×V. Par exemple, le mot “a”, qui est le premier dans la liste, sera encodé O1 = [1,0,0,0,0,0,0,0,0]. Le mot “apple”, qui est en deuxième, sera O2 = [0,1,0,0,0,0,0,0,0]. Etc.

  3. Choisir une taille de fenêtre, C, pour extraire des ensembles de mots du corpus.
    En pratique, on choisit généralement une fenêtre entre 5 et 10.
    À partir de là, deux approches différentes sont proposées:

    • continuous bag-of-word [CBOW]:
      prédit le mot courant en fonction des mots du contexte.

      On prend C×2+1 mots à la fois: le mot central sera le mot courant et les mots autour seront le contexte. Les mots sélectionnés sont encodés avec one-hot encoding et donnés à un réseau neuronal — le mot courant pour cible, les mots en contexte comme entrée. Exemple: (“i”, “a”) → “want” (fenêtre de 1)

      Complexité de l’apprentissage:
      Q = (N×D + D×log2(V))

    • skip-gram [SG]:
      prédit les mots du contexte en fonction du mot courant.

      On choisit aléatoirement un nombre R entre 1 et C, et on choisit R mots avant et R mots après le mot courant. Les mots les plus éloignés du mot courant sont généralement moins liés au mot, et cette approche permet de donner moins de poids aux mots éloignés — puisqu’au cumul, on en donnera moins au réseau neuronal.
      Les mots sélectionnés sont encodés avec one-hot encoding et donnés à un réseau neuronal — le mot courant en entrée, et chaque mot de contexte en sortie, un à un. On doit donc effectuer R×2 classification pour chaque mot courant. Example: “want” → “i”, “want” → “a”.

      Complexité de l’apprentissage:
      Q ∝ (1×D + D×log2(V)) × C

    Dans les deux cas, on utilise un mot courant et des mots de contexte (encodés avec one-hot encoding) et un réseau neuronal. Avec CBOW, les mots de contexte sont des entrées et le mot courant est le cible. Avec skip-gram, le mot courant est l’entrée et le mots de contexte la cible — utilisés les uns après les autres.

    On peut utiliser l’un ou l’autre. Avec skip-gram, l’ordre du contexte est pris en compte mais l’algorithme est plus lent que CBOW. En général, CBOW est préféré pour les petits corpus et est plus rapide à entraîner, tandis que SG est plus lent mais donne de meilleurs résultats pour de grands corpus et grandes dimensions.

  4. Avec skip-gram ou continuous bag-of-words pour données, word2vec utilise un réseau neuronal de 2 couches:

    • Couche cachée
      • L’objectif final de l’algorithme est d’apprendre la matrice de poids de la couche cachée (notée W ou E), les poids de la couche en sortie (W’) sera juste abandonnée.

        Le nombre de noeuds (D) de la couche cachée correspond à la dimension des vecteurs de mots obtenus — si la taille souhaitée est 3 (ex “i” => [0.001, 0.896, 0.763]), alors le nombre de noeuds cachés devra être 3. Dans les applications réelles, la taille est généralement autour de 300.

      • Si on prend la matrice de poids E (V×D) et qu’on la multiplie avec un vecteur one-hot Oi (1×V), le résultat obtenu correspond à la i-ème ligne (1×D). Cette ligne est le vecteur ei correspondant au mot Oi (Oi × E = ei = i-ème ligne de E). Les poids de la couche cachée fonctionnent donc en réalité comme une table de conversion. Pour cette raison, on appelle aussi cette matrice matrice d’encodage (embedding matrix en anglais).

        Les vecteurs one-hot encoded ont une dimension relativement élevée et la plupart des éléments sont nuls. Il n’est donc pas efficace d’utiliser une multiplication matricielle de vecteurs, puisqu’on multiplie tout un tas de zéros. En pratique, on utilise une fonction spécialisée pour simplement récupérer la ligne de la matrice de poids qui correspondent aux entrées. Dans keras par exemple, il y a une couche Embedding qui fait exactement ça.

    • Couche en sortie:
      • Dans le cas de CBOW, on a plusieurs entrées et donc plusieurs words embedding retournés par la première couche. Avant de passer les données à la couche en sortie, on calcule la moyenne des lignes (ou la somme suivant les implémentations).

      • Ensuite, les données sont passés à une couche en sortie, qui utilise une unité softmax. Cette couche a ses propres poids (W’), pour classer parmis tous les mots possibles (V) celui qui est le plus probable. Chaque noeud (un par mot du vocabulaire) produit une valeur entre 0 et 1 et la somme de toutes ces valeurs vaut 1. La sortie ayant la plus haute probabilité est la prédiction.

    • On initialise les différents paramètres (W, W’) aléatoirement puis on utilise gradient descent pour apprendre tous les paramètres: on prédit le mot courant en fonction des mots de contexte (ou l’inverse), et on ajuste les paramètres via backpropagation pour maximiser la probabilité du dataset.

      Évidemment, ce n’est pas un problème d’apprentissage facile — plus ou moins 5 mots autour d’un mot donné, ça peut être un grand nombre de mots différents. Mais l’objectif du réseau neuronal n’est pas d’obtenir de bons résultats sur le problème d’apprentissage supervisé en soi, on veut simplement l’utiliser pour apprendre de bons vecteurs.
      Et il s’avère que l’algorithme apprend de bons vecteurs: si deux mots différents ont des contextes très similaires, alors le modèle doit produire des résultats très similaires pour ces deux mots, et une manière d’y parvenir est si les deux mots ont des vecteurs similaires. L’algorithme a donc une incentive à apprendre des vecteurs similaires pour des mots utilisés dans des contextes similaires, et c’est exactement ce qu’on veut obtenir.

Optimisations

Points clés

Word Embeddings.ipynb