Yann LeCun

Architectures des réseaux convolutifs et récurrents

10 mai 2016

Intelligence Artificielle
Illustration de Yann LeCun

Introduction et évolution des réseaux convolutifs

Yann LeCun

Aujourd'hui, nous allons donc parler des différentes architectures et des réseaux convolutifs ainsi que récurrents. Et à la fin, je passerai quelques minutes à parler des problèmes d'optimisation pour préparer le séminaire de Yann Olivier, qui s'exprimera ensuite plus en détail sur l'optimisation en lien avec le deep learning.

Yann LeCun

Commençons par les réseaux convolutifs. Nous en avons beaucoup parlé la semaine dernière, bien sûr, mais il existe de nombreuses variantes que nous n'avons pas encore abordées. En particulier, un mélange — j'y reviendrai dans un cours ultérieur — mais un mélange de réseaux convolutifs avec des systèmes de reconnaissance de différents objets. Cela remonte en fait au début des années 90. J'en ai parlé la dernière fois, en répliquant des réseaux convolutifs dans une grande image pour détecter plusieurs objets en faisant glisser la fenêtre. Mais beaucoup de progrès ont été accomplis ces dernières années, surtout pour la reconnaissance d'objets, et j'aimerais vous en dire un peu plus à ce sujet.

Réseaux résiduels et profondeur

Yann LeCun

Lors de notre dernier cours, nous avons vu que les réseaux convolutifs ont considérablement augmenté en profondeur ces dernières années et ces derniers mois. Et maintenant, nous avons ce que nous appelons des réseaux résiduels, allant jusqu'à 150 couches. Cela semble un peu extrême, comme un excès avec le nombre de couches. Mais en empilant ces couches, cela permet au système d'émuler une sorte d'algorithme itératif. Plus il y a de couches, plus vous avez d'étapes itératives, au lieu d'un réseau neuronal avec seulement quelques couches et étapes d'itération. Si vous avez 150 couches comme celle-ci, les couches peuvent effectuer des opérations relativement complexes. Et ces connexions permettent au système de ne pas être bloqué si une couche était un peu dégénérée en termes de matrices de poids, auquel cas le gradient ne se propagerait pas correctement. Ces connexions permettent donc au système d'éliminer les couches qui ne servent pas à grand-chose et de recruter les couches qui ont été initialisées du bon côté pour faire quelque chose d'utile. Mais à mesure que vous augmentez le nombre de couches, vous vous rapprochez d'une sorte de système itératif avec un grand nombre d'itérations. Ainsi, avec ces connexions, on pourrait imaginer que si la réponse nécessite un certain nombre d'étapes pouvant varier selon l'entrée, le système peut faire, disons, 50 étapes puis utiliser ces connexions directes pour se connecter à la sortie. Et le nombre d'étapes peut varier en fonction de l'entrée. Nous ne comprenons pas bien comment cela fonctionne ; c'est assez récent. Une possibilité est que le système puisse ainsi apprendre une sorte d'algorithme simplifié.

Détection d'objets et localisation

Yann LeCun

Nous y reviendrons plus tard en parlant des réseaux récurrents. Pour la détection d'objets, la semaine dernière, nous avons parlé du glissement de fenêtres sur une image. Cela fonctionne très bien en effet. Voici donc un exemple de ce type de méthode, une figure tirée d'un article d'OverFeat au concours ImageNet en 2013. Ce système prend une image multi-échelle et applique le réseau convolutif de 220 par 220 à l'entrée avec une fenêtre glissante, en le répliquant dans toute l'image. Et pour chaque catégorie, vous avez une sorte de carte d'intensité. C'est le résultat de la détection pour la catégorie ours. Il s'allume parce qu'il voit l'ours, mais il ne peut pas le localiser. Le voici à droite de l'image. Ici, il voit l'ours en entier. Il couvre suffisamment l'ours pour le voir. Et comme vous avez une image de résolution supérieure, la carte est plus précise pour la localisation. Mais ce n'est pas suffisant pour une localisation précise.

Yann LeCun

Le critère de performance mesure ici comment la boîte prédite est couverte par ce qui est proposé. La fenêtre est de taille fixe et les objets, bien sûr, peuvent avoir des hauteurs et des largeurs différentes. Elle ne peut donc pas vous donner une prédiction très précise. Mais il y a une autre idée qui consiste tout simplement à ajouter quatre sorties au réseau. Les quatre sorties prédisent la position de la boîte avec l'objet à l'intérieur de la fenêtre. C'est exactement le même réseau, mais au lieu de 200 ou 1 000 catégories, ou une sortie pour chaque catégorie, nous avons quatre sorties supplémentaires où nous codons le centre de la fenêtre, l'objet reconnu, ainsi que sa hauteur et sa largeur. Désormais, dans le réseau avec ces fenêtres, quand le réseau voit une fenêtre centrée sur la tête, il peut en déduire que l'ours sort de la fenêtre de ce côté et peut donc prédire la position de la fenêtre. Voici le résultat de ces prédictions. Manifestement, la prédiction est tout à fait adéquate. Et au fur et à mesure que de plus en plus de sorties détectent l'ours, les prédictions se chevauchent toutes plus ou moins, comme une sorte de vote majoritaire pour trouver la fenêtre qui couvre correctement l'ours. Ce type de méthode fonctionne assez bien.

