← Comprendre les Réseaux de Neurones
📈 Phase 3 · 2-3 jours

NumPy - voir l'apprentissage

🎯 Ce que tu retiens : L'apprentissage en direct

Le code complet

📖 Vocabulaire - français / anglais

  • époque ↔ *epoch* (un passage complet sur les données)
  • taux d'apprentissage ↔ *learning rate*
  • rétropropagation ↔ *backpropagation*
  • entraînement ↔ *training*
import numpy as np

def sigmoide(x):
    return 1 / (1 + np.exp(-x))

def derivee_sigmoide(x):
    # x est DÉJÀ la sortie de la sigmoïde (pas la somme) -> formule x*(1-x).
    return x * (1 - x)

# 4 fleurs : 2 Setosa, 2 Virginica
X = np.array([[1.4, 0.2], [1.3, 0.2], [4.5, 1.5], [5.1, 1.8]])
y = np.array([[0], [0], [1], [1]])

np.random.seed(1)
poids1 = np.random.uniform(-1, 1, (2, 3))
biais1 = np.random.uniform(-1, 1, (1, 3))
poids2 = np.random.uniform(-1, 1, (3, 1))
biais2 = np.random.uniform(-1, 1, (1, 1))

taux = 0.5

for epoch in range(10001):
    couche1 = sigmoide(np.dot(X, poids1) + biais1)
    sortie = sigmoide(np.dot(couche1, poids2) + biais2)

    erreur = y - sortie

    delta2 = erreur * derivee_sigmoide(sortie)
    delta1 = delta2.dot(poids2.T) * derivee_sigmoide(couche1)

    poids2 += couche1.T.dot(delta2) * taux
    biais2 += np.sum(delta2, axis=0, keepdims=True) * taux
    poids1 += X.T.dot(delta1) * taux
    biais1 += np.sum(delta1, axis=0, keepdims=True) * taux

    if epoch % 500 == 0:
        print(f"=== ÉPOQUE {epoch} ===")
        print(f"Poids1[0,0] (longueur -> Neurone A): {poids1[0,0]:.3f}")
        print(f"Erreur moyenne: {np.mean(np.abs(erreur)):.4f}")

print("\nRésultats finaux:")
print(sortie)

Exercice 3.1 - Observer les poids bouger

✍️ À toi de jouer

Exécute le code et observe la sortie.

  1. Que fait Poids1[0,0] au début ? À la fin ?
  2. L'erreur monte-t-elle ou descend-elle ?
  3. Vers quelle époque les prédictions deviennent-elles correctes (>0.9 pour Virginica, <0.1 pour Setosa) ?
Voir la réponse
  1. Poids1[0,0] part d'environ 0.2 et dépasse 2.0 : le réseau a décidé que la longueur du pétale est importante.
  2. L'erreur diminue progressivement.
  3. En général entre l'époque 2000 et 5000, selon l'initialisation aléatoire.

La leçon : tu as vu l'apprentissage en direct. Personne n'a dit au réseau que la longueur comptait - réduire l'erreur passait par l'augmentation de ce poids, alors il l'a augmenté.

Exercice 3.2 - Casser le modèle (taux d'apprentissage)

✍️ À toi de jouer

Change uniquement la ligne taux = ... et observe. Devine d'abord, puis vérifie :

taux = 20.0        # Test A
taux = 0.000001    # Test B
taux = 0.5         # Test C
Voir la réponse
  • A (20.0) : l'erreur oscille sauvagement, les poids explosent (100, −100…). Le réseau panique et ne converge jamais. Comme conduire en donnant des coups de volant à 90°.
  • B (0.000001) : les poids bougent de 0.00001 par époque. En 10 000 époques, presque rien appris. Comme aller de Québec à Montréal en faisant un pas par jour.
  • C (0.5) : assez grand pour apprendre vite, assez petit pour ne pas déraper.

La leçon : le taux d'apprentissage, c'est la taille du pas quand on descend une colline. Trop grand → on tombe. Trop petit → on n'arrive jamais.