Accéder au contenu principal

Stanford 2017 - Classification de mots par fenêtre glissante et Réseau de Neurones (4/18)

Chapitre 4- Classification de mots par fenêtre glissante et Réseau de Neurones

Beaucoup de choses nouvelle dans ce cours. Il est dense mais il présente à la fois la base du principe de classification appliquée au langage, le notion de fonction Softmax, sa dérivée, le principe fondamental de régularisation et enfin la généralisation des principes précédents aux réseaux de neurones.

Accrochons-nous ensemble, cela vaut le coup.

Classification

On commence par rappeler les notations utilisées dans ce chapitre ainsi que les notions de base.
  • Un processus de classification est le plus souvent un processus supervisé, c’est-à-dire que l’on entraîne le réseau de neurones en lui donnant des données dont on connaît la catégorie (le label).
  • En conséquence, les données d’entraînement sont constituées d’un nombre N d’échantillons, chacun de ces points de données étant défini par un couple {donnée, label} et noté {xi, yi} pour i entre 1 et N.
  • Les valeurs yi de chaque couple sont donc les classes, les labels que l’on veut prédire parmi un nombre C de classes possibles. Cela peut correspondre à un sentiment, des dénominations de classes ou bien même comme on le verra dans les chapitres suivants une séquence de mots.
L’exemple suivant montre un ensemble de points de donnée, définis par trois valeurs : leur deux coordonnées x1 et x2 définissant leur position dans le plan de référence et une troisième valeur correspondant à la couleur des points. 


On voit qu’à partir de ces points de donnée, en considérant les points comme invariables (xi ne peuvent changer) on peut optimiser les poids Wi d’une régression logistique de façon à définir une frontière linéaire séparant au mieux les deux classes de point.

A la place d’une régression logistique, on peut alors décider d’entraîner un réseau de neurone utilisant une fonction softmax comme activation finale, on aura alors affaire à une classification softmax.

Optimiser un tel réseau de neurones, c’est maximiser globalement les paramètres de pondération de façon à ce que globalement la vraie valeur du label y soit la plus probable compte des coordonnées x1 et x2 en chacun des points de données. Maximiser la fonction softmax est équivalent à minimiser la fonction suivante :
Une méthode de calcul de l’erreur (ou plutôt de la différence entre la distribution de probabilité actuelle de y estimé par rapport à sa distribution réelle) utilise le principe d’entropie et la divergence de Kullback-Leiber. Cette fonction nommée Entropie Croisée (Cross-Entropy) peut être définie comme suit :
Dans nos approches où la fonction fy(x) est le plus souvent une combinaison linéaires pondérées des coordonnées des points de l’échantillonnage d’entraînement, on peut réécrire la fonction précédente de façon à rendre visible les poids.

Régularisation

La « fonction objectif » à minimiser ne serait pas complète si elle n’intégrait pas le paramètre de régularisation ajouté pour éviter les problèmes de sur-apprentissage d’un réseau de neurones par rapport à son jeu de données d’entraînement.
Dans cette forme simple de régularisation, l’ajout systématique d’un terme positif permet de limiter l’effet de variance du modèle, tout en limitant son biais grâce au premier terme de la « fonction objectif ».

La performance du modèle sera donc bonne sur le jeu de données d’entraînement et bonne sur le jeu de validation ou de test, grâce à une plus grande flexibilité du modèle.
Dans le cas général de l’apprentissage probabilité, l’optimisation itérative se fait par la méthode de descente des gradients, ces gradients étant dépendant des points Wi uniquement. Si l’on suppose que chaque point de donnée est défini dans un espace de dimensions d, alors le vecteur de gradients des poids Wi aura C x d éléments après réduction de dimensionnalité (flattening).
Dans le cas de l’analyse linguiste, on doit optimiser les poids et les mots-vecteurs eux-mêmes. Ces mots sont au nombre de V, pris dans un corpus documentaire prédéfini. Le vecteur gradient en résultant est énorme, contenant (C x d + V x d) éléments après réduction de dimensionnalité. Le risque de sur-apprentissage du modèle est donc très important.
Exemple de sur-apprentissage et d’une mauvaise performance sur un jeu de test : nous entraînons une régression logistique pour classifier des critiques de films sortis au cinéma. Il est généralement admis qu’une critique contenant des mots relatifs à la télévision est négative car le film sera considéré comme digne d’une sortie sur chaînes câblées mais pas cinéma (cet exemple date d’avant le nouveau modèle économique de Netflix qui produit désormais des films de grande qualité diffusés en dehors de tout réseau de cinéma).
  • Dans la matrice de similarités, les mots « TV », « Telly » et « Television » sont très proches. Dans le jeu d’entraînement, le mot « TV » et « Telly » sont présents. Mais supposons que le mot « Television » ne soit pas présent dans ce jeu d’entraînement mais dans le jeu de test uniquement.
  • Lors de la phase d’entraînement, les poids de la régression logistique évoluent ce qui implique que la frontière entre les deux classes positif et négatif change. Mais la position des mots-vecteurs présents dans le jeu d’entraînement aussi puisque les similarités font partie également des paramètres « appris » par le modèle.
  • Les deux mots-vecteurs  « TV » et « Telly » évoluent ensemble en restant proches l’un de l’autre. Mais le mot « Television » absent du jeu d’entraînement reste à sa position initiale et la similarité de ce mot avec les deux autres est progressivement perdue.