Yann LeCun

Pour détecter des objets, il existe une autre méthode qui a émergé quelques mois seulement après celle-ci. Elle s'appelle R-CNN, pour Region CNN. Et cela consiste à avoir un réseau qui détecte des propositions d'objets et un autre réseau qui regarde cet endroit plus précisément. Cela a été proposé par Ross Girshick, qui était à l'Université de Berkeley à l'époque et qui travaille maintenant au centre de recherche de Facebook en Californie, à Seattle, en fait.

Reconnaissance faciale et DeepFace

Yann LeCun

Ce type de méthode est l'une des méthodes les plus simples pour la localisation. Plus tard, je parlerai d'une localisation encore plus précise utilisant la technique de Roland Colbert. Mais en attendant, j'aimerais parler de quelques applications des réseaux convolutifs que je n'ai pas abordées la dernière fois. En particulier, l'utilisation de réseaux convolutifs pour reconnaître de nombreux objets sans connaître les classes a priori. Détecter un visage, par exemple, en est un exemple, ou reconnaître des objets spécifiques comme des monuments ou des lieux spéciaux. Il y en a des millions, et nous n'avons peut-être pas d'image de chaque objet. Mais une fois que vous avez une image, vous pouvez essayer de comparer cette image avec les images que vous aviez auparavant dans le domaine des caractéristiques reconnues. Il s'agit de DeepFace, construit par Yaniv Taigman et Ming Yang chez Facebook. Facebook l'utilise pour la reconnaissance faciale en ligne. Il n'est pas activé en Europe, vous ne pouvez donc pas en profiter ici, mais il est activé dans plusieurs pays. Vous téléchargez une photo sur Facebook, les personnes sur la photo sont détectées et reconnues si ce sont vos amis. De cette façon, vous pouvez les identifier automatiquement, puis demander à votre ami s'il accepte d'être identifié. Voici comment cela fonctionne. Vous avez un système de détection de visage assez rapide et simple, puis la détection de points clés sur le visage afin d'aligner une sorte de modèle 3D moyen d'un visage sur l'image. Nous faisons cela pour pouvoir ensuite appliquer la texture ; nous pouvons considérer qu'il s'agit de la texture appliquée à ce modèle 3D. Nous pouvons ensuite faire pivoter le modèle 3D pour une vue de face. C'est exactement ce qui est fait ici. Ce modèle est aligné puis pivoté dans un espace 3D pour obtenir une vue de face du visage, et nous pouvons aussi déplier un peu les côtés. L'image est donc très bien centrée, pas besoin de s'occuper des problèmes d'échelle et de position. C'est extrêmement bien calibré. C'est aussi un réseau convolutif et les couches supérieures n'utilisent pas de poids partagés. Vous utilisez des poids partagés dans un réseau convolutif car si une caractéristique apparaît à un endroit de l'image, il est improbable qu'elle soit utile pour la détecter ailleurs dans l'image. C'est pourquoi nous répétons les combinaisons de poids ; le noyau est répliqué dans toute l'image. Mais si le visage est bien centré, nous savons plus ou moins où se trouvent les yeux, la bouche, etc. Pas besoin de détecter des motifs de haut niveau sur toute l'image. Quand vous faites cela, les couches supérieures qui ne sont plus des convolutions ont toujours des connexions locales, mais chaque position a un ensemble de poids différent et nous pouvons donc apprendre à détecter différents motifs. Il est probable que les détecteurs en haut à gauche ici se concentreront sur l'œil, ceux-ci sur l'autre œil, et celui-là sur la bouche. Ils vont se spécialiser.

Apprentissage métrique et Dr. LIM

Yann LeCun

