Transcription de la 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.