Après une introduction très pratique sur ce qu’est un neurone artificiel, passons à un peu de théorie pour poser les bases pour la suite.
Ce chapitre est uniquement théorique, pour mieux comprendre ce que l’on va voir par la suite.
Nous allons décrire ici les différentes étapes nécessaires pour mener à bien un projet.
Je parle souvent d’images mais le fonctionnement est le même pour des données sous forme de fichier textes.
Il y a différent type d’apprentissage :
- Supervisé : On donne un jeux de données avec des labels/étiquettes correspondants à chacune des classes à reconnaître, c’est ce que l’on a fait dans l’article sur le Perceptron.
- Non-supervisé : La machine découvre elle-même des classes.
- Semi-supervisé : On combine des données labellisées et non-labellisées et la machine va apprendre d’elle même. Cela réduit le nombre de données à labelliser.
- Par renforcement : La machine fait une action et apprend de son comportement. Par exemple on la fait conduire dans un simulateur et elle perd des points à chaque accident. Au début il n’y a que des accidents mais petit à petit elle va réussir à conduire.
Nous n’aborderons ici que l’apprentissage supervisé.
Acquisition des données
C’est une étape cruciale et un des gros inconvénients de l’apprentissage supervisé : il faut un gros volume de données d’entrainement pour que les réseaux de neurones puissent apprendre.
Le volume courant pour de l’analyse d’image est de 10 000 images par classes. Par exemple le jeux de données MNIST consistant a reconnaître des chiffres manuscrits comporte 70 000 exemples de chiffres.
Cette nécessité fait que si vous voulez vous attaquer a un problème nouveau il va probablement vous falloir consacrer plus de temps a la récolte de données qu’a leur traitement .
Pouvoir faire apprendre un réseau de neurones avec beaucoup moins de données, comme le fait un être humain, est un des gros axes de recherche dans le domaine du Deep Learning.
Cependant des solutions intermédiaires existent, comme nous le verrons ultérieurement.
Classification des données
Une fois que vous avez le bon volume de données il faut les classer, on dit aussi labelliser, ou étiqueter. Ceci afin d’indiquer pour chaque image ce qu’elle contient. Or cette étape est souvent entièrement manuelle.
C’est pourquoi certaines organisations font appel a des plateformes spécialisées à cette étape. Amazon Mecanical Turk permet ainsi de faire appel a des personnes réelles pour classifier des données. Cela pour un coût dérisoire qui peut poser un problème éthique.
Pré-traitement des données
Une fois les données réunies et labellisées il va falloir les préparer pour une utilisation par le réseau de neurone.
La première chose a faire est de réduire leur taille. En effet nous sommes habitués à faire des photos en plusieurs millions de pixel, or pour conserver des temps de traitement réaliste, il faut se limiter a des images les plus petites possibles. Par exemple 28×28 pixels pour le jeux de données MNIST. On ne dépasse normalement pas 256×256, soit 0,06 millions de pixels !
L’autre traitement qui peut beaucoup améliorer la rapidité du traitement est de passer les photos en noir et blanc. Ceci divise la complexité par 3 puisqu’il n’y a plus qu’une information de ‘couleur’ (on parle de canaux) au lieu de 3.
Dans le cas de tableau de données, pour de la détection de fraudes par exemple, il faut convertir chaque information en données numérique. En effet les neurones ne traite que des nombres. Il existe des algorithmes pour effectuer cette transformation sans perdre la signification de la donnée initiales.
Il est aussi possible de réduire les données sans trop perdre en précision. Par exemple avec des algorithmes de réduction dimensionnelle tel que l’Analyse par Composante principale.
Ensuite arrivent les traitements destine à améliorer la pertinence. On va par exemple augmenter le contraste de l’image. Ceci afin de faciliter la découverte des zones d’intérêts par le réseau.
Pour terminer on doit mettre en forme les images dans le format attendu par le modèle. Par exemple sous forme d’un tableau a plusieurs dimensions au lieu d’un fichier JPEG.
Augmentation artificiel du jeux de données
Pour augmenter la performance du réseau on peut lui soumettre la même image plusieurs fois, en lui faisant subir des déformations.
C’est une technique qui permet d’améliorer les performances finales. Il s’agit d’augmenter la taille du jeux de données en créant des doublons auxquels on applique un traitement d’image.
Par exemple un effet miroir, des rotations, du flou… Il est préférable de se limiter au cas qui peuvent se présenter réellement : retourner les panneaux de signalisation n’est pas une bonne idée.
Choix du framework
C’est en réalité un choix personnel comme celui d’un langage de programmation. À faire en fonction de ses compétences et objectifs.
C’est plus le choix du réseau de neurones qui va être déterminant pour les performances.
Dans le cadre de ce cours nous utiliserons Keras qui est une librairie Python de haut niveau pour, entre autre, piloter Tensorflow. Ce dernier est le framework de machine learning de Google. C’est un des projets en vogue car il permet à la fois de faire de la recherche et de la production de façon performante.
Choix du réseau de neurone
C’est la partie délicate. C’est là où se situe la plus grosse difficulté technique, qui dépasse largement le périmètre de ce cours. La meilleurs solution est de reprendre un réseau existant pour un problème similaire à celui que l’on veut traiter. Par exemple une configuration de réseau qui fonctionne pour reconnaître des chiffres dans es images devrait pouvoir reconnaître des lettres.
Ou encore un modèle qui reconnait des animaux devrait pouvoir reconnaître des voitures. Un réseau de prédiction de cours de bourse pourrait prévoir la météo.
Il y a plusieurs grandes familles d’architectures de réseau de neurones, par exemple :
- Les réseaux de neurones convolutifs, abrégés CNN pour Convolutional Neural Network en anglais. Ce type de réseau est adapté à l’analyse d’image car il consiste à repérer des détails, puis des ensembles de détails pour construire une abstraction de la données.
Source : umich.edu
- Les réseaux de neurones récurrents, abrégés RNN pour Recurrent Neural Networks. Ils sont adaptés a l’analyse du langage, la prédiction de cours de bourse ou encore la musique. En effet ces réseaux traitent les données de façon séquentielles, les données passées étant considérées en relation avec les données actuelles.
Chaque famille se déclinent dans une infinité de variantes.
Choix du matériel
Le Deep Learning requière de grosses capacités de calcul, en particulier pour l’apprentissage. Les GPUs Nvidia s’y sont fait une place au soleil du fait de l’accélération des temps de calculs qu’ils proposent.
Pour des petits tests un ordinateur portable peut suffire mais il faut rapidement passer à une carte de joueur haut-de-gamme comme la GTX 1080 ti pour ne pas passer son temps à attendre les résultats.
Il y a aussi des cartes dédiés aux calcul pour les professionnelles. La Rolls étant un serveur spécialisé : le DGX1, de Nvidia toujours, à 100 000 € environs !
AMD commence à proposer des cartes et librairies dédiées mais il va falloir attendre que les frameworks adoptent cette technologie.
Une alternative est de passer par des services clouds qui proposent du GPU mais ils sont très chers à long terme, à réserver pour des tests courts.
Pensez aussi au stockage : certains jeux de données requièrent plusieurs dizaines de gigas et un disque rapide type SSD / NVMe est fortement indiqué pour alimenter rapidement le GPU en données.
Apprentissage du réseau de neurones
Nous arrivons enfin à la partie ou c’est la machine qui va travailler pour nous !
La machine va passer en revue chaque données du jeux d’entrainement. Quand le jeux de données a été parcouru complètement une fois, on appel cela une ‘epoch’. Il faut plusieurs epochs pour l’entrainement.
Cependant cette étape doit aussi être ‘pilotée’ par un humain. Afin de choisir les hyper-paramètres, c’est a dire les paramètres d’entraînement.
Par exemple le nombre d’epochs et la taille du ‘batch’, autrement dit le nombre d’images que l’on va analyser d’un bloc dans le GPU.
Apres chaque epochs, la machine va tester son apprentissage en regard du jeux de test. Ce jeux de test n’est pas utilisé dans la phase d’apprentissage, il permet de mesurer le taux de succès des prédictions. En générale on utilise 60% des données pour l’entrainement et 40% pour les tests.
Une fois l’entrainement terminé, on peut aussi faire tourner le modèle sur un jeux de validation. Des images qui n’aurons pas été utilisées ni pour l’apprentissage, ni pour les phases de tests.
Pour gagner beaucoup de temps, on peut utiliser la technique du ‘fine-tunning’ qui consiste à partir d’un réseau pré-entraîné. C’est une technique à privilégier si vous trouvez un réseau pré-entraîné sur un sujet similaire au vôtre. Par exemple pour détecter des hot-dog, un réseau pre-entraîné sur ImageNet, un jeux de données d’objets classiques, fera l’affaire.
Utilisation du réseau de neurone
Maintenant que le réseau est entraîné, nous allons pouvoir l’utiliser pour réaliser des prédictions, c’est à dire indiquer ce qu’il pense être la meilleur réponse en fonction des données qui lui sont présentées.
Il faut lui présenter des données qui ont subit les mêmes pré-traitement que pour l’entraînement. Par exemple, réduire la taille des images et les passer en noir et blanc si c’était le cas.
Post traitement
Il s’agit là d’utiliser la sortie du réseau de neurone pour la mettre en forme en fonction du besoin attendu.
Parfois il n’y a rien de spéciale à faire mais dans d’autre cas cela peut être complexe.
Il faudra aussi décider des seuils à appliquer aux valeurs du taux de confiance du réseau dans sa prédiction. Autrement dit est-ce que l’on prend le risque d’avoir des faux-positifs ou préfère-t-on des vrais-négatifs ? Par exemple un e-commerçant préférera souvent accepter un taux de fraude plutôt que de rejeter des clients légitimes par erreur. Alors qu’à l’inverse un labo pharmaceutique ne pourra se permettre le moindre risque et préférera jeter des médicaments viables.
Mise en production
Une fois que vous êtes satisfait du résultat, il faut déployer votre modèle en production. C’est plus ou moins aisé en fonction des Framework. Certains sont plus adaptés à la recherche.
Il y a aussi une contrainte de plateforme. Par exemple si le modèle doit être utilisé nativement sur un mobile ou un Raspberry Pi. Ou si il doit fonctionner en direct sur un service web ou seulement en traitement par lot nocturne.
Tout recommencer
On pourrait croire que c’est terminé, mais en fait il va falloir mesurer les performances du modèle en production, récupérer plus de données et améliorer les performances.
Pour cela, on peut, par ordre croissante de complexité :
- L’entraîner plus longtemps. En effet, plus on entraîne le réseau, meilleur est son taux de réussite… la limite étant le sur-apprentissage: c’est à dire qu’il est meilleur sur les données d’apprentissage mais moins bon sur de nouvelles données. D’où l’importance des courbes comparant les taux de réussites sur les données d’entraînement et de test. La courbe doit ressembler le plus possible à une exponentielle.
- Modifier les hyper-paramètres du modèle ou de son entraînement. Comme, par exemple, la taille des données par batch (limité par la mémoire du GPU) ou le taux d’apprentissage. Une bonne pratique étant qu’il soit élevé au début et décroisse progressivement.
- Revoir les pré-traitements : peut-être que passer les images en noir et blanc fait perdre des informations essentielles ? Ce n’est pas le cas pour de la reconnaissance d’écriture mais l’est surement pour différencier la rouille de la mousse sur du métal.
- L’entraîner sur plus de données.
- Modifier le réseau de neurone.
- Vous pouvez même être amener à revoir votre jeu de données. Par exemple si l’objet à détecter n’occupe pas suffisamment de place dans l’image on n’est pas bien visible il faudra peut-être réaliser un masque pour chaque image indiquant où se trouve l’objet à détecter.
Conclusion
Comme vous avez pu le remarquer il y a beaucoup à faire pour l’Homme dans le Machine Learning !
Dans le prochain chapitre nous allons passer à la mise en oeuvre concrète de ces étapes.
Merci pour ce travail, je voudrais un exemple de réseau neuronal pour le détail et la compréhension de toutes les techniques merci beaucoup.