Il y a deux façons d'entraîner un réseau comme celui-ci. Tout d'abord, en ayant une collection de visages et en entraînant tout simplement un classificateur. Une expérience menée portait sur environ 4 000 catégories, je crois. Plusieurs photos d'environ 4 000 personnes, l'entraînement du système, puis vous retirez la dernière couche. Vous utilisez simplement l'avant-dernière couche comme vecteur de caractéristiques. Et pour chaque personne que vous devez reconnaître, vous entraînez un classificateur spécifique pour cette personne. Il y a différentes façons de le faire. Une possibilité est que si vous n'avez pas beaucoup d'exemples de chaque personne et que vous avez beaucoup moins d'exemples de la personne en question que de toutes les autres personnes collectivement, vous avez besoin d'une méthode robuste en termes d'équilibre des fréquences de classe, correctement régularisée parce que vous n'avez pas beaucoup d'exemples pour cette catégorie. Une bonne façon de faire est donc d'utiliser des SVM linéaires, correctement régularisées. Une autre méthode est celle du plus proche voisin, une règle de densité gaussienne, un modèle génératif sur les caractéristiques extraites du réseau neuronal. Pour ce faire, vous devez vous assurer que les vecteurs produits par ce réseau neuronal traversent correctement les espaces de tous les visages. L'analyse doit être de bonne qualité. Nous utilisons l'apprentissage métrique. Vous en entendrez beaucoup parler par ceux qui travaillent sur les langues naturelles, les questions et les réponses. C'est beaucoup utilisé dans ce domaine, mais on l'utilise de plus en plus pour les images. Il existe plusieurs méthodes. L'une dont je vais parler en particulier, appelée Dr. LIM, ce qui signifie réduction de dimensionnalité par l'apprentissage d'une application invariante. L'idée est simple. Vous prenez le réseau convolutif et vous prenez une sortie qui est censée représenter une catégorie, mais ce n'est que la dernière couche des caractéristiques. Donc, juste avant l'endroit où vous mettriez un classificateur, vous prenez deux images similaires de la même personne. Vous les envoyez dans le réseau, deux copies identiques du même réseau avec les mêmes poids. Les deux réseaux produisent deux vecteurs et vous voudriez que ces deux vecteurs soient aussi proches que possible l'un de l'autre. Deux images de la même personne peuvent avoir des coiffures différentes, des lunettes différentes, un look différent, mais c'est la même personne. Et vous voulez que ce vecteur code l'identité de la personne et non les paramètres d'instanciation de cette photo en particulier. Vous prenez donc les deux images et vous essayez de rapprocher les deux vecteurs l'un de l'autre avec une distance quadratique entre les vecteurs. Mais si vous faites cela sans penser au reste, il ne s'agit que d'une fonction de coût que vous minimisez ; cela ne fonctionnera pas car les deux réseaux finiraient par ignorer l'entrée et prendraient deux vecteurs constants et égaux. Cela signifie que vous avez besoin d'un terme contrastif forçant le vecteur à produire quelque chose de différent lorsque vous produisez deux images différentes. Voici un autre exemple du contraire. Si vous prenez une image très différente de l'image de référence, le système n'apprendra pas grand-chose sur le vecteur de sortie ; il sera déjà très différent. Vous avez donc besoin de visages qui peuvent être confondus avec l'image de référence afin que le vecteur soit relativement proche et puisse donc être repoussé. Il existe de nombreuses techniques de ce type pour produire, détecter ou extraire d'une base de données des exemples contradictoires. Il existe une littérature abondante à ce sujet. Mais ce que nous allons faire ici est tout le contraire. Nous allons repousser les deux vecteurs l'un de l'autre.

Yann LeCun

L'idée est assez simple. Si vous avez, d'accord, disons que cette quantité est la distance entre la sortie du réseau pour la première forme, toujours paramétrée par les paramètres, donc une distance euclidienne. Vous pouvez avoir un coût quadratique pour rendre ces deux choses différentes dans les cas où X1 et X2 sont dans la même classe. Une autre fonction de coût où ils ne sont pas dans la même classe, quelque chose comme ça. Ce symbole avec les plus, c'est juste pour la partie positive avec les crochets. C'est comme la fonction ReLU, ce qui signifie que si l'argument est positif, c'est l'identité, sinon c'est zéro. C'est donc ce qui va repousser les deux vecteurs l'un de l'autre avec un coût linéaire jusqu'à ce que la distance soit supérieure à une certaine marge M. Vous pouvez la choisir arbitrairement. C'est juste un changement d'échelle à la sortie. Disons que c'est une constante. Il arrive un moment où soit il sera possible pour le système de repousser les vecteurs au-delà de cette marge, auquel cas le coût pourra être nul, soit ce n'est pas possible, auquel cas il y aura une sorte d'équilibre entre le coût quadratique et le coût linéaire, satisfaisant toutes les contraintes, essayant de couvrir tous ces espaces à la sortie pour que les points soient correctement alignés. La connexion de ces deux termes est ce qui nous permet — ainsi la fonction de coût totale sera la somme de deux termes, qui sera cette distance que j'ai écrite ici, plus celle-ci. Nous avons deux coefficients devant indiquant si X1 et X2 sont de la même classe ou non. Ainsi delta 1-2 nous dit si X1 et X2 sont de la même classe. Si c'est le cas, nous activons ce terme ou cet autre terme et vous calculez le gradient bien sagement. C'est la fonction de coût Dr. LIM. Il y a un point important cependant. Il n'y a pas de carré ici dans cette fonction. Il y en a un ici pourtant, une racine carrée pour cette fonction. Vous n'avez pas besoin de mettre le carré ; vous pouvez simplement avoir un coût linéaire. C'est quadratique, mais il est important de ne pas mettre de carrés à l'intérieur. Si vous mettriez une racine carrée ici, le coût deviendrait une sorte de parabole inversée et le gradient ici à zéro est nul, ce qui n'est pas bon. Cela signifie que si par erreur le réseau projetait toutes les images à zéro-zéro, il n'y aurait plus de gradients pour la sortie. La fonction de coût serait élevée mais sans gradient, vous ne pouvez pas vous en sortir. Beaucoup de gens font cette erreur et ça ne marche pas. Donc, pas de racines carrées ici. Il existe de nombreuses fonctions de coût de ce type que les gens ont trouvées au fil des ans. Je ne les aborderai pas toutes, mais c'est l'idée de base de l'apprentissage métrique.

