Descente de gradient -- Descendre le long de la direction de plus forte pente
Ce chapitre implémente la descente de gradient à partir de zéro et l'utilise pour ajuster une régression linéaire.C'est le prototype mathématique de toute la boucle d'entraînement de l'IA.
Analyse du concept
Formule de base
\[ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \]La boucle d'entraînement en quatre étapes
Propagation avant
Prédire la sortie
Calculer la perte
Mesurer l'écart
Calculer le gradient
Rétropropagation
Mettre à jour les paramètres
θ -= η·∇J
Impact du taux d'apprentissage
| Taux d'apprentissage | Effet |
|---|---|
| Trop petit | Converge extrêmement lentement, nécessitant de nombreuses étapes |
| Modéré | Converge en douceur et rapidement |
| Trop grand | Oscille, voire diverge |
Exemple concret
Descendre la montagne par un jour de brouillard
Par un jour de brouillard où vous ne voyez pas votre main devant votre visage, vous devez descendre la montagne. La stratégie pour chaque étape :
Sentez la direction la plus raide sous vos pieds → Faites un petit pas dans la direction descendante la plus raide → Arrêtez → Sentez à nouveau → Faites un autre petit pas → Répétez.
Il s'agit de la descente de gradient : sentir = calculer le gradient, faire un petit pas = mettre à jour les paramètres, s'arrêter = itération suivante.
Exercices pratiques Python
Exemple
# Générer les données y = 3x + 2 + bruit
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 3 * X + 2 + np.random.normal(0, 2, 100)
# Implémenter la descente de gradient à partir de zéro
w, b = 0.0, 0.0
lr, n_iter = 0.01, 200
losses = []
for i in range(n_iter):
y_pred = w * X + b
loss = np.mean((y_pred - y) ** 2)
losses.append(loss)
# Gradient
dw = 2 * np.mean((y_pred - y) * X)
db = 2 * np.mean(y_pred - y)
# Mise à jour
w -= lr * dw
b -= lr * db
print(f"EXEMPLE résultat de la descente de gradient :")
print(f"Vrai : w=3.0, b=2.0")
print(f"Ajusté : w={w:.4f}, b={b:.4f}")
print(fPerte initiale : {losses[0]:.2f} → Perte finale : {losses[-1]:.2f})
EXAMPLE 梯度下降结果: 真实: w=3.0, b=2.0 拟合: w=2.9874, b=2.2835 初始损失: 79.69 → 最终损失: 3.91
Courbe de descente de la perte
Scénarios d'application en IA
Le prototype mathématique de la boucle d'entraînement PyTorch
Toutes les boucles d'entraînement en apprentissage profond suivent le même schéma, à savoir la descente de gradient :
① optimizer.zero_grad() → mettre à zéro le cache de gradient ; ② loss = model(x) → propagation avant ; ③ loss.backward() → rétropropagation pour calculer les gradients ; ④ optimizer.step() → effectuer la mise à jour des paramètres θ -= η·∇J.
Une fois que vous comprenez cette boucle en quatre étapes, vous comprenez la logique d'entraînement fondamentale de tous les frameworks d'apprentissage profond.
Le taux d'apprentissage est l'hyperparamètre le plus important
Un taux d'apprentissage trop grand → la perte oscille ou même diverge ; un taux d'apprentissage trop petit → la convergence est extrêmement lente et peut rester bloquée dans des optima locaux. La planification du taux d'apprentissage (Step, Cosine Annealing, Warmup) est une technique indispensable pour entraîner de grands modèles — l'entraînement de GPT-3 a utilisé une stratégie de warmup linéaire + décroissance cosinus.
Compromis sur la taille du lot pour SGD
Full-batch GD : utilise toutes les données pour calculer des gradients exacts, lent mais stable ; SGD (batch_size=1) : ne regarde qu’un seul échantillon à la fois, rapide mais les estimations du gradient sont bruitées ; Mini-batch SGD : un compromis (batch_size=32/64/128), avec un bruit modéré, qui aide en fait à échapper aux optima locaux — c’est la pratique standard en entraînement réel.
Limitations de la descente de gradient
La descente de gradient trouve les points où le gradient est nul — ceux-ci peuvent être des optima globaux, des optima locaux ou des points selle. Dans les espaces de grande dimension, les points selle sont bien plus courants que les optima locaux : un point est un minimum dans certaines directions et un maximum dans d’autres. Les optimiseurs adaptatifs tels qu’Adam peuvent échapper plus efficacement aux points selle.
Autres extensions