1
00:00:05,310 --> 00:00:12,220
Dans cette vidéo nous allons voir ensemble quel est le but d'entraîner un tokenizer, quelles

2
00:00:12,220 --> 00:00:18,770
sont les étapes clés à suivre et quelle est la manière la plus simple de le faire.

3
00:00:18,770 --> 00:00:23,039
Vous vous poserez la question « Dois-je entraîner un nouveau tokenizer ? »

4
00:00:23,039 --> 00:00:27,369
lorsque vous envisagez de entraîner un nouveau modèle à partir de zéro.

5
00:00:27,369 --> 00:00:36,600
Un tokenizer entraîné ne serait pas adapté à votre corpus si votre corpus est dans une

6
00:00:36,600 --> 00:00:43,640
langue différente, utilise de nouveaux caractères tels que des accents ou des lettres majuscules, a un vocabulaire spécifique,

7
00:00:43,640 --> 00:00:50,980
par exemple médical ou juridique, ou utilise un style différent, une langue d'un autre siècle par

8
00:00:50,980 --> 00:00:51,989
exemple.

9
00:00:51,989 --> 00:01:00,719
Si je prends le tokenizer entraîné pour le modèle `bert-base-uncased` et ignore

10
00:01:00,719 --> 00:01:08,580
son étape de normalisation alors nous pouvons voir que l'opération de tokenisation sur la

11
00:01:08,580 --> 00:01:14,310
phrase anglaise « here is a sentence adapted to our tokenizer » produit une liste plutôt satisfaisante

12
00:01:14,310 --> 00:01:20,820
de tokens dans le sens où cette phrase de 8 mots est tokenisée en 9 tokens.

13
00:01:20,820 --> 00:01:29,909
Par contre si on utilise ce même tokenizer sur une phrase en bengali, on voit que soit

14
00:01:29,909 --> 00:01:36,320
un mot est divisé en plusieurs sous tokens soit que le tokenizer ne connait pas un des

15
00:01:36,320 --> 00:01:41,359
caractères unicode et ne retourne qu'un token inconnu.

16
00:01:41,359 --> 00:01:47,350
Le fait qu'un mot commun soit divisé en plusieurs tokens peut être problématique car les

17
00:01:47,350 --> 00:01:52,750
modèles de langage ne peuvent gérer qu'une séquence de tokens de longueur limitée.

18
00:01:52,750 --> 00:01:59,290
Un tokenizer qui divise excessivement votre texte initial peut même avoir un impact sur les performances de votre

19
00:01:59,290 --> 00:02:00,290
modèle.

20
00:02:00,290 --> 00:02:05,060
Les tokens [UNK] sont également problématiques car le modèle ne pourra extraire aucune

21
00:02:05,060 --> 00:02:11,440
information de la partie inconnue du texte.

22
00:02:11,440 --> 00:02:16,910
Dans cet autre exemple, on peut voir que le tokenizer remplace les mots contenant des caractères

23
00:02:16,910 --> 00:02:21,230
avec des accents et des majuscules par des tokens inconnus.

24
00:02:21,230 --> 00:02:28,140
Enfin, si nous réutilisons ce tokenizer pour tokeniser du vocabulaire médical nous constatons à nouveau

25
00:02:28,140 --> 00:02:37,349
qu'un même mot est divisé en plusieurs sous-tokens : 4 pour « paracetamol » et « pharyngitis ».

26
00:02:37,349 --> 00:02:42,050
La plupart des tokenizers utilisés par les modèles de langage de pointe actuels doivent être

27
00:02:42,050 --> 00:02:48,160
entraînés sur un corpus similaire à celui utilisé pour pré-entraîner le modèle de langage.

28
00:02:48,160 --> 00:02:54,390
Cette entraînement consiste à apprendre des règles pour diviser le texte en tokens et la manière

29
00:02:54,390 --> 00:03:00,510
d'apprendre ces règles et de les utiliser dépend du modèle de tokenizer choisi.

30
00:03:00,510 --> 00:03:06,710
Ainsi, pour entraîner un nouveau tokenizer il faut d'abord construire un corpus d'apprentissage composé

31
00:03:06,710 --> 00:03:09,239
de textes bruts.

32
00:03:09,239 --> 00:03:13,440
Ensuite, vous devez choisir une architecture pour votre tokenizer.

33
00:03:13,440 --> 00:03:19,640
Ici deux options s'offrent à vous : la plus simple est de réutiliser la même architecture que celle