Modèles graphiques et pose humaine

Yann LeCun

Même chose ici, l'utilisation coopérative de réseaux convolutifs et de modèles graphiques tels que les CRF, les champs aléatoires conditionnels. En règle générale, c'est ce qui est utilisé pour résoudre un problème tel que tenter d'identifier la pose d'un corps humain. Vous pouvez entraîner un réseau convolutif à détecter la position de points clés sur le corps, par exemple le visage, l'épaule, le coude, le poignet, etc. Mais très souvent, ces étiquettes sont un peu ambiguës dans l'image réelle. Vous pouvez avoir de fausses détections de certains de ces points clés et s'il y a plusieurs personnes dans la même image, vous pouvez confondre les poignets des personnes. Sur certains visages, vous n'avez pas d'apparition récente lorsque la main est derrière. Vous devez donc effectuer une interprétation cohérente de la position relative de tout cela pour extraire correctement chaque caractéristique. La question est de savoir comment effectuer une localisation précise de ces points caractéristiques ? Cela peut être approximatif avec un réseau convolutif avec beaucoup de sous-échantillonnage et de pooling. Le problème est que la carte de sortie est d'une résolution inférieure à celle de l'image d'entrée. La reconnaissance des caractéristiques ne serait donc pas très précise, vous donnant des blocs d'activation mais sans vous dire exactement quelles sont les caractéristiques d'intérêt. Cela a été proposé par Jonathan Tompson, un étudiant à NYU avec Chris Bregler, qui travaille maintenant chez Google. L'idée consiste à prendre les cartes de caractéristiques tirées du réseau à un certain niveau avant les couches de pooling et à faire tourner un réseau tout simplement sur une fenêtre. Une fois que vous détectez la position approximative de la tête, vous prenez une image qui se concentre là-dessus, vous la recadrez et produisez un réseau convolutif plus petit sans pooling. Ainsi, il peut vraiment extraire la position exacte de cet objet. C'est un peu plus coûteux car vous avez besoin de plusieurs réseaux pour fonctionner. C'est similaire au réseau R-CNN de Ross Girshick avec une pré-position d'objets pour la reconnaissance. C'est donc plus pour reconnaître un petit nombre de classes comme les points clés d'un corps humain. Voici le résultat final. Mais il y a une étape supplémentaire pour que vous puissiez trouver une interprétation plus ou moins cohérente de tous ces points et les faire tous correspondre, en tenant compte des contraintes géométriques du corps humain. La façon de faire est de connecter ce que l'on pourrait appeler une sorte de modèle graphique au-dessus du réseau neuronal, une sorte de graphe de facteurs. Au lieu de vous donner une formule, laissez-moi vous l'expliquer intuitivement. Ici, vous prenez une carte pour détecter le visage ; vous avez une activation autour du visage. Et puis vous la rendez un peu floue, une convolution avec un petit noyau gaussien ou quelque chose de ce genre. Vous faites donc une convolution avec cela, ce qui vous donne une carte floue. Il y a deux propositions, une ici et une là pour le visage. Il y a le visage de quelqu'un que l'on voit plus ou moins ici. Et vous avez aussi un détecteur d'épaule, l'épaule gauche en particulier, qui est activé sur celle-ci et sur celle-là aussi pour une raison étrange. Maintenant, l'activation ici est assez précise. Ce que vous devez faire maintenant, c'est faire coopérer ces deux cartes, dire que s'il y a une épaule ici, le visage devrait être là. Et c'est le rôle de cette carte ici. Ce que fait cette carte, c'est ceci. Elle dit : si i je vois une épaule au centre de mon image, voici une sorte de distribution de probabilité de la position relative du visage. Donc toutes les images que j'ai vues, j'ai noté que le centre du visage se trouve à cette position relative par rapport au centre de cette image ici qui contient une épaule gauche, nous donnant une proposition, nous disant que le visage devrait être plus ou moins par ici. Et puis vous prenez une sorte de carte de scores. Vous prenez la carte de scores du visage, vous la multipliez par la carte de scores du visage prédite par l'épaule gauche. Vous multipliez ces deux termes et cela élimine les mauvaises propositions de visage qui ne sont pas cohérentes. Puisque toutes ces opérations sont différentiables, vous pouvez dire qu'elles en font partie intégrante. Vous les entraînerez avec des gradients stochastiques comme le reste. Sebastian Seung a travaillé là-dessus il y a plusieurs années dans son analyse, disant que si vous prenez un réseau convolutif avec de nombreuses couches et que vous le répétez plusieurs fois, vous pouvez voir les opérations effectuées par le réseau convolutif local comme étant similaires aux algorithmes d'inférence d'une chaîne de Markov, le modèle graphique. Il n'est donc pas nécessaire d'utiliser des méthodes séparées, des champs de Markov ou des CRF au-dessus d'un réseau convolutif. Vous pouvez voir la dernière couche d'un réseau convolutif comme faisant plus ou moins la même chose. Jonathan, quand he a commencé, il voulait une correspondance directe entre la dernière couche du réseau convolutif et une sorte de CRF. Il s'est rendu compte que grâce à l'entraînement, il n'avait besoin que d'une seule couche. Il n'avait pas besoin de répéter l'opération de cohérence ici. Cela fonctionne bien avec une seule couche, en tenant compte de toutes les interactions entre toutes les catégories, bien sûr. Je ne vous ennuierai pas avec les résultats, mais il a battu plusieurs records avec cela.

