contenu
methode du gradient pour trouver le minimum d'une fonction derivable
demo sur fonction polynimial dont on connait la derivée
STOCHASTIC GRADIENT: general idea is to aproximate an unknown function through iterations of unbiased estimates of the function's gradient. Knowing that the expectation of the gradient estimates equal the gradient.
“stochastic” comes from the fact that the gradient based on a single training sample is a “stochastic approximation” of the “true” cost gradient
comment estimer le gradient / la derivee
FONCTION DE COUT , FORME GÉNÉRALE: E(w, b) = L( , f ( )) +αR(w)
example of loss function : Quadratic error : need to normalize
breve histoire du SGD
implementation generalisée et tres optimisée
online learning
les parametres du SGD de scikit learn
influence du learning rate
strategies du learning rate : adaptatif, etc
MINI-BATCH (aka out-of-core) vs batch vs stochastic GRADIENT DESCENT
regularisation : L1, L2
comment regulariser le SGD
realy stopping
scikit SGDRegressor
overview of optimizers
Entrainer un modele revient a minimiser une fonction de cout
chaque famille de modele a sa propre fonction de cout
Modèle : y^=wTx+b
Fonction de coût (MSE - Mean Squared Error) : E(w,b)=2n1∑i=1n(yi−y^i)2=2n1∑i=1n(yi−wTxi−b)2
Modèle (classification binaire) :
y^=σ(wTx+b)=1+e−(wTx+b)1 où σ est la fonction sigmoïde
Fonction de coût (Log Loss / Cross-Entropy) :
E(w,b)=−n1∑i=1n[yilog(y^i)+(1−yi)log(1−y^i)] où yi∈{0,1}
critères de division :
1. Pour la régression - MSE (Mean Squared Error) :
MSE=n1∑i=1n(yi−yˉ)2 où yˉ est la moyenne des y dans le nœud
2. Pour la classification - Gini Impurity :
Gini=1−∑k=1Kpk2 où pk est la proportion de la classe k
3. Pour la classification - Entropie (Entropy) :
Entropy=−∑k=1Kpklog2(pk)
Algorithme glouton (greedy) qui choisit la meilleure division à chaque nœud, pas de descente de gradient pour les arbres de decisions !
Objectif : Trouver le minimum d'une fonction dérivable f(x) (la fonction de cout)
Principe : Itération selon la direction opposée au gradient
xn+1=xn−η∇f(xn)
où η est le taux d'apprentissage (learning rate) et ∇f(xn) le gradient, la derivée de la fonction f(x)
Qu'est-ce que le gradient ?
Le gradient, c'est la pente de la fonction à un point donné.
Analogie : Imaginez que vous êtes dans une vallée. Le gradient vous montre la direction de la montée la plus raide. Pour descendre au fond de la vallée (trouver le minimum), on va dans la direction opposée au gradient.
Exemple : Minimiser f(x)=x2−4x+5
Dérivée : f′(x)=2x−4
Algorithme :
Résultat : f(2)=1 est le minimum global
def gradient_descent(f, df, x0, learning_rate=0.1, max_iter=100, tol=1e-6):
"""
Trouve le minimum d'une fonction par descente de gradient
Args:
f: fonction à minimiser
df: dérivée de la fonction
x0: point de départ
learning_rate: taux d'apprentissage (eta)
max_iter: nombre maximum d'itérations
tol: tolérance pour l'arrêt (early stopping)
"""
x = x0
for i in range(max_iter):
# Calcul du gradient
grad = df(x)
# Mise à jour
x_new = x - learning_rate * grad
# Critère d'arrêt
if abs(x_new - x) < tol:
break
x = x_new
return x
Le gradient n'est PAS une constante, c'est une fonction de la position :
∇E(w)
Le gradient ne s'applique qu'aux modeles dit lineaires ou il faut trouver les poids / les coefficients.
w = vecteur des paramètres (weights)
w=w1w2⋮wd∈Rd
où d = nombre de features (dimensions)
Modèle : y^=w1x1+w2x2+...+wdxd+b
Ou en notation vectorielle : y^=wTx+b
Paramètres :
Mise à jour vectorielle :
wt+1=wt−η∇E(wt)
Cela signifie chaque composante est mise à jour :
wi(t+1)=wi(t)−η∂wi∂E
Avec f(x)=x2−4x+5 :
En pratique ML :
| Modèle | Taille de w |
|---|---|
| Régression simple (1 feature) | w∈R |
| Régression multiple (100 features) | w∈R100 |
| Réseau de neurones simple | w∈R10000 |
| GPT-3 | w∈R175 milliards |
À chaque itération :
Le gradient change car on l'évalue à chaque nouveau point
descendre une montagne :
Le gradient change naturellement car la pente n'est pas la même partout !
Contexte Machine Learning : On a n echantillons d'entraînement (x1,y1),...,(xn,yn)
Fonction de coût totale :
E(w)=n1∑i=1nL(yi,f(xi;w))
où L = perte (loss) sur un echantillon
Problème : Calculer le gradient complet est coûteux
∇E(w)=n1∑i=1n∇Li(w)
Avec n = 1 million d'exemples → impossible à chaque itération !
Idée : Au lieu de calculer le gradient sur TOUS les exemples, utiliser UN SEUL echantillon aléatoire
Gradient complet (trop lent) :
∇E(w)=n1∑i=1n∇Li(w)
Gradient stochastique (rapide) :
∇E~(w)=∇Lk(w) où k est tiré au hasard parmi {1,...,n}
Propriété du gradient stochastique : En moyenne, ça marche !
E[∇Lk]=n1∑i=1n∇Li=∇E
Le terme "stochastique" vient de l'échantillonnage aléatoire
Chaque itération :
Ce qui est stochastique :
Ce qui est exact :
Question : Un seul exemple, c'est pas trop approximatif ?
Réponse : C'est bruité, mais non biaisé
Non biaisé = correct en moyenne
Si on répète l'expérience 1000 fois :
Analogie : Lancer un dé
Ce qui est calculé/estimé :
Batch GD :
SGD :
Pour un seul echantillon : Li(w)=loss(yi,f(xi;w))
fonction de Coût avec régularisation estimée sur tous les échantillons : E(w)=n1∑i=1nLi(w)+αR(w)
Composantes :
Frameworks optimisés :
Optimisations :
Principe : Mise à jour après chaque observation
Avantages :
Application :
Principe : Mise à jour des paramètres après chaque observation qui arrive
Algorithme :
À l'instant t, une nouvelle observation (xt,yt) arrive :
Prédiction avec le modèle actuel : y^t=f(xt;wt)
Calcul de la perte sur cette seule observation : Lt=L(yt,y^t)
Mise à jour immédiate des paramètres : wt+1=wt−ηt∇Lt(wt)
Différence avec SGD classique :
| SGD Classique | Online Learning |
|---|---|
| Dataset fixe, plusieurs epochs | Flux continu, une seule passe |
| wt+1=wt−η∇Lk | wt+1=wt−ηt∇Lt |
| k tiré aléatoirement | Ordre d'arrivée des données |
Learning rate adaptatif souvent utilisé : ηt=1+λtη0
où t est le nombre d'observations vues
Exemple - Régression linéaire online :
Observation (xt,yt) arrive : wt+1=wt+ηt(yt−wtTxt)⋅xt
Exemple - Moyenne mobile :
Calculer la moyenne en ligne : μt=μt−1+t1(xt−μt−1)
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(
loss='squared_error', # Fonction de perte
penalty='l2', # Régularisation
alpha=0.0001, # Force régularisation
learning_rate='invscaling', # Stratégie LR
eta0=0.01, # LR initial
max_iter=1000, # Nb itérations
tol=1e-3, # Critère arrêt
early_stopping=True # Arrêt anticipé
)
wt+1=wt−η∇L(wt)
η trop grand :
η trop petit :
η optimal : Convergence rapide et stable
1. Constant : ηt=η0
2. Décroissance temporelle : ηt=1+t⋅dη0
3. Inverse scaling : ηt=tαη0
4. Adaptatif : Ajustement selon performance validation
Méthodes avancées :
AdaGrad : Adapte η par paramètre ηt(i)=∑τ=1t(gτ(i))2+ϵη0
RMSprop : Moyenne mobile des gradients
Adam : Combine momentum + adaptation
| Type | Taille échantillon | Caractéristiques |
|---|---|---|
| Batch GD | Tous (n) | Stable, lent, grande mémoire |
| Stochastic GD | 1 | Rapide, bruité, converge |
| Mini-Batch GD | m (ex: 32-256) | Optimal : vectorisation + stabilité |
Formule mini-batch : wt+1=wt−ηm1∑i=1m∇Li(wt)
Problème : Dataset trop large pour la RAM
Solution : Charger les données par batch
for epoch in range(n_epochs):
for batch in data_loader:
gradient = compute_gradient(batch)
weights -= learning_rate * gradient
Applications : Big Data, streaming
R(w)=∥w∥1=∑i=1d∣wi∣
Effet : Sélection de variables (sparsité)
Gradient sous-différentiel : ∂wi∂R=sign(wi)
Usage : Features redondantes, interprétabilité
R(w)=∥w∥22=∑i=1dwi2
Effet : Réduction de tous les poids
Gradient : ∂wi∂R=2wi
Mise à jour : wt+1=(1−2ηα)wt−η∇L(wt)
L1 (Lasso) :
R(w)=∥w∥1=∑i=1d∣wi∣
L2 (Ridge) :
R(w)=∥w∥22=∑i=1dwi2
L1 : Gradient constant (en valeur absolue)
∂wi∂∣wi∣=⎩⎨⎧+1−1[−1,1]si wi>0si wi<0si wi=0L2 : Gradient proportionnel à w
∂wi∂wi2=2wi
Avec L1 :
wt+1=wt−η(∇L+α⋅sign(wt))
➜ On retire une quantité constante ηα à chaque itération ➜ Les petits poids arrivent rapidement à zéro exact
Avec L2 :
wt+1=wt−η(∇L+2αwt)=(1−2ηα)wt−η∇L
➜ On multiplie par (1−2ηα) ➜ Les poids diminuent mais n'atteignent jamais zéro (décroissance exponentielle)
Contrainte L1 : ∥w1∥+∥w2∥≤t → forme un losange
Contrainte L2 : w12+w22≤t → forme un cercle
Quand les contours de la fonction de coût rencontrent la contrainte :
[Imagine un graphique 2D avec contours et contraintes]
Combinaison L1 + L2 :
R(w)=ρ∥w∥1+21−ρ∥w∥22
Avantages :
SGDRegressor(penalty='elasticnet',
l1_ratio=0.5)
Paramètres Scikit-learn :
SGDRegressor(
penalty='l2', # 'l1', 'l2', 'elasticnet'
alpha=0.0001, # Force régularisation
l1_ratio=0.15 # Si elasticnet
)
Impact :
Principe : Arrêter l'entraînement avant la fin si pas d'amélioration
Algorithme :
Implémentation :
SGDRegressor( early_stopping=True, validation_fraction=0.1, n_iter_no_change=5)
c'est le parametre n_iter_no_change qui contrôle le nombre d'époques sans amélioration avant l'arrêt.
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# Normalisation
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Division
X_train, X_val, y_train, y_val = train_test_split(
X_scaled, y, test_size=0.2
)
# Modèle
sgd = SGDRegressor(
loss='squared_error',
penalty='l2',
alpha=0.001,
learning_rate='adaptive',
eta0=0.01,
early_stopping=True
)
sgd.fit(X_train, y_train)
SGD classique : wt=wt−1−η∇L
SGD + Momentum : vt=βvt−1+∇L wt=wt−1−ηvt
Nesterov : Momentum anticipé
AdaGrad : LR adaptatif par paramètre
RMSprop : Moyenne mobile du gradient carré
Adam (Adaptive Moment Estimation) :
AdamW : Adam avec weight decay découplé
Nadam : Nesterov + Adam
RAdam : Warmup automatique
Choisir : Adam par défaut, SGD+momentum si besoin de généralisation
| Optimiseur | Vitesse | Stabilité | Généralisation | Usage |
|---|---|---|---|---|
| SGD | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | Classique |
| SGD+Momentum | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | Recommandé |
| Adam | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | Deep Learning |
| RMSprop | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | RNN |
Problème SGD : Oscillations dans les ravins
Solution : Accumuler la "vitesse"
vt=βvt−1+(1−β)∇Lt wt=wt−1−ηvt
Effet :
Courbes d'apprentissage :
Signes de problèmes :
Stratégies :
Paramètres critiques :
cas general
deep learning
Choix du Learning Rate : Sensible, difficile à optimiser
Minima locaux : Peut rester coincé (fonctions non-convexes)
Saddle points : Ralentit près des points-selle
Scaling : Sensible à l'échelle des features
Solution : Optimiseurs adaptatifs (Adam, etc.)
SGD convient si :
Alternatives :
Variance Reduction :
Second-ordre :
Distribué :
Particularités :
Best Practices :
Papers fondateurs :
Documentation :
Cours :
SGD = Outil fondamental du Machine Learning
Points clés :
Recommandation : Commencer avec SGD+momentum ou Adam