34
00:03:19,640 --> 00:03:26,760
d'un tokenizer utilisé par un autre modèle déjà entraîné, sinon il est également possible de

35
00:03:26,760 --> 00:03:33,950
concevoir entièrement votre tokenizer mais cela demande plus d'expérience et d'attention.

36
00:03:33,950 --> 00:03:39,620
Une fois l'architecture choisie, on peut ainsi entraîner ce tokenizer sur votre corpus constitué.

37
00:03:39,620 --> 00:03:44,870
Enfin, la dernière chose que vous devez faire est de sauvegarder les règles apprises pour pouvoir

38
00:03:44,870 --> 00:03:49,780
utiliser ce tokenizer qui est maintenant prêt à être utilisé.

39
00:03:49,780 --> 00:03:55,120
Prenons un exemple : supposons que vous souhaitiez entraîner un modèle GPT-2 sur du code Python.

40
00:03:55,120 --> 00:04:03,000
Même si le code Python est en anglais ce type de texte est très spécifique et mériterait

41
00:04:03,000 --> 00:04:09,800
un tokenizer entraîné dessus. Pour vous en convaincre nous verrons à la fin la différence

42
00:04:09,800 --> 00:04:11,319
produite sur un exemple.

43
00:04:11,319 --> 00:04:18,889
Pour cela nous allons utiliser la méthode `train_new_from_iterator` que possèdent tous les tokenizers rapides de la

44
00:04:18,889 --> 00:04:22,530
librairie et donc notamment `GPT2TokenizerFast`.

45
00:04:22,530 --> 00:04:28,389
C'est la méthode la plus simple dans notre cas pour avoir un tokenizer adapté au code Python.

46
00:04:28,389 --> 00:04:34,229
Rappelez-vous, la première étape consiste à rassembler un corpus de entraînement.

47
00:04:34,229 --> 00:04:39,639
Nous utiliserons une sous-partie de le jeu de données CodeSearchNet contenant uniquement des fonctions Python provenant de

48
00:04:39,639 --> 00:04:42,039
bibliothèques open source sur GitHub.

49
00:04:42,039 --> 00:04:48,890
Ça tombe bien, ce jeu de données est connu par la bibliothèque Datasets et on peut le charger en

50
00:04:48,890 --> 00:04:51,190
deux lignes de code.

51
00:04:51,190 --> 00:04:57,940
Ensuite, comme la méthode `train_new_from_iterator` attend un itérateur de listes de textes nous créons

52
00:04:57,940 --> 00:05:04,030
la fonction `get_training_corpus` qui retournera un itérateur.

53
00:05:04,030 --> 00:05:10,861
Maintenant que nous avons notre itérateur sur notre corpus de fonctions Python, nous pouvons charger l'architecture du tokenizer de GPT-2

54
00:05:10,861 --> 00:05:12,490
.

55
00:05:12,490 --> 00:05:19,450
Ici `old_tokenizer` n'est pas adapté à notre corpus mais nous n'avons besoin que d'une ligne de plus pour

56
00:05:19,450 --> 00:05:21,850
l'entraîner sur notre nouveau corpus.

57
00:05:21,850 --> 00:05:29,310
Un argument commun à la plupart des algorithmes de tokenisation utilisés à l'heure actuelle

58
00:05:29,310 --> 00:05:33,370
est la taille du vocabulaire, nous choisissons ici la valeur 52 000.

59
00:05:33,370 --> 00:05:38,780
Enfin, une fois l'entraînement terminée, il suffit de sauvegarder notre nouveau tokenizer en local

60
00:05:38,780 --> 00:05:45,430
ou de l'envoyer au Hub pour pouvoir le réutiliser très facilement par la suite.

61
00:05:45,430 --> 00:05:49,962
Enfin, voyons ensemble sur un exemple s'il était utile de ré-entraîner un tokenizer similaire

62
00:05:49,962 --> 00:05:55,259
à celui de GTP-2.

63
00:05:55,259 --> 00:06:01,610
Avec le tokenizer original de GPT-2 on voit que tous les espaces sont isolés et le

64
00:06:01,610 --> 00:06:05,860
nom de méthode `randn` relativement courant dans le code python est divisé en 2.

65
00:06:05,860 --> 00:06:10,919
Avec notre nouveau tokenizer, les indentations simples et doubles ont été apprises et la méthode

66
00:06:10,919 --> 00:06:13,410
`randn` est tokenisé en 1 token.

67
00:06:13,410 --> 00:06:23,190
Et avec cela, vous savez maintenant comment entraîner vos propres tokenizers !