L'algorithme qui permet aux réseaux de neurones d'apprendre
La backpropagation (rétropropagation du gradient) est l'algorithme fondamental qui permet aux réseaux de neurones d'apprendre à partir de leurs erreurs. C'est essentiellement un algorithme d'optimisation qui ajuste les poids du réseau pour minimiser l'erreur de prédiction.
Compare la prédiction avec la vraie réponse
Remonte l'erreur couche par couche
Ajuste chaque poids proportionnellement à sa contribution à l'erreur
Avant de corriger les erreurs, le réseau doit d'abord faire une prédiction.
Couche cachée :
$$z^{[1]} = W^{[1]} \cdot x + b^{[1]}$$
$$a^{[1]} = \sigma(z^{[1]})$$
Couche de sortie :
$$z^{[2]} = W^{[2]} \cdot a^{[1]} + b^{[2]}$$
$$\hat{y} = a^{[2]} = \sigma(z^{[2]})$$
La fonction de coût mesure la différence entre la prédiction et la vraie valeur.
$$L = \frac{1}{2}(y - \hat{y})^2$$
Cette fonction pénalise quadratiquement les erreurs, ce qui signifie que les grandes erreurs sont beaucoup plus coûteuses que les petites.
$$L = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})]$$
Utilisée pour la classification binaire, cette fonction pénalise les prédictions confiantes mais incorrectes.
Le gradient indique dans quelle direction et de combien modifier chaque poids pour réduire l'erreur. On utilise la règle de la chaîne (chain rule) du calcul différentiel.
Pour calculer comment l'erreur change par rapport à un poids profond dans le réseau :
$$\frac{\partial L}{\partial W^{[1]}} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z^{[2]}} \cdot \frac{\partial z^{[2]}}{\partial a^{[1]}} \cdot \frac{\partial a^{[1]}}{\partial z^{[1]}} \cdot \frac{\partial z^{[1]}}{\partial W^{[1]}}$$
Avec MSE et sigmoid :
$$\frac{\partial L}{\partial z^{[2]}} = (a^{[2]} - y) \cdot \sigma'(z^{[2]})$$
$$\delta^{[2]} = (a^{[2]} - y) \cdot a^{[2]} \cdot (1 - a^{[2]})$$
$$\delta^{[1]} = (W^{[2]})^T \cdot \delta^{[2]} \odot \sigma'(z^{[1]})$$
Le symbole ⊙ représente le produit élément par élément (Hadamard product)
$$\frac{\partial L}{\partial W^{[2]}} = \delta^{[2]} \cdot (a^{[1]})^T$$
$$\frac{\partial L}{\partial b^{[2]}} = \delta^{[2]}$$
$$\frac{\partial L}{\partial W^{[1]}} = \delta^{[1]} \cdot x^T$$
$$\frac{\partial L}{\partial b^{[1]}} = \delta^{[1]}$$
Une fois les gradients calculés, on met à jour chaque poids dans la direction opposée au gradient (descente de gradient).
$$W^{[l]} := W^{[l]} - \alpha \frac{\partial L}{\partial W^{[l]}}$$
$$b^{[l]} := b^{[l]} - \alpha \frac{\partial L}{\partial b^{[l]}}$$
α (alpha) est le taux d'apprentissage (learning rate), un hyperparamètre crucial qui contrôle la taille des pas d'optimisation.
Apprentissage lent, convergence très longue
Convergence rapide et stable
Oscillations, pas de convergence
Observez la backpropagation en action sur un réseau simple (2-3-1).
Pour un réseau avec des couches de plusieurs neurones, on utilise l'algèbre matricielle.
Le gradient est calculé comme un produit externe (outer product) :
$$\frac{\partial L}{\partial W^{[1]}} = \delta^{[1]} \cdot (x)^T$$
Initialiser W et b avec des valeurs aléatoires petites
Calculer toutes les activations : z[l] = W[l]a[l-1] + b[l], puis a[l] = σ(z[l])
L = fonction_de_cout(y, ŷ)
Calculer tous les δ[l] en remontant depuis la sortie
∂L/∂W[l] et ∂L/∂b[l] pour chaque couche
W[l] := W[l] - α·∂L/∂W[l]
Retour à l'étape 2 pour l'échantillon suivant
Problème : Les gradients deviennent très petits dans les couches profondes.
Solutions :
Problème : Les gradients deviennent très grands, causant des mises à jour instables.
Solutions :
Problème : L'apprentissage prend trop de temps.
Solutions :
Problème : Le réseau mémorise les données d'entraînement.
Solutions :