Tokenisation

Bonjour à tous, aujourd'hui nous allons explorer la technique des participes dans la modélisation des langues étendues (LLM). Malheureusement, la désambiguïsation est une partie plus complexe et plus délicate des grands modèles linguistiques actuels, mais il est très important de comprendre certains de ses détails car de nombreuses personnes accusent les réseaux neuronaux ou d'autres raisons apparemment mystérieuses d'être à l'origine de certaines lacunes des grands modèles linguistiques, alors qu'en fait, la source de ces problèmes est souvent liée aux techniques de désambiguïsation.
Texte original :https://github.com/karpathy/minbpe

Précédemment : segmentation basée sur les caractères

Qu'est-ce qu'un sous-texte ? En fait, dans notre vidéo précédente [Construire un GPT à partir de zéroDans [ ], nous avons parlé du mot fractionnaire, mais ce n'est qu'une forme très simple et primitive du niveau de caractère. Si vous regardez la vidéo de [Google colab], vous verrez que nous utilisons nos données d'apprentissage ([œuvres de Shakespeare], qui n'est autre qu'une très longue chaîne de caractères en Python :

Premier citoyen : Avant de poursuivre, je vous prie de m'écouter.
Tous : Allez-y, dites-le.
First Citizen : Êtes-vous tous déterminés à mourir plutôt que de mourir de faim ?
Tous : Déterminés. Déterminé.
First Citizen : Tout d'abord, vous savez que Gaius Marcius est l'ennemi numéro un du peuple.
Tous : Nous savons, nous savons.

Mais comment introduire des séquences de caractères dans le modèle linguistique ? La première étape consiste à construire un tableau de vocabulaire qui inclut tous les différents caractères que nous trouvons dans l'ensemble de données d'apprentissage :

``python# C'est le seul caractère qui apparaît dans le texte chars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)
# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65 ````

Immédiatement après, nous créerons une table de conversion entre les caractères individuels et les mots entiers, sur la base du vocabulaire énuméré ci-dessus. Cette table de conversion est en fait un dictionnaire Python :

```` pythonstoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# Encoder : reçoit une chaîne et produit une liste d'entiers correspondants encode = lambda s : [stoi[c ] pour c dans s]# Décodeur : prend une liste d'entiers et la réduit à une chaîne de caractèresdecode = lambda l : ''.join([itos[i] pour i dans l])
print(encode("hii là"))print(decode(encode("hii là")))
# [46, 47, 47, 1, 58, 46, 43, 56, 43]# hii there```.

Après avoir converti les séquences en nombres entiers, nous verrons que chaque nombre entier est utilisé comme index dans une matrice d'intégration bidimensionnelle entraînable. La taille du vocabulaire étant `vocab_size=65`, cette matrice d'intégration comporte également 65 lignes :

```pythonclass BigramLanguageModel(nn.Module).
def __init__(self, vocab_size):super(). __init__()self.token_embedding_table = nn.Embedding(vocab_size, n_embd)
def forward(self, idx, targets=None):tok_emb = self.token_embedding_table(idx) # (B,T,C) ````

Ici, l'"entier" extrait une ligne de la table d'intégration, qui est un vecteur représentant le jeton. Ce vecteur est ensuite introduit dans le transformateur en tant qu'entrée pour le pas de temps correspondant (Transformateur).

Tokénisation des "blocs de caractères" à l'aide de l'algorithme de codage par paire d'octets (BPE)

C'est suffisant pour un modèle de langage rudimentaire au niveau des caractères. Dans la pratique, cependant, les modèles de langage les plus récents utilisent des schémas plus complexes pour construire des vocabulaires de balisage. Ces schémas ne fonctionnent pas au niveau du caractère, mais au niveau du bloc de caractères. Ces vocabulaires de blocs de caractères sont construits à l'aide d'algorithmes tels que le codage par paires d'octets (BPE), une approche que nous expliquerons plus en détail ci-dessous.
En ce qui concerne le développement historique de cette approche, le document GPT-2 de l'OpenAI publié en 2019, intitulé "Language Models as Unsupervised Multitasking Learners", a rendu les algorithmes BPE au niveau de l'octet populaires dans l'étiquetage des modèles de langage. Lisez la section 2.2 de ce document, intitulée "Input Representation", pour connaître la description et la motivation de cet algorithme. Vous les verrez mentionnés à la fin de cette section :

Le vocabulaire a été étendu à 50 257. Nous avons également augmenté la taille du contexte de 512 à 1024 tokens et utilisé une taille de lot plus importante de 512.

Rappelons qu'au niveau de la couche d'attention du transformateur, chaque jeton est une attention à un nombre fini de jetons de la séquence précédente. L'article mentionne que la longueur du contexte du modèle GPT-2 est de 1024 tokens, ce qui représente une amélioration par rapport aux 512 tokens du modèle GPT-1. En d'autres termes, les tokens sont les unités de base qui servent d'entrée au modèle de mémoire linguistique à long terme (LLM). La tokenisation est le processus de conversion des chaînes brutes en Python en listes de tokens et vice versa. Pour donner un autre exemple populaire de l'omniprésence de cette abstraction, si vous regardez [Lama 2L'article], encore une fois, cherchez "markers" et vous obtiendrez 63 mentions. Par exemple, l'article affirme qu'ils se sont entraînés sur deux trillions de jetons, etc.
Avant d'entrer dans les détails de la mise en œuvre, examinons brièvement les raisons pour lesquelles nous devons nous pencher sur le processus de tokenisation. La tokenisation est au cœur de nombreuses bizarreries des LLM et je recommande de ne pas la prendre à la légère. De nombreux problèmes qui semblent liés à la structure des réseaux neuronaux proviennent en fait de la tokenisation. En voici quelques exemples :

  • Pourquoi LLM ne peut-il pas épeler les mots correctement ?
  • Pourquoi LLM n'est-il pas capable d'effectuer des tâches simples de manipulation de chaînes de caractères, comme l'inversion de chaînes ?
  • Pourquoi le LLM est-il peu performant lorsqu'il s'agit de langues autres que l'anglais (par exemple le japonais) ?
  • Pourquoi les performances de LLM sont-elles médiocres lorsqu'il s'agit d'effectuer des opérations arithmétiques simples ?
  • Pourquoi le GPT-2 a-t-il plus de difficultés à programmer en Python ?
  • Pourquoi mon LLM s'arrête-t-il soudainement de fonctionner lorsqu'il rencontre la chaîne "" ?
  • Quel est cet étrange avertissement que je reçois à propos des "espaces de fin" ?
  • Lorsque je pose une question sur "SolidGoldMagikarp", pourquoi LLM se bloque-t-il ?
  • Pourquoi devrais-je préférer utiliser YAML plutôt que JSON pour interagir avec les LLM ?
  • Pourquoi le LLM n'est-il pas un véritable modèle linguistique de bout en bout ?
  • Quelle est la cause profonde de la souffrance ?

Nous reviendrons sur ces sujets à la fin de la vidéo.
Ensuite, chargeons ce fichier [Outils de tokenisation en ligne] L'avantage de cet outil en ligne est que le processus de tokénisation se déroule en temps réel dans votre navigateur web. Vous pouvez facilement saisir une chaîne de texte dans la zone de saisie et voir immédiatement le résultat de la tokénisation sur le côté droit. Le haut de la page montre que nous utilisons actuellementgpt2nous pouvons voir que la chaîne de l'exemple est décomposée en 300 tokens. Ces tokens sont clairement affichés dans des couleurs différentes :

Tokenization(分词标记化)

Par exemple, la chaîne "Tokenisation" est codée sous la forme du jeton 30642, suivi du jeton 1634. L'indice du jeton "est" (notez qu'il y a trois caractères ici, y compris l'espace qui précède, ce qui est important !) L'index du jeton est 318. Notez l'espace, car il est bien présent dans la chaîne et doit être transformé en jeton avec tous les autres caractères, mais il est généralement omis pour des raisons de clarté visuelle. Vous pouvez désactiver la visualisation des espaces en bas de l'outil. De même, le token "at" est 379, "the" est 262, et ainsi de suite.
Examinons ensuite un exemple arithmétique simple. Nous constatons ici que les nombres peuvent être décomposés par le tokeniser de manière incohérente. Par exemple, le nombre 127 est décomposé en un seul jeton composé de trois caractères, alors que le nombre 677 est décomposé en deux jetons : le jeton " 6 " (notez à nouveau l'espace en tête !) et le jeton "77". Nous nous appuyons sur de grands modèles de langage pour comprendre cet arbitraire. Le modèle doit apprendre, à la fois dans ses paramètres et pendant l'entraînement, que les deux jetons ("6" et "77") se combinent pour représenter le nombre 677. De même, si le LLM veut prédire que le résultat de cette addition sera 804, il doit le produire en deux étapes : il émet d'abord le jeton "8", puis le jeton "04". Notez que toutes ces décompositions semblent être complètement arbitraires. Dans l'exemple ci-dessous, nous voyons que 1275 est décomposé en "12" et "75", 6773 est en fait deux jetons "6" et "773", et 8041 est décomposé en "8" et "041".
(A suivre...) (TODO : A moins que nous ne trouvions un moyen de générer automatiquement ce contenu à partir de vidéos, nous continuerons probablement à le faire).

© déclaration de droits d'auteur

Articles connexes

Pas de commentaires

Vous devez être connecté pour participer aux commentaires !
S'inscrire maintenant
aucun
Pas de commentaires...