Vidéo : Qu’est-ce qu’un réseau de neurones ?

Grant Sanderson • 3Blue1Brown • Boclips

Qu’est-ce qu’un réseau de neurones ?

17:44

Transcription de vidéo

Ceci est un trois. Il est mal écrit et rendu à une résolution extrêmement basse de 28 fois 28 pixels. Mais votre cerveau n’a aucun mal à le reconnaître en tant que trois. Et je veux que vous preniez un moment pour apprécier à quel point c’est génial que le cerveau puisse le faire sans effort. Je veux dire ceci, ceci et cela sont également reconnaissables comme étant des trois, même si les valeurs spécifiques de chaque pixel sont très différentes d’une image à l’autre. Les cellules sensibles à la lumière de votre œil qui se déclenchent lorsque vous voyez ce trois sont très différentes de celles qui se déclenchent lorsque vous voyez ce trois. Mais quelque chose dans votre intelligent cortex visuel les résout comme étant la même idée. Et en même temps, reconnaît les autres images comme leurs propres idées distinctes.

Mais si je vous demandais « allez ! Asseyez et écrivez un programme qui prend une grille de 28 fois 28 pixels comme celle-ci et génère un seul nombre compris entre zéro et 10, vous indiquant ainsi comment il lit ce chiffre ». La tâche va du ridiculement trivial au considérablement difficile. À moins que vous n’ayez vécu dans une grotte, je pense que je n’ai pas besoin de motiver la pertinence et l’importance de l’apprentissage automatique et des réseaux de neurones pour le présent et l’avenir. Mais ce que je veux faire ici, c’est vous montrer ce qu’est un réseau de neurones, sans aucun contexte. Et vous aider à visualiser ce qu’il fait, non pas comme un buzzword, mais comme une notion mathématique. J’espère que vous en ressortirez comme si la structure elle-même était motivée. Et que vous saurez ce que cela signifie quand vous lisez ou entendez parler d’un réseau de neurones, entre guillemets, apprentissage.

Cette vidéo va juste être consacrée à l’élément structural de cela. Et la vidéo suivante va aborder l’apprentissage. Ce que nous allons faire est créer un réseau de neurones pouvant apprendre à reconnaître les chiffres écrits à la main. C’est un exemple assez classique d’introduire le sujet. Et je suis content de rester avec le statu quo ici. Parce qu’à la fin des deux vidéos, je voudrais vous indiquer quelques bonnes ressources où vous pouvez en apprendre davantage. Et où vous pouvez télécharger le code qui fait cela et jouer avec sur votre propre ordinateur. Il existe de très nombreuses variantes de réseaux de neurones. Et ces dernières années, il y a eu une sorte de boom de la recherche sur ces variantes. Mais dans ces deux vidéos d’introduction, vous et moi allons simplement regarder la forme la plus simple sans fioritures. C’est en quelque sorte un préalable essentiel à la compréhension des variantes modernes les plus puissantes. Et croyez-moi, il nous reste encore beaucoup de complexité à considérer.

Mais même sous cette forme qui est la plus simple, il peut apprendre à reconnaître les chiffres manuscrits, ce qui est super pour un ordinateur de pouvoir le faire. Et en même temps, vous verrez que cela ne répond pas à tout ce dont nous espérons. Comme son nom l’indique, les réseaux de neurones sont inspirés par le cerveau. Mais décomposons cela. Que sont les neurones et comment sont-ils liés entre eux ? En ce moment, quand je parle de neurone, tout ce que je veux que vous ayez en tête c’est quelque chose qui contient un nombre, plus spécifiquement un nombre compris entre zéro et un. Ce n’est vraiment pas plus que ça. Par exemple, le réseau commence par un groupe de neurones correspondant à chacun des 28 fois 28 pixels de l’image d’entrée, soit 784 neurones au total. Chacun de ceux-ci contient un nombre représentant la valeur d’échelle de gris du pixel correspondant, allant de zéro pour les pixels noirs à un pour les pixels blancs.

