Ch. 05 · 9 min

Régler α, éviter la divergence.

Reviens à l'image de la cuvette. Si tu avances d'un millimètre à chaque pas, tu mettras des heures. Si tu avances d'un kilomètre, tu sors de la cuvette à la première enjambée. Il existe une bonne taille de pas, et c'est α\alpha qui la fixe.

Paramètre, hyperparamètre

α\alpha est ce qu'on appelle un hyperparamètre : un réglage choisi par toi, pas appris par l'algorithme. À ne pas confondre avec θ0\theta_0 et θ1\theta_1, qui sont les paramètres ajustés par la descente. En gros : tu choisis α\alpha avant de lancer l'entraînement, et l'algorithme choisit θ\theta pendant.

Trois scénarios :

  • α\alpha trop petit (par exemple 0.0001) : le coût baisse, mais si lentement qu'il te faudra des centaines de milliers d'itérations pour voir la différence. Sûr, mais inefficace.
  • α\alpha trop grand (par exemple 1 ou 10) : chaque pas saute par-dessus le fond de la cuvette. Le coût oscille, parfois augmente, puis explose. On dit que l'algorithme diverge.
  • α\alpha bien choisi (autour de 0.01 sur des données normalisées) : le coût chute régulièrement et se stabilise en quelques centaines d'itérations.

α = 0.001

Courbe de coût

Trop lent

α = 0.1

Courbe de coût

Converge

α = 10

Courbe de coût

Diverge

Trois α, même point de départ (0, 0), 80 itérations sur les voitures normalisées. Trop petit, juste, trop grand.
+Comment lire ce graphique ?

Chaque petite courbe est l'évolution de la MSE au fil des itérations, pour un α\alpha donné. On veut voir la courbe descendre régulièrement et se stabiliser : c'est le signe d'un bon α\alpha. Quand α\alpha est trop petit, la courbe est presque plate : l'entraînement avance à peine. Quand α\alpha est trop grand, la courbe monte vers l'infini : l'entraînement diverge.

Le piège des kilomètres

Sur notre dataset de voitures, xx vaut typiquement 150 000 km. Or le gradient J/θ1\partial J / \partial \theta_1 contient un facteur xx : il est donc de l'ordre de 10510^5 fois plus grand que J/θ0\partial J / \partial \theta_0. Avec le même α\alpha, θ1\theta_1 fait un pas 10510^5 fois trop gros. Partant de (0,0)(0, 0), une seule itération suffit à envoyer θ1\theta_1 à plusieurs millions, et l'itération suivante dépasse les limites du flottant : \infty, puis NaN\mathrm{NaN}.

Deux remèdes existent. Le premier, diviser α\alpha par dix millions, est une rustine : ça rend l'entraînement stable mais ultra-lent, et ça ne traite pas la cause. Le second, propre et standard en ML, est de normaliser les données avant l'entraînement.

La normalisation Z-score

On ramène xx à un ordre de grandeur sympathique en le centrant sur zéro et en le divisant par son écart-type. Note μ\mu (mu) la moyenne des kilométrages et σ\sigma (sigma) leur écart-type (l'écart-type mesure à quel point les valeurs sont dispersées autour de la moyenne) :

xnorm=xμσx_{\text{norm}} = \frac{x - \mu}{\sigma}

Les kilométrages normalisés ont maintenant une moyenne de 0 et un écart-type de 1. Environ 95 % des voitures tombent dans l'intervalle [2,+2][-2, +2]. Les deux gradients sont du même ordre de grandeur, et un α=0.01\alpha = 0.01 marche pour les deux en même temps.

Dénormaliser pour rester fidèle au sujet

Le sujet impose que predict prenne un kilométrage en km bruts, pas normalisés. On pourrait stocker μ\mu et σ\sigma et renormaliser dans predict, mais c'est moche. Plus propre : après l'entraînement, on dénormalise les paramètres. Si on note θ0n\theta_{0n} et θ1n\theta_{1n} les paramètres appris sur les données normalisées, alors les paramètres utilisables sur les km bruts sont :

θ1=θ1nσ\theta_1 = \frac{\theta_{1n}}{\sigma}θ0=θ0nθ1μ\theta_0 = \theta_{0n} - \theta_1 \cdot \mu

theta.json contient ces valeurs dénormalisées. Le programme predict reste trivial : il applique littéralement l'hypothèse du sujet, y^=θ0+θ1x\hat{y} = \theta_0 + \theta_1 \cdot x, sans rien savoir de la normalisation.

Et maintenant ?

Tu sais descendre, tu sais régler α\alpha, tu sais domestiquer un dataset hostile. Il te reste à juger le modèle une fois qu'il est entraîné : une MSE en euros carrés, ça ne parle à personne. Au chapitre suivant, tu vas découvrir le R2R^2, une métrique sans unité qui dit enfin « ce modèle est bon » ou « ce modèle est mauvais ».