Dans la dernière leçon, vous avez découvert les arbres de décision, KNN et la régression linéaire. Ils sont puissants — mais ils peinent avec des tâches complexes comme la reconnaissance faciale ou la compréhension du langage.
Pour ces tâches, nous avons besoin de réseaux de neurones — des algorithmes inspirés du fonctionnement de votre cerveau.
Votre cerveau possède environ 86 milliards de neurones. Chacun :
Un neurone artificiel fait la même chose, avec des nombres :
Entrées Poids Somme Activation Sortie
────── ───── ───── ────────── ──────
x₁ = 0.5 ──→ w₁ = 0.8 ─┐
├──→ 1.25 ──→ f(1.25) ──→ 0.78
x₂ = 0.3 ──→ w₂ = 1.5 ─┘
Somme = (0.5 × 0.8) + (0.3 × 1.5) = 0.40 + 0.85 = 1.25
Pensez aux poids comme des boutons de volume sur une table de mixage. Chaque entrée est un instrument différent. Les poids contrôlent le volume de chaque instrument. Le neurone les mélange, et la fonction d'activation décide si le son combiné est assez fort pour passer.
Un seul neurone ne peut pas faire grand-chose. La puissance vient de l'organisation en couches.
1. Couche d'entrée — Les yeux et les oreilles 👀
2. Couche(s) cachée(s) — Le cerveau pensant 🧠
3. Couche de sortie — La réponse 💡
COUCHE D'ENTRÉE COUCHE CACHÉE 1 COUCHE CACHÉE 2 COUCHE DE SORTIE
(3 features) (4 neurones) (4 neurones) (2 classes)
[x₁] ──────→ [h₁] ──────→ [h₅] ──────→ [Chat : 0.92]
[x₂] ──────→ [h₂] ──────→ [h₆] ──────→ [Chien : 0.08]
[x₃] ──────→ [h₃] ──────→ [h₇]
[h₄] ──────→ [h₈]
Le terme « apprentissage profond » signifie simplement un réseau de neurones avec beaucoup de couches cachées — plus de 2. GPT-4 a plus de 100 couches ! Plus de couches permettent d'apprendre des motifs de plus en plus abstraits : bords → formes → objets → scènes.
Après qu'un neurone additionne ses entrées, il doit décider : dois-je m'activer ou non ?
Imaginez un tuyau avec une valve :
ReLU — La porte simple
def relu(x):
return max(0, x)
print(relu(3.5)) # 3.5 (positif → passe)
print(relu(-2.0)) # 0.0 (négatif → bloqué)
Sigmoïde — Le compresseur doux
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
print(sigmoid(5.0)) # 0.993 (très confiant "oui")
print(sigmoid(0.0)) # 0.500 (complètement incertain)
print(sigmoid(-5.0)) # 0.007 (très confiant "non")
Softmax — Le compteur de votes
Sorties brutes : [2.0, 1.0, 0.5]
Après softmax : [0.59, 0.24, 0.17] → Chat (59 %), Chien (24 %), Oiseau (17 %)
Pourquoi les fonctions d'activation ? Sans elles, un réseau — peu importe le nombre de couches — ne serait qu'une régression linéaire sophistiquée. Les fonctions d'activation introduisent la non-linéarité, permettant au réseau d'apprendre des courbes et des motifs complexes.
Pensez à une course de relais :
Classifions si un fruit est une pomme ou une orange :
Entrée : poids = 150g, couleur = 0.8 (orangé)
Étape 1 — La couche d'entrée transmet :
x₁ = 150 (poids), x₂ = 0.8 (couleur)
Étape 2 — Neurone caché 1 :
somme = (150 × 0.01) + (0.8 × 2.0) + biais(0.1) = 3.2
sortie = ReLU(3.2) = 3.2
Étape 3 — Neurone caché 2 :
somme = (150 × -0.005) + (0.8 × 1.5) + biais(0.3) = 0.75
sortie = ReLU(0.75) = 0.75
Étape 4 — Couche de sortie :
score_pomme = (3.2 × -0.5) + (0.75 × 0.8) = -1.0
score_orange = (3.2 × 0.7) + (0.75 × 0.3) = 2.465
Étape 5 — Softmax :
Pomme : 18 %
Orange : 82 % ← Prédiction : Orange ! 🍊
La propagation avant donne une prédiction. Mais si elle est fausse ? C'est là que la rétropropagation intervient.
Propagation avant : Données → Réseau → Prédiction
↓
Comparer : Prédiction vs Réponse réelle = Erreur
↓
Rétropropagation : L'erreur remonte EN ARRIÈRE dans le réseau
↓
Mise à jour : Ajuster les poids pour réduire l'erreur
↓
Répéter : Faire cela des milliers de fois !
Imaginez une chaîne de montage produisant des produits défectueux. Pour corriger le problème, vous remontez la chaîne depuis le produit final : « L'emballage était-il mauvais ? La peinture ? La matière première ? » Chaque station ajuste son processus. C'est la rétropropagation.
Traçons les données dans un petit réseau qui classifie les e-mails spam.
Caractéristiques :
import math
# Entrées
x1, x2 = 5, 1
# Neurone caché 1
z1 = (x1 * 0.6) + (x2 * 0.9) + 0.1 # = 4.0
h1 = max(0, z1) # ReLU → 4.0
# Neurone caché 2
z2 = (x1 * 0.3) + (x2 * 0.4) + 0.2 # = 2.1
h2 = max(0, z2) # ReLU → 2.1
# Neurone de sortie
z_out = (h1 * 0.7) + (h2 * 0.5) - 0.5 # = 3.35
output = 1 / (1 + math.exp(-z_out)) # Sigmoïde → 0.966
print(f"Couche cachée : h1={h1}, h2={h2}")
print(f"Sortie brute : {z_out:.2f}")
print(f"Probabilité de spam : {output:.1%}") # 96,6 % → SPAM ! 🚫
Données (Leçon 1) → Algorithme (Leçon 2) → Réseau de Neurones (Leçon 3)
📊 🧮 🧠
Les réseaux de neurones alimentent :
L'idée des réseaux de neurones a été proposée en 1943 — il y a plus de 80 ans ! Mais ils ne sont devenus pratiques que dans les années 2010, quand nous avons eu assez de données et d'ordinateurs assez rapides (GPU) pour les entraîner.
Félicitations — vous comprenez maintenant les trois piliers de l'IA : données, algorithmes et réseaux de neurones ! Dans les prochaines leçons, nous explorerons les outils d'IA et l'IA responsable 🌱