Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. Intelligence artificielle vulgarisée
  3. Un neurone pour prédire
Extrait - Intelligence artificielle vulgarisée Le Machine Learning et le Deep Learning par la pratique
Extraits du livre
Intelligence artificielle vulgarisée Le Machine Learning et le Deep Learning par la pratique
2 avis
Revenir à la page d'achat du livre

Un neurone pour prédire

Ce que nous allons découvrir et les prérequis

Jusqu’à présent, nous avons découvert et mis en pratique les principes du Machine Learning à travers l’utilisation d’algorithmes issus des statistiques. Nous allons à présent voir comment une machine peut apprendre à partir d’algorithmes imaginés et conçus à partir des sciences cognitives à savoir les réseaux de neurones.

Prérequis nécessaires pour bien aborder ce chapitre : avoir lu les chapitres Les fondamentaux du langage Python, Des statistiques pour comprendre les données, Principaux algorithmes du Machine Learning et Abricots, cerises et clustering.

1957 - Le perceptron

Le perceptron, réalisé en 1957 par Frank Rosenbalt, est un algorithme d’apprentissage supervisé. Cependant, ce qui le différencie de ceux que nous avons découverts et utilisés dans le chapitre précédent c’est sa conception issue des sciences cognitives. Le perceptron sous sa forme la plus simple, avec lequel nous aurons l’occasion de faire connaissance d’ici quelques instants, est également nommé neurone formel (issu des travaux de Mc Culloch et Pitts en 1943) et a pour but de séparer des observations en deux classes (ou groupes) distinctes à condition que ces données soient linéairement séparables. Son rôle est donc de classifier.

1. Un peu de biologie

Rappelons-nous quelques instants nos cours de biologie du collège ou du lycée lorsque notre professeur nous expliquait le fonctionnement de notre cerveau.

Notre cerveau est composé de 86 à 100 milliards de neurones dont le rôle est d’acheminer et de traiter des messages dans notre organisme. Certains neurones ont un rôle dédié aux perceptions des sensations et aux mouvements alors que d’autres sont responsables des fonctions automatiques de notre corps (digestion, respiration…).

Biologiquement, un neurone est une cellule, composée :

  • D’un corps cellulaire appelé également...

Des données linéairement séparables

Le perceptron simple couche ou neurone formel n’est en mesure de classifier que des données linéairement séparables. Lorsque celles-ci ne le seront pas, nous utiliserons un perceptron multi-couche dont nous aurons l’occasion de découvrir les principes et le fonctionnement dans le chapitre suivant.

Comme vous le savez à présent, des données linéairement séparables sont celles pouvant être séparées par une droite. Pour modéliser simplement ce concept nous allons utiliser les fonctions logiques ET, OU et le OU Exclusif.

Si l’on considère deux éléments A et B. Si un résultat dépendant de A et de B est calculé en appliquant la logique ET (AND en anglais) pour A et B, alors :

  • Le résultat sera VRAI si A ET B sont VRAI (leur valeur égale à 1).

ET

A

B

A ET B

0

0

FAUX

0

1

FAUX

1

0

FAUX

1

1

VRAI

Maintenant, si le résultat dépend de A et de B avec cette fois-ci la logique OU (OR en anglais).

  • Le résultat sera VRAI si A OU B sont VRAI.

OU

A

B

A OU B

0

0

FAUX

0

1

VRAI

1

0

VRAI

1

1

VRAI

Si l’on représente graphiquement ces deux cas, on constate qu’ils sont linéairement séparables.

images/11FL04.png

Représentation graphique des fonctions logiques ET et OU

Considérons à présent la règle suivante...

Fonctions d’activation, rétropropagation et descente de gradient

Nous allons à présent entrer dans le détail du fonctionnement du perceptron en introduisant des notions que vous serez amené à rencontrer lorsque vous utiliserez des réseaux de neurones pour mener à bien vos projets de classification.

1. La fonction d’activation

Comme nous l’avons vu lors de la présentation du neurone biologique, celui-ci s’active si un seuil de tension électrique a été dépassé. Pour notre neurone artificiel, son activation sera également déclenchée en fonction d’un seuil.

