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.
- Que fait
Poids1[0,0]au début ? À la fin ? - L'erreur monte-t-elle ou descend-elle ?
- Vers quelle époque les prédictions deviennent-elles correctes (>0.9 pour Virginica, <0.1 pour Setosa) ?
Voir la réponse
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.- L'erreur diminue progressivement.
- 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 CVoir 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.