Voir le monde à travers un réseau de neurones

Paul Breton
BeTomorrow

--

Il vous est certainement déjà arrivé lors de l’oisiveté d’une après-midi d’été de regarder vers le ciel et d’admirer la profondeur de son bleu. Peut-être même vous êtes vous amusés alors à observer les nuages, leurs formes, leur complexité. Enfant, j’aurais juré plus d’une fois voir dans ces nuages un mouton, jouant avec un visage flottant et un godzilla douteux. Ce phénomène se nomme la paréidolie. Le principe se résume au fait de parvenir à identifier une forme familière dans un nuage, de la fumée, une tâche d’encre. La paréidolie visuelle est associée aux illusions d’optique, et est entre autres utilisée professionnellement dans le cas de tests psychologiques.

Paréidolie et réseaux de neurones

Au cours des différents travaux que j’ai pu faire sur les réseaux de neurones, je me suis arrêté sur quelques opérations de manipulation de la structure de ces derniers pour reproduire des phénomènes similaires. Nous allons tenter de voir ici ce que les réseaux de neurones voient vraiment à travers une image, ou plutôt ce qu’ils cherchent à voir. Nous allons faire faire de la paréidolie aux réseaux de neurones.

Rappels

NB : Nous allons ici parler de fonctionnement des réseaux de neurones de convolutions. Si vous ne vous sentez pas très à l’aise avec les concepts de ces réseaux, je vous invite à aller regarder cet article de vulgarisation de leur fonctionnement.

Un réseau de convolutions est scindé en deux “parties”. La première, les convolutions, permettent d’extraire et de fournir une interprétation complexe du contenu d’une image sous forme de caractéristiques. Par exemple si l’on donne un lapin, les convolutions permettront de mettre en évidence que l’image est composée de fourrure, de petites pattes, de grandes oreilles, d’un petit museau, d’un pompon …

Illustration de l’architecture d’un réseau de neurones de convolution ainsi que de son entraînement.

Ces caractéristiques sont ensuite données à un réseau de neurones classique qui se charge de faire l’interprétation et la mise en relation de ces extractions. C’est lui qui va corréler le pompon aux grandes oreilles, à la fourrure, et au reste de l’analyse pour en déduire que l’image contient un lapin.

Passage de l’image aux caractéristiques (Oreilles, Yeux, Fourrure, Patte)

Lorsque le réseau de neurones de convolution (l’ensemble) est encore vierge, tout ce qui lui permet de juger est totalement aléatoire. C’est le réseau lui-même qui va peu à peu en s’entraînant via une grande quantité de photos comprendre quelles caractéristiques font quels animaux, objets ou concepts. Suivant ses résultats, nous lui dirons si oui ou non il a juste et il adaptera en conséquence toutes ses unités décisionnelles pour converger progressivement vers ce que nous attendons de lui : dire qu’une image de lapin correspond à un lapin. Pour cela il va calculer à chaque fois une “distance” entre le résultat qu’il a donné et le résultat attendu, qui va lui permettre de savoir comment modifier son interprétation.

L’ensemble de données d’entraînement est donc très important puisque logiquement s’il y a des images biaisées (un nuage qui ressemble à un lapin par exemple) ou pas assez variées, le réseau risque de mal interpréter ce qui fait vraiment les caractéristiques d’un objet.

Notre objectif est de savoir ce que comprend vraiment le réseau de neurones de son apprentissage en tentant de créer depuis son interprétation une représentation visuelle que nous, humains, puissions comprendre et voir. Nous allons donc tenter de lui faire faire de la paréidolie pour qu’il nous montre ce qui lui fait penser à quelque chose au travers d’une image totalement aléatoire.

Image aléatoire (bruit).

Démarche

Un entraînement classique partirait du résultat de la décision du réseau et ferait s’adapter ce dernier pour convenir au bon résultat supposé de la décision. Cependant notre objectif n’est pas de modifier la perception du réseau de neurones, mais de la visualiser. Nous ne devons donc surtout pas modifier le réseau.

L’idée serait de faire en sorte que le réseau puisse produire une image qui selon lui représenterait un objet (un lapin, godzilla ou une poule), avec une certitude de 100%. Et c’est là qu’intervient littéralement la paréidolie. Nous allons “forcer” le réseau à interpréter du n’importe quoi, en changeant son modèle d’entraînement.

