Comment les Réseaux de neurones à convolution fonctionnent

Traduction de l’article original de Brandon Rohrer (Senior Data Scientist à Facebook), “How Convolutional Neural Networks Work

Aperçu de ce qu’il se passe dans un réseau de neurones à convolution, et pourquoi sont-ils si efficaces.

Neuf fois sur dix, quand vous entendez parler des barrières scientifiques qui ont été repoussées grâce à l’application de techniques d’Apprentissage profond (ou Deep Learning en anglais), les réseaux de neurones à convolution sont impliqués. Aussi appelés CNN ou ConvNets, ils constituent les fers de lance de l’Apprentissage profond.

Aujourd’hui, ils sont même capable d’apprendre à trier des images par catégorie avec dans certains cas, de meilleurs résultats qu’après un triage manuel. S’il y a donc aujourd’hui une méthode qui justifie un engouement particulier, il s’agit donc bien des CNNs.

Ce qui est particulièrement intéressant avec les CNNs, c’est qu’ils sont également faciles à comprendre, lorsque vous les divisez en leurs fonctionnalités de base.

X et O

Pour nous aider à comprendre le fonctionnement d’un réseau de neurones à convolution, nous allons nous aider d’un exemple simplifié et chercher à déterminer si une image représente un X ou un O.

En effet, cet exemple est suffisamment riche pour illustrer les différents principes des CNNs, tout en étant aussi suffisamment simple pour éviter de “s’encombrer” de détails non essentiels.

Notre CNN n’a qu’une seule tâche à réaliser: chaque fois qu’on lui présente une photo, il doit décider si cette photo représente un X ou un O. Il considère que dans chaque cas, il ne peut y avoir que l’un ou l’autre.

Une approche naïve pour résoudre ce type de problème est de sauver une image représentant un X et une image représentant un O et de comparer chaque nouvelle image à ces deux images afin de voir de laquelle elle est la plus proche (i.e. ressemblante).

Ce qui rend cette tâche complexe est que, pour un ordinateur, une image n’est rien d’autre qu’un tableau de pixels en 2 Dimensions (une sorte d’échiquier géant) avec chaque case contenant un numéro spécifique: Dans notre exemple, un pixel ayant la valeur 1 est un pixel blanc, et -1 est noir.

Lorsque l’on compare 2 images directement entres elles, s’il y a ne serait-ce qu’un pixel contenant différentes valeurs, alors les images sont considérées comme étant différentes par l’ordinateur.

Idéalement, nous voudrions être capable de reconnaître un X et un O, même s’ils sont décalés, réduits, pivotés ou déformés dans l’image. C’est là que les CNNs entrent en jeu.

Caractéristiques

Le CNN compare les images fragment par fragment. Les fragments qu’il recherche sont appelés les caractéristiques. En trouvant des caractéristiques approximatives qui se ressemblent à peu près dans 2 images différentes, le CNN est bien meilleur à détecter des similitudes que par une comparaison entière image à image.

Chaque caractéristique est comme une mini-image — i.e. un petit tableau de valeurs en 2 Dimensions. Les caractéristiques rassemblent les aspects les plus communs des images. Dans le cas de l’image montrant un X, les caractéristiques définissant les deux diagonales et l’entre-croisement de ces dernières représentent les traits les plus communs d’un X. Ces caractéristiques correspondent probablement aux bras et au centre de toute image d’un X.

Convolution

Quand on lui présente une nouvelle image, le CNN ne sait pas exactement si les caractéristiques seront présentes dans l’image ou où elles pourraient être, il cherche donc à les trouver dans toute l’image et dans n’importe quelle position.

En calculant dans toute l’image si une caractéristique est présente, nous faisons un filtrage. Les mathématiques que nous utilisons pour réaliser cette opération sont appelés une convolution, de laquelle les réseaux de neurones à convolution tiennent leur nom.

Les mathématiques derrière le principe de convolution ne sont pas bien complexes. Pour calculer la correspondance entre une caractéristique et une sous-partie de l’image, il suffit de multiplier chaque pixel de la caractéristique par la valeur que ce même pixel contient dans l’image. Ensuite, on additionne les réponses et divise le résultat par le nombre total de pixels de la caractéristique. Si les 2 pixels sont blancs (de valeur 1) alors 1 * 1 = 1. Si les deux sont noires, alors (-1) * (-1) = 1. Dans tous les cas, chaques pixels correspondant ont pour résultat 1. De manière similaire, chaque décalages donnent -1.