La première étape dans la détermination de l’activation ou non d’un neurone artificiel est de réaliser la somme des produits des poids synaptiques avec les valeurs d’entrées. Cette étape peut être considérée comme étant une préactivation du neurone. Une fois cette somme réalisée, nous allons utiliser une fonction d’activation qui va nous permettre de déterminer si le neurone doit s’activer ou non. Cette activation sera en fait la prédiction de notre neurone. Pour calculer cette prédiction, il existe plusieurs fonctions utilisables.

a. La fonction de seuil binaire

La première fonction qui peut nous être utile est la fonction de seuil binaire. Cette fonction retourne une valeur égale à 0 ou 1. Prenons comme hypothèse que la somme pondérée des différentes valeurs de chaque entrée fait 0,8 et que nous avons défini un seuil à 0,5. Comme 0,8 est supérieur à 0,5, la fonction renvoie la valeur 1 (le neurone s’active). Si la valeur de cette somme pondérée était inférieure à 0,5, la fonction d’activation renverrait 0.

Voici...

La rétropropagation de l’erreur

Passons à présent à la notion de rétropropagation. La particularité des réseaux de neurones est qu’ils apprennent de leurs erreurs. L’étape consistant à réaliser la somme pondérée des entrées et à utiliser une fonction d’activation pour obtenir une valeur de prédiction est appelée la phase de propagation. Car nous partons des points d’entrées du neurone artificiel vers son point de sortie pour réaliser ces calculs.

Une fois la prédiction réalisée, nous allons comparer la prédiction réalisée par le neurone artificiel avec la prédiction attendue en faisant la différence entre la valeur attendue et la valeur prédite. En faisant cela, nous venons de calculer l’erreur de prédiction.

Une fois cette erreur obtenue, nous allons à présent parcourir le neurone en sens inverse (de la sortie vers les entrées) afin de prendre en compte l’erreur commise lors de la prédiction dans l’apprentissage en ajustant les valeurs des différents poids (nous verrons comment un peu plus loin dans ce chapitre). Cette phase est appelée la rétropropagation de l’erreur.

Les fonctions de perte (Loss function)

Là encore, ce terme vous deviendra vite familier au fur et à mesure de vos diverses expérimentations avec les réseaux de neurones.

Une fonction de perte, ou Loss function, est une fonction qui évalue l’écart entre les prédictions réalisées par le réseau de neurones et les valeurs réelles des observations utilisées pendant l’apprentissage. Plus le résultat de cette fonction est minimisé, plus le réseau de neurones est performant. Sa minimisation, c’est-à-dire réduire au minimum l’écart entre la valeur prédite et la valeur réelle pour une observation donnée, se fait en ajustant les différents poids du réseau de neurones.

1. L’erreur linéaire ou erreur locale

Comme nous venons de l’indiquer, l’erreur d’apprentissage, appelée aussi erreur locale, se calcule en réalisant la différence entre la valeur réelle à prédire et la valeur prédite par le neurone artificiel.

Erreur = Prediction_reelle - Prediction_realisee 

C’est cette erreur que nous chercherons à minimiser au fur et à mesure des apprentissages.

Cette erreur peut être qualifiée d’erreur locale, car elle se focalise sur une observation donnée en comparant la valeur réelle...

La descente de gradient

La descente de gradient a déjà été abordée dans le chapitre Principaux algorithmes du Machine Learning consacré aux statistiques, mais il est sans doute important d’y revenir à présent, car il s’agit d’un concept important dans la compréhension du fonctionnement des réseaux de neurones.

L’objectif de la descente de gradient est de minimiser la fonction d’erreur en ajustant petit à petit les paramètres d’apprentissage représentés par les différents poids.

Reprenons l’image de la descente de la montagne. Vous vous situez au point le plus haut de la montagne et vous souhaitez atteindre la plaine en contrebas. Cependant, il fait nuit noire et vous n’êtes pas en mesure de voir où vous allez. Vous allez donc progresser doucement par petits pas jusqu’à atteindre le bas de la vallée.

