Durée : 50 minutes
Un réseau de neurones multicouches se compose d'une couche d'entrée, d'une ou plusieurs couches cachées et d'une couche de sortie. Chaque neurone applique une fonction d'activation (souvent la sigmoïde) pour modéliser la non-linéarité.
La rétropropagation permet de calculer les gradients de la fonction de coût par rapport aux poids et de mettre à jour ces derniers en fonction de l'erreur constatée.
Objectif : Construire un réseau à deux couches (une couche cachée) afin de résoudre le problème XOR, impossible à résoudre par un perceptron simple.
import numpy as np
# Fonctions d'activation
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
# Jeu de données pour le problème XOR
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[0], [1], [1], [0]])
np.random.seed(0)
# Architecture 2-2-1
W1 = np.random.randn(2, 2)
b1 = np.zeros((1, 2))
W2 = np.random.randn(2, 1)
b2 = np.zeros((1, 1))
learning_rate = 0.1
n_iterations = 10000
for i in range(n_iterations):
# Forward pass
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2)
# Calcul de l'erreur
error = y - a2
# Backward pass
d_a2 = error * sigmoid_derivative(z2)
d_W2 = np.dot(a1.T, d_a2)
d_b2 = np.sum(d_a2, axis=0, keepdims=True)
d_a1 = np.dot(d_a2, W2.T) * sigmoid_derivative(z1)
d_W1 = np.dot(X.T, d_a1)
d_b1 = np.sum(d_a1, axis=0, keepdims=True)
# Mise à jour des poids et biais
W2 += learning_rate * d_W2
b2 += learning_rate * d_b2
W1 += learning_rate * d_W1
b1 += learning_rate * d_b1
print("Prédictions après entraînement :")
print(a2)
Ce code entraîne un réseau multicouches sur le problème XOR. La rétropropagation permet d'ajuster progressivement les poids, malgré la non-linéarité du problème.