La solution est de ne pas entraîner les mots-vecteurs dans ce cas précis, mais au contraire de partir d’une matrice de similarité précédemment calculée par d’autres à partir d’un jeu d’entraînement très fourni et de ne mettre à jour que les poids de la régression logistique. C’est l’approche recommandée lorsque le jeu d’entraînement disponible est peu fourni.

Si l’on dispose d’un jeu de donnée d’entraînement de taille adéquate, alors la double mise à jour mots-vecteurs et poids de la régression logistique est envisageable et marche souvent de façon satisfaisante.

Méthode de classification Softmax sur fenêtre glissante définissant un contexte

L’idée générale est qu’un mot peut être classé du point de sa signification par l’analyse de mots voisins définissant son contexte. C’est une approche « Bag of Words » où le mot à classer se trouve au centre d’une fenêtre de mots définissant son contexte.

Par exemple, on veut ici classer les mots d’un texte en 4 catégories suivant que le mot désigne une personne, un lieu, une organisation ou autre chose.


Si l’on suppose que la matrice de similarité comporte d dimensions, alors le vecteur correspondant à cette fenêtre comprenant le mot central à classer (Paris) et son contexte, aura (5 x d) éléments. Par simplicité du code à venir, on prendra la transposée de ce vecteur pour manipuler un vecteur-colonne.

Softmax et Entropie Croisée

En supposant que l’on utilise la méthode Softmax pour classer ce mot central entre 4 catégories, alors on se souvient que la prédiction de classe la plus probable pour ce mot central est la conséquence de la probabilité conditionnelle suivante dépendante du contexte de ce mot et calculée par :
Et on se souvient également que la fonction-objectif à minimiser peut être l’entropie croisée définie comme suit (où fyi correspond à Wy.x).

Optimisation par la méthode de descente de gradients

L’optimisation des paramètres (que ce soit les poids Wi ou les mots-vecteurs eux-mêmes (x)) se fait par la méthode classique de la descente de gradients appliquée à chacun des paramètres.

Rappel de notation, des dimensions des variables et de règles de dérivation
t est le vecteur cible (vecteur creux de type [0, 0, 1, 0] si la classe 3 est correcte). L’erreur est donc la différence entre y^ et t.
En supposant y = f(u) et u = g(x), on a la dérivation successive suivante :

Dérivation de la fonction Softmax
On se souvient de la forme suivante de dérivée de la fonction Softmax:
Dans la suite de ce cours, on notera l’erreur δ:
On peut alors réécrire les formules précédentes:

Calcul des gradients pour les mots-vecteurs de la fenêtre glissante
Le gradient de la fenêtre glissante se trouve être la concaténation des gradients définis pour chacun des mots-vecteurs appartenant à cette fenêtre.
On applique une approche similaire pour les paramètres de la fonction softmax et obtient un vecteur-gradient pour les poids Wi.

Concaténation des gradients
Les deux vecteurs gradients (un pour les mots-vecteurs et l’autre pour les paramètres de la fonction Softmax) sont concaténés pour ne former plus qu’un seul vecteur gradient de taille (C x d) + (V x d) souvent considérable et creux pour la partie correspondante aux mots-vecteurs. L’implémentation doit utiliser la vectorisation de ces opérations d’algèbre linéaire afin d’optimiser la performance du programme.

Généralisation de la méthode à un Réseau de Neurones

Faire une seule classification utilisant un opérateur non-linéaire comme la fonction Softmax peut marcher dans des cas très simples mais n’est pas très performante quand elle est utilisée seule. L’idée est alors d’utiliser ces opérateurs (linéaires ou pas) en réseau, chaque opérateur formant un nœud (neuron). Par analogie à l’organisation d’un cerveau, on a appelé de tels réseaux, des réseaux de neurones.

