 Donc aujourd'hui, je vous parle de la similarité des inputs, des entrées d'un réseau de neurones, mais depuis la perspective du réseau de neurones lui-même. Donc en fait, ça fait un peu la suite de l'exposé d'Agnès à l'instant, qui a introduit certaines notions que je vais réutiliser. Mais ici, au lieu d'essayer de définir une similarité entre des images avec des matrices de courriance, par exemple, ou des choses comme ça, je vais essayer de comprendre ce que c'est la similarité du point de vue d'un réseau qui a déjà été entraîné. Donc on entraîne un réseau et la question, ça va être pour lui, qu'est-ce qu'il perçoit comme exemple, qu'ils sont similaires, qu'est-ce qu'il perçoit comme choses qui sont vraiment très dissimilaires. Le but, ce serait d'essayer de comprendre un peu mieux ce que le réseau a appris dans son apprentissage. Un autre titre que j'aurais pu avoir pour cet exposé, ça aurait été l'auto-dévoitage de base de données, parce qu'en fait, on va voir qu'il y a un lien entre les deux. Et d'ailleurs, je vais commencer là-dessus, je vais commencer par décrire une application en imageries satellite, où on a essayé de segmenter des images, de les aligner. Et en se rendu compte d'un phénomène intéressant qui était que, même si on a une variété terrain qui est très bouïtée, le raisonne-roh ne peut émettre des prédictions qui sont de la noire de vendeur beaucoup plus précises que ce qu'on avait dans la base de données. Pour essayer de comprendre ça, je vais développer le concept de la similarité d'après du point de vue du raisonne-roh, donc je vais expliquer où est le lien. Une fois que j'aurais développé un peu ces choses-là, je vais retourner au problème principal et expliquer en quoi est-ce qu'on peut quantifier ces effets de dévoitage. Donc tout ça, ce sont des travaux avec l'équipe de Yulia Tarabalka et en particulier ce papier que je présente, c'est avec Nicolas Girard et Loris Valdos, donc de Linaia Saclay, donc de l'équipe Tao et de l'équipe Titane à Sofianti Pris. Commençons par une application. Je vais essayer de décrire rapidement l'application à laquelle on s'intéressait. On est dans le cadre de la segmentation automatique sémantique d'image, où à chaque pixel, on va associer une classe. Alors voilà un exemple plus concret. Donc ici, on a une image en entrée et on voudrait la remplacer par ceci. Ou alors une autre image ici. Alors ici, la différence entre ce type d'image et celle-ci, c'est que ça, c'est pris par des avions, ça, c'est pris par des satellites. Donc ce n'est pas la même résolution. Et du coup, le type de classe qu'on va s'intéresser n'est pas forcément le même. Ici, on s'intéresse plutôt à détecter des bâtiments, des routes, des choses comme ça. Ici, on a une précision qui est plus grande. On pourrait même détecter, on voit les voitures ou les arbres individuellement, etc. C'est beaucoup plus précis. Donc on a un ensemble de classes qui est prédéfinie. Et étant donné une nouvelle image, on aimerait prédire une image de même résolution. Pour chaque pixel, on a la probabilité de chacune des classes possibles. Donc ici, ce serait bâtiments, routes ou autres. Donc problème de segmentation assez classique. Sauf qu'une chose qui est bien, c'est qu'on a énormément de données. Donc on va faire du machine learning dessus. On a énormément de photos satellites et aériennes. Et surtout, on a énormément de variété terrain. Et ça, grâce au fait qu'il y a des cadastres. Donc dans chaque mairie, vous pouvez les consulter de cadastres. Ils ont été numérisés. Tout est disponible en vectoriel sur OpenStreetMap. Et donc vous avez toute la France couverte avec la variété terrain. Donc on peut apprendre vraiment sur de grandes bases de données. Ça, c'est vraiment super. Il y a juste un petit problème, c'est que même si on en a beaucoup de ces données, en fait, elles sont mal recalées. C'est-à-dire que entre le plan du cadastre qu'on nous donne qui contient les variétés terrain et la photo satellite, il y a toujours un décalage. Alors pour expliquer l'origine de ces décalages, il y a tout simplement le fait que par exemple, quand on prend une photo satellite, selon l'élévation, les bâtiments qu'on voit ici vont apparaître dans des endroits différents d'images. Et en plus, il y a une différence entre la base du bâtiment et le haut du bâtiment. Donc l'angle du satellite et le fait qu'il y a des collines, ça joue pour beaucoup de choses. Il y a aussi des choses qui sont dues à des formations atmosphériques. Il y a énormément de choses qui fait qu'en pratique, on peut vraiment avoir un décalage, par exemple, de 30 pixels entre l'emplacement officiel du bâtiment et où il est sur la photo, sachant que le bâtiment lui-même fera, par exemple, 10 ou 20 pixels. Donc ça peut vraiment être problématique d'avoir une variété de terrain qui est complètement à côté de l'objet. Alors, voici un exemple. Du coup, d'images, donc là, c'est une image aérienne, je pense, et de la variété terrain. Et donc, si on apprend à partir de quelque chose comme ça, bon, là, encore, le déplacement n'est pas assez dramatique que ça, mais on aurait bien aimé avoir recalé cette variété terrain avant pour pouvoir apprendre. Donc, c'est ce qu'on va essayer de faire. Comment est-ce qu'on va faire pour recaler? Alors, il faut voir que c'est pas qu'on est non évident, parce qu'on a, typiquement, en un côté, une image qui est RGB. Donc, en chaque pixel, on a une couleur. En l'autre côté, on a quelque chose qui est plutôt binaire. C'est ce qu'il y a un bâtiment ou ce qu'il n'y en a pas. Donc, on ne peut pas juste recaler ces deux images en disant, je vais essayer d'aligner de façon à minimiser une certaine distance entre les deux images pixel par pixel. Par exemple, que les couleurs correspondent ou que les bords correspondent. C'est un peu plus compliqué que ça. Donc, comment faire ça? On va poser ça en termes de machine learning. Donc, on va se dire, on va avoir une grande base d'apprentissage. On va essayer de minimiser certains pétères. On va essayer de prédire la déformation au lieu de plutôt utiliser des outils à doc. Alors, comment est-ce qu'on modélise ça? Alors, une image, c'est juste, on a une grille de pixels avec, en chaque endroit, pour chaque pixel, trois canaux qui sont RGB, par exemple. Ça pourrait être hyper spectrable, pas d'autre chose. Et une déformation, qu'est-ce que c'est? Une déformation de l'image, finalement, c'est juste un champ de vecteurs qui, pour chaque pixel, associe un vecteur dans R2. Donc, de combien est-ce qu'on voudrait déplacer ce pixel? Et ensuite, qu'est-ce que c'est? Appliquer une déformation de l'image, c'est juste, sur la composée, hieronfi. Donc, cette image avec ce champ de déformation, ça donne ceci. Alors, maintenant, posons le problème. Ce qu'on voudrait faire, c'est, on part d'un data set, un grand ensemble d'apprentissage, où on a en entrée une perte d'image. Donc, l'image, la photo et le plan du cadastre. Et, en sortie, on voudrait une certaine déformation. Donc, on a ensemble une grande base de données comme ça. Et le notre-ritère pour entraîner notre réseau de neuro et notre réseau de cette tâche, ça va être simplement de parcourir l'ensemble d'apprentissage. Et pour chaque pixel de chaque perte d'image, on va regarder si la déformation prédite en ce pixel est proche ou pas de la déformation cible. Donc, voilà, c'est juste une régression. La seule chose qu'il faut retenir ici, c'est qu'on fait une régression et qu'on utilise une finalité L2 classique sur ce qu'on cherche à apprédire. Alors, je passe les détails, parce qu'en fait, si on fait juste ça comme ça, ça marche pas du tout. Mais bon, je vais passer les détails d'optimisation et les détails de... Comment est-ce qu'on parle en passant en multi-échelle pour que c'est une chance de marcher ? Donc, voilà, je passe tout ça. Tout ce qu'il faut retenir, c'est que, bon, au final, ça marche. Voilà, on s'en surprise. Ce qui m'intéresse ici, c'est plutôt pour s'étexposer la gestion du bouillard. Alors, comment est-ce qu'on a déjà... Comment est-ce qu'on a construit notre ensemble d'affrontissages ? Qu'est-ce qu'on a fait ? On a été regardé sur OpenStreetMap, le plan du cadastre et les images qu'on avait. On a regardé à quels endroits est-ce que la variété terrain était relativement bien recalée. Donc, où est-ce qu'il n'y avait pas trop de recalage à faire ? Et ensuite, on s'est dit, voilà, un endroit où il n'y a pas trop de recalage à faire, on va considérer que ça nous fait un exemple en entrée où on a l'image, on a le plan du cadastre et la déformation qui a trouvé, c'est juste l'identité. Qu'on n'a pas besoin de bouger les pixels, ils sont déjà à la bonne place. Voilà, sauf que si on entraîne un raison neuro, on a toujours prédit l'identité. C'est simple, il a toujours prédit l'identité. Donc, il faut lui donner des exemples où la déformation a trouvé et il n'y a pas l'identité. Alors, qu'est-ce qu'on fait ? On va aller chercher, on va prendre une déformation au hasard qui est assez lisse, donc pour une histoire de cuisine typiquement. On va rajouter cette déformation au plan du cadastre. Et ensuite, on va dire, voilà, quand je vous présente cette image initiale et ce plan du cadastre qui a été déformé, quelle est la déformation qu'il faut trouver ? Donc voilà, c'est comme ça qu'on construit notre ensemble de données avec les déformations à la toit et on les applique sur des données qui étaient à peu près recalées. Donc, la question ici, c'est justement ces données, elles étaient à peu près recalées, mais c'était pas parfait. Donc, parfois, on l'a alignées à la main, mais parfois, souvent, on a juste pris des données qui avaient l'air alignées, mais c'est tout. Donc, la question qu'on se pose, c'est quelle est la sensibilité de ce processus d'apprentissage par rapport vis-à-vis de la qualité d'alignement initial qu'on avait dans notre ensemble d'apprentissage ? Donc, à quel point est-ce que j'ai besoin que mes recalages soient précis ici pour pouvoir apprendre quelque chose de correct ? Donc voilà, c'est la question fondamentale ici dans cette exposé. Alors, si je re-rédige ça de façon un peu plus générale, en fait, j'ai un ensemble d'exemples qui sont X. Donc, X, c'est quoi ? C'est une paire d'images, l'image couleur et le plan du cadastre. Et avec, j'ai des étiquettes qui sont la déformation que je dois trouver, mais qui, en fait, bruitent. C'est le recalage et pas toujours parfait. Et donc, on peut considérer que, en fait, dans cet ensemble d'apprentissage, ce qui cloche, c'est plutôt l'étiquetage. C'est l'étiquetage qui est bruité. Donc, la question, c'est, est-ce qu'on peut réussir à apprendre à partir de l'étiquetage bruité ? Et est-ce qu'on peut quantifier ça éventuellement ? Et déjà, la question super intéressante, ce serait, est-ce que c'est possible ou pas d'avoir une précision qui est plus grande que la quantité de bruit dans les données. Parce qu'on pourrait se dire, intuitivement, on va essayer de, vu les exemples typiques qu'on nous donne, si on a un certain décalage à chaque fois, ça paraît assez exigeant de demander au réseau de pouvoir faire quelque chose de mieux que les étiquettes typiques qu'on lui donne. Alors, voici un exemple où, là, en rouge, c'est les étiquettes officielles qu'on donne. C'est le champ de déformation qu'on a trouvé. C'est, on doit, en fait, on doit trouver que la segmentation officielle est là, ici. Et nous, on aimerait bien recaler et trouver après entraînement que c'est ici. Alors, Nicolas, donc le doctorant qui a travaillé là-dessus, a une idée pour tester la robustesse au bruit, de se dire, c'est simple. On va entraîner sur notre ensemble d'apprentissage qui est complètement bouité. Bon, soit. Et ensuite, on va prédire sur cet ensemble d'apprentissage. Donc, évidemment, notre prédiction ne vont pas être très précises, mais bon, on va. Et ce qu'il a fait, c'est qu'il s'est dit, on va relancer l'apprentissage, mais au lieu d'essayer d'apprendre les étiquettes officielles, on va apprendre à prédire les étiquettes que le réseau que je viens d'apprendre apprédite. Ce nous forme un nouveau data set d'apprentissage. Ce sont les mêmes exemples en entrée, mais ce sont des étiquettes différentes. Et puis, je vais y terrer. Donc, je vais entraîner sur ce nouveau data set, sur ces nouvelles étiquettes. Je vais prédire à nouveau. Je vais avoir de nouvelles prédictions. Et je continue comme ça. Donc, on voit que, potentiellement, il peut y avoir un problème. C'est que, soit tout se passe bien et que le réseau fure à mesure et il fait des prédictions de mieux en mieux et que tout s'améliore, soit contraire, à un certain moment, le réseau, il commence à sortir un peu n'importe quoi et tout part en cacahuète. Et puisqu'à chaque fois, on se base sur les prédictions du réseau précédent. Alors, pour visualiser un peu mieux ce qu'il se passe. Regardez, en rouge, c'était les étiquettes officielles. C'est là où on devait prédire l'apprentissage des bâtiments. Donc, on apprend sur les rouges et on se met à prédire sur l'une image. Qu'est-ce qu'il se passe ? On prédit les bleus. Les bleus font ça ici. Alors, les bleus font ça, si vous regardez, de temps en temps, c'est un peu mieux. Donc, dans ce cas-là, c'est qu'il y a l'espoir qu'en faisant une seconde pas d'apprentissage, on a meilleur les choses. Mais parfois, c'est pire. Si vous regardez ici, là, c'est, bon, voilà. Donc, c'est mitigé. Et deuxième étape, je rentre à un réseau de neurones à prédire les bleus. Et ce qu'on apprend, c'est ce qui est en vert. Et donc, si vous regardez bien, les vers sont parfaites. Et donc ça, ça nous a vraiment étonné. C'est comment est-ce que c'est possible qu'on arrive à prédire quelque chose de à peu près parfait alors qu'on s'est basé sur un ensemble d'apprentissages qui étaient complètement boutés, que tout était à côté d'un certain écartipement qui était beaucoup plus grand que l'erreur qu'on a à la fin. Donc, c'est ça que je vais essayer d'expliquer maintenant. Si on veut des éléments quantitatifs, ici, c'est la courbe d'erreur pour, alors, comment ça se lit ? C'est le nombre de pixels dont l'erreur est moins qu'un certain seuil. Donc, c'est l'erreur cumulatif, si vous voulez. Là, c'est en rouge, c'est plein ici. C'est les étiquettes officielles originales. Donc, c'est le dataset qui était bruité. Et on voit que, par exemple, l'erreur médiane dans le dataset, donc à 50%, c'était à peu près 18 pixels. Donc, ça veut dire que dans la moitié des endroits des images, on avait une erreur de recalage qui était de l'ordre de 18 pixels. Quand on apprend sur cet ensemble d'apprentissages-là, on obtient la courbe bleue. Donc, on voit qu'il y a pas mal d'amélioration pour une certaine zone, ici. Il y a beaucoup d'endroits d'image où on aura des predictions qui seront de meilleure qualité que la source originale. Mais il y a quand même un nombre significatif d'endroits où les choses s'empirent. Ensuite, quand on apprend à partir de la courbe bleue, on obtient la courbe verte, ici. Et en fait, la courbe verte, c'est difficile d'espérer de faire mieux parce que l'erreur médiane, ici, est de 3 pixels. Et c'est à peu près l'erreur humaine sur ce genre de dataset. C'est difficile de le faire plus à cause d'erreur d'ambiguïté de recalage. C'est-à-dire que assez souvent, la forme des bâtiments du cadaste ne correspond pas exactement à la forme des vrais bâtiments qu'on observe. Et donc, il y a souvent une ambiguïté de recalage où on ne peut pas recaler de façon parfaite. Et donc, ici, on obtient une prédiction de qualité humaine à partir de quelque chose qui était complètement abouté. Donc, comment est-ce que c'est possible ? Alors, une première tentative d'explication, c'était que peut-être que dans l'ensemble d'apprentissage initial, il y avait suffisamment d'endroits qui étaient parfaitement recalés et que le réseau a pris à partir de ça. Donc, pour tester ça, ce qu'on fait, c'est qu'on rajoute du bruit encore aux données initiales. Donc, on obtient la courbe en pointillé ici pour voir si effectivement le réseau a un plus de mal à apprendre à partir de ces données qui sont surbouïtées. Et on obtient la courbe en pointillé ici. Et au bout de deux rounds d'entraînement, en fait, on retrouve quelque chose de même qualité. Donc, ce n'est pas la bonne explication. Donc, c'est pas ça. Ici, l'explication est à chercher ailleurs. Alors, l'explication est basée sur le papier suivant, noise to noise, qui consiste à dire ceci. Imaginons qu'on n'est qu'un seul point dans notre ensemble d'apprentissage. On a toujours le même point avec la vraie étiquette après dire, et y. Mais après, on va montrer ce point n fois différente avec des étiquettes qui, elles, vont être boutées. Donc, on ne va jamais montrer la vraie étiquette. On va montrer des versions boutées de cette étiquette. Donc, j'ai un bruit à chaque fois. Je vais juste supposer que ce bruit est centré et idé. Et ensuite, pour trouver quelle est la meilleure prédiction, je peux faire pour x, comme on a un problème de régression avec une normale 2. Finalement, comme je peux faire une seule prédiction pour x, parce que c'est toujours la même, j'ai une fonction ici. Donc, je ne peux faire qu'une sortie pour un point x donné. La meilleure prédiction que je peux faire, finalement, c'est juste la moyenne des données boutées que j'ai. Et donc, finalement, qu'est-ce que c'est, cette moyenne ? En fait, c'est la vraie étiquette, plus ou moins un terme en 1 sur la racine de n, où n est le nombre d'exemples. Donc, on a une explication ici. C'est que si on a beaucoup d'exemples qui sont très similaires, qui sont quasiment identiques et que sur cet ensemble, j'ai un bruit qui change de direction à chaque fois, et bien, c'est assez naturel de prédire la moyenne. Et donc, je vais pouvoir diminuer le bruit de la base à données d'apprentissage. Grâce à ceci, c'est un excellent de phénomène. Donc, si je fais un petit schéma, si j'ai, j'ai, j'ai, j'ai essayé de prédire quelque chose. Maintenant, dans un temps, on me pousse à aller dans une direction ou une autre. C'est le différent bruit que j'ai, les différentes réalisations du bruit qui sont autour de la vraie, de la vraie étiquette. Et ensuite, quand je cherche à, quand je fais une moyenne des endroits où on demande d'être, je vais être un écart typique de la vraie moyenne, qui va être de l'ordre de un sur la scénarienne, ou un et le nombre d'exemples. Alors, ça, c'est, c'est gentil comme explication, mais ça, ça suppose que, que je regarde toujours le même exemple. Dans mon cas, à moi, ce qui va se passer, c'est plutôt que je vais avoir des exemples qui sont similaires, mais qui sont pas exactement le même. Et donc, la question, ça va être de quantifier du point de vue du réseau. Combien est-ce qu'il y a d'exemples qui sont difficiles à me distinguer, pour lequel il va devoir faire la même prédiction pour tout cet ensemble d'entrées? Et du coup, on va voir que l'effet de déboutage, il va être lié à ce nombre d'exemples similaires. Donc, la question, c'est, comment est-ce que je quantifie la notion de similarité? Donc, c'est la similarité depuis le point de vue du réseau. Ce qui compte, c'est que le réseau pense que c'est similaire, il n'arrive pas à faire des prédictions différentes pour ces exemples-là. Donc, ça m'amène à la notion de similarité. Alors, pour la similarité, on pourra utiliser une pénétrie que prédit finit dans l'espace des entrées, mais, par exemple, la pénétrie filienne, mais sur des images, par exemple, ça n'a pas trop de sens. Si je fais une petite translation de mon image, je décale mes pixels, disons que l'intensité dans l'image n'est pas une fonction qui est lisse du tout. Donc, quand je décale les pixels d'une image, ça change complètement l'image. Donc, la normelle 2, là-dedans, ce n'est pas une bonne idée. Alors, il y a une chose qu'on appelle la lost perceptuelle, dont Agnès a déjà parlé, je ne sais plus si elle a rempli le nom ou pas. L'idée, c'est de dire je mets une image dans VGG, typiquement. Donc, VGG, c'est un réseau qui est pré-entraîné pour une certaine tâche de classification. Donc, on sait qu'il développe des bons descripteurs de mon image. Et on va regarder, typiquement, une couche, je ne sais pas, celle-là, par exemple. On va regarder les activités dans cette couche-là. Ensuite, je vais mettre une autre image. Je vais la passer dans le réseau. Je vais regarder les activités dans cette couche-là aussi. Et ce que je vais faire, c'est la normelle 2. Des activités dans cette couche-là pour mon image 2, moins les activités pour l'autre image. Et puis, je vais regarder quelque chose comme ça. Et je vais dire, finalement, ma distance, c'est quelque chose comme ça. Alors, ça, c'est bien. Alors déjà, il y a des choix qui sont arbitraires. Ici, c'est quelle couche est-ce qu'on considère. Alors, si on considère les premières couches, on va plutôt s'intéresser à des petits détails dans l'image. Quand on regarde les dernières, c'est plutôt des notions sémantiques. Mais tout ça, ça va dépendre du réseau en question et qui n'est pas le réseau qui nous intéresse, nous. Et surtout, on pourrait mettre notre réseau à la place, mais ça ne résout pas le problème du fait qu'il y a un certain nombre de choix arbitraires dans cette technique ici, qui est que typiquement, on va faire une somme sur des activités de certaines des couches. On va mettre des certains facteurs ici. Est-ce qu'on peut avoir quelque chose un peu mieux posé que ça? Alors, la façon dont je vais définir la similarité, c'est par le pouvoir discriminant du réseau. C'est-à-dire, je vais considérer que deux entrées du réseau X et X Prime sont similaires du point de vue du réseau. S'ils n'arrivent pas à modifier sa prédiction pour X sans modifier la prédiction pour X Prime. C'est-à-dire, si on demande de faire un pas d'apprentissage, de modifier un peu ces paramètres pour dire va bouger la sortie pour X dans cette direction-là, est-ce que ça a un impact ou pas pour X Prime? Donc pour insister un peu sur cette notion ici, si j'ai des points qui sont très similaires pour le réseau, ce que je voudrais, c'est que quand j'essaye de bouger la prédiction pour un point, il va bouger dans la même direction la prédiction pour l'autre. Par contre, si il se passe rien sur X Prime quand je bouge la prédiction pour X, c'est qu'il arrive à manipuler ces deux entrées de façon complètement différente, donc il arrive bien à les dissocier. Alors comment est-ce qu'on peut définir ceci? Alors déjà, comment est-ce que je fais pour changer la prédiction pour un point donné dans une certaine direction? Alors si je veux changer F theta de X par une certaine quantité epsilon, en fait, le changement de paramètres qu'il faut faire, c'est celui-ci. Alors pourquoi pas? Pourquoi ça? Parce que si je développe simplement à l'ordre 1 en theta ma prédiction pour X, j'ai avoir la prédiction d'avant, plus le gradient par rapport à theta fois mon petit déplacement, mon changement de paramètres. Et quand je prends delta theta égal à ces trucs-là, tout se simplifie, j'obtiens ce que je voulais. Très bien. Maintenant, ce qui m'intéresse, c'est que j'ai réussi à changer la prédiction pour X de epsilon, très bien. C'est une certaine direction epsilon. Ça fait d'un vecteur ici, si vous préférez. Je fais tout dans le cas réel, parce que c'est plus ça, mais ça, c'est dans le cas vectoriel. Alors ce qui m'intéresse, c'est pour mon autre point X prime, ce changement de paramètres, qu'est-ce qu'il a changé? Alors si je développe à l'ordre 1 aussi, j'obtiens l'ancienne prédiction en X prime, plus le gradient par rapport au paramètre en X prime fois le changement de paramètres. Et quand je développe, je remplace l'étape par sa formule ici, j'obtiens ceci. Ce qui est intéressant de voir, c'est que j'obtiens le produit scalaire des deux gradients, de gradients par rapport au maître à chacun des points, et je fais le produit scalaire. C'est ça, et ce qu'on voit, c'est que cette quantité, c'est un nombre réel. Et finalement, au point X prime, j'ai bougé pareil que pour le point X. J'ai bougé de epsilon, mais il faut un certain coefficient qui est cette quantité ici. Alors je vais m'intéresser de plus près à cette quantité. Donc en fait, je vais la normaliser pour que ce soit un peu plus pratique. Donc j'ai le gradient d'un côté au point X multiplié par le gradient de l'autre côté et normalisé. Donc en fait, ça me définit un noyau. Pour 2 points X prime, je vais calculer cette chose-là, qui est entre moins 1 et 1. Et finalement, pour ceux qui connaissent, ça, c'est ce qu'on appelle le neural-tident kernel, qui est un canoutique qui a été introduit à la base pour décrire la dynamique d'apprentissage des réseaux avec des couches qui sont très grandes. Alors c'est assez marrant de retrouver le même concept, mais c'est pour un usage complètement différent ici. Donc ici, c'est mon critère de similarité. J'aimerais peut-être regarder mathématiquement si ça a un certain sens, qu'on a un peu vérifié quelques propriétés de cette quantité. Alors, il se trouve que quand le noyau vaut 1, pour un certain raison de nos données, quand le noyau vaut 1, ça implique que le gradient en X et en X prime sont égaux. Ça va être complètement évident. Ici, c'est juste le gradient normalisé, mais il se trouve que ça implique que le gradient va être égal aussi. Ça normalise aussi. Et ça, il se trouve que ça implique que les sorties vont être similaires aussi, vont être égales. Donc ça, ça va paraître être une bonne notion de similarité. C'est quand la messéarité est 1, donc le maximum, c'est tellement similaire qu'en fait, j'ai la même prédiction du réseau. Donc voilà, très bien. On peut aller un petit peu plus loin. Et en fait, il se trouve que si on a un réseau de standard FIFA World sans partage de paramètres, c'est-à-dire que ce n'est pas un réseau convolutionnel, c'est un réseau juste avec des couches pleinement connectées, il se trouve que non seulement les sorties sont égales quand on a une similarité égal à 1, mais que toutes les activités du réseau sont égales aussi pour les deux points. Alors, toutes ces activités en fait qui sont utiles, parce que certaines activités vont être multipliées par 0, vont être suivies par une relue, je ne sais pas quoi. Donc en fait, ce que j'appelle la activité utile, c'est celle dont tel que la dérivée de la sortie par rapport à cette activité n'est pas 0 en ce point-là. Donc toutes les activités qui servent dans le réseau sont effectivement égales. Donc ça a l'air peut-être une bonne notion de similarité. Ça, c'est vrai seulement pour les réseaux que je disais qui ne font pas de partage de poids. Si on fait des partages de poids, c'est un peu différent. Si on est déjà avant d'entrer là-dedans, d'expliciter ce que c'est, il faut voir que le gradient, c'est quelque chose de... Le gradient par rapport au paramètre, c'est quelque chose de très riche. C'est un très grand... C'est un descripteur de mon entrée qui est très très riche, puisque j'ai souvent dans un réseau de neurones des millions de paramètres, souvent plus de neurones que d'entrée. Du coup, finalement, mon gradient par rapport à theta, c'est un vecteur de très très grand. Il y a beaucoup d'informations là-dedans. Donc demander qu'il soit égal en X en X prime, en fait, c'est une condition qui est assez forte. Alors, revenons sur la loose perceptuelle. Que ce que vous êtes dans la loose perceptuelle, on regardait la différence ou le produit scalaire, c'est pareil, entre mes activités dans un cas, mes activités dans une autre, et on pondérait ça par un facteur qui était 1 ou 0 selon que la couche nous intéresse ou pas. Nous, en fait, il se trouve que pour un réseau qui ne fait pas de partage de poids, on peut réécrire notre simérité de cette façon-ci. On a aussi un produit scalaire entre les activités, mais multiplié par une quantité ici qui va dépendre d'une euro, et dépendre de l'entrée aussi. Et il se trouve que cette quantité, c'est quoi ? En fait, c'est l'impact de l'activité sur la sortie du réseau. C'est vraiment la dérivée du réseau par rapport à l'activité qu'on entend regarder. Donc, en fait, on quantifie, on multiplie la similarité entre les activités par l'impact que ces activités ont sur la décision à la fin. Donc ça, ce n'est pas une formule que j'ai pondue. C'est quelque chose qui, automatiquement, découle de cette définition de produit scalaire entre les gradients. Quand, par contre, on va passer à des réseaux qui partagent des proies, donc, par exemple, des réseaux convolutionnels, là, cette propriété-là n'est plus vraie. Ce qui va se passer, c'est qu'on va avoir simplement des intégrals le long de l'image de ces quantités-là. Donc on ne peut plus l'interpréter directement comme ça. Et c'est normal. Si le réseau a certaines invariances, par exemple, il y a une invariance par translation, parce qu'on a mis des choses convolutionnelles dedans, par construction, ma similarité va être invariante aussi par translation. Et ça va se traduire quand j'essaye de l'exprimer de cette façon-ci-là par des quantités qui vont refléter les invariances de l'architecture du réseau. Alors, maintenant, bon, très bien, j'ai une mesure de similarité. Moi, ce qui m'intéressait, c'était plutôt d'estimer le nombre de voisins d'un point. Donc, comment est-ce que je fais ça ? Je pourrais dire, c'est simple, je calcule la similarité de mon point X à tous les points X prime du data set, et je vais compter simplement ceux, les points X prime pour lesquels la similarité est supérieure à certains seuils taux. Bon, ça fait, ce que j'appelle le hard thresholding ici, le seuilage dur. On peut avoir quelque chose un peu plus doux ici qui serait de dire, bon, alors, je vais pas prendre un seuil et dire c'est noir ou blanc selon que je suis supérieur ou inférieur au seuil, mais je vais plutôt, pour chaque point X prime, je vais compter sa similarité, je vais ajouter. Donc, par exemple, un point qui a beaucoup de similarité, ça va compter pour quelque chose qui est proche 1, un point qui n'est pas très similaire pour quelque chose proche 0. Et voilà, et en fait, il se trouve que ces deux quantités-là sont liées. Si je fais l'intégral de cette quantité ici par rapport au seuil, parce que vous saviez pas lequel seuil choisir, alors vous allez l'intégrer sur tous les seuils possibles, en fait, vous allez retrouver exactement cette quantité ici, parce qu'en fait, on a une propriété en pratique, donc ce n'est pas une propriété théorique, mais c'est une propriété en pratique, et il se trouve que ce critère de similarité est quasiment toujours positif. Et donc, c'est très rare d'avoir des valeurs négatives, et dans ce cas-là, c'est vraiment négative, mais très peu. Donc on a cette propriété que finalement, ces deux choses-là sont inséliées. Et il y a une chose qui est vraiment très bien, c'est qu'en fait, cette quantité ici, qui nous permet d'estimer le nombre de voisins, en fait, vous voyez, depuis la formule ici, que c'est un estimateur de densité, en fait, en train de faire de l'estimation de densité dans l'ensemble d'apprentissage, mais du point de vue du réseau. Cette quantité ici, elle se calcule de façon super simple. Et en fait, au lieu d'avoir quelque chose de quadratique en l'intérêt du dataset, si je veux calculer le nombre de voisins de chacun des points, en fait, je peux le faire en deux passes linéaires, tout simplement sur mon dataset. Donc c'est quelque chose qui est pratique. Je peux calculer ça de façon très rapidement. Donc je dois avoir une estimation en chaque point x du nombre de voisins de façon très rapide. Alors je ne sais pas si j'ai vraiment le temps de tester, d'expliquer, je vais essayer d'aller rapidement. Comment est-ce qu'on peut valider cette chose-là ? Alors imaginons qu'on demande au réseau de prédire cette fonction ici. Donc ça, c'est x, c'est l'entrée, ça, c'est la sortie. Je demande de prédire ceci. Ensuite, j'ai un réseau qui marche pas trop mal là-dessus. Ensuite, je fais mon estimateur de densité et ce que j'obtiens, c'est ici. Donc en chaque point x, c'est la densité que j'observe. Alors ça peut paraître un peu bizarre au début d'obtenir d'avoir quelque chose comme ça. Mais la raison, c'est qu'en fait, un réseau avec des relus, qui sont le type standard de réseau qu'on utilise maintenant, en fait, c'est une fonction qui est linéaire par morceaux, ou affine par morceaux. Et donc ici, il peut se contenter d'avoir juste un grand morceau affine pour d'écrire toute cette région ici, tandis que quand ça tourne, il va falloir plein de petites régions affines et donc le nombre de voisins va diminuer, enfin, la taille des morceaux va diminuer quand ça tourne plus à plus petit. Du coup, moins il va y avoir de voisins dedans. Donc c'est exactement ce qu'on observe. C'est qu'aux endroits où ça va tout droit, on a plein de voisins et aux endroits où ça tourne pas mal, on en a beaucoup moins. Donc ce qu'on va faire, c'est qu'on va regarder ça, mais en faisant varier la fréquence de notre sinusoid, donc en certain temps, quand on augmente la fréquence de notre sinusoid, la densité est décroie. Bon, c'est effectivement ce qu'on observe. Et on va représenter ça en 3D, c'est que dans un sens, on a la densité, enfin, le nombre de voisins, là c'est x et de l'autre côté, en troisième dimension, on va rajouter la courbure, c'est-à-dire la courbure de notre sinusoid et on voit cette chose ici qui nous dit effectivement, quand la courbure augmente, on a moins de voisins et quand la fréquence augmente, on a aussi moins de voisins. Alors pourquoi quand la fréquence augmente, on a moins de voisins, c'est simplement parce qu'on s'est blasé de 2 points dans l'ensemble d'apprentissage pour chacun de ces ensembles-là. Donc c'est normal si j'ai une fréquence que 2 fois plus élevée d'avoir 2 fois moins de points. Donc voilà. Et une autre façon de représenter ça, c'est si je regarde le log du nombre de voisins en fonction du log de la fréquence, j'ai quelque chose qui est ici, qui n'est pas trop mal, au sens où on voit que on a bien quelque chose qui décroie avec la fréquence. Donc c'est quelque chose qui va dans le sens d'estimer si pour un point il a beaucoup de voisins ou pas, c'est tout ce qui compte. Alors je vais passer si il y a encore des choses à présenter, mais je suis déjà en retard. Alors, à quoi ça sert d'estimer la densité ? Si j'ai un point X dont je me rends compte qu'au moment du test, j'estime la densité par rapport à l'ensemble d'apprentissage, je me rends compte que la densité est très faible. C'est-à-dire que la prédiction va pas être fiable parce que le réseau peut complètement prédire n'importe quoi, c'est quelque chose qui n'est pas dépendant de l'ensemble d'apprentissage. Au contraire, si j'ai une densité qui est extrêmement grande, c'est peut-être que j'ai des problèmes d'underfit, soit il y a beaucoup de points qui se ressemblent, ou peut-être que le réseau n'est pas assez expressif. Donc en fait, on peut voir pas mal de choses avec des systémateurs de densité du point de vue du réseau neuron. Je passe le fait qu'en fait toutes ces quantités sont différenciables et qu'on peut les optimiser. Donc ça veut dire que si jamais vous avez envie que là, vous avez votre ensemble d'apprentissage, vous dîtes, à tous ces points-là, je sais que j'aimerais bien qu'ils soient similaires pour le réseau. Tout cela, je sais qu'ils devraient être similaires aussi, mais j'aimerais bien que le réseau fasse la différence entre ces deux clusters-là. C'est des choses que vous pouvez rajouter dans votre loss d'entraînement pour s'assurer que le réseau va être capable de distinguer ce genre de choses et au contraire, faire la confusion entre les points qui sont ici. Donc c'est quelque chose qu'on peut rajouter. Mais je veux passer et je vais revenir au point où je passe mon plein de détails. Et en quoi est-ce que je peux réutiliser cet outil d'estimation d'incité à mon problème initial qui était le dévouilletage. Alors, j'ai un certain d'entrée XI avec des vraies étiquettes qui sont Y, mais auxquelles je n'ai pas accès. Dans mon cas, moi je n'ai pas accès aux vraies étiquettes Y. J'observe toujours tout avec des problèmes de recalage. Donc c'est un certain bruit Epsilon-I. Donc voilà, ça c'est les données auxquelles j'ai accès. J'entraîne mon réseau et j'ai une certaine prédiction YI pour un exemple YI. Malheureusement, l'entraînement, c'est l'aramelle 2 entre ce que je prédis et ce qu'on me demande de prédire. À convergence de l'entraînement de mon réseau, il se trouve que j'ai une certaine propriété qui est que, en chacun des points de mon sens d'apprentissage, si je lisse ma prédiction avec mon noyau à l'aide de mes plus proches voisins, je vais obtenir la même quantité que ce qu'on me demandait de faire en moyenne lisser sur mes plus proches voisins. Et là, on voit que ça a commencé, on va avoir le bruit qui va te lisser du coup grâce à ce noyau ici et on va pouvoir réexprimer assez simplement en quelques lignes le fait que finalement, l'écart, l'erreur qu'on va faire entre notre prédiction et la moyenne des vraies étiquettes lisser selon notre noyau, finalement c'est d'une part un terme qu'on peut calculer c'est l'écart entre ce qu'on prédit et ce qu'on prédit dans ce voisinage plus un terme qui est lié au bruit et ce terme qui est lié au bruit, on peut l'exprimer de toute façon très simple c'est la norme du bruit initial multiplié par une certaine quantité qui est la norme de mon noyau que je peux calculer et là, c'est intéressant c'est que même en fait si je ne connaissais pas le bruit initial je ne connaissais pas la norme de ce bruit initial je peux calculer la norme de ce noyau et donc, c'est ce qu'on fait sur notre orientation en question qui est 002 ce qui veut dire que même si je ne savais pas quelle est la quantité de bruit qui avait initialement je sais que mon réseau il divise ce bruit par un facteur 50 quand il fait ses prédictions donc essentiellement tout le bruit de mon noyau a été dégommé par le réseau c'est une analyse qu'on peut faire post-entraînement qui nous dit bon je ne sais pas quelle quantité de bruit j'avais mais je sais que s'il était relativement raisonnable ça n'a pas impacté les prédictions de mon réseau voilà donc ensuite le réseau peut faire des erreurs mais elles ne sont pas dues au bruit elles seront dues à d'autres choses donc je vais passer parce que je pense que je suis bien en retard et voilà si vous avez des questions merci Guillaume donc il y avait une question de Gilles Planchard oui comment est-ce que le premier round donne une meilleure courbe ça donne les bruités et on se concédie c'était que en fait on a rajouté du bruit gaussien et du coup peut-être qu'on a régularisé le bruit peut-être que notre bruit après un jour de l'autre avait des propriétés statistiques un peu meilleures c'est l'hypothèse qu'on avait mais on n'a pas trop moyen de la prouver donc c'est juste une hypothèse d'explication merci merci une autre question peut-être j'ai une autre question encore moi donc d'un point de vue statistique quand on a une mesure de similarité fixe après en statistique on utilise je sais pas quoi c'est-à-dire d'Aralya Watson en faisant le moyen sur des voisins donc ça c'est un procédé classique du bruitage donc là finalement c'est quoi le twist c'est qu'en plus la distance a été aussi apprise avant c'est qu'en fait on ne définit pas nous-même un noyau je suis dans mon espace X l'espace des X donc j'ai des points un peu partout et la façon classique c'est de dire je définis un noyau voilà et puis je vais me moyer sur ce noyau ici le noyau qu'on prend c'est le noyau qui est lié au réseau c'est vraiment ce que voit le réseau il va dire pour moi par exemple ces deux points là ils sont vraiment très proches j'arrive pas à faire la différence alors que ceci j'arrive c'est comme si on optimisait le noyau par rapport à ce que perçoit le réseau c'est vraiment ça le but c'est de définir un noyau qui reflète ce que le réseau voit et du coup ça nous permet les moyens âges sur la sortie de savoir que normalement pour tous les points que le réseau juge similaire normalement il doit sortir à peu près la même chose et donc ce phénomène que potentiel que tu décrivais que ce n'est pas utilisé l'expression on pourrait penser que ça pourrait partir en cacahuète si le réseau estime un truc qui part n'importe comment ça ne s'observe pas en pratique ça peut fin... tout cas sur cette application non et sur d'autres non plus donc ça dépend apparemment les je pense que ça dépend de la tâche évidemment ça dépend du bruit initial par exemple si le bruit était bimodale au départ peut-être que ça pourrait être problématique si le bruit est relativement raisonnable relativement gaussien je pense que ça se passe relativement bien mais j'ai pas de garantie ici j'ai pas de garantie à part de dire qu'une fois que le réseau a été appris à la fin je veux calculer cette quantité je veux calculer ce facteur si le facteur est grand je sais qu'il a éliminé le bruit si le facteur reste lors de 1 c'est que le bruit il a pas réussi à l'enlever donc on peut le voir post-entraînement ce que le réseau fait du bruit initial d'accord on a une question d'Alexandre je t'ai donné la main je pense que tu peux parler est-ce que c'était connu dans la littérature avant il y avait cette histoire de noise-to-noise dont j'ai parlé qui regardait les choses seulement donc c'est sous la même approche mais toujours exactement la même entrée donc j'ai toujours le même point X en entrée j'ai des étiquettes qui sont différentes et du coup je vais moyenné par contre l'histoire de rajouter la similarité là je connais pas d'approche similaire c'est-à-dire voilà par contre le label d'innoising c'est quelque chose en fait il y a un certain nombre de papiers qui le font mais souvent sans trop insister dessus en disant que c'est batteriquement très bien fondé d'ailleurs on peut se poser des questions mais pour aller plus loin dans cette histoire d'innoising même sans intération en fait il y a un papier je l'ai pas cité ici mais je peux vous le montrer je crois que je l'ai là voilà c'est deep learning is a bus to massive level noise c'est-à-dire c'est la classification donc c'est pas de la régression et ce qu'ils disent c'est qu'ils vont entraîner sur un choix immédiat, je sais plus mais ils vont se dire je vais remplacer 90% des étiquettes par juste une étiquette prise au hasard et ils se disent qu'est-ce qu'il va se passer en fait ils se trouvent que le réseau met plus de temps à apprendre mais il finit par apprendre quand même avec la même précision à la fin et ce qu'ils disent c'est que même en mettant 99% de bruit sur une étiquette ils arrivent quand même à apprendre donc c'est pas iteratif c'est juste un réseau qui apprend donc les essences de radiance c'est iteratif mais on va pas remettre à jour les étiquettes par des prédictions et ce qui montre ici expérimentalement c'est que ce qui compte c'est pas la quantité de bruit mais c'est la quantité d'échantillons avec les bonnes étiquettes c'est-à-dire que si on a un bruit de 99% il va falloir juste des millions d'exemples pour que ça converge mais ça finira pas converger je ne savais pas exactement la question mais c'était juste pour donner d'autres références sur la gestion du bruit par la zone neurone ok, merci beaucoup