Segmentation d'objets et applications industrielles

Yann LeCun

Et maintenant, passons à des méthodes plus précises pour localiser les objets. L'idée de base remonte à environ un an. Je vous en ai montré des exemples auparavant, mais ce n'est que très récemment mis en œuvre, il y a quelques mois à peine.

Yann LeCun

L'idée avec la méthode Deep Mask proposée par Pinheiro et Collobert et plus tard par Dollar ICCV n'est pas de produire juste des coordonnées d'une boîte d'un objet comme je vous l'ai montré avec l'exemple de l'ours tout à l'heure. Dans certaines sorties proposant une catégorie, vous avez quatre sorties qui vous donnent les coordonnées de la boîte contenant l'objet. Ici, c'est plus précis. Vous prenez une carte qui est le masque de l'objet. Le système sera entraîné à produire simultanément une catégorie et à produire un masque de l'objet en question. Cela fonctionne très bien. Voici donc des exemples de propositions d'objets proposées par Deep Mask. Et c'est assez impressionnant. Il y a une équipe chez Facebook qui travaille sur un système pour participer au concours FAIR COCO organisé par Microsoft, les résultats ayant été présentés par l'ICCV en décembre dernier. C'est un système compliqué utilisant une séquence où il prend une image, environ 200 pixels, l'envoie à un réseau convolutif puis prend la carte des caractéristiques à plusieurs échelles, produit un masque par affinement multi-échelle. Une architecture un peu compliquée, surtout quand on regarde ce qui se passe dans ces modules, mais c'est assez facile de construire ces architectures en assemblant des boîtes. Le gradient est calculé à l'intérieur. La première proposition d'une caractéristique, une sorte de proposition de masque à basse résolution, est ensuite affinée par des boîtes qui voient les caractéristiques à une échelle plus fine pour produire un masque relativement précis par la suite. Et cela fonctionne très bien en effet pour faire des propositions d'objets et catégoriser simultanément. Le fait est que lorsque vous appliquez ce système, cela coûte beaucoup de puissance de calcul car vous devez calculer cela avec une fenêtre glissante pour chaque fenêtre. Le système produit un masque. L'objet reconnu peut ne pas être centré. Il produira donc un masque un peu décalé. Et puis vous devrez voir dans quelle fenêtre l'objet est entièrement dans l'image pour utiliser celle-là pour la reconnaissance. Cela peut avoir lieu à plusieurs échelles et à plusieurs tailles de la fenêtre d'entrée, ce qui conduit à quelque chose d'assez complexe. Aux États-Unis, ils ont essayé de trouver comment dire cela en anglais, pour dire quelque chose d'extrêmement complexe, un véritable labyrinthe. Ce qu'on appelle une 'usine à gaz' en français. J'adore cette expression, qui signifie hautement alambiqué. Quand on met toutes ces pièces ensemble, c'est assez compliqué au final avec de nombreuses boîtes, chacune avec un réseau convolutif complet avec des centaines de millions de paramètres. Cet objet consiste en des réseaux spécialisés dans les scènes pour chaque échelle d'une vue d'un objet donné afin d'effectuer une localisation et une identification plus précises. Quand on met toutes les pièces ensemble, au final cela nous donne quelque chose de vraiment compliqué. Cela coûte beaucoup de puissance de calcul pour entraîner cela. Ça fonctionne bien pourtant. Voici des exemples que je vous ai montrés lors du cours inaugural. Il peut identifier des personnes ou des objets qui ne peuvent être identifiés que par le contexte. Il fait des erreurs. Ceci est identifié comme un gant de baseball. Bien sûr, s'il avait le contexte global, il pourrait identifier que la personne joue au tennis, mais il y a peu de probabilité de trouver un gant de baseball dans cette scène. Il est donc assez facile d'intégrer cela. Ce n'est pas fait. Mais ce qui est intéressant ici, c'est qu'il détecte toutes les voitures ici, les personnes, mais il détecte aussi cela comme une voiture, ce qui est techniquement correct, mais ce n'est pas ce que l'on aurait espéré. Eh bien, c'est étonnant. Je suis vraiment surpris par la qualité du masque produit pour ces objets. Ici, il y a une erreur sur ce pauvre mouton qui a été coupé en deux. D'une certaine manière, il peut compter les sandwichs, les gâteaux, les zèbres, etc. C'est donc un système puissant, mais au concours COCO, il est arrivé deuxième. Le gagnant a utilisé un système plus simple d'une certaine manière, l'architecture R-CNN de Ross Girshick avec des propositions d'objets et un dispositif de reconnaissance. La seule différence avec ce système est que le système gagnant est celui qui venait de Microsoft Research Asia en utilisant ResNet, un réseau très profond de 150 couches et toutes les connexions. Ce réseau convolutif fonctionne mieux que les autres. La différence de performance est suffisante pour que l'ensemble du système dépasse la performance de celui-ci. Cela a été fait principalement par Kaiming He chez Microsoft Research à Pékin. Il a proposé cette architecture ResNet et l'a appliquée à de nombreux problèmes, non seulement COCO, mais aussi ImageNet, de la reconnaissance pure d'objets sans localisation, ainsi que l'identification de classes de grands nombres qui sont inconnues, similaire au problème de la reconnaissance faciale mais en se concentrant sur des objets ou des monuments spécifiques. Il y a donc un avantage avec une architecture sophistiquée, mais il faut un bon dispositif de reconnaissance de base. La première chose qu'a faite l'équipe de Facebook à son retour du réseau ICCV, c'est qu'elle a remplacé cela par ResNet et la performance a été immédiatement améliorée. Il y aura un séminaire complet sur la reconnaissance vocale la semaine prochaine, donc je ne l'aborderai pas. Comme je l'ai dit lors de la leçon inaugurale, depuis un an ou deux maintenant, les réseaux convolutifs sont devenus de plus en plus courants, particulièrement largement utilisés aujourd'hui et à l'avenir pour l'aide à la conduite. Il s'agit d'une carte spécialisée fabriquée par NVIDIA, intégrée dans les voitures pour que celles-ci puissent percevoir et éviter les obstacles pour la conduite autonome. C'est une plateforme ouverte. Elle est proposée comme plateforme aux ingénieurs et aux constructeurs automobiles pour construire leurs propres systèmes dotés d'outils de réseaux convolutifs afin qu'ils puissent être mis en œuvre rapidement. Ce système peut traiter les entrées de nombreuses caméras autour de la voiture. C'est le directeur général de NVIDIA qui a présenté cela tout récemment. Cela fonctionne assez bien. Une autre entreprise travaillant sur ce sujet est Mobileye, une société israélienne fondée par Amnon Shashua. Il y a deux ans, ils ont adopté les réseaux convolutifs, les mettant en œuvre sur une puce spécialisée qu'ils possèdent pour le traitement visuel des voitures. Ils ouvrent la voie devant NVIDIA puisqu'ils sont déjà présents sur certaines voitures haut de gamme comme Tesla afin que ces voitures puissent rester sur leur trajectoire et éviter les piétons ou freiner si la voiture de devant est trop proche. En fait, ils utilisent un encodeur très similaire à celui que nous utilisons pour les projets de robotique, une sorte de segmentation sémantique de l'image où la partie que l'on peut traverser est en vert, les obstacles sont en rouge et la bordure est violette pour que, pour chaque direction, ils puissent connaître la distance de l'objet le plus proche. Mais ces gens avaient un problème. Ils se sont rendu compte que les réseaux convolutifs fonctionnaient très bien il y a environ deux ans. À l'époque, leurs puces n'étaient pas vraiment faites pour faire fonctionner des réseaux convolutifs, ils ont donc utilisé un grand chausse-pied pour essayer de faire fonctionner le réseau convolutif dans leur puce. La prochaine génération de puces sera bien plus efficace pour les réseaux convolutifs, mais cela prend beaucoup de temps de concevoir une nouvelle puce avec tous les tests. L'idée de localiser des objets peut s'appliquer à de nombreux domaines. De nombreuses personnes travaillent sur une utilisation possible dans l'imagerie médicale pour la détection de tumeurs. Le grand avantage des réseaux convolutifs est qu'ils peuvent regarder une image volumétrique et pas seulement une section comme on le fait quand on regarde l'écran ; on peut effectuer une convolution 3D pour regarder ainsi l'image complète afin de pouvoir corréler les différentes sections et identifier les zones problématiques avec une plus grande fiabilité. Nous n'en sommes qu'au début. Cela a été fait à l'Université de Montréal au laboratoire de Yoshua Bengio. Il y a beaucoup de travaux là-dessus, effectués par de nombreuses startups et entreprises privées comme IBM et DeepMind. C'est une application des réseaux convolutifs qui aura un impact significatif sur la santé publique à l'avenir. Je ne me souviens plus si j'en ai parlé la dernière fois ou non. Les utilisateurs de Facebook téléchargent environ un milliard d'images chaque jour et chaque image est reconnue par au moins deux réseaux convolutifs, un pour le visage et un pour les objets. Encore une fois, ils ne sont pas activés en Europe. Tout cela se déroule en moins de deux secondes après le téléchargement d'une image ; la reconnaissance et l'identification ont lieu. Il faut beaucoup d'infrastructures pour gérer un tel afflux d'informations et un grand nombre de serveurs est nécessaire. Le nombre exact de serveurs est gardé secret.

