les réseaux de neurones de A à Z

Ce cours, ne peut prétendre à être exact, il est le résultat d’une journée de stage stockée dans ma petite mémoire.
Je remercie par ailleurs chaleureusement Bruno, pour ce cours magique, que je plagie complètement


I) Pourquoi un réseau de neurones ?:

En informatique et dans la vie de tous les jours il y a deux types de problèmes:
-les problèmes modélisables
-les problèmes non modélisables
Pour le premier, c’est simple, un problème modélisable est un problème pour lequel je peux créer une fonction, par exemple, si un pain coûte 2€, alors cinq pains coûtent 10€, j’ai en entrée le prix du pain et le nombre de pains, en sortie la multiplication de l’un par l’autre.
Mais je peux modéliser des problèmes bien plus complexes, comme la météo, ou le calendrier des marées.

Le second apparaît lorsque le problème est tellement compliqué que l’on a beaucoup de mal à trouver une fonction mathématique.
Par exemple, imaginons un four qui contient une pièce en métal :



On veut savoir à quelle température sortira la pièce sachant le temps qu’elle restera dans le four, sa température initiale, la température initiale du four, le temps de chauffe du four, la température maximale du four, l’inertie thermique de la pièce, la taille du four, l’humidité,...etc

Si je vous demande de me sortir une fonction mathématique prenant en entrée tous ces paramètres, vous prendriez une équipe de 30 chercheurs et bosseriez dessus 6 mois…
ou alors vous faites un réseau de neurones… : )

II) Qu’est-ce qu’un neurone ?:

Historiquement les réseaux de neurones tentent biologiquement de reproduire le cerveau Humain.
Un neurone est un organe qui prend une ou des entrées (des nombres) et qui renvoie une sortie(un nombre)




chaque entrée à un poids qui lui donne de l’importance comme dans un arbre pondéré.
ces poids sont nommés ‘w’.
w1, w2, w3, ..., wn



Chaque w à une valeur qui lui est propre,
on ne connaît pas la valeur des w.

A l’intérieur du neurone, on distingue deux éléments:
-un petits calcul qui fait: e1*w1 + e2*w2 + e3*w3

qu'on résume généralement:(en gros c’est une boucle For de 1 à n avec i comme variable)
-une fonction d’activation qui lisse le résultat, par exemple une fonction qui contient le résultat entre 1 et -1 comme la sigmoïde:



on peut aussi en utiliser des plus simple comme la fonction relu, qui évite juste un résultat négatif :



donc le neurone entier ressemble à ça:




III) Un réseau :

pour faire un réseau de neurones, on connecte ensemble tout un tas de neurones, comme celle que l’on a vu.

Le réseau peut s’apparenter à une boîte noire, on ne sait pas ce qui se passe dedans, comme les neurones qui le constitue, il prend n entrées et ressort une sortie (sur le réseau, c’est plus complexe, il peut dans certain cas y avoir plusieurs sorties, mais laissons ce détail pour l’instant)



On peut reprendre l’exemple du four



Il va falloir entraîner le réseau,
on va faire des tas d’expériences, et on envoie les résultats au réseau
on prend en entrées tous les paramètres (chaleur initiale, humidité...)
et en sortie on met la température finale.
Le réseau va tenter de trouver la valeur de chaque coefficient ‘w’ pour lesquels les entrées que l’on a mis renvoie en sortie la température.
pour cela, on peut le faire à la main,

“je bouge le premier w, si je le monte, on s’éloigne de la température demandée, si je le descend on s’en approche, je le descend… ah, je ne peux plus le descendre sinon je m'éloigne encore, je le verrouille”

Sauf que chaque fois que l’on touche à un coefficient, ça modifie les autres, c’est donc sans fin…
d’autant que l’on est pas sur de converger, par exemple, voici un graphique de l’erreur:



