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.