Plutôt donc que de modifier le réseau, nous allons créer une image totalement aléatoire en entrée que nous allons donner au réseau. Ce dernier devra progressivement modifier l’image pour qu’elle soit analysée comme la classe d’objet que nous aurons choisie. Le processus de modification est assez simple : le réseau va modifier l’image tant qu’il ne la comprend pas comme étant ce que nous cherchons à 99.9% de certitude. Nous allons donc créer un faux entraînement en “forçant” une de ses sorties à 100% pour qu’il modifie l’image en conséquence.

Concrètement nous allons prendre un modèle de réseau de neurones connu et performant, le VGG-16. Ce réseau a été élaboré au cours d’une compétition mise en place par l’organisation ImageNet et qui a pour but de classifier le contenu d’images en 1000 objets de la vie courante (mouton, poule, fourchette, chateau, lampadaire, diverses races de chiens, …). Le VGG-16 a été mis au point en 2014 et a atteint le score de 92.7% de précision. Il n’a pas gagné la compétition mais s’est fait remarquer pour ses résultats particulièrement bons compte tenu de son architecture très légère.

Comme il faut pouvoir classifier en 1000 classes, le réseau dispose donc de 1000 sorties pouvant prendre une valeur entre 0.0 et 1.0. Ceci permettant donc de dire si la classe présente dans l’image est sûre de 0% à 100%. Nous allons bloquer la sortie de la poule à 100% manuellement (et donc tous les autres à 0%). Ainsi lors de l’entraînement, tous les calculs se feront par rapport à la classe attendue “poule”. En rétro-propageant le résultat “poule” à travers le réseau de neurones de convolutions nous pouvons savoir exactement quels sont les parties du réseau impliquées dans l’interprétation de la poule ainsi que les convolutions qui ont permis de la mettre en valeur. En poussant jusqu’au bout, nous pouvons également savoir quels sont exactement les pixels qui ont aidé à dire que l’image était celle d’une poule.

Et c’est donc là le corps de notre fonctionnement : nous allons déterminer quels sont les pixels les plus influents sur la décision de la poule pour les modifier de telle sorte à ce que le réseau dise à coup sûr (sans qu’il ne soit forcé) qu’il s’agisse d’une poule. Nous réalisons une opération de minimisation qui consiste ici à réduire le plus possible la distance entre le résultat forcé et les pixels de l’image.

L’algorithme est créé à partir des frameworks Tensorflow et Keras, en Python. Pour éviter de rentrer dans trop de détails techniques, la partie minimisation n’est pas décrite dans cet article, mais je vous invite à aller lire ce blogpost de François Chollet dans le blog de Keras, qui a entre autres donné raison d’être à cet article.

Résultats

Après une petite quantité de passes voilà un exemple d’images que nous obtenons :

Rétro-propagation dans une image de la classe “poule” par le VGG-16. En bleu le corps et le plumage, en rouge la tête.

L’image paraît assez psychédélique mais en regardant bien nous pouvons voir la poule, son plumage mais aussi la tête ainsi que les courbures de son corps. L’opération est amusante et permet donc de vraiment voir ce qu’il y a à l’intérieur du réseau. Je me suis cependant surpris à “trouver” autre chose qu’une poule.

Ce qui est entouré en vert ne ressemble pas à une poule …

Ceci en fond n’est pas une poule (en tout cas pas conventionnelle). Cela pourrait être n’importe quoi, mais plus probablement quelque chose en rapport avec les images de poules telles qu’elles ont été prises. Le plus plausible semblerait donc une barrière, ou au moins à une partie d’un enclos. Surpris de ce résultat j’ai cru à une mauvaise interprétation de ma part et ai donc réitéré sur plusieurs nouvelles images aléatoires afin de voir si le phénomène se répétait.

Les barrières sont présentes toujours en haut de l’image, comme au deuxième plan.
La barrière est bien présente au fond à gauche.

Et il se trouve que le phénomène se répète, et ce presque à chaque nouvelle génération d’image. La déduction qui en découle est assez logique : selon le VGG-16, la caractéristique “barrière” fait partie (presque) intégrante des caractéristiques de la poule ! Pour avoir une classification d’une image en tant que “poule” à 100% de certitude, une barrière doit donc obligatoirement être présente dans l’image. Ceci veut dire qu’à presque chaque fois qu’une image de poule était présentée au réseau de neurones, elle comportait une poule dans un enclos dont une des barrières était clairement visible dans l’image. Explorons le dataset d’ImageNet …