si l’on est rendu à x=76, on à l’impression de ne plus pouvoir avancer ni reculer, autrement dit que l’on est à l’erreur la plus faible possible,
alors qu’en vrai le point le plus faible est à x=94.

Pour palier à ce problème, on appelle les maths à la rescousse qui nous sortent la méthode un peu barbare de la rétropropagation du gradient

cette méthode, que je ne peux pas du tout vous expliquer, mais que des algos ferons pour nous, va nous permettre de calculer les coefficient w pour des entrées et une sortie donnée.

On est content, sur la première expérience on a trouvé des coefficient qui nous permettent de prédire en fonction des arguments, la température qui va sortir.
Sauf que si on applique ces mêmes coefficient au second, la température indiquée par le réseau risque d’être très loin de la véritable
on va donc affiner les coefficient grâce à chaque expérience et faire des compromis.
Donc si au début on a fait 500 expériences, on doit entraîner le réseau grâce à 500 rétropropagation du gradient.
Et on peut faire (on doit faire) plusieurs cycles.

On doit ajouter un petit détail, c’est que si l’on fait ainsi, la dernière des expériences semble avoir plus de poids.
On va donc garder à chaque fois que l’on affine les coefficients, non pas le résultat exact pour lequel le taux d’erreur pour une expérience est le plus faible mais celui juste un peu plus large en influant sur les résultat avec un tout petit nombre (0.000001 par exemple), ce nombre peut évoluer au fur et à mesure que l’on monte en précision (faire des pas de géants au début, puis de souris à la fin)


Je ne vous ai pas parlé de la structure du réseau, en fait, c’est assez simple, les sorties des uns deviennent les entrées des autres.
prenons un réseau ultra-simple, qui traite une image de 3*3 donc 9 pixels.
il aura donc 9 entrées qui seront ces 9 premiers neurones.



les neurones de la première couche ont chacun une entrée et une sortie.
Ceux de la deuxième couche ont 9 entrées, un duplicata de chacune des sorties de la première couche.
Les troisième ont 6 entrées 3 sorties...etc

Au point où nous en sommes, on pourrait ce dire que l’on pourrait déjà créer un réseau, si vous essayez, vous serez déçus…
pour comprendre un peu d’histoire…

IV) Des réseaux de plus en plus performants :

Dans les années 2000, quand on été inventés les premiers réseaux de neurones, un concours à vu le jour également.
il s’agissait de faire un programme capable de reconnaître 20 classes différentes (des bateaux, des chiens, des chats, des hamsters...)
chaque année, à eu lieu ce concours et les réseaux proposait alors au début des classes avec 15% de réussite.
Ce n’est pas terrible, mais c’est 3 fois mieux que le hasard (5%)
Bon, au fur et à mesure que la puissance des ordis a augmentée, les scores se sont améliorés, on est passé à 20% de réussite.

Jusqu’en 2012 ou on a inventé les réseaux de convolution…

V) Méthode de convolution:

La convolution est une méthode qui permet de simplifier une image pour la rendre plus facile à traiter.
En fait, on va transformer une image en ses contours
Il n’est pas nécessaire de comprendre toute la convolution, des algorithmes le feront très bien pour nous, mais il est bien de comprendre le principe de base



bon, c’est difficile car comme je fais un exemple avec très peu de pixels (ici des cases), pour faire un dessin détaillé…

Imaginons que cette chose soit un bac, vu de dessus, le noir du bord c’est le bord du bac, ce que l’on veut récupérer, le noir au centre, c’est le fond du bac, et le gris c’est les parois que l’on voit sous une autre lumière.

Pour l’ordinateur tout ceci n’est qu’une matrice (un tableau) de chiffres allant de 0 à 255.
0 c’est noir, 255 c’est blanc, au milieu c’est gris

Pour récupérer les contours, on va passer une matrice de 3*3 qui contient des coefficient, sur tout le tableau, cette matrice en fonction des coefficient que l’on met, sera capable de retrouver une droite verticale, une droite horizontale, un pic, un creux…



