Fonctions d'activation
Sans non-linéarité, un réseau profond se réduit à une seule couche : démonstration, saturation de la sigmoïde, ReLU, GELU et le piège du softmax.
Fonctions d'activation
Retirez les fonctions d'activation d'un réseau de cinquante couches. Vous n'obtenez pas un réseau de cinquante couches moins performant : vous obtenez, exactement et démontrablement, une régression linéaire. Cinquante millions de paramètres qui calculent ce qu'une seule matrice calculerait. C'est le résultat le plus important de cette leçon, et il tient en deux lignes d'algèbre.
Ces fonctions, qu'on écrit d'un geste — un nn.ReLU() glissé entre deux nn.Linear — sont donc ce qui fait exister la profondeur. Et le choix n'est pas cosmétique. L'histoire de l'apprentissage profond entre 1990 et 2010 est en grande partie l'histoire d'un échec attribué à tort à la profondeur, alors qu'il venait de la fonction d'activation utilisée : la sigmoïde écrase les gradients, et un réseau de dix couches sigmoïdes ne peut structurellement pas s'entraîner. Le passage à ReLU, vers 2011, a plus fait pour la faisabilité des réseaux profonds que n'importe quelle astuce d'optimisation.
Il y a aussi, dans cette leçon, l'erreur la plus fréquente de tout PyTorch : ajouter un Softmax en sortie d'un modèle qu'on entraîne avec CrossEntropyLoss. Le code tourne, la perte descend, les résultats sont médiocres et personne ne voit pourquoi. Nous chiffrerons précisément ce que cette erreur coûte.