Echantillon des images utilisées pour l’entraînement du VGG-16.

Il y a en effet une forte présence de caractéristiques associables à des barrières ou des grillages dans les images des poules. Cela ne rend pas le réseau inefficient pour autant, mais a introduit un biais que ce dernier est incapable de comprendre puisqu’il a bâti sa conception de la poule seulement sur ce qu’on a pu lui donner. La faute revient donc au set de données qui n’était pas suffisamment varié : la barrière se retrouvant (trop) souvent dans les images d’entraînement, le réseau a fini par l’incorporer à ses critères décisionnels.

Et avec d’autres réseaux de convolutions ?

L’observation précédente s’applique au VGG-16, mais s’applique-t-elle aussi aux autres “grandes” structures de réseaux de convolutions… ? Comme ces réseaux peuvent avoir des architectures très différentes, cela veut également dire des manières de comprendre l’information très différentes. J’ai donc sélectionné quatre autres réseaux connus pour leurs performances :

  • Le VGG-19, amélioration du VGG-16 qui passe de 16 couches de convolutions à 19 couches.
  • La troisième version du Inception mis au point par Google, qui possède 42 couches de convolutions par blocs intercalés.
  • Le ResNet (Residual Network) mis au point par Microsoft, qui dispose de 50 couches de convolutions.
  • Le XCeption dont la structure un peu spécifique ne s’organise pas en couches de convolutions classiques.

Ces réseaux sont, au même titre que le VGG-16, des réseaux qui ont été présentés lors du concours d’ImageNet. Ils ont donc été entraînés sur les mêmes échantillons de données.

Voici donc les résultats obtenus pour chacun des réseaux :

A gauche le VGG-19, à droite le ResNet.
A gauche le InceptionV3, à droite le Xception.

Le VGG-19 reproduit un résultat assez similaire au VGG-16, mais a (semblerait-il) moins de précision sur le contenu exact des plumes que son prédecesseur. Le ResNet montre un motif répété sur l’ensemble de l’image mais très abstrait et difficilement interprétable. Quant à l’InceptionV3 et à l’XCeption, on peut commencer à voir des débuts de formes (en forçant un peu sur l’acide il faut admettre) mais tout est très difficilement compréhensible en tant qu’humain. Pourtant, chacune de ces images est, selon le réseau associé, une poule à 100% de certitude.

L’explication de ces différences est liée aux architectures de ces réseaux qui sont extrêmement plus complexes que celles du VGG-16, leur créant donc une force d’abstraction et d’interprétation plus performante. De ce fait les caractéristiques ne se basent plus sur de simples ensembles de formes “visuelles” mais sur une corrélation de caractéristiques bien plus haut niveau sans aucune représentation visuelle particulière.

En effet, nous savons que plus les couches de convolutions se succèdent plus la compréhension de l’image devient abstraite et complexe. A l’inverse, les premières couches de convolutions ne permettent d’analyser l’image qu’en termes de pixels et données très simples : des traits, des motifs basiques, des couleurs, … . De ce fait comme le VGG-16 est peu profond, nous retrouvons dans l’image ici essentiellement les caractéristiques dites “simples” (comprendre, bas-niveau, proches de l’image et de données visuelles), alors qu’avec les autres réseaux nettement plus profonds nous voyons la représentation de caractéristiques beaucoup plus abstraites donc haut-niveau et éloignées de l’image en tant qu’ensemble de pixels.

Et avec une image non-aléatoire ?

J’ai par le suite expérimenté en donnant au processus avec le VGG-16 une image qui contenait déjà des caractéristiques explicites. Nous ne sommes donc plus exactement dans la paréidolie.

Nous demandons à notre réseau d’ajuster l’image pour qu’elle convienne à sa vision. Nous avons choisi de transformer des chats en chiens, et avons sélectionné la race de chien “Berger belge de Groenendael”.

Nous avons obtenu les résultats suivants :

Plus je regarde celle de gauche plus j’y vois un chien … !

