subtitles/fr/08_what-happens-inside-the-pipeline-function-(pytorch).srt (147 lines of code) (raw):

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