La descente de gradient correspond à cette métaphore et se réalise par l’ajustement des différents poids du réseau de neurones jusqu’à obtenir une convergence, c’est-à-dire un minimum d’erreurs. Cet ajustement se fait par petit pas à l’aide d’un hyper paramètre appelé taux d’apprentissage (learning rate).

La différence entre un paramètre et un hyper paramètre...

Le biais, un neurone particulier

Nous avons vu que le réseau de neurones est composé de neurones d’entrée, correspondant aux données d’une observation et qu’on attribue un poids à chaque entrée. Ce couple entrée/poids permet de réaliser la phase de propagation à l’aide d’une fonction d’activation.

Maintenant, si nous souhaitons "forcer" la valeur de la prédiction pour certaines valeurs d’entrée cela est possible à l’aide de ce que l’on appelle un biais.

Prenons un exemple simple dont la fonction d’activation est de type ReLU.

Imaginons le cas où notre neurone artificiel est composé de 2 entrées ayant pour valeurs 1 et 2, de 2 poids ayant pour valeurs -0,45 et 0,1 et d’une sortie.

La valeur de cette sortie est calculée comme suit :

ReLU (1*-0,45 + 2 * 0,1) = 0

En effet, la somme pondérée est égale à -0,25, mais comme nous utilisons une fonction d’activation de type ReLU mettant à zéro toute valeur négative la prédiction est égale à 0. La prédiction est donc égale à 0 %.

Maintenant, si à partir des mêmes valeurs d’entrée, nous souhaitions que la valeur de prédiction soit différente et que le neurone s’active, nous allons utiliser un biais...

Un cas pratique pour comprendre le perceptron

Nous allons à présent détailler de façon chiffrée un exemple qui nous permettra de bien comprendre les concepts vus jusqu’à présent. Mais pas de panique, les calculs ne seront pas compliqués et resteront accessibles en termes de compréhension.

Comme nous l’avons vu au début de ce chapitre, l’objectif du perceptron est de classifier les observations. Nous vous proposons de créer un modèle capable de déterminer si un étudiant, selon des critères précis, peut être reçu ou non dans une prestigieuse université : l’IA Academy.

L’admission dans cette université dépend de la réussite ou non de certains examens d’entrée. Le tableau ci-dessous regroupe différents cas d’admissions et de refus en fonction de la réussite ou non aux examens en mathématiques, informatique.

Réussite à l’examen de mathématiques

Réussite à l’examen d’informatique

Admis

OUI

NON

NON

OUI

OUI

OUI

NON

OUI

NON

NON

NON

NON

Vous l’aurez sans doute remarqué, l’admission à l’université répond à la fonction logique du ET.

1. Initialisation du perceptron

Nous allons initialiser notre perceptron avec une couche de deux neurones en entrée correspondant chacun à la réussite aux examens et un neurone de sortie qui permettra de classifier l’étudiant en tant qu’admis ou refusé dans l’université. En complément des deux neurones d’entrée, nous allons en ajouter un autre appelé biais (seuil) qui a pour but de contrôler la prédisposition du neurone à s’activer ou non et qui prendra toujours la valeur 1.

Notre perceptron est à présent prêt à apprendre.

Notons la notation particulière de chaque poids. W11, W21 et Wb. W ayant pour signification Weight (Poids) suivi du numéro du neurone et du numéro de la couche. Ainsi, W11 se lit poids du premier neurone de la première couche, W21 poids du deuxième neurone de la première couche, ainsi de suite. Wb signifiant alors poids (Weight) du biais (bias en anglais).

images/11FL13.png

Neurone formel

2. Les étapes d’apprentissage...

Codons notre premier neurone formel "From Scratch"

Les précédents paragraphes demandent sans doute plusieurs lectures avant d’être totalement compris. C’est pourquoi nous allons en complément de l’exemple chiffré réalisé précédemment coder notre premier neurone formel afin de bien comprendre toute la mécanique de l’apprentissage à travers un exemple concret.

