Perceptron multicouche, fonctions d'activation, backpropagation, optimiseurs Adam/AdamW, schedulers — TF2 vs PyTorch.
Un MLP est composé de couches successives de neurones entièrement connectées (dense layers). Chaque neurone applique une transformation affine puis une non-linéarité : y = activation(Wx + b). L'empilement de couches permet d'approximer toute fonction continue (théorème d'approximation universelle, Cybenko 1989, Hornik 1991).
Source officielle : tensorflow.org/tutorials/keras/classification — Chollet F., Deep Learning with Python, Manning 2e éd. 2021.
| Activation | Formule | Quand l'utiliser |
|---|---|---|
ReLU | max(0, x) | Couches cachées CNN/MLP — défaut moderne |
Leaky ReLU | x si x>0 sinon αx | Éviter dying ReLU (gradient 0 quand x<0) |
GELU | x·Φ(x) | Transformers (BERT, GPT) |
Sigmoid | 1/(1+e⁻ˣ) | Couche de sortie binaire uniquement |
Softmax | eˣᵢ / Σeˣⱼ | Couche de sortie classification multiclasse |
Tanh | (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | RNN, GAN générateur |
La descente de gradient stochastique (SGD) minimise la loss en propageant l'erreur en arrière (chain rule). TensorFlow et PyTorch automatisent ce calcul via le graphe computationnel.
import tensorflow as tf
from tensorflow.keras import layers, Sequential
model = Sequential([
layers.Input(shape=(784,)),
layers.Dense(256, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(1e-4)),
layers.Dropout(0.3),
layers.Dense(128, activation='relu'),
layers.Dropout(0.3),
layers.Dense(10, activation='softmax')
])
model.compile(
optimizer=tf.keras.optimizers.AdamW(learning_rate=1e-3, weight_decay=1e-4),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
history = model.fit(X_train, y_train, batch_size=128, epochs=20,
validation_split=0.1,
callbacks=[tf.keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)])
import torch
import torch.nn as nn
import torch.optim as optim
class MLP(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.3),
nn.Linear(256, 128), nn.ReLU(), nn.Dropout(0.3),
nn.Linear(128, 10)
)
def forward(self, x):
return self.net(x)
model = MLP().cuda()
optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
criterion = nn.CrossEntropyLoss()
for epoch in range(20):
for X_batch, y_batch in train_loader:
X_batch, y_batch = X_batch.cuda(), y_batch.cuda()
optimizer.zero_grad()
logits = model(X_batch)
loss = criterion(logits, y_batch)
loss.backward() # autograd
optimizer.step()
| Optimiseur | Idée clé | Hyperparamètres | Quand l'utiliser |
|---|---|---|---|
SGD + momentum | Inertie | lr, momentum=0,9 | Vision, ResNet — meilleur final |
RMSprop | Lr adaptatif par paramètre | lr=1e-3, ρ=0,9 | RNN, séquences |
Adam | Momentum + RMSprop combinés | lr=1e-3, β₁=0,9, β₂=0,999 | Défaut moderne |
AdamW | Adam + weight decay découplé | lr, weight_decay=1e-4 | Transformers, recommandé |
Lion | Découvert par AutoML 2023 | lr=1/3 × AdamW | Émergent — modèles très larges |
Loshchilov & Hutter, « Decoupled Weight Decay Regularization », ICLR 2019, arXiv:1711.05101 — démontre que AdamW > Adam pour les modèles avec régularisation.
Le learning rate (lr) est le hyperparamètre le plus critique. Un schedule progressif améliore la convergence.
scheduler = optim.lr_scheduler.OneCycleLR(
optimizer, max_lr=1e-2,
steps_per_epoch=len(train_loader), epochs=20,
pct_start=0.1, anneal_strategy='cos'
)
for epoch in range(20):
for batch in train_loader:
# forward, backward, step
optimizer.step()
scheduler.step()
Désactive aléatoirement une fraction p des neurones à chaque batch. Empêche la co-adaptation excessive. Taux typique : 0,2-0,5.
Normalise les activations par mini-batch. Accélère drastiquement la convergence, permet des lr plus grands, agit comme régularisation. Place : entre couche dense et activation, ou après convolution.
Normalise sur la dimension feature (pas batch). Standard dans les Transformers (BERT, GPT).
| Symptôme | Diagnostic | Remède |
|---|---|---|
| train_loss stagne haut | Sous-apprentissage | Plus de capacité, lr plus grand, plus d'epochs |
| train_loss bas, val_loss qui remonte | Sur-apprentissage | Dropout, weight_decay, early stopping, plus de data |
| val_loss oscille | lr trop grand ou batch trop petit | Réduire lr, augmenter batch |
| NaN dans la loss | Gradient explosion ou lr trop grand | gradient_clipping, lr/10, init Xavier/He |
La leçon suivante est également gratuite. Découvrez-la sans inscription.
Leçon 2 — Continuer →Choisis quels cookies tu acceptes — modifiable à tout moment.