Si tous les pixels dans une caractéristique correspondent, alors leur addition puis leur division par le nombre total de pixels donne 1. De la même manière, si aucun des pixels de la caractéristique ne correspond à la sous-partie de l’image, alors la réponse est -1.

Pour compléter une convolution, on répète ce processus alignant les caractéristiques avec chaque sous-partie de l’image. On prend alors le résultat de chaque convolution et créé avec un nouveau tableau de 2 Dimensions, basé sur où dans l’image le patch se trouve. Cette map des correspondances est aussi une version filtrée de l’image d’origine. C’est une map indiquant où la caractéristique a été trouvée dans l’image. Les valeurs proches de 1 montrent une forte correspondance, celles proches de -1 montrent une forte correspondance pour le négatif photographique de la fonctionnalité et les valeurs proches de 0 ne correspondent à aucun type.

L’étape suivante est de répéter le processus complet de convolution pour chacunes des autres caractéristiques existantes. Le résultat est un ensemble d’images filtrées, dont chaque image correspond à un filtre particulier.

Il est conseillé de considérer cet ensemble d’opérations de convolutions comme une unique étape de traitement: Dans les réseaux de neurones à convolutions, on appelle cela la couche de convolution, ce qui laisse deviner qu’il y aura par la suite d’autre couches ajoutées à celles-ci.

Bien que le principe soit relativement simple et l’on puisse facilement expliquer notre CNN au dos d’une serviette, le nombre d’additions, de multiplications et de divisions peut rapidement s’accumuler. En termes mathématiques, elles s’accroissent linéairement avec le nombre de pixels de l’image, avec le nombre de pixels de chaque caractéristique.

Avec tant de facteurs, il est très facile de rendre ce problème infiniment plus complexe. Il n’est donc pas étonnant que les fabricants de microprocesseurs fabriquent maintenant des puces spécialisées dans le type d’opérations qu’exigent les CNNs.

Pooling

Un autre outil très puissant utilisé par les CNNs s’appelle le Pooling. Le Pooling est une méthode permettant de prendre une large image et d’en réduire la taille tout en préservant les informations les plus importantes qu’elle contient. Les mathématiques derrière la notion de pooling ne sont une nouvelle fois pas très complexe. En effet, il suffit de faire glisser une petite fenêtre pas à pas sur toutes les parties de l’image et de prendre la valeur maximum de cette fenêtre à chaque pas. En pratique, on utilise souvent une fenêtre de 2 ou 3 pixels de côté et une valeur de 2 pixels pour ce qui est de la valeur d’un pas.

Après avoir procédé au pooling, l’image n’a plus qu’un quart du nombre de ses pixels de départ.

Parce qu’il garde à chaque pas la valeur maximale contenue dans la fenêtre, il préserve les meilleurs caractéristiques de cette fenêtre. Cela signifie qu’il ne se préoccupe pas vraiment d’où a été extraite la caractéristique dans la fenêtre.

Le résultat est que le CNN peut trouver si une caractéristique est dans une image, sans se soucier de l’endroit où elle se trouve. Cela aide notamment à résoudre le problème liés au fait que les ordinateurs soient hyper-littéraires.

Au final, une couche de pooling est simplement un traitement de pooling sur une image ou une collection d’images. L’output aura le même nombre d’images mais chaque images aura un nombre inférieur de pixels. Cela permettra ainsi de diminuer la charge de calculs. Par exemple, en transformant une image de 8 mégapixels en une image de 2 mégapixels, ce qui nous rendra la vie beaucoup plus facile pour le reste des opérations à effectuer par la suite.

Unités Rectifié Linéaire (ReLU)

Un élément important dans l’ensemble du processus est l’Unité linéaire rectifiée ou ReLU. Les mathématiques derrière ce concept sont assez simples encore une fois: chaque fois qu’il y a une valeur négative dans un pixel, on la remplace par un 0. Ainsi, on permet au CNN de rester en bonne santé (mathématiquement parlant) en empêchant les valeurs apprises de rester coincer autour de 0 ou d’exploser vers l’infinie.

C’est un outil pas vraiment sexy mais fondamental car sans lequel le CNN ne produirait pas vraiment les résultats qu’on lui connaît.

Le résultat d’une couche ReLU est de la même taille que ce qui lui est passé en entrée, avec simplement toutes les valeurs négatives éliminées.

Apprentissage Profond

Vous aurez probablement remarqué que ce que l’on donne en entrée à chaque couche (i.e. des tableaux de 2 Dimensions) ressemble énormément à ce que l’on obtient en sortie (d’autres tableaux de 2 Dimensions). Pour cette raison, nous pouvons les ajouter les uns après les autres comme on ferait avec des Legos.

