CI : IA Explicable et Interprétable
Dans les domaines critiques comme le diagnostic médical, la performance brute d'un modèle d'apprentissage profond (Deep Learning) ne suffit plus. Le déploiement de modèles en production requiert des garanties de transparence pour répondre aux exigences réglementaires et instaurer la confiance avec les experts métiers (médecins, radiologues). Ce TP illustre comment ouvrir la "boîte noire" d'un modèle de Vision par Ordinateur grâce aux méthodes d'explicabilité (XAI) dites spécifiques au modèle (White-box) et post-hoc.
Vous allez auditer un réseau de neurones convolutif (ResNet50) pré-entraîné sur des radiographies pulmonaires. En utilisant la bibliothèque Captum (développée par Meta pour l'écosystème PyTorch), vous implémenterez des méthodes d'attribution basées sur les gradients (Grad-CAM et Integrated Gradients) pour comprendre quelles zones spatiales d'une image déclenchent une prédiction. En tant que futurs ingénieurs, vous aborderez également ces méthodes sous un angle MLOps : vous mesurerez leur surcoût de calcul en temps réel et vous traquerez les biais potentiels (l'effet Clever Hans) silencieusement appris par le modèle.
- Déployer un pipeline d'inférence utilisant un modèle PyTorch/HuggingFace pré-entraîné sur des données médicales.
- Implémenter Grad-CAM pour extraire une explication sémantique de la dernière couche convolutive.
- Implémenter Integrated Gradients pour obtenir une attribution exacte au niveau du pixel, et la lisser avec SmoothGrad.
- Profiler les temps de calcul (Inférence vs Explicabilité) pour évaluer la faisabilité d'un déploiement temps réel.
- Auditer visuellement le modèle pour détecter un biais de confusion sur une image aberrante.
Mise en place, Inférence et Grad-CAM
Commencez par créer un dossier TP6 dans votre dépôt Git de rendu. Placez-vous dans ce dossier et créez un fichier rapport.md qui contiendra vos réponses et vos captures d'écran.
Téléchargez plusieurs images radiographiques de test (une saine et deux avec pneumonie) pour éprouver le modèle. Vous pouvez tout à fait ajouter d'autres images de votre choix issues d'internet pour prolonger vos tests !
Créez le script 01_gradcam.py. Complétez le code ci-dessous. Le script utilise sys.argv pour que vous puissiez passer l'image de votre choix en argument lors de l'exécution (ex: python 01_gradcam.py normal_1.jpeg).
Dans l'architecture ResNet implémentée par HuggingFace, la dernière couche convolutive s'appelle wrapped_model.model.resnet.encoder.stages[-1].layers[-1].Exécutez votre script sur les trois images téléchargées (normal_1.jpeg, normal_2.jpeg, pneumo_1.jpeg, pneumo_2.jpeg). Dans votre fichier rapport.md, incluez :
- Les trois images Grad-CAM générées.
- Analyse des Faux Positifs : Le modèle devrait prédire "PNEUMONIA" même pour l'image saine. En observant la zone mise en évidence par Grad-CAM sur cette erreur, le modèle regarde-t-il une anomalie pulmonaire, ou se base-t-il sur un artefact de la radiographie (effet Clever Hans) ?
- Granularité : Que remarquez-vous concernant la résolution de l'explication (les zones colorées ressemblent à de gros blocs flous) ? Sachant que l'on extrait l'information de la dernière couche d'un ResNet, expliquez d'où vient cette perte de résolution spatiale.
Integrated Gradients et SmoothGrad
Les méthodes de type CAM ont une faible résolution spatiale (elles s'arrêtent à la taille de la dernière feature map). Pour obtenir une explication précise au pixel près, nous allons utiliser Integrated Gradients (IG). Cependant, IG produit souvent une carte très bruitée. Nous lui appliquerons donc un lissage stochastique appelé SmoothGrad.
Créez le script 02_ig.py et complétez-le. Attention, pour éviter une erreur CUDA Out of Memory due au nombre massif d'images générées en interne par ces algorithmes, vous devrez utiliser l'argument internal_batch_size. Il faudra également contrôler l'amplitude du bruit avec stdevs.
Soumettez ce script sur votre cluster. Dans rapport.md :
- Ajoutez l'image comparative générée.
- Relevez les temps d'exécution. Au vu du temps de calcul de SmoothGrad par rapport à une inférence classique, pensez-vous qu'il soit technologiquement possible de générer cette explication de manière synchrone (en temps réel) pour un médecin lors du premier clic d'analyse ? Proposez une architecture logicielle en une phrase pour résoudre ce problème (ex: utilisation de files d'attente).
- En observant les couleurs de la visualisation finale (bleu et rouge), expliquez brièvement l'avantage mathématique d'avoir une carte qui descend "en dessous de zéro" par rapport au filtre ReLU classique utilisé dans Grad-CAM.
Modélisation Intrinsèquement Interprétable (Glass-box) sur Données Tabulaires
Pour cette seconde partie du TP, nous quittons les images pour analyser des données cliniques tabulaires. Avant de manipuler des modèles complexes dits "boîtes noires", l'approche d'ingénierie standard consiste à commencer par un modèle intrinsèquement interprétable (Glass-box).
Installez les bibliothèques d'analyse de données nécessaires pour la suite de ce TP :
Créez le script 03_glassbox.py. Nous allons utiliser le jeu de données Breast Cancer Wisconsin (intégré dans scikit-learn) pour prédire si une tumeur est bénigne ou maligne à partir de 30 caractéristiques cellulaires numérisées.
Complétez le code ci-dessous pour entraîner une Régression Logistique. Afin que les poids d'une régression logistique soient interprétables et comparables entre eux, il est impératif de normaliser les données en amont.
Exécutez ce script sur votre machine ou votre cluster. Dans votre rapport.md :
- Ajoutez l'image glassbox_coefficients.png générée.
- En observant le graphique, identifiez la caractéristique (feature) qui a le plus d'impact pour pousser la prédiction vers la classe "Maligne" (classe 0, coefficients négatifs).
- Expliquez en une phrase l'avantage d'avoir un modèle directement interprétable par rapport aux méthodes post-hoc vues précédemment.
Explicabilité Post-Hoc avec SHAP sur un Modèle Complexe
Les modèles linéaires sont faciles à interpréter, mais ils ne capturent pas les interactions complexes non-linéaires entre les caractéristiques. Pour obtenir de meilleures performances, les ingénieurs utilisent souvent des modèles d'ensemble (comme les Random Forests) ou du Deep Learning, créant ainsi des "boîtes noires". Pour auditer ces modèles, nous utilisons des méthodes post-hoc comme SHAP (SHapley Additive exPlanations).
Commencez par installer la bibliothèque SHAP dans votre environnement :
Créez le script 04_shap.py. Complétez le code ci-dessous. Vous remarquerez que contrairement à la Régression Logistique, un Random Forest n'a pas besoin que les données soient normalisées. Nous analyserons les valeurs brutes.
Exécutez le script et récupérez les deux images générées. Dans votre rapport.md :
- Ajoutez les images shap_waterfall.png et shap_summary.png.
- Explicabilité Globale : En regardant le Summary Plot, vérifiez si les 2-3 variables les plus importantes identifiées par le Random Forest (SHAP) sont les mêmes que celles trouvées par la Régression Logistique (Exercice 3). Que déduisez-vous sur la robustesse de ces caractéristiques cliniques (biomarqueurs) ?
- Explicabilité Locale : En analysant le Waterfall Plot du patient 0, citez la caractéristique (feature) ayant le plus contribué à tirer la prédiction vers sa valeur finale, ainsi que la valeur numérique exacte de cette caractéristique pour ce patient précis.