Ce nombre à l’intérieur du neurone s’appelle son activation. Et l’image que vous pourriez avoir à l’esprit ici est que chaque neurone est excité lorsque son activation est un nombre élevé. Tous ces 784 neurones constituent donc la première couche de notre réseau. Passons maintenant à la dernière couche où 10 neurones représentent chacun l’un des chiffres. L’activation dans ces neurones, encore un nombre compris entre zéro et un, représente à quel point le système pense qu’une image donnée correspond à un chiffre donné. Il y a aussi quelques couches entre les deux couches appelées les couches cachées, ce qui pour le moment ne devrait être qu’un énorme point d’interrogation sur la façon dont le processus de reconnaissance des chiffres va être géré. Dans ce réseau, j’ai choisi deux couches cachées, chacune avec 16 neurones. Et certes, c’est un choix arbitraire. À dire vrai, j’ai choisi deux couches en fonction de la motivation que je souhaite donner à la structure en un instant. Et 16 ? Eh bien, c’était juste un bon chiffre à afficher sur l’écran.

En pratique, il y a beaucoup de place pour expérimenter une structure spécifique ici. Suivant la manière dont le réseau fonctionne, les activations dans une couche déterminent les activations de la couche suivante. Et bien sûr, le cœur du réseau en tant que mécanisme de traitement de l’information dépend de la manière dont ces activations d’une couche entraînent des activations dans la couche suivante. Cela est censé être vaguement analogue à la façon dont, dans les réseaux biologiques de neurones, certains groupes de neurones excitent certains autres. Le réseau que je présente ici a déjà été formé pour reconnaître les chiffres. Et laissez-moi vous montrer ce que je veux dire par là. Cela signifie que si vous insérez une image éclairant les 784 neurones de la couche d’entrée en fonction de la luminosité de chaque pixel de l’image. Ce modèle d’activations génère un motif très spécifique dans la couche suivante, ce qui entraîne un modèle dans la couche suivante. Ce qui donne finalement un motif dans la couche de sortie. Et le neurone le plus brillant de cette couche de sortie est le choix du réseau, pour ainsi dire, quel chiffre cette image représente.

Et avant de vous lancer dans les calculs sur la manière dont une couche influence la suivante ou sur le fonctionnement de l’apprentissage, voyons pourquoi il est même raisonnable de s’attendre à ce qu’une structure en couches de ce type se comporte intelligemment. À quoi on s’attend ici ? Quel est notre plus grand espoir pour ce que ces couches intermédiaires pourraient faire ? Eh bien, quand vous ou moi reconnaissons les chiffres, nous assemblons divers composants. Un neuf a une boucle en haut et un trait à droite. Un huit a aussi une boucle en haut, mais il est associé à une autre boucle en bas. Un quatre se décompose essentiellement en trois traits spécifiques, et des choses de ce genre. Dans un monde parfait, nous pourrions espérer que chaque neurone de l’avant-dernière couche corresponde à l’un de ces sous-composants. Que chaque fois que vous alimentez une image avec, par exemple, une boucle en haut comme un neuf ou un huit, il y a un neurone spécifique dont l’activation sera proche de un.

Et je ne parle pas de cette boucle spécifique de pixels. L’espoir serait que tout motif généralement bouclé vers le sommet déclenche ce neurone. De cette façon, passer de la troisième couche à la dernière nécessite simplement de savoir quelle combinaison de sous-composants correspond à quels chiffres. Bien sûr, cela ne fait que remettre le problème à plus tard. Parce que, comment reconnaîtriez-vous ces sous-composants ou même apprendriez quels devraient être les bons sous-composants ? Et je n’ai même pas encore parlé de l’influence d’une couche sur la suivante. Mais regardez avec moi celui-ci pour un instant. Reconnaître une boucle peut également se décomposer en sous-problèmes. Une façon raisonnable de le faire serait de reconnaître d’abord les divers petits côtés qui la composent.