Réseaux récurrents et mémoire à long terme

Yann LeCun

Parlons maintenant des réseaux récurrents. Je vous en dirai plus lors du prochain cours, mais j'aimerais juste introduire le sujet. Les réseaux récurrents sont des réseaux où l'on observe une entrée à un instant T. Le système prend cette entrée et l'état précédent à un instant antérieur, produit un nouvel état, et à partir de cet état interne, une sortie est calculée avec un autre réseau qui peut regarder l'entrée et les états précédents et pas seulement l'état présent. Il s'agit donc d'un réseau en boucle avec un retard. Au fur et à mesure, chaque fois que vous observez un vecteur d'entrée, vous faites le tour de la boucle et produisez une sortie. Comment entraîner un réseau comme celui-ci avec des boucles ? Vous les déployez dans le temps. Si vous déroulez ce réseau dans le temps, vous avez une copie du réseau à chaque instant. C'est le réseau à l'instant T, T moins 1. Vous prenez l'entrée à l'instant moins 1 et ainsi de suite. Le même réseau est appliqué à l'instant suivant. Tout cela signifie l'entraînement d'un réseau sans boucle qui est à propagation avant. La seule différence est que les poids sont partagés. Tous ces modèles sont identiques avec les mêmes paramètres, les mêmes modules à différents moments. Nous les appelons réseaux siamois car ce sont des jumeaux attachés par la tête. Ce n'est pas un problème conceptuellement. Vous pouvez construire ces réseaux facilement. Il existe des architectures pour les réseaux récurrents multicouches où vous empilez ces fonctions. Une première couche ici prenant les états aux instants précédents. Et vous répétez cela et les sorties sont calculées à partir de l'état de la dernière couche.

