Un modèle d’apprentissage pour analyser des images avec des mécanismes convolutionnels

Un modèle d’apprentissage pour analyser des images avec des mécanismes convolutionnels

Cet article est destiné à ceux qui veulent mieux comprendre comment les réseaux de neurones apprennent. Plus précisément, il décrit un mode d’apprentissage des réseaux de neurones. Ce mode utilise des mécanismes convolutionnels pour analyser une image. La lecture de cet article ne nécessite aucun prérequis spécifique aux neurosciences et peu de prérequis spécifiques à l’informatique ou aux mathématiques si ce n’est de savoir ce qu’est un pixel, une matrice, une fonction, une itération, un algorithme, un processeur et de la mémoire dynamique. A la fin de l’article vous trouverez un exemple de pseudo-code, sa lecture n’est néanmoins pas nécessaire pour comprendre ce qu’est un mécanisme convolutionnel et comment il est possible d’apprendre et d’évoluer avec de tels mécanismes.

Nous lui apprenons, il apprend, il vous apprend

Dans ce billet, vous sera présenté un exemple de réseau convolutionnel qui apprend à reconnaître des formes. Dans le cadre de cet apprentissage, ce réseau découvre une heuristique ; c’est-à-dire une manière d’orienter ou de faciliter la résolution d’un problème. L’heuristique apprise par le réseau est assurément très différente des heuristiques que vous ou moi aurions utilisées. Ce réseau nous apprend,en quelque sorte, une nouvelle manière de résoudre notre problème. Nous lui apprenons à l’aide d’exemples, il apprend à partir de ces exemples, il nous apprend une heuristique qu’il a utilisée pour résoudre un problème plutôt complexe.

Le problème du classement des images n’est pas trivial

Prenons comme problème de référence celui du tri d’un ensemble d’images de chaussures selon la hauteur de leur talon. Ce problème n’est pas trivial, il faut localiser le talon sur l’image, déterminer là où il commence et là où il s’arrête, le mesurer ; la mesure doit permettre de comparer des images plus ou moins définies et des formes de talon très diverses :aiguilles, plats, compensés voire ronds. Résoudre ce problème avec un langage de programmation avec des librairies spécialisées dans le traitement d’images, est assez compliqué voire impossible. En revanche, le résoudre avec un réseau convolutif, c’est plutôt simple. Même si on ne sait pas comment ce type de réseau fonctionne, il suffit de lui fournir suffisamment d’exemples bien classés et le réseau s’occupe de calculer la fonction qui fait le travail de tri. J’ai bien dit fonction. Les réseaux fabriquent des fonctions ou apprennent à fabriquer des fonctions. Nous lui fournissons deux images et la fonction détermine celle qui a le plus grand talon. Nous lui fournissons un ensemble d’images et la fonction nous retourne cet ensemble ordonné du plus petit talon au plus grand.

La figure 1 explique l’heuristique apprise par le réseau

Regardez bien la figure 1, elle présente à grosses mailles la manière dont le réseau convolutionnel a appris à trier une image de chaussure en fonction de la hauteur de son talon.

À chaque ligne, sa chaussure et, à chaque colonne, sa couche de réseau. Il y a donc trois chaussures et quatre couches. La couche de gauche présente des images bien définies avec de nombreux pixels, celle de droite des images mal définies avec peu de de pixels ; on peut presque les compter à la main.

Les pixels sont plus ou moins jaunes ou bleus. Les pixels jaunes sont ceux qui ont été choisis par le réseau comme étant à même de caractériser la solution à notre problème. Ces pixels ont été mis en évidence pour caractériser la solution à notre problème. Comment le réseau a-t-il fait pour les choisir ?

L’aspect plutôt intriguant est que les pixels jaunes ne sont pas les pixels du talon, ce sont plutôt les pixels de la semelle. Vous l’avez compris, le réseau ne cherche à compter les pixels du talon, il cherche plutôt à mettre en évidence l’angle que fait la semelle avec le sol : plus cet angle est important plus le talon est haut. L’heuristique est là, c’est elle qui nous guide et c’est le réseau qui l’a identifiée, pas l’humain. Nous n’avons pas expliqué au réseau comment faire pas-à-pas à la manière d’un algorithme classique, il a trouvé sa propre solution et nous l’avons comprise en observant les cartes de caractéristiques de la figure 1.