si la matrice observe une forte différence (peu importe comment elle le fait) de couleur entre 2 pixels, elle détecte quelque chose, entre le bord blanc et le noir il y a une grande différence, mais pas entre le bord noir et le bord gris
Après convolution, on obtient ceci:



Le problème de la convolution, c’est qu’il faut trouver des coefficient qui détectent des formes, pour une infinité de forme…

VI) Des réseaux de convolutions:

En 2012, un français, Yann Le Cun à l’idée de faire trouver les coefficient par le réseau lui même, à partir de ce moment, la puissance des réseaux de neurones c’est complètement envolé, et le concours des 20 classes, pour garder un peu de difficulté a dut passer à 2000 classes, et avec les 2000 classes, les IA faisaient moins d’erreurs que les humains !!

VII) Des réseaux multi-sorties:

Pour des raisons pratiques, on préfèrera lorsque l'on cherche à définir des classes (un chat, un chien, un bateau...), avoir autant de sortie que de classes à détecter et de se débrouiller pour que ce soit des probabilités qui sortent (0.1% de chance que ce soit un bateau, 8.2% de chance que ce soit un chat, 91.7% de chance que ce soit un chien)

VIII) Des réseaux récurrents:

Il y a encore peu, on trouvait des réseaux de neurones qui faisaient de la reconnaissance vocale, sauf qu’il disaient n’importe quoi.
C’est normal, vous quand vous entendez quelqu’un parler, vous n’entendez pas tout, mais votre cerveau comble les trous en fonction du contexte, cela nécessite de se rappeler de ce qui à été dit auparavant.
pour faire cela avec une machine, on a dut inventer les réseaux récurrents…

un réseau récurrent, est un réseau qui récupère une partie de ses sorties en entrées


VIII) Un peu de pratique:

Il est probable que vous n'ayez pas lu le haut de cette page et que vous vous soyez jetés tête baissé sur cette partie.
Si tel est le cas, remontez immédiatement et lisez tout, vous rattez l'essentiel... Par rapport à la théorie, la pratique n'est rien...

Pour la pratique, c'est simple:

On a une fonction d'apprentissage,
qui contient la fonction du neurone(le calcul et la fonction d'activation), la fonction qui lie les neurones entres eux, la fonction de convolution et la fonction de rétropropagation du gradient.

pour ce servir de cette grosse fonction on met la structure du réseaux avec les neurones pas couches ex:[100, 50, 25, 10, 5]
on envoie aussi les entrées des premiers neurones
ainsi que la solution


On a également une fonction de "test/utilisation"
qui prend les entrées et en fonction de ce qui à été fait avec la fonction d'apprentissage, renvoie la sortie qui va bien.

Rien ne nous empèche de faire les deux fonctions dans des langages différents, par exemple on fait la première en python, on récupère les coefficient des w et on les met en dur dans un code C.
Il faut tout de même faire attention que les deux algorithmes utilisent les mêmes fonction d'activation, de convolution...


Donc comme dans mon exemple, on peux faire la fonction d'apprentissage en python, car python offre des outils puissants pour faire la rétropropagation du gradient et la convolution.
Je suis fort désolé de ne pouvoir vous aiguiller plus, mais je n'ai jamais utilisé ces fonctions, nottament car je n'ai pas réussi à les télécharger sur mon vieux windows XP (oui, j'en entends qui murmure que je code sur un dinosaure, mais windows XP est moins compatible mais bien plus puissant que windows 10...)

pour ma part, je suis adepte du faire soi-même et du tout 100% compatible, je suis donc en train de développer une lib d'IA sur ma calculatrice casio graph75+E. Lorsque j'aurais terminé, je vous enverrais le code, vous pourrez utilisez la lib tel quel ou vous en inspirer, de toute façon ce sera libre de droits.


www.000webhost.com