Yann LeCun

Mais il y a un problème avec les réseaux récurrents. Si vous déroulez le réseau avec trop de couches, vous avez des problèmes de convergence des gradients. Je pense que Yann Ollivier vous dira un mot sur le fait que vous avez ce problème. Il a été identifié par Yoshua Bengio, Patrice Simard et Jürgen Schmidhuber il y a environ 20 ans. Le problème étant que si l'une de ces couches est relativement dégénérée — si la fonction calculée ZT dépendant de ZT moins 1 n'est pas correctement entraînée, produisant toujours le même état — cela signifie que l'état final ne dépendra pas beaucoup de l'état initial. Lorsque vous effectuez la rétropropagation des gradients, ceux-ci deviennent très petits. Chaque fois que vous rétropropagez le gradient, vous le multipliez par le jacobien de cette boîte, qui peut être nul ou proche de zéro, réduisant les gradients au fur et à mesure que vous multipliez cela sur les couches. Un autre problème identifié par Yoshua et Patrice est que la raison pour laquelle vous voulez utiliser des réseaux récurrents est de pouvoir stocker une mémoire à long terme pour une dépendance à long terme. Les réseaux récurrents sont souvent utilisés pour la modélisation du langage. Or, pour que le système fonctionne correctement, il doit se souvenir de la structure de la phrase, il a donc besoin d'assez de mémoire à long terme pour contenir le dernier mot dans une langue comme l'allemand où le verbe est à la fin de la phrase. Si la modélisation du langage est destinée à capturer le sens d'une histoire, cela nécessite une dépendance à long terme. Yoshua et Patrice pensent qu'il faut de la mémoire. Avec de la mémoire, vous avez des états stables dans le système, ce qui signifie qu'un état stable est un état où l'état final ne dépend pas de l'état initial. Mais cela ouvre la boîte de Pandore car la puissance de calcul de ces réseaux récurrents est la même que celle des machines de Turing. Si vous avez une dimension élevée de l'état interne, vous pouvez calculer à peu près n'importe quoi en utilisant un réseau récurrent. Mémoire — l'article sur les limites des réseaux récurrents et le fait de vouloir les utiliser pour stocker la mémoire à long terme — s'ils stockent la mémoire à long terme, dans ce cas la rétropropagation ne fonctionne plus. Mais cela remonte à quelque 20 ans et cela a mis un frein à l'intérêt des chercheurs pour les réseaux récurrents. Mais cet argument est faux dans ses hypothèses. La mémoire n'est pas nécessaire pour le calcul. Vous n'avez pas besoin de stocker une mémoire stable pour vous souvenir de ce qui s'est passé dans le passé. La meilleure explication est la suivante : l'existence des ordinateurs quantiques. Un ordinateur quantique n'effectuera que des opérations réversibles. Il ne peut pas y avoir de mémoire dans un ordinateur quantique d'une certaine manière ; il ne peut y avoir d'état stable. Si plusieurs états peuvent converger vers le même état, l'opération devient soudainement non réversible. Mais nous pouvons faire n'importe quel calcul avec un ordinateur quantique, même ceux qui nécessitent de la mémoire. Il n'y a donc pas besoin de mémoire stable pour effectuer un calcul universel.

Yann LeCun

