Réseaux de neurones
#Réseaux de neurones artificiels
Les réseaux de neurones artificiels sont des modèles computationnels inspirés du fonctionnement du cerveau humain. Ils sont capables d'apprendre des représentations complexes à partir de données et constituent la base de l'apprentissage profond (deep learning).
#Principe
Un réseau de neurones est composé de neurones artificiels (unités de calcul) organisés en couches :
- Couche d'entrée : Reçoit les données
- Couches cachées : Transforment les données de manière non linéaire
- Couche de sortie : Produit le résultat
Chaque connexion entre neurones a un poids qui détermine l'importance du signal transmis.
#Animation interactive
Voici une animation qui illustre le fonctionnement d'un réseau de neurones :
#Concepts fondamentaux
#Neurone artificiel
Un neurone artificiel reçoit des entrées, les combine linéairement, ajoute un biais, puis applique une fonction d'activation non linéaire :
1Sortie = f(Σ(poids_i × entrée_i) + biais)
#Fonctions d'activation courantes
-
Sigmoïde :
σ(x) = 1 / (1 + e^(-x))
- Sortie dans [0, 1]
- Historiquement utilisée, mais cause des problèmes de gradient
-
ReLU :
ReLU(x) = max(0, x)
- Simple et efficace
- Évite le problème du gradient qui s'annule
-
Tangente hyperbolique :
tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
- Sortie dans [-1, 1]
- Zéro-centrée
#Implémentation en Python
1import numpy as np2 3class Neurone:4 def __init__(self, nb_entrees):5 """Initialiser un neurone avec des poids aléatoires"""6 self.poids = np.random.randn(nb_entrees)7 self.biais = np.random.randn()8 9 def sigmoid(self, x):10 """Fonction d'activation sigmoïde"""11 return 1 / (1 + np.exp(-np.clip(x, -500, 500))) # Clipping pour éviter overflow12 13 def forward(self, entrees):14 """Propagation avant"""
#Entraînement
L'entraînement d'un réseau de neurones consiste à ajuster les poids pour minimiser une fonction de perte.
#Rétropropagation du gradient
- Propagation avant : Calculer la sortie pour une entrée donnée
- Calcul de la perte : Comparer la sortie avec la cible
- Rétropropagation : Calculer les gradients de la perte par rapport à chaque poids
- Mise à jour : Ajuster les poids dans la direction opposée au gradient
#Algorithme de rétropropagation
1class NeuroneEntrainable:2 def __init__(self, nb_entrees):3 self.poids = np.random.randn(nb_entrees) * 0.14 self.biais = 0.05 self.derivee_perte_poids = np.zeros(nb_entrees)6 self.derivee_perte_biais = 0.07 8 def sigmoid(self, x):9 return 1 / (1 + np.exp(-np.clip(x, -500, 500)))10 11 def derivee_sigmoid(self, x):12 s = self.sigmoid(x)13 return s * (1 - s)14
#Exercice : Réseau pour la fonction XOR
Implémentez un réseau de neurones capable d'apprendre la fonction XOR, qui ne peut pas être résolue par un seul neurone.
#Instructions
- Créez un réseau avec une couche cachée
- Implémentez la rétropropagation pour tout le réseau
- Entraînez-le sur les données XOR
#Exemple de code
1class CoucheEntrainable:2 def __init__(self, nb_entrees, nb_neurones):3 self.neurones = [NeuroneEntrainable(nb_entrees) for _ in range(nb_neurones)]4 5 def forward(self, entrees):6 return np.array([neurone.forward(entrees) for neurone in self.neurones])7 8 def backward(self, derivees_perte_sorties):9 derivees_perte_entrees = np.zeros(len(self.neurones[0].entrees))10 11 for i, neurone in enumerate(self.neurones):12 derivee_perte_entree = neurone.backward(derivees_perte_sorties[i])13 derivees_perte_entrees += derivee_perte_entree14
#Applications
- Reconnaissance d'images : Classification, détection d'objets
- Traitement du langage naturel : Traduction, génération de texte
- Reconnaissance vocale : Conversion parole-texte
- Jeux : AlphaGo, échecs
- Médecine : Diagnostic, découverte de médicaments
- Finance : Détection de fraudes, algorithmes de trading
Les réseaux de neurones sont devenus omniprésents dans l'intelligence artificielle moderne, permettant des avancées spectaculaires dans de nombreux domaines.