Réseaux de neurones
Machine learning
Le machine learning, apprentissage automatique ou apprentissage statistique en français, est une technologie d’intelligence artificielle basée sur le fait que la machine peut apprendre toute seule en se basant sur des modèles statistiques permettant d’effectuer des analyses prédictives.(Bastien L, 2018). Il existe plusieurs modes d’apprentissage, comme par exemple : l’apprentissage supervisé, l’apprentissage non-supervisé et l’apprentissage par renforcement.(Chaouche, 2018). Dans le cas de l’apprentissage supervisé, nous devons fournir des données à la machine et nous devons lui donner la réponse attendue, aidant la machine à faire les bonnes prédictions(Chaouche, 2018). Ensuite, dans le cas de l’apprentissage non-supervisé, nous n’indiquons pas à la machine ce que nous voulons comme sortie, la machine va tout simplement regrouper les données par similitude(Chaouche, 2018). Et dans le cas de l’apprentissage par renforcement, la machine va apprendre par récompense.
C’est-à-dire, lorsque celle-ci améliore sa performance, elle reçoit une récompense et ceci va donc augmenter les chances que ce comportement se reproduise(Chaouche, 2018). Dans le cadre de ce travail de bachelor, c’est l’apprentissage supervisé qui sera expliqué et analysé dans le but de créer un modèle statistique qui nous permette de classifier correctement des données. Le concept d’apprentissage automatique existe depuis les années 1950 mais, aujourd’hui les systèmes d’apprentissage automatique sont devenus plus complexes, la puissance de calcul a augmenté manière exponentielle (Moore, 1965) et avec Internet, la quantité de données à disposition est astronomique(Schultz, 2017). Ce sont quelques raisons qui ont fait en sorte que ces systèmes soient en vogue depuis quelques années(Hodjat et al., 2015). Afin de bien comprendre le fonctionnement de ceux-ci, nous devons d’abord comprendre l’un des premiers concepts de neurones artificiels : le perceptron.
Surentraînement
La phase d’entraînement peut s’avérer délicate. En effet, il est facile de surentraîner un perceptron, ce qui veut dire que celui-ci a mémorisé les données fournies et n’est pas assez générale pour être appliqué à d’autres données. Pour éviter ce problème, celui-ci doit passer une phase de tests(Geitgey, 2014). Pour cela, nous devons avoir un jeu de données que l’on peut diviser en deux parties. Cette division peut se faire de plusieurs façons. Un exemple, c’est de prendre 80% des données comme entraînement et 20% de test(Shah, 2017). La phase de tests sert à introduire de nouvelles données dans le réseau de neurones artificiels qui n’ont pas été utilisées dans la phase d’apprentissage(Ivanov, 2017), et avoir un pourcentage de réponses justes. Si le pourcentage n’est pas satisfaisant, nous pouvons modifier la façon dont les données sont divisées. Par exemple, 70% pour la phase d’apprentissage et 30% pour la phase de test(Ivanov, 2017). En revanche, pour savoir si le pourcentage est suffisant, il n’y a pas de règle universelle préconisée car cela dépend du domaine en question(Saitta, 2010). Il y a certains problèmes, comme la prédiction des valeurs des actions d’une entreprise, où il n’est pas possible de prendre en compte toutes les variables influençant les résultats. A l’inverse, dans le domaine de la reconnaissance d’image, les données que nous avons à traiter son uniquement des pixels. Par conséquent, il n’existe pas de variables externes influençant ce résultat(Saitta, 2010). D’autres techniques qui influencent le surentrainement seront abordées dans le chapitre dédiés aux réseaux de neurones à convolution « 2.4.5 Apprentissage d’un réseau de neurones à convolution ».
Le sous-apprentissage
Un réseau de neurones artificiels peut mémoriser les données mais il peut aussi ne pas apprendre suffisamment pour être généralisable. Afin d’éviter le sous-apprentissage, nous devons mélanger toutes les données avant la phase d’entraînement (Ivanov, 2017). En effet, si nous voulons classifier des chats et des chiens mais que tous les chats se trouvent au début de l’ensemble de données et que les chiens se trouvent à la fin, alors le réseau saura classifier des chats, mais il n’aura jamais reçu un chien en entrée. Sa précision sera alors mauvaise. Aussi, il est important d’avoir un nombre équilibré de données pour chaque classe à prédire(Ivanov, 2017). Si nous possédons 20 fois plus d’images de chats que de chiens, alors il est possible que le réseau soit optimisé pour la classification de chats mais qu’il soit mauvais pour la classification de chiens.
Les couches cachées
Le théorème d’approximation universelle nous indique que tous les problèmes non-linéaires peuvent être résolus à l’aide d’un réseau de neurones ayant une seule couche cachée avec un nombre fini de neurones(Heaton, 2017). Cependant, ce théorème n’explique pas comment le réseau pourrait apprendre tout type de problème. Ce théorème a été démontré par George Cybenko en 1989 (Cybenko, 1989) en utilisant des fonctions sigmoïdes et, en 1991, Kurt Hornik (HORNIK, 1991) a prouvé que c’est l’architecture elle-même des réseaux de neurones artificiels qui permet d’approximer toutes les fonctions(Heaton, 2017). Or, depuis 1991, notre compréhension du fonctionnement des réseaux de neurones artificiels a changé. En utilisant une seule couche, nous pouvons donc approximer toute fonction, mais elle ne sera pas généralisable, d’où la nécessité d’utiliser plusieurs couches cachées. En 2006, Geoffrey Hinton a créé le Deep Learning (Hinton et al., 2006). Il a démontré qu’en utilisant plusieurs couches cachées, la précision des réseaux s’améliore dans les domaines de la reconnaissance d’image, de la reconnaissance vocale et de l’analyse de texte(Kate Allen, 2015). Mais, comment définir l’architecture d’un réseau étant donné la multitude de configurations possibles de nombre de couches cachées et de neurones artificiels par couche à utiliser ?
Le nombre de couches à utiliser
Le nombre de couches cachées à utiliser dépend du problème à traiter. En effet, si le jeu de données à traiter est simple, deux couches cachées ou moins, sont souvent suffisantes(Heaton, 2017). Cependant, lorsque le problème et les données à traiter sont plus complexes, comme la reconnaissance d’image, il peut être utile d’utiliser des couches additionnelles(Heaton, 2017). Pour décider si nous devons utiliser une ou deux couches cachées, nous pouvons utiliser une technique qui consiste à commencer avec une seule couche cachée et de l’adapter (Voir 2.3.2.2 Le nombre de noeuds à utiliser par couche) jusqu’à trouver une architecture satisfaisante. Si une seule couche cachée ne produit pas des résultats satisfaisants, alors nous devons passer à deux couches cachées. Définir ce qu’est un problème simple n’est pas facile. Cependant, si le problème à traiter est lié à du traitement de texte ou à de la reconnaissance d’image, par exemple, il est recommandé de commencer avec plus de 2 couches(Heaton, 2017). Rien n’indique que tous les autres types de problèmes peuvent être résolus avec 2 couches cachées ou moins. Ces recommandations nous permettent juste d’avoir un point de départ pour tester plusieurs architectures.
Apprentissage d’un réseau de neurones à convolution
La phase d’apprentissage, de test et validation du réseau de neurones à convolution reste très similaire à celui du réseau de neurones multicouches, et les filtres sont adaptés à chaque itération également. Cependant, d’autres techniques de prévention de surentrainement ou sous-apprentissage peuvent être appliquées. Une technique est le DropOut. L’idée de cette technique est de désactiver des neurones de manière aléatoire dans notre réseau afin que celui-ci soit redondant et qu’il puisse trouver de nouveaux moyens de résoudre un même problème(Deshpande, 2016). Cette technique n’est utilisée que pendant la phase d’apprentissage. Il faut que la probabilité qu’un neurone ne soit pas désactivé soit entre 0.5 et 0.8 pour obtenir les meilleurs résultats(Srivastava et al., 2014). Ceci peut se faire par un tirage aléatoire. Par exemple, en jetant une pièce pour décider de la désactivation d’un neurone, on obtiendrait une probabilité de 0.5. Le nombre de neurones est donc réduit mais de façon aléatoire à chaque itération d’apprentissage. Cette technique fonctionne bien dans la généralisation d’un réseau car comme vu dans le chapitre « 2.3.2.2 – Le nombre de noeuds à utiliser par couche », moins nous avons de neurones, plus le réseau se généralise.
La technique de DropOut peut être utilisée dans la phase d’apprentissage d’un réseau de neurones multicouches ou après une phase de Pooling. Il est tout de même recommandé de le faire dans la phase d’apprentissage du réseau de neurones multicouches car il y a plus de connexions entre les neurones et l’impact du DropOut est plus élevé(Deshpande, 2016). Une technique qui nous permet d’éviter le sous-apprentissage est d’utiliser un modèle statistique pré-entrainé(Deshpande, 2016). Cela consiste à prendre un réseau déjà entrainé sur un ensemble de données semblables mais plus grand que celui que nous avons à disposition. Ce réseau a aura donc appris à détecter des formes et des objets dans notre ensemble de données et il suffit d’adapter la dernière couche du réseau de neurones à convolution afin que celui-ci classifie correctement les éléments qui nous intéressent. Pendant la phase d’apprentissage, tous les poids restent gelés, c’est-à-dire, ils ne sont pas adaptés à chaque itération. Seuls les poids de la dernière couche (sortie) s’adaptent(Deshpande, 2016).
|
Table des matières
1. Introduction
2. Réseaux de neurones
2.1 Machine learning
2.2 Perceptron
2.2.1 Structure
2.2.2 Phase d’apprentissage
2.2.2.1 Le biais
2.2.2.2 Surentraînement
2.2.2.3 Le sous-apprentissage
2.2.2.4 Le meilleur modèle statistique
2.2.3 Le problème XOR
2.3 Les réseaux de neurones multicouches
2.3.1 L’architecture d’un réseau de neurones
2.3.2 Les couches cachées
2.3.2.1 Le nombre de couches à utiliser
2.3.2.2 Le nombre de noeuds à utiliser par couche
2.3.3 Application à la reconnaissance d’image
2.3.3.1 Les difficultés d’un réseau de neurones pour la reconnaissance d’image
2.3.3.1.1 Le nombre de poids :
2.3.3.1.2 Reconnaissance d’images plus complexes
2.4 Réseau de neurones à convolution
2.4.1 Convolution
2.4.1.1 Effets d’application de filtres
2.4.2 ReLu – Unité linéaire rectifiée
2.4.3 Pooling
2.4.4 Architecture
2.4.5 Apprentissage d’un réseau de neurones à convolution
3. TensorFlow
3.1 Pourquoi TensorFlow ?
3.2 Structure
3.3 Exécution
3.3.1 Graphe de flux de données
3.4 En pratique
3.4.1 Tensors
3.4.2 Les bases d’images basée sur la technologie des réseaux de neurones BARREIRO LINDO Flávio
3.4.3 Les opérations
3.4.4 Les variables
3.4.5 Un réseau de neurones à convolution
3.4.6 TensorBoard
4. Implémentation
4.1 Architecture pour compter des personnes
4.2 Traitement des données
4.2.1 Chargement des images
4.2.2 Chargement des labels
4.3 Entrainement
4.4 Résultats
4.5 Production
4.5.1 gRPC
4.5.2 Enregistrer un modèle statistique
4.5.3 Serveur de production
4.5.4 Création d’un client
4.6 Nouvelle architecture de réseaux de neurones à convolution
4.6.1 Entrainement
4.6.2 Architecture avec une API REST
4.6.3 Fiabilité du modèle statistique
4.6.3.1 Améliorer la précision du modèle statistique
5. Conclusion
Bibliographie
Télécharger le rapport complet