Les réseaux profonds recommencent à faire du bruit
Je viens de lire sur les travaux présentés par Google à l’ICML, et les réseaux de neurones recommencent à attirer l’attention. Ils ont déjà connu des vagues d’enthousiasme. Cette fois, la combinaison est différente : beaucoup de données, de meilleures méthodes d’entraînement et énormément de calcul parallèle.
Un réseau reçoit un vecteur de nombres, applique à chaque couche une multiplication par des poids, ajoute des biais et passe le résultat dans une fonction non linéaire. Les premières couches apprennent des motifs simples; les suivantes les combinent. À la sortie, le réseau produit un score pour chaque classe ou représentation.
Comment un réseau apprend une image
Pour reconnaître deux catégories, le cycle d’entraînement ressemble à ceci :
- convertir l’image en valeurs numériques et la normaliser;
- calculer les activations couche par couche;
- comparer la sortie à l’étiquette avec une fonction de perte;
- propager le gradient de l’erreur vers les couches précédentes;
- ajuster légèrement chaque poids;
- répéter sur de nombreux lots.
Les GPU sont utiles parce que beaucoup de ces opérations sont des multiplications semblables exécutées en parallèle. Ils ne rendent pas le modèle intelligent; ils permettent davantage d’itérations et de paramètres dans un temps raisonnable.
Il faut séparer entraînement, validation et test. L’entraînement ajuste les poids. La validation choisit architecture et paramètres. Le test reste fermé jusqu’à la fin pour estimer la performance sur des exemples non vus. Réutiliser sans cesse le test finit par l’intégrer indirectement au modèle.
Le taux global peut cacher le vrai problème
Un jeu de données Web contient erreurs, doublons et biais. Si 95 % des images représentent une classe, prédire toujours cette classe donne 95 % d’exactitude. La matrice de confusion et les mesures par catégorie montrent mieux faux positifs et faux négatifs. Une application médicale ou de sécurité ne valorise pas les deux erreurs de la même façon.
Le réseau peut mémoriser les images d’entraînement. La régularisation, davantage de données et certaines transformations réduisent ce surapprentissage, mais il faut surveiller l’écart entre perte d’entraînement et de validation. Une image légèrement recadrée ou prise avec une autre caméra peut aussi déplacer la distribution.
L’inférence a son propre coût : mémoire, temps par image et énergie. Un modèle entraîné sur un grand cluster n’entre pas nécessairement sur un appareil. Il faut mesurer la chaîne complète, incluant prétraitement et transfert des données.
Garder une baseline volontairement simple
Avant le réseau profond, je comparerais une régression logistique ou un classificateur sur des caractéristiques simples. La baseline donne un coût d’entraînement, une précision et des erreurs compréhensibles. Si le réseau gagne un demi-point au prix de cent fois plus de calcul, le contexte dira si l’écart vaut quelque chose. Je figerais aussi les graines aléatoires, l’ordre des lots et les versions des librairies afin de reproduire la courbe. Les GPU peuvent introduire certaines variations numériques; plusieurs entraînements donnent une distribution plus honnête qu’un seul meilleur résultat choisi après coup.
Je reproduirais d’abord un résultat sur un jeu documenté, conserverais les versions des données et du code, puis examinerais les erreurs une par une. Une courbe moyenne impressionnante ne suffit pas. Le progrès devient intéressant quand on peut dire quelles représentations sont apprises, où elles échouent et si l’erreur reste acceptable dans l’usage visé.