Comment trouver de bonnes heuristiques ?

Revenons à la question qui nous intéresse, comment le réseau a-t-il fait pour trouver cette heuristique ? Si on regarde toujours la même image, nous voyons par ligne des transformations successives d’une image de chaussure allant d’une image très définie vers la moins définie. Toutes ces images sont des représentations successives de la même chaussure. Contrairement à ce que laisserait penser la figure 1, le réseau que nous étudions ne traite pas plusieurs images à la fois, il les traite une par une, la figure 1 montre donc quatre traitements différents d’images de chaussure complètement indépendants les uns des autres. Chaque image est une carte de caractéristiques ; certaines sont pertinentes pour résoudre notre problème, d’autres ne le sont pas.

L’apprentissage par la ténacité

Notre réseau n’apprend pas d’un coup, il lui faut un grand nombre d’essais, autrement dit, d’allers et de retours, d’itérations voire d’expériences ratées ou réussies. À chaque itération, notre réseau réalise successivement de nombreuses transformations pour aboutir à une hauteur de talon.

Parmi ces transformations, nous pouvons trouver des transformations d’images qui conservent l’échelle de l’image et mettent en évidence des caractéristiques, des transformations de réduction de définition et des transformations qui transforment une image en résultat.

Une image dans notre réseau est représentée par une matrice de chiffres, qui peut, elle-même, être transformée en une autre matrice de chiffres similaire à la forme attendue, en l’occurence la hauteur du talon. Cette forme attendue est plus moins ou différente de la forme calculée. La hauteur du talon calculée peut être supérieure ou inférieure à la hauteur obtenue. L’évolution de cette différence est calculée et ensuite répercutée sur l’ensemble des pondérations du réseau. Le mécanisme de répercussion est appelé rétro-propagation. Cette information de l’importance et du sens de la différence entre l’attendu et l’obtenu est donc rétro-propagée à l’ensemble des pondérations du réseau.

Ainsi, petit à petit, le système converge vers le résultat recherché :

  1. Transformation des images en cartes de caractéristiques
  2. Transformation vers la forme attendue
  3. Calcul de la différence entre l’obtenu et l’attendu
  4. Rétro-propagation de l’importance et du sens de cette différence vers l’ensemble des pondérations
  5. Retour à l’étape 1

À la suite d’un grand nombre d’itérations par chaussure et à un grand nombre de présentations de chaussures, notre réseau apprend à rapprocher le résultat obtenu ou calculé du résultat attendu. Au fur et mesure que notre réseau apprend, les pixels jaunes vont changer et mettre en évidence les parties de l’image les plus pertinentes pour résoudre notre problème.

Les opérations de convolution pour trouver de nouvelles caractéristiques

Une image se transforme en une carte de caractéristiques grâce à une opération de convolution.

Pour expliquer ce type de transformation une première méthode est de s’inspirer des techniques de traitement du signal. Le traitement du signal est une discipline qui transforme un signal peu compréhensible comme un signal très bruité ou très flou en un autre signal plus lisible etfacile à interpréter. Le traitement du signal transforme un nuage de points en une tendance ou transforme un nuage de points en une droite plus ou moins haussière ou baissière ou transforme un nuage de points en une courbe avec des creux et des sommets.

Par exemple, si nous divisons un nuage de points en morceaux et que nous comptons le nombre de points par morceau et que nous grisons les morceaux en fonction du nombre de points par morceau nous obtenons une image grisée où les zones les plus foncées sont celles où il y a le plus de points et les zones les plus claires celles où il y en a le moins. On aura caractérisé les zones où l’information est la plus dense.