Ce théorème qui dit qu'on ne peut pas utiliser de réseaux récurrents parce qu'ils doivent stocker de la mémoire — nous pouvons les entraîner, mais en réalité, ce n'est pas tout à fait vrai. Il suffit de construire le réseau de manière à ce que les opérations effectuées pour calculer l'état à partir de l'état précédent soient réversibles d'une certaine manière. Yoshua et moi avons travaillé environ 20 ans là-dessus ; nous n'avons pas réussi à le faire fonctionner, mais ses laboratoires et les miens ont travaillé sur des formes de réseaux récurrents où nous forçons l'irréversibilité de cette fonction et résolvons ce problème de l'évanouissement du gradient. Une autre astuce pour augmenter la durée de dépendance des états dans un réseau récurrent consiste à empiler les couches et à faire en sorte que les couches supérieures se mettent à jour plus lentement. C'est comme un réseau convolutif avec pooling où la couche suivante est toujours récurrente mais elle est mise à jour une fois sur deux. Avec la même itération, elle peut voir deux fois plus loin dans le passé. Une autre astuce plus simple proposée par Tomas Mikolov et son équipe a consisté à prendre deux catégories d'unités dans un réseau récurrent. Une catégorie récurrente qui est mise à jour à la vitesse normale et un autre ensemble d'unités dont l'évolution est ralentie selon vos besoins. En d'autres termes, l'état de cet ensemble d'unités peut changer très rapidement. Ceci est imposé par le fait que la matrice de mise à jour de ces unités est très proche de l'unité. Cet état change en fait assez lentement et peut donc être utilisé comme contexte pour une mémoire à relativement long terme. Idée simple qui fonctionne assez bien pour la modélisation du langage. Quoi qu'il en soit, architectures possibles pour ces réseaux récurrents à plusieurs couches.

LSTM et modélisation du langage

Yann LeCun

Mais ce dont j'aimerais parler, c'est du LSTM, mais j'y reviendrai plus tard la semaine prochaine quand Gabriel Synnaeve parlera de reconnaissance vocale. C'est un type de réseau récurrent qui est devenu largement utilisé ces dernières années. On l'appelle la mémoire à long et court terme (Long Short-Term Memory), proposé à l'origine par Hochreiter et Schmidhuber à la fin des années 90 pour résoudre ce problème de dépendance à long terme. Chaque unité d'un réseau récurrent LSTM où ce module est répété possède une entrée. Cette entrée passe par des sous-réseaux calculant l'entrée du système. Elle traverse plusieurs couches et pénètre dans l'unité que vous pouvez voir comme un état interne. Cet état interne est utilisé par une autre partie du réseau pour calculer la sortie. La particularité du LSTM est que ces unités ont une boucle, un poids très proche de l'unité. Chaque unité est connectée à elle-même par une boucle de retour. Une entrée supplémentaire est calculée à partir des autres sorties, produisant un coefficient qui peut être nul. S'il est nul, cette boucle de retour est coupée. Si la boucle de retour est active, cette unité conserverait son état et nous ne ferions qu'accumuler les entrées qui arrivent, maintenant son état au fur et à mesure que vous parcourez la boucle. Mais si cette unité décide de se mettre à jour, la boucle est coupée et l'unité est mise à jour. Vous pouvez voir cela comme une sorte d'unité de mémoire. Il y a une multiplication ici prenant l'entrée pour que vous puissiez écrire l'entrée dans cette mémoire en fonction de ce coefficient. S'il est nul, rien n'est écrit ici car la mémoire est préservée. Si cette entrée est égale à un, soudainement cette entrée est écrite dans cette mémoire et ajoutée à l'état précédent. De même, l'état interne peut être activé, influençant la sortie par le biais d'une autre unité. Si vous prenez tous ces petits circuits, cela ressemble beaucoup à une version logicielle d'un circuit mémoire. Cela fonctionne assez bien pour de nombreuses applications.

Yann LeCun

Une application spectaculaire apparue il y a environ un an et demi proposée par Sutskever et al. chez Google : ils prennent un réseau LSTM en empilant quatre couches. Il prend une phrase en anglais et vous pouvez voir le vecteur de sortie à la fin de cette période comme une représentation du sens de la phrase, puis un autre réseau LSTM prend cette représentation et produit des mots dans une autre langue. La performance de ce système à l'époque était juste en dessous de celle d'un système conventionnel, mais combiné à un système conventionnel, il a dépassé l'état de l'art. Récemment, des personnes ont effectué des travaux plus raffinés à ce sujet, et avec ces systèmes, elles peuvent battre les records actuels en traduction. Il y a donc de grands espoirs que les systèmes de traduction dépassent bientôt les performances des systèmes conventionnels et puissent peut-être être déployés sur Internet. Si vous vous intéressez à la modélisation du langage, il y a un article qui vient d'être publié sur Archive par une équipe de Google examinant de nombreuses architectures utilisant le LSTM, des réseaux convolutifs ou un mélange des deux. Ce système ne regarde pas les mots mais directement les caractères et prédit le mot suivant en utilisant soit un réseau récurrent, soit un réseau convolutif. Ils effectuent des essais massifs à grande échelle avec des résultats vraiment excellents. Beaucoup de progrès ont été accomplis.

Yann LeCun

Voilà. J'aimerais vous remercier et je vais maintenant céder la parole à Yann Ollivier qui va nous parler de l'optimisation des réseaux neuronaux.