Comment être intelligent avec votre formation en annotant les échantillons avec lesquels votre modèle a le plus de problèmes ? Avec l'apprentissage actif pour l'apprentissage automatique, bien sûr !
1. Pourquoi utiliser l'apprentissage actif pour l'apprentissage automatique ?
Supposons que vous vous trouviez dans un contexte où les données sont abondantes. En fait, vous avez tellement de données que vous n'avez pas le budget (argent, expérience en matière d'étiquetage, ou les deux) pour annoter toutes vos données. D'un autre côté, comme vous servez un modèle d'apprentissage automatique, vous aimeriez utiliser certaines de ces données pour améliorer vos performances. C'est là que l'apprentissage actif entre en jeu !
Lorsque vous disposez d'un budget limité par rapport au volume de vos données non étiquetées, le principal problème consiste à choisir des données intéressantes. Supposons, par exemple, que vous disposiez d'un modèle classant les images entre les chats, les chiens et les chevaux. Si les performances de votre modèle sont déjà très bonnes pour les deux premières classes, mais plutôt mauvaises pour les chevaux, vous souhaiteriez vous concentrer sur l'étiquetage des images de chevaux afin que votre modèle dispose de plus de données pour s'entraîner. C'est exactement ce que fait l'apprentissage actif : vous définissez un critère décrivant les performances actuelles de votre modèle sur les données non étiquetées et vous choisissez les données que vous pensez être les meilleures pour votre modèle. Le critère d'arrêt est le budget d'annotation dont vous disposez.
Voulez-vous apprendre cette puissance ? En seulement 3mn vous connaîtrez les méthodes d'Active Learning les plus connues, et en moins de 10mn vous aurez implémenté votre propre Active Learner dans TensorFlow !
2. Méthodes d'apprentissage actif pour la classification
Comme nous l'avons vu précédemment, l'intérêt de l'apprentissage actif est de choisir les meilleures données à étiqueter pour améliorer votre modèle.
Comment savoir quels exemples seront les plus instructifs ? L'idée est que plus vous êtes loin d'une prédiction parfaite (1 pour une classe, 0 pour les autres), moins vous avez de connaissances sur ce type de données, ce qui en fait un échantillon très important à étiqueter.
Pour une configuration de classification, vous pouvez utiliser ces critères de base basés sur les probabilités de classification des données non étiquetées :
- Moins de confiance : sélectionner les données pour lesquelles la probabilité maximale dans les scores de classification est minimale ;
- Plus petite marge : sélectionner les données pour lesquelles la différence entre les probabilités de classification du top 1 et du top 2 est minimale ;
- Entropie : sélectionner les données pour lesquelles l'entropie est maximale.
Pour mettre cela en pratique, utilisons un exemple simple avec cette tâche de classification à 5 classes :
Nous obtenons les résultats suivants pour les critères ci-dessus :
Dans cet exemple avec un budget d'une seule image à étiqueter, vous pouvez observer que les résultats diffèrent selon le critère choisi. En particulier, on choisira l'échantillon B si l'on utilise Least confidence ou Entropy, mais l'échantillon A si l'on utilise Smallest margin.
Vous pouvez constater que le critère le plus facile à utiliser et à mettre en œuvre est le critère de moindre confiance. C'est pourquoi nous nous en tiendrons à cette méthode pour le reste de l'article.
Maintenant que vous savez pourquoi vous devriez utiliser l'apprentissage actif pour votre modèle d'apprentissage automatique, laissez-moi vous montrer comment le mettre en œuvre pour la formation d'un modèle d'apprentissage automatique !
3. Comment mettre en œuvre votre propre système d'apprentissage actif sur un ensemble de données ?
Nous allons maintenant nous plonger dans la mise en œuvre de votre propre apprenant actif. Nous allons travailler sur l'ensemble de données tf_flowers, qui est un ensemble de données d'images avec 5 classes : marguerite, pissenlit, roses, tournesols et tulipes. Nous utiliserons un modèle InceptionV3 pré-entraîné sur l'ensemble de données iNaturalist, de sorte que nous avons déjà une bonne représentation de ce qu'est une plante.
3.1 Chargement du jeu de données
Nous allons diviser l'ensemble de données tf_flowers en 4 parties :
- l'ensemble de données d'entraînement, constitué des 1 000 premiers échantillons ;
- l'ensemble de données de validation, tiré des 500 échantillons suivants ;
- l'ensemble de données de test, tiré des 1 000 premiers échantillons ;
- l'ensemble de données non étiquetées, constitué des 1 170 échantillons restants.
Ensuite, comme d'habitude, nous devons prétraiter nos ensembles de données avant de procéder à l'entraînement. En particulier, nous devons redimensionner toutes les images en carrés de 299 x 299 pixels pour le modèle InceptionV3 :
3.2 Définition du modèle
Nous utiliserons un modèle InceptionV3 pré-entraîné sur l'ensemble de données iNaturalist, qui contient des espèces de fleurs. Nous nous attendons à ce que ce modèle ait appris une bonne représentation des espèces de fleurs afin de pouvoir les classer. En outre, nous ajoutons simplement une couche Dense pour la classification.
Vous avez peut-être remarqué que nous avons gelé le modèle InceptionV3 interne avec trainable=False. C'est parce que nous faisons de l'apprentissage par transfert : d'abord, vous n'entraînez que les nouvelles couches denses du haut, puis vous dégeler tout le modèle pour l'affiner.
Pour entraîner la couche dense supérieure, nous entraînons le modèle pendant 3 époques. Ensuite, nous entraînons à nouveau l'ensemble du modèle pendant 2 époques.
Maintenant que nous avons un modèle réel entraîné sur le jeu de données, nous pouvons l'évaluer pour en savoir plus sur ses performances et obtenir nos premiers résultats !
3.3 Sélection des données à étiqueter
Maintenant que nous disposons d'un modèle fonctionnel, plongeons dans la véritable méthode d'apprentissage actif. Par souci de simplicité, nous utiliserons le critère de moindre confiance.
Tout d'abord, nous devons calculer les probabilités de classification pour l'ensemble de données non étiquetées.
N'oubliez pas que nous utilisons le critère de moindre confiance. Ainsi, maintenant que nous disposons de toutes les probabilités prédites pour l'ensemble de données non étiquetées, nous pouvons calculer la probabilité maximale pour chaque échantillon. À partir de là, nous pouvons sélectionner les échantillons ayant la valeur la plus faible jusqu'à ce que nous ayons dépensé tout notre budget.
La définition d'un budget est plus logique dans le cadre d'une entreprise, car elle permet de mesurer le montant nécessaire pour étiqueter une image. Pour cet article, nous prendrons un budget de 500 images.
Prenez le temps d'admirer le fait que ces 3 simples lignes sont en fait tout le code au cœur de l'Apprenant Actif ! Si vous vouliez essayer une autre méthode, il vous suffirait de changer ces quelques lignes !
L'étape suivante consiste à étiqueter les instances choisies. Dans un cas réel, vous pourriez utiliser la méthode décrite dans mon dernier article sur l'annotation d'images.
Mais dans cet article, nous avons de la chance car nous pouvons directement prendre les vraies étiquettes de l'ensemble de données existant, nous pouvons donc sauter la partie étiquetage !
Si nous jetons un coup d'œil aux 20 pires probabilités, nous obtenons le résultat suivant :
Étant donné que nous n'avons que 5 classes, les pires probabilités sont proches de celles d'un modèle aléatoire. Il est donc très important d'améliorer notre modèle sur ces données spécifiques.
Nous pouvons également évaluer le modèle entraîné sur le jeu de données least_confidence_dataset :
Nous observons que nous perdons pratiquement 10 % de précision sur cet ensemble de données par rapport à l'ensemble de données de test. Nous devons ajouter ces échantillons à l'ensemble de données d'entraînement et réentraîner le modèle.
3.4 Réentraînement du modèle à l'aide des données supplémentaires
La dernière étape consiste à fournir les données nouvellement étiquetées comme données supplémentaires pour l'entraînement du modèle. Nous pouvons le faire avec la commande suivante. Vous ne pouvez concaténer que des ensembles de données non concaténés, vous devez donc les concaténer à nouveau à la fin.
Enfin, ré-entraînez votre modèle et évaluez-le sur l'ensemble de données de test :
Nous constatons que nous n'avons gagné que 1 % en performance. En fait, le modèle est trop performant et il y a trop peu de classes pour observer un changement important. À titre d'exercice, vous pouvez essayer un modèle plus petit (comme ResNet50 ou MobileNetV2) sur un ensemble de données comportant de nombreuses classes (comme ImageNet). Vous devriez alors constater une grande différence !
4. Conclusion et prochaines étapes
Comme vous pouvez le constater, les méthodes d'apprentissage actif sont assez faciles à intégrer dans votre pipeline de formation à l'apprentissage automatique. Les méthodes présentées ici sont faciles à comprendre et à utiliser. De plus, elles vous aident à vous concentrer sur les problèmes à traiter en priorité pour rendre votre modèle encore meilleur !
Si vous voulez en savoir plus sur l'apprentissage actif, vous pouvez cloner mon référentiel active-learning-methods et essayer d'implémenter d'autres critères. N'hésitez pas à laisser une étoile en guise de soutien !
Vous pouvez également utiliser une autre approche en utilisant l'apprentissage auto-supervisé de sorte que vous n'avez même pas besoin d'étiqueter vos données. Pour plus de détails, consultez l'article suivant sur l'apprentissage auto-supervisé.
Vous recherchez des experts en reconnaissance d'images ? N'hésitez pas à nous contacter !