1 00:00:05,360 --> 00:00:07,680 Que se passe-t-il dans la fonction pipeline ? 2 00:00:09,840 --> 00:00:14,800 Dans cette vidéo, nous allons voir ce qui se passe réellement lorsque nous utilisons la fonction pipeline de 3 00:00:14,800 --> 00:00:20,880 la bibliothèque Transformers. Plus précisément, nous examinerons le pipeline d'analyse des sentiments et 4 00:00:20,880 --> 00:00:26,720 comment il est passé des deux phrases suivantes aux étiquettes positives et négatives avec leurs scores respectifs. 5 00:00:28,560 --> 00:00:34,160 Comme nous l'avons vu dans la présentation du pipeline, il y a trois étapes dans le pipeline. Tout d'abord, 6 00:00:34,800 --> 00:00:38,880 nous convertissons les textes bruts en nombres que le modèle peut comprendre, à l'aide d'un tokenizer. 7 00:00:40,000 --> 00:00:43,520 Ensuite, ces chiffres passent par le modèle, qui génère des logits. 8 00:00:44,400 --> 00:00:49,120 Enfin, les étapes de post-traitement transforment ces logits en étiquettes et scores. 9 00:00:50,720 --> 00:00:54,960 Examinons en détail ces trois étapes et comment les reproduire à l'aide de la bibliothèque Transformers, en 10 00:00:54,960 --> 00:01:03,280 commençant par la première étape, la tokenisation. Le processus de tokenisation comporte plusieurs étapes. Tout d'abord, 11 00:01:03,280 --> 00:01:09,120 le texte est divisé en petits morceaux appelés tokens. Il peut s'agir de mots, de parties de mots ou de 12 00:01:09,120 --> 00:01:17,440 symboles de ponctuation. Ensuite, le tokenizer aura des tokens spéciaux (si le modèle les attend). Ici, le modèle 13 00:01:17,440 --> 00:01:22,800 utilise attend un token [CLS] au début et un token [SEP] à la fin de la phrase à classer. 14 00:01:23,760 --> 00:01:28,880 Enfin, le tokenizer associe chaque token à son ID unique dans le vocabulaire du modèle pré-entraîné. 15 00:01:28,880 --> 00:01:34,640 Pour charger un tel tokenizer de tokens, la bibliothèque Transformers fournit l'API AutoTokenizer. 16 00:01:35,680 --> 00:01:40,640 La méthode la plus importante de cette classe est `from_pretrained`, qui téléchargera et mettra en cache 17 00:01:40,640 --> 00:01:47,200 la configuration et le vocabulaire associés à un checkpoint donné. Ici, le checkpoint utilisé 18 00:01:47,200 --> 00:01:53,840 par défaut pour le pipeline d'analyse des sentiments est `distilbert base uncased finetuned sst2 english`. 19 00:01:56,560 --> 00:02:01,440 Nous instancions un tokenizer associé à ce checkpoint, puis lui envoyons les deux phrases. 20 00:02:02,640 --> 00:02:07,360 Étant donné que ces deux phrases n'ont pas la même taille, nous devrons remplir la plus courte pour 21 00:02:07,360 --> 00:02:11,680 être en mesure de créer un tableau. Cette opération est effectuée par le tokenizer avec l'option `padding=True`. 22 00:02:13,840 --> 00:02:18,960 Avec `truncation=True`, nous nous assurons que toute phrase plus longue que le maximum que le modèle peut gérer 23 00:02:18,960 --> 00:02:25,600 est tronquée. Enfin, l'option `return_tensors` indique au tokenizer de renvoyer un tenseur TensorFlow. 24 00:02:26,720 --> 00:02:29,680 En regardant le résultat, nous voyons que nous avons un dictionnaire avec deux clés. 25 00:02:30,240 --> 00:02:37,280 Les ID d'entrée contiennent les ID des deux phrases, avec des 0 où le rembourrage est appliqué. La deuxième clé, 26 00:02:37,280 --> 00:02:42,080 masque d'attention, indique où le rembourrage a été appliqué, de sorte que le modèle n'y prête pas 27 00:02:42,080 --> 00:02:48,000 attention. C'est tout ce qui se trouve à l'intérieur de l'étape de tokenisation. Examinons maintenant la deuxième étape, 28 00:02:48,640 --> 00:02:54,960 le modèle. Comme pour le tokenizer, il existe une API TFAutoModel, avec une méthode `from_pretrained`. 29 00:02:55,600 --> 00:02:59,840 Il téléchargera et mettra en cache la configuration du modèle ainsi que les pondérations pré-entraînées. 30 00:02:59,840 --> 00:03:05,600 Cependant, l'API TFAutoModel n'instanciera que le corps du modèle, 31 00:03:06,320 --> 00:03:10,640 c'est-à-dire la partie du modèle qui reste une fois la tête de pré-entraînement retirée. 32 00:03:12,000 --> 00:03:16,960 Il produira un tenseur de grande dimension qui est une représentation des phrases passées, 33 00:03:16,960 --> 00:03:20,080 mais qui n'est pas directement utile pour notre problème de classification. 34 00:03:21,760 --> 00:03:28,080 Ici, le tenseur a deux phrases, chacune de 16 tokens et la dernière dimension est la taille cachée 35 00:03:28,080 --> 00:03:34,320 de notre modèle 768. Pour obtenir une sortie liée à notre problème de classification, nous devons 36 00:03:34,320 --> 00:03:40,000 utiliser la classe TFAutoModelForSequenceClassification. Elle fonctionne exactement comme la classe AutoModel, 37 00:03:40,000 --> 00:03:45,440 sauf qu'elle créera un modèle avec une tête de classification. Il existe une classe automatique pour 38 00:03:45,440 --> 00:03:52,160 chaque tâche NLP courante dans la bibliothèque Transformers. Ici, après avoir donné à notre modèle les deux phrases, 39 00:03:52,160 --> 00:03:59,120 nous obtenons un tenseur de taille 2 par 2 : un résultat pour chaque phrase et pour chaque étiquette possible. Ces 40 00:03:59,120 --> 00:04:04,800 sorties ne sont pas encore des probabilités (nous pouvons voir qu'elles ne somment pas à 1). En effet, chaque modèle de la 41 00:04:04,800 --> 00:04:10,960 bibliothèque Transformers renvoie des logits. Pour donner un sens à ces logits, nous devons approfondir la troisième et 42 00:04:10,960 --> 00:04:17,520 dernière étape du pipeline : le post-traitement. Pour convertir les logits en probabilités, nous devons leur 43 00:04:17,520 --> 00:04:22,800 appliquer une couche SoftMax. Comme nous pouvons le voir, cela les transforme en nombres positifs qui 44 00:04:22,800 --> 00:04:28,160 somment à 1. La dernière étape consiste à savoir lequel d'entre eux correspond à l'étiquette positive ou négative. 45 00:04:28,160 --> 00:04:34,720 Ceci est donné par le champ `id2label` de la configuration du modèle. Les premières probabilités 46 00:04:34,720 --> 00:04:40,800 (indice 0) correspondent à l'étiquette négative et les secondes (indice 1) correspondent à l' 47 00:04:40,800 --> 00:04:46,640 étiquette positive. C'est ainsi que notre classifieur construit avec la fonction de pipeline a sélectionné ces étiquettes et calculé 48 00:04:46,640 --> 00:04:55,840 ces scores. Maintenant que vous connaissez le fonctionnement de chaque étape, vous pouvez facilement les adapter à vos besoins.