Il est assez remarquable que l’image n’ait pas tant changé que cela. Mis à part une quantité d’artefacts liés aux images réelles de chiens, les chats ont été légèrement modifiés et principalement les aspects qui les éloignent des chiens. En effet le chat et le chien ont en commun le fait d’être des boules de poils sur quatre pattes. Seules leurs différences ont été changées :

  • Les oreilles sont plus pointues
  • Le pelage est plus “ébouriffé” comme celui du chien, des poils plus longs
  • Le museau a été allongé, voire la truffe agrandie
  • Les yeux ont été rétrécis
  • La couleur du pelage a été uniformisée

Le réseau de neurones a donc modifié les caractéristiques qui ne lui convenaient pas, sans toucher aux autres (ou très peu), pour que l’image corresponde à la classe de la race berger de Groenendael. Ceci montre donc que plusieurs neurones sont communs à plusieurs classes, et partagent les mêmes caractéristiques et détections.

Discussion

Dans le cas de la poule, ce que j’ai souligné comme étant un biais n’en est pas obligatoirement un. En effet de notre point de vue il y a une dualité entre l’objet et son environnement. De ce fait, l’appartenance de la poule à un environnement de basse-cour n’est pas exclusif : une poule se retrouverait en haut d’un gratte-ciel, elle resterait tout de même une poule. Pour le réseau de neurones qui ne prend pas que l’objet mais l’image dans son ensemble, il y a obligatoirement une corrélation qui se fait entre la poule et son environnement. Ainsi en haut d’un gratte-ciel, la poule pourrait tout aussi bien être un gros pigeon. Ce que le réseau de neurones tente de comprendre, c’est que la partie invariante de toutes ces images est la poule. Pour créer une véritable robustesse, il faudrait donc fournir au réseau des images de poules sur des gratte-ciels, dans des supermarchés et à la plage. C’est là ce qui nous différencie des réseaux de neurones. Notre capacité d’abstraction et d’apprentissage est bien supérieure et permet de comprendre des notions très spécifiques avec peu de données.

Prenons un peu de recul sur cela. La probabilité de rencontrer une poule en dehors d’un enclos est aujourd’hui assez faible (c’est un euphémisme). De ce fait nous n’avons pas besoin que le réseau de neurones soit capable de déterminer de manière parfaite et exclusive les caractéristiques de la poule, nous avons simplement besoin qu’il soit capable de dire “poule” lorsque nous lui présentons des images d’animaux. Ce que nous interprétons comme biais est justifié mais largement négligeable, du fait que nous ne demandons pas au réseau d’être infaillible et que la poule en dehors d’un contexte de basse-cour est (très) rare. Cependant une question demeure : Y-a-t’il un intérêt à s’entraîner à des situations “improbables” ?

Conclusion

Nous avons déduit une nouvelle manière d’auditer nos réseaux de neurones. Plutôt que de tester ce qu’il se passe lorsque nous rentrons quelque chose à l’intérieur, nous faisons le raisonnement inverse en cherchant à voir ce qu’est capable de créer le réseau à partir de ce qu’il connaît. Ceci nous permet de clairement illustrer ses biais. De plus ceci est d’autant plus utile que lors de tâches simples nous utilisons des réseaux simples qui seront donc encore plus sensibles à cet audit.

Bien que l’incidence dans le cas de la poule soit minime, cela soulève le problème de la méthode d’apprentissage en tant que telle. Le réseau n’apprend pas de concepts mais apprend à partir d’images sans précisions réelles de leur contenu. Il ne fait que comprendre les invariants des images et d’en déduire à quoi ils peuvent correspondre. Le réseau n’est pas intelligent comme l’humain : il n’a ni sa faculté d’adaptation, ni sa conscience de ce qu’il apprend. Il est donc particulièrement sensible aux informations d’entraînement que nous lui présentons.

NB: Attention cependant, il est possible de faire un lien avec le Deep Dream de Google. Le lien est justifié mais il n’y a techniquement pas de relation entre nos expérimentations ici et le Deep Dream. J’aurai l’occasion de vous montrer explicitement pourquoi dans un très prochain article sur une analyse poussée de ce phénomène.

Et en petit bonus, deux autres des résultats lors des essais de “l’audit” …

L’araignée des jardins et le lapin selon le VGG-16.

Vous avez aimé cet article ? Cliquez sur 👏 en bas de page pour que d’autres lecteurs puissent le trouver !

BeTomorrow est une agence de conseil, design et développement. Pour aller plus loin, nous vous invitons à lire nos derniers articles ou nous contacter directement.

--

--