De même, un long trait comme celui que vous voyez peut-être dans les chiffres un, quatre ou sept, eh bien, c’est une périphérie très longue. Ou peut-être pensez-vous qu’il s’agit d’un certain motif composé de plusieurs périphéries plus petites. Nous espérons donc peut-être que chaque neurone de la deuxième couche du réseau corresponde aux diverses petites périphéries pertinentes. Peut-être que lorsqu’une image comme celle-ci apparaît, elle éclaire tous les neurones associés à environ huit à 10 petites périphéries spécifiques. Ce qui, à son tour, éclaire les neurones associés à la boucle supérieure et à un long trait vertical. Et ceux-ci éclairent le neurone associé à un neuf. Que ce soit ou non ce que notre réseau final fait réellement est une autre question. Une question sur laquelle je reviendrai une fois que nous verrons comment entraîner le réseau.

Mais c’est une espérance que nous pourrions avoir, une sorte d’objectif avec une structure en couches comme celle-ci. De plus, vous pouvez imaginer à quel point être capable de détecter des périphéries et des motifs de cette manière serait vraiment utile pour d’autres tâches de reconnaissance d’images. Et même au-delà de la reconnaissance d’images, vous pouvez vouloir faire toutes sortes de choses intelligentes qui se décomposent en couches d’abstraction. L’analyse de la parole, par exemple, implique de prendre un son brut et de choisir des sons distincts qui se combinent pour former certaines syllabes. Qui se combinent pour former des mots, qui se combinent pour former des phrases et des pensées plus abstraites, etc. Mais pour en revenir à la manière dont cela fonctionne réellement, imaginez-vous en train de concevoir comment exactement les activations dans une couche pourraient déterminer les activations dans la couche suivante. Le but est d’avoir un mécanisme qui pourrait éventuellement combiner des pixels en périphéries ou des périphéries en motifs ou des motifs en chiffres.

Et pour zoomer sur un exemple très spécifique, disons que l’espérance est qu’un neurone particulier de la deuxième couche détecte si l’image possède ou non une périphérie dans cette région. La question qui se pose est la suivante : quels paramètres le réseau devrait-il avoir ? Quels boutons et commandes devriez-vous pouvoir ajuster pour qu’il soit suffisamment expressif pour capturer potentiellement ce motif ou tout autre motif de pixels ? Ou le motif où plusieurs périphéries peuvent faire une boucle et d’autres choses de ce genre ? Eh bien, nous allons attribuer un poids à chacune des connexions entre notre neurone et les neurones de la première couche. Ces poids ne sont que des chiffres. Ensuite, prenez toutes ces activations de la première couche et calculez leur somme pondérée en fonction de ces poids.

Je trouve utile de penser que ces poids sont organisés dans une petite grille qui leur est propre. Et je vais utiliser les pixels verts pour désigner les poids positifs et les pixels rouges pour les poids négatifs, où la luminosité de ce pixel est une représentation approximative de la valeur du poids. Maintenant, si nous associons les poids à presque tous les pixels nuls, à l’exception de quelques poids positifs dans cette région à laquelle nous nous intéressons. Ensuite, prendre la somme pondérée de toutes les valeurs de pixels revient en réalité à simplement additionner les valeurs des pixels dans la région qui nous intéresse. Et si vous voulez vraiment savoir s’il y a une périphérie ici, ce que vous pourriez faire c’est associer des poids négatifs aux pixels environnants. La somme est alors plus grande lorsque les pixels du milieu sont clairs, mais les pixels environnants sont plus sombres.

Lorsque vous calculez une somme pondérée comme celle-ci, vous pouvez obtenir n’importe quel nombre. Mais pour ce réseau, nous voulons que les activations aient une valeur comprise entre zéro et un. Il est donc courant de pomper cette somme pondérée dans une fonction qui comprime la droite numérique entre zéro et un. Et une fonction commune qui fait cela s’appelle la fonction sigmoïde, également appelée courbe logistique. Fondamentalement, les entrées très négatives finissent par se rapprocher de zéro, les entrées très positives s’approchent de un. Et cela augmente régulièrement autour du zéro en entrée. Donc l’activation du neurone ici est fondamentalement une mesure de la positivité de la somme pondérée pertinente.

