subtitles/fr/42_training-a-new-tokenizer.srt (201 lines of code) (raw):

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 !