Vous êtes maintenant habitué, nous vous laissons le soin de créer un nouveau projet dans l’éditeur PyCharm et d’y ajouter un nouveau fichier script que nous nommerons perceptron.py.

Pour mener à bien le projet, nous aurons besoin des librairies matplotlib et numpy.

1. Les données d’apprentissage

La première chose que nous allons faire est de créer nos données d’apprentissage et définir le taux d’apprentissage :

#------------------------------------- 
#    OBSERVATIONS ET PREDICTIONS 
#------------------------------------- 
 
observations_entrees = array([ 
                             [1, 0], 
                             [1, 1], 
                             [0, 1], 
                             [1, 0]]) 
 
 
predictions = array([[0],[1], [0],[0]]) 

2. Définition des poids

Passons maintenant à la génération des poids de façon aléatoire, compris dans l’intervalle de valeur [-1,1] :

#Génération des poids dans l'intervalle [-1;1] 
random.seed(1) 
borneMin = -1 
borneMax = 1 
 
w11 = (borneMax-borneMin) * random.random() + borneMin 
w21 = (borneMax-borneMin) * random.random() + borneMin 
w31 = (borneMax-borneMin) * random.random() + borneMin 

N’oublions pas le biais qui aura pour valeur 1 et dont le poids sera égal à 0.

#Le biais 
biais = 1 
wb = 0 

3. Gestion des hyperparamètres

Nous allons à présent définir les hyperparamètres représentant le nombre d’épochs...

Un neurone artificiel avec TensorFlow

Après avoir codé notre neurone artificiel de façon "artisanale", nous allons à présent voir comment utiliser le module TensorFlow pour créer ce même neurone artificiel.

1. Un petit mot sur TensorFlow

De nos jours, lorsque nous demandons à des développeurs de nous conseiller un outil de Machine Learning et de Deep Learning, leur réponse est souvent le framework "TensorFlow" développé par Google.

En 2011, le projet Google Brain voit le jour en ayant pour objectif d’améliorer les performances commerciales et les expériences utilisateurs de Google, à l’aide du Deep Learning. En effet, au vu de la quantité de données accumulées par Google à l’aide de ses produits Gmail, Google Photo et son moteur de recherche, le Deep Learning semblait tout indiqué pour améliorer les performances commerciales de Google à partir de ces données, sans oublier l’axe recherche scientifique. De cette activité est né le produit interne à Google nommé DistBielef qui fut remanié afin de le rendre plus rapide et plus solide tout en prenant le nom de TensorFlow. En 2015, Google décide de rendre publique la bibliothèque TensorFlow, avec une version reconnue comme stable en 2017.

Tensorflow s’articule autour d’une architecture composée de trois briques qui sont :

  • Le prétraitement des données

  • La construction des modèles de prédictions

  • L’évaluation des modèles

TensorFlow tire son nom du terme mathématique Tensor (Tenseur) exprimant la faculté de traiter des tableaux en multidimension et de Flow (Processus) permettant de représenter toutes les étapes nécessaires à la création d’un modèle.

Maintenant que nous en savons un peu plus sur le module TensorFlow, nous pouvons l’ajouter à notre projet pour découvrir comment l’utiliser sur notre cas pratique.

L’installation du module TensorFlow dans l’outil de développement PyCharm est identique à l’installation des autres modules que vous avez maintenant l’habitude d’installer.

2. Données d’apprentissage et de tests

Une fois le module TensorFlow installé...

Un premier pas vers le Deep Learning

Nous voici au terme de ce chapitre qui nous a permis de comprendre le fonctionnement d’un neurone formel qui, rappelons-le, n’est capable de ne classifier que des données linéairement séparables. Cependant, nous l’avons vu au cours des différents exemples rencontrés jusqu’à présent, cette notion de séparation linéaire n’est pas adapté à tous les problèmes de classification.

Par conséquent, dans le chapitre suivant nous allons voir qu’en ajoutant des couches de neurones supplémentaires à notre neurone formel, nous allons pouvoir classifier des données non linéairement séparables.