Dans cette vidéo nous allons voir ensemble quel est le but d'entraîner un tokenizer, quelles
sont les étapes clés à suivre et quelle est la manière la plus simple de le faire.
Vous vous poserez la question « Dois-je entraîner un nouveau tokenizer ? »
lorsque vous envisagez de entraîner un nouveau modèle à partir de zéro.
Un tokenizer entraîné ne serait pas adapté à votre corpus si votre corpus est dans une
langue différente, utilise de nouveaux caractères tels que des accents ou des lettres majuscules, a un vocabulaire spécifique,
par exemple médical ou juridique, ou utilise un style différent, une langue d'un autre siècle par
exemple.
Si je prends le tokenizer entraîné pour le modèle `bert-base-uncased` et ignore
son étape de normalisation alors nous pouvons voir que l'opération de tokenisation sur la
phrase anglaise « here is a sentence adapted to our tokenizer » produit une liste plutôt satisfaisante
de tokens dans le sens où cette phrase de 8 mots est tokenisée en 9 tokens.
Par contre si on utilise ce même tokenizer sur une phrase en bengali, on voit que soit
un mot est divisé en plusieurs sous tokens soit que le tokenizer ne connait pas un des
caractères unicode et ne retourne qu'un token inconnu.
Le fait qu'un mot commun soit divisé en plusieurs tokens peut être problématique car les
modèles de langage ne peuvent gérer qu'une séquence de tokens de longueur limitée.
Un tokenizer qui divise excessivement votre texte initial peut même avoir un impact sur les performances de votre
modèle.
Les tokens [UNK] sont également problématiques car le modèle ne pourra extraire aucune
information de la partie inconnue du texte.
Dans cet autre exemple, on peut voir que le tokenizer remplace les mots contenant des caractères
avec des accents et des majuscules par des tokens inconnus.
Enfin, si nous réutilisons ce tokenizer pour tokeniser du vocabulaire médical nous constatons à nouveau
qu'un même mot est divisé en plusieurs sous-tokens : 4 pour « paracetamol » et « pharyngitis ».
La plupart des tokenizers utilisés par les modèles de langage de pointe actuels doivent être
entraînés sur un corpus similaire à celui utilisé pour pré-entraîner le modèle de langage.
Cette entraînement consiste à apprendre des règles pour diviser le texte en tokens et la manière
d'apprendre ces règles et de les utiliser dépend du modèle de tokenizer choisi.
Ainsi, pour entraîner un nouveau tokenizer il faut d'abord construire un corpus d'apprentissage composé
de textes bruts.
Ensuite, vous devez choisir une architecture pour votre tokenizer.
Ici deux options s'offrent à vous : la plus simple est de réutiliser la même architecture que celle
d'un tokenizer utilisé par un autre modèle déjà entraîné, sinon il est également possible de
concevoir entièrement votre tokenizer mais cela demande plus d'expérience et d'attention.
Une fois l'architecture choisie, on peut ainsi entraîner ce tokenizer sur votre corpus constitué.
Enfin, la dernière chose que vous devez faire est de sauvegarder les règles apprises pour pouvoir
utiliser ce tokenizer qui est maintenant prêt à être utilisé.
Prenons un exemple : supposons que vous souhaitiez entraîner un modèle GPT-2 sur du code Python.
Même si le code Python est en anglais ce type de texte est très spécifique et mériterait
un tokenizer entraîné dessus. Pour vous en convaincre nous verrons à la fin la différence
produite sur un exemple.
Pour cela nous allons utiliser la méthode `train_new_from_iterator` que possèdent tous les tokenizers rapides de la
librairie et donc notamment `GPT2TokenizerFast`.
C'est la méthode la plus simple dans notre cas pour avoir un tokenizer adapté au code Python.
Rappelez-vous, la première étape consiste à rassembler un corpus de entraînement.
Nous utiliserons une sous-partie de le jeu de données CodeSearchNet contenant uniquement des fonctions Python provenant de
bibliothèques open source sur GitHub.
Ça tombe bien, ce jeu de données est connu par la bibliothèque Datasets et on peut le charger en
deux lignes de code.
Ensuite, comme la méthode `train_new_from_iterator` attend un itérateur de listes de textes nous créons
la fonction `get_training_corpus` qui retournera un itérateur.
Maintenant que nous avons notre itérateur sur notre corpus de fonctions Python, nous pouvons charger l'architecture du tokenizer de GPT-2
.
Ici `old_tokenizer` n'est pas adapté à notre corpus mais nous n'avons besoin que d'une ligne de plus pour
l'entraîner sur notre nouveau corpus.
Un argument commun à la plupart des algorithmes de tokenisation utilisés à l'heure actuelle
est la taille du vocabulaire, nous choisissons ici la valeur 52 000.
Enfin, une fois l'entraînement terminée, il suffit de sauvegarder notre nouveau tokenizer en local
ou de l'envoyer au Hub pour pouvoir le réutiliser très facilement par la suite.
Enfin, voyons ensemble sur un exemple s'il était utile de ré-entraîner un tokenizer similaire
à celui de GTP-2.
Avec le tokenizer original de GPT-2 on voit que tous les espaces sont isolés et le
nom de méthode `randn` relativement courant dans le code python est divisé en 2.
Avec notre nouveau tokenizer, les indentations simples et doubles ont été apprises et la méthode
`randn` est tokenisé en 1 token.
Et avec cela, vous savez maintenant comment entraîner vos propres tokenizers !