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 qui la fixe.
Paramètre, hyperparamètre
est ce qu'on appelle un hyperparamètre : un réglage choisi par toi, pas appris par l'algorithme. À ne pas confondre avec et , qui sont les paramètres ajustés par la descente. En gros : tu choisis avant de lancer l'entraînement, et l'algorithme choisit pendant.
Trois scénarios :
- 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.
- 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.
- 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
Trop lent
α = 0.1
Converge
α = 10
Diverge
+Comment lire ce graphique ?
Chaque petite courbe est l'évolution de la MSE au fil des itérations, pour un donné. On veut voir la courbe descendre régulièrement et se stabiliser : c'est le signe d'un bon . Quand est trop petit, la courbe est presque plate : l'entraînement avance à peine. Quand est trop grand, la courbe monte vers l'infini : l'entraînement diverge.
Le piège des kilomètres
Sur notre dataset de voitures, vaut typiquement 150 000 km. Or le gradient contient un facteur : il est donc de l'ordre de fois plus grand que . Avec le même , fait un pas fois trop gros. Partant de , une seule itération suffit à envoyer à plusieurs millions, et l'itération suivante dépasse les limites du flottant : , puis .
Deux remèdes existent. Le premier, diviser 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 à un ordre de grandeur sympathique en le centrant sur zéro et en le divisant par son écart-type. Note (mu) la moyenne des kilométrages et (sigma) leur écart-type (l'écart-type mesure à quel point les valeurs sont dispersées autour de la moyenne) :
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 . Les deux gradients sont du même ordre de grandeur, et un 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 et et renormaliser dans predict, mais c'est moche. Plus propre : après l'entraînement, on dénormalise les paramètres. Si on note et les paramètres appris sur les données normalisées, alors les paramètres utilisables sur les km bruts sont :
theta.json contient ces valeurs dénormalisées. Le programme predict reste trivial : il applique littéralement l'hypothèse du sujet, , sans rien savoir de la normalisation.
Et maintenant ?
Tu sais descendre, tu sais régler , 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 , une métrique sans unité qui dit enfin « ce modèle est bon » ou « ce modèle est mauvais ».