Démystifier le concept de réseau de neurones

L’élément principal de tout réseau de neurones est le nœud, le neuron qui peut se résumer à une unité de calcul qui travaille à partir de flux d’entrée et sort un résultat par un flux de sortie.
  • Les flux d’entrée correspondent à chaque dimension du vecteur donné auxquelles on rajouter un terme de biais.
  • Le flux de sortie correspond au résultat du calcul effectué dans le neuron, en général des combinaisons linéaires entre poids et coordonnées du vecteur donné et du biais, auxquelles se superpose une fonction d’activation (en général un opérateur non-linéaire).
Il est important de comprendre que la force de cette approche est l'utilisation d'une fonction d'activation non-linéaire. C'est cette non-linéarité qui fait que le neuron et surtout l'empilement de neurons formant un réseau de neurone n'est pas en définitive qu'un gros opérateur linéaire avec toutes ses limitations.

L’empilement de couches successives de neuron forme un réseau de neurones, les résultats de chaque couche « nourrissant » la couche suivante.
  • Il est important de constater que le résultat final est contraint par la dernière fonction objectif hW,b(x). Tous les paramètres intermédiaires utilisés par les opérateurs de chaque neuron vont être appris par le modèle de façon autonome.
  • Les résultats de ces opérateurs intermédiaires ne sont pas directement accessibles, les couches les rassemblant étant cachées (hidden layers) des yeux de l’utilisateur final.

Convention de notations pour la suite de ce cours

A partir de maintenant et pour toute la suite du cours, on utilisera la notation définie dans la figure suivante.

Application d’un réseau de neurones à notre exemple de classification de mots

Reprenons l’exemple de classification de mot selon son contexte. On se souvient que l’objectif est de déterminer si un mot désigne un lieu ou non automatiquement une fois le modèle de classification calibré.

Définissons le modèle de couche d’un réseau de neurones pour un tel objectif.
  • Comme convenu, un neuron de cette couche va combiner un opérateur linéaire z et un opérateur non-linéaire a, la fonction d’activation.
  • Cette fonction d’activation va être choisie de façon à calculer un résultat qui fait sens pour notre problème actuel. Par exemple, on peut choisir de choisir la fonction softmax vue précédemment de façon à approcher la probabilité conditionnelle p(y|x) qui pourrait se traduire par « la probabilité que le mot central d’une fenêtre glissante désigne un lieu compte-tenu de son contexte dans cette même fenêtre ». Mais on peut également choisir une fonction beaucoup plus basique qui fournira un score non-normalisé. Ce score est calculé pour chaque fenêtre glissante.

Le calcul « Forward » est très simple pour obtenir le score du mot Paris en tant que lieu, compte-tenu de son contexte défini dans la fenêtre.

Par rapport à une approche utilisant une seule couche de classification comme précédemment, on comprend intuitivement que la couche de neurons supplémentaire permet de capturer les interactions non-linéaires entre les mots-vecteurs.

Cet exemple permet d’introduire une nouvelle fonction erreur appelée « Max-Margin loss » meilleure que la fonction entropie-croisée ou la Softmax.

L’idée est d’augmenter le score d’une fenêtre S où le mot central est un lieu et de minimiser le score d’une fenêtre Sc où ce n’est pas le cas.
  • S = score de la fenêtre [Les musées à Paris sont fantastiques.]
  • Sc = score de la fenêtre [Tous les musées ne sont pas à Paris.]
La fonction J « Max-Margin loss » est définie par J = max (0, 1 – S + Sc).

Son optimisation se fait encore une fois par descente de gradients. On va alors dériver J en fonction des variables U, W, b et x.
  • Pour la dérivée partielle par rapport à U,
  • Pour la dérivée partielle par rapport à W, on explicite l’imbrication des différentes fonctions

Pour l’exercice on va dériver un unique poids Wij en remarquant que ce paramètre n’intervient que pour calculer ai. Dans la figure, on voit bien que le poids W23 ne participe qu’au calcul de a2, pas a1.

On peut rajouter ce petit schéma pour aider à la compréhension des étapes de calcul:

Il est important de penser lorsqu'on dérive des gradients, à la réutilisation des éléments de calcul car cela représente une grosse part de l’optimisation future de l’algorithme. En particulier, certains paramètres apparaissant dans la « back-propagation » ont déjà été calculés lors de la « forward-propagation ». En outre, selon la fonction d’activation choisie, certaines ont des dérivées très simples et rapides à calculer, comme par exemple la fonction « régression logistique » dont la dérivée f’(z) = f(z) (1 – f(z)).