Les images brutes sont filtrées, rectifiées et mises en commun pour créer un ensemble d’images rétrécies et filtrées par caractéristiques visibles dans chaque image. Celles-ci peuvent ainsi être filtrées et rétrécies encore et encore. A chaque fois, les caractéristiques deviennent plus grandes et plus complexes, et les images deviennent plus compactes. Cela permet aux couches inférieures de représenter des aspects simples de l’image, tels que les bords et points lumineux. Les couches supérieures quant à elles représentent des aspects beaucoup plus complexes de l’image, tels que des formes et des patterns. Ceux-ci ont tendance à être facilement reconnaissables. Par exemple, dans un CNN entraîné à reconnaître des visages, les couches supérieures représentent des motifs et patterns qui font clairement partie d’un visage (1).

Couches entièrement connectées

Les CNNs ont une autre flèche dans leur carquois. En effet, les couches entièrement connectés prennent les images filtrées de haut niveau et les traduisent en votes. Dans notre exemple, nous devons seulement décider entre deux catégories, X et O.

Les couches entièrement connectées sont les principaux blocs de construction des réseaux de neurones traditionnels. Au lieu de traiter les inputs comme des tableaux de 2 Dimensions, ils sont traités en tant que liste unique et tous traités de manière identique. Chaque valeur a son propre vote quant à si l’image est un X ou un O. Cependant, le process n’est pas complètement démocratique. Certaines valeurs sont bien meilleures à détecter lorsqu’une image est un X que d’autres, et d’autres sont bien meilleures à détecter un O. Celles-ci ont donc davantage de pouvoir de vote que les autres. Ce vote est appelé le poids, ou la force de la connection, entre chaque valeur et chaque catégorie.

Lorsqu’une nouvelle image est présentée au CNN, elle se répand à travers les couches inférieures jusqu’à atteindre la couche finale entièrement connectée. L’élection a ensuite lieu. Et la solution avec le plus de vote gagne et est déclarée la catégorie de l’image.

Les couches entièrement connectées, tout comme les autres couches, peuvent être ajoutées les unes à la suite des autres car leur valeur en sortie (une liste de votes) ressemble énormément à leur valeur en entrée (une liste de valeur). En pratique, plusieurs couches entièrement connectées sont souvent ajoutées les unes à la suite des autres, avec chaque couche intermédiaire votant pour des catégories “cachées” fantômes. En effet, chaque couche additionnelle laisse le réseau apprendre des combinaisons chaque fois plus complexes de caractéristiques qui aident à améliorer la prise de décision.

Rétropropagation

Même si notre analyse des CNNs avance bien, il y a toujours quelque chose qui manque: D’où viennent les caractéristiques? Et comment définit-on les poids de nos couches entièrement connectées? S’il fallait tout choisir manuellement, les CNNs serait bien moins populaires qu’ils ne le sont. Heureusement, un concept très important fait ce travail pour nous: la rétropropagation.

Pour pouvoir faire appel à la rétropropagation, nous devons avoir une collection d’images pour lesquelles nous connaissons déjà la catégorie à sélectionner. Cela veut dire que quelques âmes charitables (et patientes) ont analysés des milliers d’images en amont et ont associés à chacune d’entre elles leur catégorie respective, X ou O.

On utilise donc ces images avec un CNN qui n’a pas encore été entraîné, ce qui veut dire que chaque pixel de chaque caractéristique et chaque poids de chaque couche entièrement connectée est configurée avec une valeur aléatoire. Apres ca, on commence à passer des images au CNN, une par une.

Pour chaque image analysée par le CNN on obtient un vote. Le nombre d’erreurs que l’on fait dans notre classification nous renseigne ensuite sur la qualité de nos caractéristiques et de nos poids. Les caractéristiques et poids peuvent ensuite être ajustées de manière à réduire l’erreur. Chaque valeur est augmentée ou diminuée, et la nouvelle valeur de l’erreur de notre réseau est recalculée, à chaque fois. Quel que soit l’ajustement fait, si l’erreur diminue, l’ajustement est conservé.

Après avoir fait ca, pour chaque pixel de chaque caractéristique, de chaque couche convolutive et pour chaque poids dans chaque couche entièrement connectée, les nouveaux poids permettent d’obtenir une réponse qui marche légèrement mieux pour cette image.

Ce processus est ensuite répété avec chacune des autres images qui ont un label.

