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 tangente hyperbolique ou la sigmoïde(de 0 à 1):



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...


La fonction d'apprentissage en python est un bon choix, car python offre des outils puissants pour faire la rétropropagation du gradient et la convolution.
Dans cette partie, je vais vous faire voire différentes librairies en python, nous permettant de créer un modèle de deep-learning.

La première librairie que nous allons utiliser se nomme sckikit learn.
Cette librairie à l'avantage d'être facile à manipuler, et à installer.

Pour installer sklearn:
Ouvrez un invite de commande (terminal ou cmd sous windows)
et tapez
pip install sklearn

Il est possible que cette commande échoue en retournant un message comme
"no command name pip"
ou
"pip n'est pas reconnu comme commande interne ou externe"

Si vous avez une erreur de ce type, il vous faut alors tester un maximum de commande différentes.
en voici quelques unes:
pip3 install sklearn
py -m pip install sklearn
py -m pip3 install sklearn
python -m pip install sklearn
python -m pip3 install sklearn
python3 -m pip install sklearn
python3 -m pip3 install sklearn
python-pip install sklearn
python-pip3 install sklearn
python3-pip install sklearn
python3-pip3 install sklearn


Bon, vérifions que l'installation à fonctionnée
Ouvrez python et taper: import sklearn

vous aurez peut-être un message d'erreur de la lib elle même, qui dit...set warning false...blablabla...., ce n'est pas grâve, tant que vous n'avez pas d'erreur de python disant "no module named sklearn", c'est bon.


Voici un exemple de réseau de neurone simple sans convolution:

"- sans convolution? mais tu as dit que c'était nul..."

Attention à ça, les méthodes de convolution servent pour les images.
Ici, on va traiter des données qui sont par exemple des mesures en cm

En fait, il s'agit d'un jeu de données pour apprendre à un réseau à déterminer si une tumeure est cancereuse (on dit maligne) à partir de sa taille, sa texture...



Le plus interréssant à expliquer ici, c'est cette ligne:


Voici donc les éléments un à un:
-activation='tanh' : Vous avez probablement deviné qu'il s'agissait de la fonction d'activation.
tanh, c'est la tangente hyperbolique, on l'a vu avant, c'est celle qui contient les resultats entre -1 et 1.

-max_iter=1000: c'est le nombre maximale d'itérations avant que la fonction de rétro-propagation du gradient s'arrète.
si il est trop faible, la fonction de rétro-propagation du gradient ne peux pas finir ces calculs. dans ce cas, le programme vous l'indique.
Si il est trop élevé, et que pour une raison ou une autre, la fonction de rétropropagation du gradient ne parvient pas à converger (rappelez vous du graphique d'erreur), alors, votre ordinateur va calculer pour rien, pendant un temps proportionel à max-iter.

-alpha=0.000000001: Je ne vous ais pas parlé de ça, les fonctions de rétropropagation d'aujourd'hui, sont si performantes, qu'elles trouve souvent pile poil les coefficient pour lesquels tel entrée à une réponse parfaite.
A cause de cela, la dernière entrée que l'on donne au réseau, à plus d'importance, et le réseau à du mal à généraliser
alpha oblige une erreur à la fonction de rétropropagation du gradient.
grâce à ça on peut "lisser" le réseau

-random_state=42: vous savez qu'avant que la fonction de rétro-propagation ne fasse son oeuvre, les coefficients on des valeurs aléatoires.
plus ces valeurs sont proche des valeurs finales, plus la fonction apprendra vite.
On peut donc donner une initialisation à ces coefficients avec random_state,
il faut faire des tests pour trouver la meilleure initialisation possible...

-hidden_layer_sizes=[10,10]: voila le plus important, cette variable se traduit par "taille des couches cachées", en gros, combien de de couche y a t'il, et combien de neurones y a t'il dans chaque couche.
Ici, il y a une première couche (pas définie dans hidden_layer_sizes), avec autant de neurones que d'entrées, ensuite deux couches de 10 neurones (d'où les [10,10]) et une dernière couche (pas définie dans hidden_layer_sizes) avec autant de neurones que de sorties.


Pour les autres lignes de code, je ne crois pas à avoir à dire beaucoup plus que ce que disent les commentaires.

Avec ce petit réseau, j'optient un score de 83.2 % de fiabilité.
Ce n'est pas mal, mais bon, si je dois monter dans un avion qui à 16.8% de chances de se crasher, je ne serais pas bien.

On va donc essayer d'améliorer un peu le programme, je changerais au passage quelques paramètres comme la fonction d'activation, ce n'est pas parce que c'est mieux, mais juste pour que vous voyez les différentes choses possibles.



Et j'optient 97.2% de fiabilité
C'est mieux, beaucoup mieux !

Bon, qu'est ce que j'ai fait là:
En fait, j'ai recalibré mes données afin qu'elles soient plus générales.
J'ai fait en sorte que toutes mes données soient compriseent entre 0 et 1, avec une moyenne de 0. Un peu comme les fonctions d'activation.
Bon, dit comme ça c'est très abstrait, je vais essayer de vous illuster par un schema:

ici, viendra un schema

On peut voir que l'on a perdu l'information de la position des données, il ne reste plus que l'écart qui existe entre les données, c'est donc seulement là dessus que le réseau va s'appuyer.
Ors, c'est ce qui nous arrange, car on veut que le réseau compare des tumeures malignes et benignes.


Je devine vos pensées, vous devez vous dire: "chouette je sais faire un réseau qui dit si un cancer est malin ou benin ! Mais, si je veux faire autre chose ?"

Sckikit-learn regorge de données dans la partie sklearn.datasets, mais je ne vais pas les explorer, car sur internet, vous les trouverez facilement.
Je vais plutot m'amuser à créer un jeu de données à partir d'une fonction.
Ca ne sert à rien dans ce cas de faire une IA, mais comme du coup vous savez bien comment son agencées les données, ça aide énormément pour comprendre.

Je vais faire une sorte de feu rouge, avec des entrées pouvant être [1, 0, 0], [0, 1, 0] ou [0, 0, 1]
Les sorties devront être dans l'ordre: 0, 1 ou 2.



Vous pouvez voire que sur la dernière ligne, j'ai rajouté une fonction.
Il s'agit en fait de la fonction d'utilisation.
Ici: donne moi la sortie correspondante à [0,1,0]

À l'éxecution, le programme ecrit [1]
Tout est parfait.

D'ailleurs, comme l'on pouvait si attendre, le programme indique une fiabilité de 100%


J'en ai à peu près fini avec sckikit-learn et sa partie sur les réseaux de neurones.
Je vais maintenant vous montrer keras, qui est une librairie bien plus professionelle.





 mactul:

admin
hors ligne
2019-10-11
n'hésitez à poser vos questions et réactions ici

Par ailleurs, si il y a des gens qui ont des connaissances sur le sujet qui ne sont pas expliqués ici, lachez vous !



Pour poster un message, vous devez vous connecter




www.000webhost.com