Pour avoir la dérivée du gradient du vecteur W entier, on généralise ce qu’on vient de faire pour un poids Wij à l’ensemble de tous les poids définissant W. Puisqu’on a pu exprimer la dérivée de gradient d’un poids Wij sous la forme δi xi , on va juste vectoriser cette expression pour le vecteur W entier en notant δ le vecteur colonne de dimension (2, 1) correspondant à l’erreur venant des deux neurons a1 et a2 :
  • La dérivation du gradient par rapport au terme de biais ne pose pas de problème : 
  • La dérivation du gradient par rapport au mot-vecteur x se fait de la même manière que pour la dérivation par rapport aux poids W. En partant de la couche la plus profonde (le score de la fenêtre contenant le mot-vecteur central x) et en dérivant ce score rapport à ce mot (dérivée partielle pour chacun des « embedding » de ce mot-vecteur), on obtient en cascade le résultat présenté à droite. Si l’on vectorise cette relation pour toutes les coordonnées « embedding » du mot x, on a alors :
Si on reprend toute la colonne de calcul en décomposant les dérivées partielles imbriquées, on obtient la figure suivante:

Remarque sur l’implémentation d’un algorithme de « back-propagation »

Deux règles pour assurer une performance correcte de tout programme ayant pour objectif une optimisation reposant sur une descente de gradient, intégrée dans une approche en « back-propagation » :
  • Réutilisation des éléments de calcul provenant de la phase de « forward-propagation » et de la phase de « back-propagation » des couches les plus profondes du réseau.
  • Vectorisation du code pour travailler avec des tenseurs pour ne pas avoir à effectuer de boucles en calculant les gradients à l’échelle de la coordonnée des vecteurs mis en jeu.


Commentaires

Posts les plus consultés de ce blog

Stanford 2017 - Neural Language Processing et Techniques associées (2/18)

Chapitre 2- Représentation Vectorielle des mots Comment représenter la signification d’un mot en informatique ? Un  mot, tout comme une phrase, représente avant tout une idée, l’idée qu’une  personne veut exprimer. Une des façons les plus immédiates d’exprimer une idée,  c’est d’utiliser un mot, qui est finalement un symbole. WordNet Une  solution historique pour représenter la signification d’un mot en informatique  est de fournir au programme des listes de synonymes ou d’hyperonymes. C’est-à-dire de coder en dur des listes de correspondances entre les mots d’un  vocabulaire.  Une ressources couramment utilisée est WordNet qui comprend un nombre important de mots et leurs synonymes/hyperonymes mais manque de nuances, n’est pas mise à jour régulièrement, peut  être subjectif, requiert une action humaine pour être adapté quant à son contenu et surtout, ne permet  calculer de façon précise les similarités entre mots au-delà de celles entrées par l’homme lors de la créat

Intelligence Artificielle, Apprentissage Probabilisé et Apprentissage Profond en Français

IA-France vous propose de suivre l'actualité de l'Intelligence Artificielle et de ses dérivées en Français dans le texte. La grande majorité des articles et des sites ou blogs traitant du sujet est proposée en Anglais, et même si la majorité de la population intéressée par ces sujets maîtrise l'Anglais, il m'a semblé important de proposer au moins une actualité et des tutoriaux en Français pour la population intéressée et francophone. Vous êtes donc les bienvenus sur IA-France, un blog sur l'IA, l'Apprentissage Probabilisé et l'Apprentissage Profond en Français. Bonne visite et bonne lecture Jérôme

Stanford 2017 - Neural Language Processing et Techniques associées (1/18)

Chapitre 1- Introduction Générale     Introduction générale au Traitement Linguistique et l’Apprentissage Probabilisé Le traitement linguistique (NLP pour Natural Language Processing) est une discipline que l’on peut définir à l’intersection de 3 domaines de recherche anciens : l’informatique, la linguistique et l’intelligence artificielle. Son but est de rendre l’ordinateur capable de traiter voire de comprendre le langage naturel afin de faire des choses utiles comme la traduction automatique d’une langue à une autre, la réponse à des requêtes écrites ou orales, l’extraction d’information d’un ensemble de textes, la classification automatique, etc. La représentation et la compréhension totales du langage humain par une machine est objectif très ambitieux et très difficile à atteindre. Et en raison de cette difficulté que l’Apprentissage Probabilisé (AI) a été utilisé    Quelques spécificités du langage humain Le langage humain est spécifiquement élaboré pour tran