Détaillons, maintenant la technique de filtrage utilisée. Un filtre est une petite image de quelques pixels qui lorsqu’on l’applique à une grande image ne laisse passer qu’un morceau de cette grande image. Lorsque l’on applique ce filtre à la grande image on obtient une nouvelle image de taille identique mais complètement transformée. Si nous disposons d’un grand nombre de filtres nous pouvons disposer d’un grand nombre d’images transformées. Chacun des pixels d’un filtre est pondéré par un poids et le poids attribué à un pixel évolue à chaque itération.

Nous venons d’expliquer un traitement qui permet de comprendre comment un pixel s’éclaire plus qu’un autre mais nous n’avons pas expliqué en quoi cela le rendait capable de résoudre notre problème de classement.

Le mécanisme de changement d’échelle pour multiplier les représentations

Le mécanisme de changement d’échelle permet de réduire l’échelle d’une représentation. On peut citer deux transformations basiques pour transformer une fenêtre de quatre pixels en une fenêtre d’un seul pixel : soit le réseau ne garde que le pixel de poids maximum, soit il fait la moyenne des pixels. Dans un réseau où l’on cherche à mettre en exergue les caractéristiques les plus pertinentes, on aura probablement intérêt à choisir la méthode du poids maximum plutôt que celle de la moyenne.

La mise en lien des cartes

Dans le cas de notre problème de référence, il s’agit de transformer un ensemble de cartes de caractéristiques en hauteur de talon. Il s’agit donc d’accorder, à chacune de ces cartes de caractéristiques, une pondération et, a minima, de multiplier ces matrices par leur poids pour obtenir un réel. Divers types de transformation et de représentation du résultat sont possibles, sachez seulement que cette étape est fortement consommatrice de poids et faiblement consommatrice en mémoire.

La taille d’un réseau

En pratique, les chercheurs se sont aperçus que les réseaux les plus performants, que ce soit en traitement de la vision ou en traitement des textes, étaient les réseaux avec un grand nombre de poids à pondérer. La taille des réseaux a eu tendance à croître fortement ces dernières années, à tel point que les réseaux performants mettent des semaines à affiner leurs modèles en utilisant des machines de taille gigantesque.

La figure 2 présente le nombre de poids mis à jour par le réseau à chaque passage, à chaque passage le réseau met à jour 3.000.000 de poids. Cet ensemble de poids forme l’ensemble des paramètres à pondérer pour trouver une solution plus ou moins bonne à notre problème.  Le réseau présenté est celui qui a servi à générer la figure 1. La figure 1 présente des convolutions fabriquées par les couches de convolution 1, 3, 4. Les couches de Max Pooling permettent d’agréger les convolutions et de changer la taille d’une carte de caractéristiques. Les couches Flatten et Dense permettent de trouver des liens entre les différentes convolutions et de se rapprocher de la forme de résultat attendu.

 

Les limites de l’apprentissage à l’aide de convolutions

Ce type d’apprentissage a permis de très grandes avancées en apprentissage par la machine et a débouché sur de très nombreuses applications. Notamment dans le cadre de la conduite automatique, de la médecine ou de la robotique. Il est néanmoins nécessaire d’être conscient de différentes limites :

  1. le jeu d’apprentissage: il est toujours plus ou moins biaisé et donc l’apprentissage est lui-même biaisé ; en reconnaissance faciale les jeux étaient biaisés au sens où la couleur blanche de la peau était sur-représentée.
  2. la faible capacité de généralisation des approches connexionnistes : les réseaux ont tendance à sur-apprendre et à ne pas savoir analyser des images peu attendues.
  3. le gâchis d’apprentissage : pour apprendre il consomme de trop nombreux exemples et trop de puissance processeurs ; la recherche actuelle vise la moindre consommation de ressources et pas seulement l’amélioration des performances.
  4. la sensibilité au bruit : il n’est pas très difficile de leurrer ce réseau en lui présentant une image qu’il croit être une chaussure mais qui n’en a absolument pas l’apparence.

Une représentation de notre modèle avec du pseudo code

