Que se passe-t-il dans la fonction pipeline ? Dans cette vidéo,
nous allons voir ce qui se passe réellement lorsque nous utilisons la fonction pipeline de la bibliothèque Transformers.
Plus précisément, nous examinerons le pipeline d'analyse des sentiments et comment il
est passé des deux phrases suivantes aux étiquettes positives et négatives avec leurs scores respectifs.
Comme nous l'avons vu dans la présentation du pipeline, il y a trois étapes dans le pipeline.
Tout d'abord, nous convertissons les textes bruts en nombres que le modèle peut comprendre, à l'
aide d'un tokenizer. Ensuite, ces chiffres passent par le modèle, qui génère des logits.
Enfin, les étapes de post-traitement transforment ces logits en étiquettes et scores.
Examinons en détail ces trois étapes et comment les reproduire à l'aide de la bibliothèque Transformers, en
commençant par la première étape, la tokenisation. Le processus de tokenisation comporte plusieurs étapes. Tout d'abord,
le texte est divisé en petits morceaux appelés tokens. Il peut s'agir de mots, de parties de mots ou de
symboles de ponctuation. Ensuite, le tokenizer ajoutera des tokens spéciaux (si le modèle les attend). Ici, le modèle
utilise attend un token [CLS] au début et un token [SEP] à la fin de la phrase à classer.
Enfin, le tokenizer associe chaque token à son ID unique dans le vocabulaire du modèle pré-entraîné.
Pour charger un tel tokenizer, la bibliothèque Transformers fournit l'API AutoTokenizer.
La méthode la plus importante de cette classe est `from_pretrained`, qui
télécharge et met en cache la configuration et le vocabulaire associés à un checkpoint donné.
Ici, le checkpoint utilisé par défaut pour le pipeline d'analyse des sentiments est `distilbert base
uncased finetuned sst2 english`. Nous instancions un tokenizer associé à ce checkpoint,
puis lui envoyons les deux phrases. Étant donné que ces deux phrases n'ont pas la même taille,
nous devrons remplir la plus courte pour pouvoir construire un tableau.
Cette opération est effectuée par le tokenizer avec l'option `padding=True`.
Avec `truncation=True`, nous nous assurons que toute phrase plus longue que le maximum que le modèle peut gérer
est tronquée. Enfin, l'option `return_tensors` indique au tokenizer de renvoyer un tenseur PyTorch.
En regardant le résultat, nous voyons que nous avons un dictionnaire avec deux clés. Les ID d'entrée contiennent les ID des deux
phrases, avec des 0 où le rembourrage est appliqué. La deuxième clé, le masque d'attention,
indique où le rembourrage a été appliqué, afin que le modèle n'y prête pas attention.
C'est tout ce qui se trouve à l'intérieur de l'étape de tokenisation. Examinons maintenant la deuxième étape,
le modèle. Comme pour le tokenizer, il existe une API AutoModel, avec une méthode `from_pretrained`.
Il téléchargera et mettra en cache la configuration du modèle ainsi que les poids pré-entraînés.
Cependant, l'API AutoModel n'instanciera que le corps du modèle,
c'est-à-dire la partie du modèle qui reste une fois la tête de pré-entraînement retirée.
Il produira un tenseur de grande dimension qui est une représentation des phrases passées, mais qui
n'est pas directement utile pour notre problème de classification. Ici, le tenseur a deux phrases,
chacune de 16 tokens et la dernière dimension est la taille cachée de notre modèle 768. Pour obtenir une sortie
liée à notre problème de classification, nous devons utiliser la classe AutoModelForSequenceClassification.
Elle fonctionne exactement comme la classe AutoModel, sauf qu'elle créera un modèle avec une
tête de classification. Il existe une classe automatique pour chaque tâche NLP courante dans la bibliothèque Transformers.
Ici, après avoir donné à notre modèle les deux phrases, nous obtenons un tenseur de taille 2 par 2 :
un résultat pour chaque phrase et pour chaque étiquette possible. Ces sorties ne sont pas encore des probabilités
(nous pouvons voir qu'elles ne somment pas à 1). En effet, chaque modèle de la bibliothèque Transformers renvoie des
logits. Pour donner un sens à ces logits, nous devons approfondir la troisième et dernière étape du pipeline : le
post-traitement. Pour convertir les logits en probabilités, nous devons leur appliquer une
couche SoftMax. Comme nous pouvons le voir, cela les transforme en nombres positifs qui somment à 1.
La dernière étape consiste à savoir lequel de ces correspond à l'étiquette positive ou négative.
Ceci est donné par le champ `id2label` de la configuration du modèle. Les premières probabilités (indice 0)
correspondent à l'étiquette négative, et les secondes (indice 1) correspondent à l'étiquette positive.
C'est ainsi que notre classifieur construit avec la fonction de pipeline a sélectionné ces étiquettes et calculé
ces scores. Maintenant que vous connaissez le fonctionnement de chaque étape, vous pouvez facilement les adapter à vos besoins.