Mais peut-être que vous ne voulez pas que le neurone s’éclaire lorsque la somme pondérée est strictement supérieure à zéro. Peut-être vous ne voulez qu’il soit actif que lorsque la somme est supérieure à 10, par exemple. C’est-à-dire que vous voulez qu’un biais soit inactif. Nous allons donc simplement ajouter un autre nombre, tel que moins 10, à cette somme pondérée avant de l’insérer dans la fonction sigmoïde. Ce nombre supplémentaire s’appelle le biais. Donc les poids vous indiquent le motif de pixels que ce neurone de la deuxième couche détecte. Et le biais vous indique à quel point la somme pondérée doit être élevée avant que le neurone ne commence à devenir réellement actif. Et ce n’est qu’un seul neurone. Tous les autres neurones de cette couche seront connectés aux 784 pixels de la première couche. Et chacune de ces 784 connexions a son propre poids qui lui est associé. De plus, chacun a un biais, un autre chiffre que vous ajoutez à la somme pondérée avant de la réduire avec la fonction sigmoïde.

Et c’est beaucoup de choses à penser ! Avec cette couche cachée de 16 neurones, vous obtenez un total de 784 fois 16 poids avec 16 biais. Et tout cela ne concerne que les connexions de la première couche à la deuxième. Les connexions entre les autres couches ont également beaucoup de poids et de biais. Tout compte fait, ce réseau a presque exactement 13000 poids et biais au total, 13000 boutons et commandes qui peuvent être ajustés et tournés pour que ce réseau se comporte de manières différentes. Par conséquent, lorsque nous parlons d’apprentissage, nous faisons en sorte que l’ordinateur trouve une configuration valable pour ces nombreux nombres. Cela résoudra le problème.

Une expérience de pensée à la fois amusante et horrible consiste à vous vous imaginer assis et en train de régler tous ces poids et biais à la main. Délibérément ajuster les nombres pour que la deuxième couche se redresse sur les périphéries. La troisième couche reprend les motifs, etc. Personnellement, je trouve cela satisfaisant plutôt que de simplement lire le réseau comme toute une boîte noire. Car lorsque le réseau ne fonctionne pas comme prévu. Si vous avez établi un léger lien avec la signification réelle de ces poids et biais, alors vous avez un point de départ pour expérimenter la façon de modifier la structure à améliorer. Ou, lorsque le réseau fonctionne, mais pas pour les raisons que vous pourriez attendre. Explorer ce que font les poids et les biais est un bon moyen de remettre en question vos hypothèses et d’exposer tout l’espace de solutions possibles.

À propos, la fonction réelle est un peu compliquée à écrire, n’est-ce pas ? Alors permettez-moi de vous montrer une manière plus compacte en termes de notations comment ces connexions sont représentées. C’est ce que vous verriez si vous choisissez d’en savoir plus sur les réseaux de neurones. Organisez toutes les activations d’une couche dans une colonne en tant que vecteur. Ensuite, organisez tous les poids en tant que matrice, chaque ligne de cette matrice correspondant aux connexions entre une couche et un neurone particulier de la couche suivante. Cela signifie que le fait de prendre la somme pondérée des activations de la première couche en fonction de ces poids correspond à l’un des termes du produit matrice-vecteur de tout ce que nous avons à gauche ici.

À propos, une bonne partie de l’apprentissage machine se résume à une bonne compréhension de l’algèbre linéaire. Donc, pour ceux d’entre vous qui veulent une bonne compréhension visuelle des matrices et de ce que signifie multiplication d’une matrice par un vecteur, jetez un coup d’œil sur la série que j’ai réalisée sur l’algèbre linéaire, en particulier le chapitre trois. Revenons à notre expression, au lieu de parler d’ajouter les biais à chacune de ces valeurs indépendamment. Nous le représentons en organisant tous ces biais en un vecteur et en ajoutant le vecteur entier au produit matrice-vecteur précédent. Enfin, pour terminer, je vais entourer par une fonction sigmoïde à l’extérieur. Et ce que cela est censé représenter, c’est que vous allez appliquer la fonction sigmoïde à chaque composant spécifique du vecteur résultant à l’intérieur.