Les éléments qui n’apparaissent que dans de rares images sont rapidement oubliées, mais les patterns que l’on trouve régulièrement dans un grand nombre d’images sont retenus par les caractéristiques et le poids des connections. Si vous avez suffisamment d’images avec labels, ces valeurs se stabilisent à un ensemble de valeurs qui marche plutôt bien pour un ensemble de cas variés.

Comme c’est certainement apparent, la rétropropagation est une autre étape de calcul coûteuse et une autre motivation pour le matériel informatique spécialisé.

Hyperparameters

Malheureusement, tous les aspects des CNNs ne sont pas aussi intuitifs à apprendre et comprendre que ce que nous avons vu jusqu’à présent. Ainsi, il y a toujours une longue liste de paramètres qui doivent être définis manuellement pour permettre au CNN d’avoir de meilleurs résultats.

  • Pour chaque couche convolutive, combien de caractéristiques doit on choisir? Combien de pixels doit-on considérer dans chaque caractéristique?
  • Pour chaque couche de Pooling, quelle taille de fenêtre doit-on choisir? Quel pas?
  • Pour chaque couche entièrement connectée supplémentaire, combien de neurones cachés doit on définir?

En plus de ces paramètres, il y a aussi d’autres éléments architecturaux de plus haut niveau à considérer: Combien de couches de chaque type doit on inclure? Dans quel ordre? Certains modèles d’apprentissage profond peuvent avoir plus d’une centaine de couches, ce qui rend le nombre de possibilités extrêmement important.

Avec tant de combinaisons et permutations envisageables, seulement une petite fraction des configurations possibles ont été testées jusqu’à présent. Les différentes conceptions de CNNs sont en général motivées par la connaissance accumulée par la communauté scientifique, avec certains écarts occasionnels permettant des améliorations surprenantes en performances. Et bien que nous ayons présenté les principales briques nécessaires à la construction des CNNs de manière relativement simple et intuitive, il existe un grand nombre de variations et de réglages qui ont été testés et ont permis d’obtenir de très bons résultats, tel que de nouveaux types de couches et des manières plus complexes de connecter les couches entres elles.

Au dela des images

Bien que notre exemple avec des X et des O implique l’utilisation d’images, les CNNs peuvent aussi être utilisés pour catégoriser d’autres types de données.

L’astuce est: quel que soit le type de données que vous traitez, transformez ces données pour les faire ressembler à une image.

Par exemple, les signaux audio peuvent être décomposé en un ensemble de petits morceaux de durée plus courte et décomposer chacun de ces morceaux par bande de fréquences graves, moyennes, aiguës ou plus encore plus fines. Ceci peut être représenté par un tableau de 2 Dimensions où chaque colonne est un bloc de temps et chaque ligne est une bande de fréquences. Les “pixels” de cette fausse image qui sont proches les uns des autres sont étroitement liés. Les CNNs fonctionne bien dans ces cas précis.

Les scientifiques ont été particulièrement créatifs. Dans une approche similaire, ils ont notamment adapté des données textuelles pour le traitement du langage naturel et même des données chimiques pour la découverte de médicaments.

Un exemple de données particulier qui ne correspond pas à ce type de format est tout ce qui est “données clients”, où chaque ligne d’une table représente un client et chaque colonne représente des informations à propos de cette personne, telles que son nom, son adresse, son adresse email, ses achats et son historique de navigation. Dans ce cas, l’emplacement des lignes et des colonnes n’a pas vraiment d’importance. Les lignes peuvent être ré-arrangées et les colonnes peuvent être ré-ordonnées sans perte d’importance des données. En revanche, réorganiser les rangées et les colonnes d’une image la rende complètement intraitable.

Une règle générale: si vos données restent aussi exploitable après avoir échangé certaines colonnes entres elles, vous ne pouvez sans doute pas utiliser les réseaux neuronaux convolutionnels. Cependant, si vous pouvez faire en sorte que votre problème ressemble à de la recherche de motifs dans une image, les CNNs peuvent être exactement ce dont vous avez besoin.

En savoir plus

Si vous souhaitez vous essayer à l’apprentissage profond, vous pouvez trouver un certain nombre d’outils ayant chacun une communauté très active. N’hésitez pas, essayez les! Parmis les plus populaires:

J’espère que vous aurez aimé cette initiation aux réseaux de neurones à convolution.

Je vous recommande chaudement de suivre l’auteur de l’article original pour davantage de ressources concernant le Deep Learning:

Brandon @_brohrer_ Facebook

N’hésitez pas à me contacter également pour toute question ou simplement pour discuter Deep Learning!

(1) Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations, Honglak Lee, Roger Grosse, Rajesh Ranganath, Andrew Y. Ng