Transfer Learning
Scénario : réutilisation d’un Backbone pré-entraîné type ResNet / MobileNet / EfficientNet sur un problème de classification
Introduction
Définition
Le backbone est la partie du réseau qui extrait les caractéristiques (apprentissage des features)
Le head est la partie finale du réseau qui transforme les features en décision (classiquement du FC)
Nous appelons Transfer learning (TL), le fait de réutiliser un modèle pré-entraîné pour une nouvelle tâche. Cette approche peut prendre deux formes :
Feature extractor : backbone complètement gelé, on entraîne uniquement la head
Fine-tuning : on débloque certaines couches du backbone pour adapter les features à la nouvelle tâche
Deux contextes :
Feature extractor : plus simple, plus stable, orienté petit dataset, faible nombre de classes, besoin de résultats rapides
Fine-tuning : plus puissant, plus risqué (overfit possible), requiert plus de données
Chronologie
En transfer learning, on commence toujours par la phase de feature extraction. Le fine-tuning est une amélioration qui s’applique dans la phase suivante, c’est n’est pas un point de départ.
Feature extraction
Préparation des données
Cette étape doit être finalisée avant toute expérimentation.
Points à vérifier :
Labels corrects
Séparation stricte entre les ensembles d’entraînement et de validation
Normalisation compatible avec le modèle pré-entraîné (statistiques ImageNet)
Data augmentation si le nombre d’images par classe est limité
Pas de data augmentation sur l’ensemble de validation
En transfer learning, une mauvaise normalisation détruit l’information pré-apprise.
Choix du modèle pré-entraîné
Le modèle doit être choisi avant toute décision d’optimisation.
Tout dépend de la complexité du dataset :
Taille(nombre d’images)
Complexité visuelle des images (résolution, textures similaires..)
L’idée centrale :
Un réseau trop gros sur un petit dataset → Overfit
Un réseau trop petit sur un gros dataset → Underfit
Taille du dataset
Trop petit
Zone saine
Trop gros
< 1 000 images
EfficientNet-B0, ResNet34
MobileNetV2, ResNet18
Overfit fort probable
1k – 10k
MobileNetV2
ResNet18, EfficientNet-B0
ResNet50+
10k – 50k
ResNet18
ResNet34, EfficientNet-B0
EfficientNet-B3+
> 100k
ResNet18
ResNet50+
peu utile
Choisir un optimiseur
Cette choix est peu critique, on conseille :
Adam / AdamW pour la phase feature extractor
SGD plutôt pour le fine-tuning profond
Créer une tête
Pour le démarrage, on peut prendre une FC+ReLU
Optimiser le learning rate
Configuraiton : backbone gelé - head en entraînement
Le LR reste le paramètre n°1, mais attention, les échelles changent :
Cas 1 — Backbone gelé - LR “classique” pour la tête :
Adam : 1e-3
SGD : 1e-2 à 1e-1
Cas 2 — Fine-tuning
Adam : 1e-4 à 3e-5
SGD : LR de 1e-4 à 1e-5
En fine-tuning, les LR sont plus petits : on ajuste, on ne ré-apprend pas.
Architecture
Si les résultats ne conviennent pas (overfit, divergence), il est possible de tester une autre architecture pour le head :
MLP simple ou bicouche
dropout éventuel
Il faudra alors effectuer à nouveau l’étape précédente
Fine-tuning
Par rapport au learning from scratch, on ne testera pas de nouvel optimiseur caractéristiques cela est peu utile dans ce contexte.
Régularisation
Beaucoup plus important que pour l’apprentissage from scratch. En TL, la régularisation est souvent nécessaire dès le début.
Data augmentation (par défaut)
Dropout dans la tête
Weight decay (AdamW recommandé)
Label smoothing (souvent utile)
Le backbone est puissant, le risque d’overfit augmente.
Couche BatchNorm
Si le backbone contient des couches BatchNorm :
Feature Extractor : backbone gelé → ne pas toucher aux BatchNorm
Fine-tuning
Choix A : on gèle quand-même les couches BatchNorm
Choix B : il faut absolument batch_size > 32
Scheduler
Les schedulers sont très efficaces en TL.
CosineAnnealing / ReduceLROnPlateau
Peuvent apporter de bons résultats