Donc une fois que vous écrivez cette matrice de poids et ces vecteurs comme leurs propres symboles. Vous pouvez communiquer la transition complète des activations d’une couche à l’autre dans une expression extrêmement propre et soignée. Et cela rend le code pertinent à la fois beaucoup plus simple et beaucoup plus rapide, car de nombreuses bibliothèques optimisent parfaitement la multiplication matricielle. Vous rappelez-vous lorsque j’avais dit tout à l’heure que ces neurones sont simplement des choses qui détiennent des nombres ? Bien sûr, les nombres spécifiques qu’ils détiennent dépendent de l’image que vous alimentez. Il est donc plus précis de penser à chaque neurone en tant que fonction. Une fonction qui prend les sorties de tous les neurones de la couche précédente et crache un nombre compris entre zéro et un.

Vraiment, tout le réseau n’est qu’une fonction, qui prend 784 nombres en entrée et crache 10 chiffres en sortie. C’est une fonction absurdement compliquée. Une fonction qui implique 13000 paramètres sous la forme de ces poids et biais qui reviennent sur certains motifs. Et qui implique itérer de nombreux produits matrices-vecteurs et la fonction sigmoïde. Mais ce n’est toutefois qu’une fonction. Et d’une certaine manière, c’est rassurant de penser que cela a l’air compliqué. Je veux dire, si c’était plus simple, quelle espérance aurions-nous pour qu’il puisse relever le défi de la reconnaissance des chiffres ? Et comment relève-t-il ce défi ? Comment ce réseau apprend-il les poids et les biais appropriés simplement en consultant les données ? Eh bien, c’est ce que je vais montrer dans la vidéo suivante.

Pour terminer, j’ai avec moi Lisha Li qui a effectué son travail de doctorat sur le côté théorique du deep learning. Et qui travaille actuellement dans une société de capital-risque appelée Amplify Partners, qui a gracieusement fourni une partie du financement pour cette vidéo. Donc Lisha, une chose que je pense que nous devrions rapidement évoquer est cette fonction sigmoïde. Si je comprends bien, les premiers réseaux l’utilisaient pour réduire la somme pondérée pertinente dans cet intervalle compris entre zéro et un. Vous savez, en quelque sorte motivés par cette analogie biologique de neurones inactifs ou actifs.

LISHA : Exactement.

GRANT : Mais relativement peu de réseaux modernes utilisent encore sigmoïde. C’est un peu la vieille école, non ?

LISHA : Ouais, ou plutôt ReLU semble être beaucoup plus facile à former.

GRANT : Et ReLU signifie unité de rectification linéaire.

LISHA : Oui, c’est ce genre de fonction où vous prenez un maximum de zéro et 𝑎, où 𝑎 est donné par ce que vous expliquiez dans la vidéo. Et je pense qu’en quelque sorte cela a été motivé partiellement par une analogie biologique avec la manière dont les neurones seraient activés ou non. Et ainsi, si elle dépasse un certain seuil, alors ce sera la fonction identité. Mais sinon, alors il ne serait tout simplement pas activé, et serait donc zéro. C’est donc une sorte de simplification. L’utilisation des sigmoïdes n’a pas aidé l’apprentissage. Ou bien, il était très difficile d’entraîner à un moment donné, et les gens venaient d’essayer ReLU. Et cela s’est avéré très bien fonctionner pour ces réseaux de neurones incroyablement profonds.

GRANT : D’accord ! Merci Lisha.

Nagwa utilise des cookies pour vous garantir la meilleure expérience sur notre site. En savoir plus sur notre Politique de Confidentialité.