Il y a quelque temps, le cours d'IA en ligne du maître de l'IA Karpathy a reçu 150 000 vues sur l'ensemble du réseau.
A cette époque, certains internautes disaient que la valeur de ce cours de 2 heures équivalait à 4 années d'université.
Ces derniers jours, Karpathy a eu une nouvelle idée :
Convertissez les 2 heures et 13 minutes du contenu vidéo "Construire un tokenizer GPT à partir de zéro" en un chapitre de livre ou un blog. La forme de l'article se concentre sur le thème de la « segmentation des mots ».
Les étapes spécifiques sont les suivantes :
- Ajouter des sous-titres ou un texte de narration à la vidéo.
- Coupez la vidéo en plusieurs paragraphes avec des images et du texte correspondants.
- Utilisez la technologie d'ingénierie rapide des grands modèles linguistiques pour traduire paragraphe par paragraphe.
- Affichez les résultats sous forme de page Web avec des liens vers des parties de la vidéo originale.
Plus largement, un tel flux de travail peut être appliqué à n'importe quelle entrée vidéo, générant automatiquement des « guides de support » pour divers didacticiels dans un format plus facile à lire, à parcourir et à rechercher.
Cela semble faisable, mais aussi assez difficile.
Il a écrit un exemple pour illustrer son imagination dans le cadre du projet GitHub minbpe.
Adresse : https://github.com/karpathy/minbpe/blob/master/lecture.md
Karpathy a déclaré qu'il s'agissait d'une tâche manuelle, c'est-à-dire regarder la vidéo et la traduire Articles au format démarque.
"Je n'ai regardé qu'environ 4 minutes de la vidéo (soit 3% de réalisation), et cela m'a pris environ 30 minutes à écrire, donc ce serait génial si quelque chose comme ça pouvait être fait automatiquement."
Ensuite, c'est l'heure des cours !
Bonjour à tous, aujourd'hui nous aborderons la problématique de la "segmentation de mots" en LLM.
Malheureusement, la « segmentation des mots » est une composante relativement complexe et délicate des grands modèles les plus avancés, mais il nous est nécessaire de la comprendre en détail.
Parce que de nombreux défauts du LLM peuvent être attribués à des réseaux de neurones ou à d'autres facteurs apparemment mystérieux, ces défauts peuvent en réalité être attribués à la « segmentation des mots ».
Segmentation de mots au niveau des caractères
Alors, qu'est-ce que la segmentation de mots ?
En fait, dans la vidéo précédente "Construisons GPT à partir de zéro", j'ai déjà introduit la tokenisation, mais ce n'était qu'une version très simple au niveau des personnages.
Si vous allez sur Google Colab et regardez cette vidéo, vous verrez que nous commençons par les données d'entraînement (Shakespeare), qui ne sont qu'une grosse chaîne en Python :
First Citizen: Before we proceed any further, hear me speak.All: Speak, speak.First Citizen: You are all resolved rather to die than to famish?All: Resolved. resolved.First Citizen: First, you know Caius Marcius is chief enemy to the people.All: We know't, we know't.
Mais comment est-ce qu'on alimente la chaîne dans What about LLM ?
Nous pouvons voir que nous devons d'abord construire un vocabulaire pour tous les caractères possibles dans l'ensemble de la formation :
# here are all the unique characters that occur in this textchars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65
Ensuite, sur la base du vocabulaire ci-dessus, créez un vocabulaire entre les caractères simples et les nombres entiers. Table de recherche pour conversion. Cette table de recherche n'est qu'un dictionnaire Python :
stoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# encoder: take a string, output a list of integersencode = lambda s: [stoi[c] for c in s]# decoder: take a list of integers, output a stringdecode = lambda l: ''.join([itos[i] for i in l])print(encode("hii there"))print(decode(encode("hii there")))# [46, 47, 47, 1, 58, 46, 43, 56, 43]# hii there
Une fois que nous convertissons une chaîne en une séquence d'entiers, nous voyons que chaque entier est utilisé comme index dans l'intégration 2D des paramètres pouvant être entraînés.
Puisque la taille de notre vocabulaire est vocab_size=65 , cette table d'intégration aura également 65 lignes :
class 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, et cette ligne est le vecteur représentant la segmentation des mots. Ce vecteur sera ensuite introduit dans le transformateur comme entrée pour le pas de temps correspondant.
Utilisation de l'algorithme BPE pour la segmentation des "morceaux de caractères"
C'est très bien pour une configuration naïve d'un modèle de langage "au niveau du caractère".
Mais en pratique, dans les modèles linguistiques de pointe, les gens utilisent des schémas plus complexes pour construire ces vocabulaires représentationnels.
Plus précisément, ces solutions ne fonctionnent pas au niveau du personnage, mais au niveau du "bloc de personnage". La façon dont ces vocabulaires de blocs sont construits consiste à utiliser des algorithmes tels que le Byte Pair Encoding (BPE), que nous décrivons en détail ci-dessous.
Passons brièvement en revue le développement historique de cette méthode. L'article qui utilise l'algorithme BPE au niveau de l'octet pour la segmentation des mots du modèle de langage est l'article GPT-2 Les modèles de langage sont des apprenants multitâches non supervisés publié par OpenAI en 2019.
Adresse papier : https://d4mucfpksywv.cloudfront.net/better-lingual-models/lingual_models_are_unsupervised_multitask_learners.pdf
Faites défiler jusqu'à la section 2.2 « Représentation des entrées », où ils décrivent et motivent cet algorithme. . À la fin de cette section, vous verrez qu'ils disent :
Vocabulaire étendu à 50 257 mots. Nous avons également augmenté la taille du contexte de 512 à 1 024 jetons et utilisé une taille de lot plus grande de 512.
Rappelez que dans la couche d'attention du Transformer, chaque jeton est associé à une liste limitée de jetons précédents dans la séquence.
Cet article souligne que la longueur du contexte du modèle GPT-2 est passée de 512 jetons dans GPT-1 à 1024 jetons.
En d'autres termes, le token est "l'atome" de base à l'entrée de LLM.
La « tokenisation » est le processus de conversion de chaînes originales en Python en listes de jetons, et vice versa.
Il existe un autre exemple populaire qui prouve l'universalité de cette abstraction. Si vous recherchez également "jeton" dans l'article de Llama 2, vous obtiendrez 63 résultats correspondants.
Par exemple, le journal affirme qu'ils se sont entraînés sur 2 000 milliards de jetons, etc.
Adresse papier : https://arxiv.org/pdf/2307.09288.pdf
Une brève discussion sur la complexité de la segmentation des mots
Avant d'entrer dans les détails de la mise en œuvre, expliquons brièvement qu'il est nécessaire de comprendre en détail le processus de « segmentation des mots ».
La tokenisation est au cœur de très nombreux problèmes étranges en LLM, et je vous recommande de ne pas l'ignorer.
De nombreux problèmes apparemment liés à l'architecture des réseaux neuronaux sont en réalité liés à la segmentation des mots. Voici quelques exemples :
- Pourquoi LLM ne parvient-il pas à épeler les mots ? ——Segmentation des mots
- Pourquoi LLM ne peut-il pas effectuer des tâches de traitement de chaînes très simples, telles que l'inversion des chaînes ? ——Segmentation des mots
- Pourquoi le LLM est-il pire dans les tâches en langue autre que l'anglais (comme le japonais) ? ——Participe
- Pourquoi LLM n'est-il pas bon en arithmétique simple ? ——Segmentation des mots
- Pourquoi GPT-2 rencontre-t-il plus de problèmes lors du codage en Python ? ——Segmentation de mots
- Pourquoi mon LLM s'arrête-t-il soudainement lorsqu'il voit la chaîne ? ——Participe
- Quel est cet étrange avertissement que j'ai reçu à propos des "espaces de fin" ? ——Participe
- Si je demande à LLM à propos de "SolidGoldMagikarp", pourquoi plante-t-il ? ——Segmentation de mots
- Pourquoi devrais-je utiliser YAML avec LLM au lieu de JSON ? ——Segmentation des mots
- Pourquoi LLM n'est-il pas une véritable modélisation linguistique de bout en bout ? ——Participe
Nous reviendrons sur ces questions à la fin de la vidéo.
Aperçu visuel de la segmentation de mots
Ensuite, chargeons cette WebApp de segmentation de mots.
Adresse : https://tiktokenizer.vercel.app/
L'avantage de cette application web est que la tokenisation s'exécute en temps réel dans le navigateur web, vous permettant de saisir facilement du texte sur la chaîne du côté entrée et voyez les résultats de la segmentation des mots sur la droite.
En haut, vous pouvez voir que nous utilisons actuellement le tokenizer gpt2, et vous pouvez voir que la chaîne collée dans cet exemple est actuellement tokenisée en 300 tokens.
Ici, ils sont clairement affichés en couleur :
Par exemple, la chaîne "Tokenization" est codée en token30642, suivie du token 1634.
le jeton "is" (notez qu'il s'agit de trois caractères, y compris l'espace précédent, c'est important !) vaut 318.
Soyez prudent avec l'utilisation des espaces, car ils sont absolument présents dans la chaîne et doivent être rédigés avec tous les autres caractères. Cependant, il est généralement omis lors de la visualisation par souci de clarté.
Vous pouvez activer et désactiver sa fonction de visualisation en bas de l'application. De même, le jeton « à » vaut 379, « le » vaut 262, et ainsi de suite.
Ensuite, nous avons un exemple arithmétique simple.
Ici, nous voyons que le tokenizer peut être incohérent dans sa décomposition des nombres. Par exemple, le nombre 127 est un jeton à 3 caractères, mais le nombre 677 l'est car il y a 2 jetons : 6 (encore une fois, notez l'espace précédent) et 77.
Nous nous appuyons sur LLM pour expliquer cet arbitraire.
Il doit se renseigner sur ces deux jetons (6 et 77 se combinent en fait pour former le nombre 677) au sein de ses paramètres et lors de l'entraînement.
De même, on peut voir que si le LLM veut prédire que le résultat de cette somme est le nombre 804, il doit le sortir en deux pas de temps :
D'abord, il doit émettre le jeton "8" , puis c'est le jeton "04".
Veuillez noter que toutes ces répartitions semblent complètement arbitraires. Dans l'exemple ci-dessous, nous pouvons voir que 1275 est "12", puis "75", 6773 est en fait trois jetons "6", "77" et "3", et 8041 est "8" et "041" .
(À suivre...)
(À FAIRE : Si vous souhaitez continuer la version texte du contenu, à moins que nous trouvions comment la générer automatiquement à partir de la vidéo)
Les internautes ont dit : super, en fait, je préfère lire ces articles plutôt que de regarder des vidéos, c'est plus facile de contrôler mon propre rythme.
Certains internautes ont donné des conseils à Karpathy :
"Cela semble délicat, mais cela pourrait être possible en utilisant LangChain. Je me demandais si je pouvais utiliser la transcription chuchotée pour produire un plan de haut niveau avec des chapitres clairs, puis traiter ces morceaux de chapitre en parallèle, en me concentrant sur chacun dans le contexte. du plan général. Le contenu spécifique du bloc de chapitre (des images sont également générées pour chaque chapitre traité en parallèle. Ensuite, toutes les marques de référence générées sont compilées jusqu'à la fin de l'article via LLM. "
Quelqu'un a écrit un pipeline pour cela, et il sera bientôt open source.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!