Dans cet article, nous comparons les performances d’un modèle BERT, sur une tâche d’analyse de sentiment, quant à une utilisation comme feature extractor contre celle d’un réglage fin (fine tuning). Nous pourrons constater une forte différence de précision entre les deux approches pour un jeu de données égal. En effet, le fine tuning du réseau nous offrira des performances significatives alors que l’autre approche nous permettra d’obtenir des performances insuffisantes mais toujours supérieures à l’aléatoire..
Nous allons nous pencher sur un fine tuning dans le cadre de l’analyse de sentiment. Pour ce faire, nous utiliserons un dataset composé de 16 000 entrées en training et 2 000 entrées en validation. Chaque entrée se compose de la paire texte + label. On compte dans ce dataset 6 classes représentant 6 émotions. La répartition est comme suit :
Le dataset est déséquilibré sur ses classes : on peut voir que la joie est sur-représentée en comparaison avec la surprise. La taille des textes pour ces deux classes est cependant équivalente.
Nous disposons d’un modèle BERT, pré-entraîné sur la langue anglaise, que nous allons utiliser pour extraire les features de notre texte. Features que nous essaierons de classifier par la suite.
Pour ce faire, nous allons d’abord récupérer la dernière couche cachée de notre BERT et la stocker pour chaque entrée afin d’accélérer l'entraînement de notre classifieur. Cela dans le but d'éviter d’avoir à faire une inférence pour chaque donnée durant l'entraînement du classifier. Il est possible pour les plus curieux de visualiser l’état caché du modèle en ramenant toutes les valeurs entre 0 et 1, puis en appliquant un algorithme comme UMAP. Cependant, de par la forte dimensionnalité qui est ramenée sur 2 dimensions, l’interprétation n’est pas totalement possible.
Nous pouvons maintenant entraîner une régression logistique pour faire notre classification. Nous obtenons des performances supérieures à ce que pourrait être de l’aléatoire (~16%), soit une précision de 0.63. Il est à remarquer qu’à cause du déséquilibre du dataset, on pourrait obtenir un bon 30% de précision en répondant systématiquement par “joy”.
La régression logistique étant assez proche de la sortie d’un réseau de neurones, une démonstration par une autre méthode permet de confirmer la difficulté à atteindre une bonne précision. Pour cela, nous pouvons utiliser une machine à vecteur de support (SVM) pour tenter de classifier.
On peut aussi remarquer que la précision et la matrice de confusion sont relativement très proches.
Nous allons ici mettre en place une tête de classification à notre modèle BERT, puis nous entraînerons l’ensemble du réseau, sur les mêmes données afin de comparer les résultats. Le modèle est entraîné sur 6 epochs et nous utiliserons la précision et le score F1 comme métriques. L'entraînement se conclut sur une précision à 0.93 et un score F1 à 0.923, ce qui surpasse de loin notre approche précédente par une amélioration de 47% de la précision.
Nous avons pu constater que pour un dataset identique utilisé, un réseau transformer comme feature extractor sans procéder à son fine tuning sur la tâche à accomplir ne permet pas d’obtenir des performances optimales. Il est donc intéressant d’ajouter / remplacer la tête du modèle par une tête spécialisée pour la tâche et de ré-entraîner (fine tuning) l’ensemble du modèle préalablement entraîné sur des données généralistes. De même, nous pouvons voir que les features extraites par la première approche nous permettent d'atteindre de meilleures performances que l’aléatoire. Même si cette approche souffre d’une précision relativement faible sur la tâche. Enfin, il existe un ensemble de réseaux transformer déjà pré-entrainé dans les hubs (https://huggingface.co/models), ce qui permet de s’adapter à une bonne quantité de tâches inhérente au NLP.