La classe « net » est notre réseau. Nous l’initialisons avec des couches de convolutions qui implémentent les mécanismes de convolution et des couches de combinaisons qui permettent de pondérer les cartes de caractéristiques suivant qu’elles nous rapprochent ou nous éloignent de la solution.

La fonction « en avant » permet de calculer un résultat en calculant de nouvelles cartes de caractéristiques et en les combinant.

class net
   	init(n,m) :
          	couches_de_convolution = ajoute_couches_de_convolution(n)
          	couches_de_combinaison = ajoute_couche_pour_combiner_les_cartes_de_caractéritiques(m)
          	initialise_les_poids_au_hasard()
    	erreur = 100
    	matrice_désirée = []
      
   	en-avant() :
        	cartes_de_caratéristiques = calcule_les_nouvelles_cartes_caractéritiques()
        	matrice_obtenue = calcule_les_nouvelles_combinaisons(cartes_de_caratéristiques)
        	return difference_entre(matrice_obtenue,matrice_désirée)
   
  en_arriere(erreur):
        	couches_de_convolution.actualisation_poids(erreur)
        	couches_de_convolution.actualisation_poids(erreur)
        	return erreur
 
#Code principal
net(3,2)
for n in range(10000):
  print('erreur =',net.en_arriere(net.en-avant()))

La fonction « en arrière » actualise les poids des couches de convolutions et des couches de combinaisons en fonction de la différence entre le résultat calculé et le résultat obtenu.

Le code principal initialise le réseau avec différentes couches et réalise 10.000 fois le calcul de différence et l’actualisation des poids de notre réseau.

Le résultat de ces calculs est la définition d’une fonction capable d’ordonner des images de chaussures en fonction de la hauteur de leur talon.

Un schéma, en synthèse

De manière très simplifiée, voici ce que l’on peut retenir de la manière dont ce réseau apprend. Il réalise de nombreux essais et progresse à chacun d’eux. Il apprend ainsi à générer, plus ou moins aléatoirement, des cartes de caractéristiques. Ces cartes sont de nouvelles représentations de l’image en entrée. Ces cartes sont, couche après couche, simplifiées en réduisant leur définition, leur nombre de pixels. Moins le nombre de pixels est grand, plus les caractéristiques représentées sont globales. On obtient donc d’abord des cartes de caractéristiques détaillées et ensuite des cartes de caractéristiques globales. Le problème est donc représenté à diverses échelles.

Les CC sont les cartes de caractéristiques. Les ronds bleus sont des éléments unitaires de réseau qui participent à la mise en lien des cartes de caractéristiques

Comme la solution à un problème est le plus souvent plurifactorielle, le réseau essaie ensuite de combiner plusieurs cartes de caractéristiques, plusieurs représentations de petits bouts de solution. Il essaie de combiner les liens entre ces cartes de caractéristiques. Lorsqu’un ensemble de cartes de caractéristiques semble avoir de l’importance il augmente les poids des connexions qui les relient et, à l’inverse, il les diminue lorsque cet ensemble ne semble pas pertinent.

A l’issue d’un essai, le réseau évalue la qualité de la solution proposée. Il calcule la différence entre ce que l’on obtient et ce que l’on souhaite obtenir. Ce calcul permet de déterminer si l’essai nous éloigne ou nous rapproche de l’objectif désiré. Cette information est ensuite répercutée à l’ensemble des poids du réseau. Ces poids sont ceux qui combinent plusieurs cartes de caractéristiques ou ceux qui permettent de calculer une nouvelle carte de caractéristiques.

Le modèle présenté élude volontairement un grand nombre de détails et n’est qu’une représentation à gros grains de la manière dont un réseau convolutionnel apprend. Il existe, bien sûr, de nombreux autres modes d’apprentissage, celui-ci a fait ses preuves et a donné lieu à de nombreuses applications : que ce soit dans le monde médical, pour aider les médecins à analyser des images, ou automobile pour permettre à une voiture de se déplacer dans des environnements inhospitaliers voire dangereux ou encore industriel pour permettre à des robots d’effectuer des tâches de portage, de rangement ou d’usinage.