Partie 1 · Créer
Compresser puis reconstruire
Hier le modèle de langage prolongeait un texte. Aujourd'hui on veut la même chose pour des images : fabriquer des coupes de scanner qui n'existent pas, pour partager des données sans partager les images de vrais patients (le besoin du CHU).
Première idée naïve : une coupe d'OrganAMNIST fait 28 × 28 pixels, soit 784 nombres entre 0 (noir) et 1 (blanc). Tirons-les au hasard ? On obtient du bruit, et pratiquement jamais une coupe. Dans une vraie coupe, deux pixels voisins ont des valeurs proches : les 784 nombres dépendent les uns des autres. On devrait donc pouvoir les résumer en beaucoup moins de nombres.
Un autoencodeur est un réseau qui reçoit une image et rend une image de même taille. L'encodeur (un MLP de J1, 784 → 128 → 2) résume l'image en un vecteur court, son code. Le décodeur (2 → 128 → 784) reconstruit l'image à partir du code. Ici le code a 2 composantes : l'ensemble des codes possibles s'appelle l'espace latent, c'est le plan, et chaque image y devient un point.
Le réseau a 202 258 poids. Vérifie ce chiffre toi-même.
À toi de coder
Aucune étiquette n'est nécessaire : l'image est à la fois l'entrée et la bonne réponse. La perte est la MSE de J1 entre l'image et sa reconstruction. Exemple réduit de la slide (2 pixels, code d'un seul nombre, poids choisis) : l'image [0,9 ; 0,7].
- Coder : l'encodeur fait la moyenne des deux pixels, 0,5 × 0,9 + 0,5 × 0,7 = 0,8.
- Reconstruire : le décodeur recopie le code dans chaque pixel,
[0,8 ; 0,8]. - Comparer : ((0,9 − 0,8)² + (0,7 − 0,8)²) / 2 = 0,01.
À toi de coder
Une image inhabituelle se reconstruit mal. Le même réseau code [0,9 ; 0,1] par 0,5 et la reconstruit en [0,5 ; 0,5] : perte 0,16, soit 16 fois plus que pour [0,9 ; 0,7]. Le réseau n'a appris à résumer que ce qu'il a vu (des images où les voisins se ressemblent).
On en tire un détecteur d'anomalies : on entraîne l'autoencodeur sur des images normales seulement, et l'erreur de reconstruction d'une nouvelle image devient un score d'anomalie. Au-dessus d'un seuil choisi sur la validation (comme en J2), on signale l'image.
Limites à garder en tête (exercice 3, radiographies de PneumoniaMNIST) : le score dit qu'une image est inhabituelle, pas pourquoi. Une image mal cadrée sera signalée, elle aussi. Et rien ne garantit que les pneumonies aient une plus grande erreur que les normales : à mesurer. Le protocole : autoencodeur à code de 16 composantes entraîné sur les normales, seuil = quantile 0,95 des scores des normales de validation (5 % de fausses alertes acceptées), puis mesure une seule fois sur le test : sensibilité (part des pneumonies signalées) et spécificité (part des normales non signalées).
À toi de coder
Pourquoi ne peut-on pas encore générer ? Voici les codes de 2 000 coupes de validation, une couleur par organe : ils forment des nuages séparés par des zones vides, où ne tombe le code d'aucune coupe. Un code tiré dans une zone vide n'a jamais servi à l'entraînement : rien ne garantit que le décodeur en fasse une coupe plausible. Pour générer, il faudrait savoir où tirer un code. C'est le problème de la partie 2.