CS 25 Transformers United V2 - Introduction et Conférence d'Andrej Karpathy
19 mai 2023
Artificial Intelligence
Introduction au cours CS 25 Transformers United V2
Bonjour à tous. Bienvenue à CS 25 Transformers United V2. C'était un cours qui s'est tenu à Stanford à l'hiver 2023. Ce cours ne porte pas sur les robots capables de se transformer en voitures, comme cette image pourrait le suggérer. Il s'agit plutôt de modèles d'apprentissage profond qui ont conquis le monde et révolutionné le domaine de l'IA et d'autres encore. Partant du traitement du langage naturel, les transformers ont été appliqués partout, de la vision par ordinateur, l'apprentissage par renforcement, la biologie, la robotique et plus encore. Nous avons une série de vidéos passionnantes pour vous avec des conférenciers vraiment fascinants qui feront des présentations sur la façon dont ils appliquent les transformers à leurs recherches dans différents domaines et domaines. Nous espérons que vous apprécierez et apprendrez de ces vidéos. Sans plus tarder, commençons. Il s'agit d'un cours purement introductif et nous aborderons les éléments de base des transformers. Commençons par présenter les instructeurs.
Présentation des instructeurs
En ce qui me concerne, je suis actuellement en report temporaire de mon programme de doctorat et je dirige l'IA dans une startup de robotique, Collaborative Robotics, travaillant sur des robots à usage général, un peu comme le Tesla Bot. Je suis très passionné par la robotique et la création d'algorithmes d'apprentissage profond efficaces. Mes intérêts de recherche portent sur l'apprentissage par renforcement, la vision par ordinateur, la modélisation générative, et j'ai un certain nombre de publications en robotique, en conduite autonome et dans d'autres domaines. J'ai fait mes études de premier cycle à Cornell. Je suis ravi de vous rencontrer tous.
Cool. Je suis Steven, actuellement étudiant en première année de doctorat en informatique. J'ai précédemment fait mon master à CMU et mon premier cycle à Waterloo. Je m'intéresse principalement à la recherche en NLP, tout ce qui implique le langage et le texte. Plus récemment, je me suis davantage intéressé à la vision par ordinateur ainsi qu'au multimodal. Et juste quelques trucs que je fais pour le plaisir, beaucoup de musique, principalement du piano. Je poste beaucoup sur mon Insta, YouTube et TikTok, donc si vous voulez aller voir. Mes amis et moi lançons également un Stanford Piano Club. Si quelqu'un est intéressé, n'hésitez pas à m'envoyer un e-mail ou un DM pour plus de détails. En dehors de cela, j'aime les arts martiaux, la musculation et je suis un grand fan de K-dramas, d'animes et un joueur occasionnel.
D'accord, cool. Je m'appelle Rylan. Puisque je parle de moi, je veux juste dire très brièvement que je suis super excité d'enseigner ce cours. Je l'ai suivi la dernière fois qu'il a été proposé et je me suis beaucoup amusé. Je pense que nous avons fait venir un groupe de conférenciers vraiment formidables la dernière fois. Je suis super excité pour cette édition. Je vous remercie d'être tous ici et j'attends avec impatience un trimestre vraiment amusant avec vous. Merci.
Fait amusant, Rylan était l'étudiant le plus bavard l'année dernière. Donc si quelqu'un veut devenir instructeur l'année prochaine, vous savez quoi faire.
Objectifs du cours et évolution des Transformers
Ce que nous espérons que vous apprendrez dans ce cours, c'est tout d'abord comment fonctionnent les transformers et comment ils sont appliqués au-delà du NLP. De nos jours, nous les utilisons à peu près partout dans l'IA et l'apprentissage automatique. Quelles sont les nouvelles directions de recherche intéressantes sur ces sujets ?
Ce cours n'est qu'une introduction. Nous parlerons des bases des transformers, nous les présenterons et nous parlerons du mécanisme d'auto-attention sur lequel ils sont fondés. Nous ferons une plongée profonde dans des modèles comme BERT, GPT, et des choses comme ça. Commençons. Laissez-moi commencer par présenter la chronologie de l'attention. L'attention a commencé avec l'article, Attention Is All You Need, de Vaswani et al. en 2017. C'était le début des transformers. Avant cela, nous avions l'ère préhistorique avec des modèles comme les RNN, les LSTM et des mécanismes d'attention simples qui ne fonctionnaient pas ou ne passaient pas bien à l'échelle. À partir de 2017, nous avons vu cette explosion des transformers dans le NLP où les gens ont commencé à l'utiliser pour tout. J'ai même entendu cette citation de Google : 'nos performances augmentaient chaque fois que nous licenciions un linguiste.' C'était en 2018. De 2018 à 2020, nous avons vu cette explosion des transformers dans d'autres domaines comme la vision, la biologie avec AlphaFold, et plus encore. 2021 a été le début de l'ère générative où nous avons eu des modèles comme Codex, GPT, DALL-E et la diffusion stable. Nous avons commencé à passer à l'échelle supérieure en IA. Aujourd'hui, c'est le présent. C'est 2022 et le début de 2023, et nous avons des modèles comme ChatGPT, Whisper et bien d'autres. Nous progressons sans ralentir. C'est l'avenir.
En allant plus loin, il y avait autrefois les RNN. Nous avions des modèles séquence à séquence, des LSTM et des GRU. Ce qui fonctionnait, c'est qu'ils étaient bons pour encoder l'historique, mais ils n'encodaient pas bien les longues séquences et étaient très mauvais pour encoder le contexte. Imaginez essayer de prédire le dernier mot du texte : 'J'ai grandi en France... Je parle couramment [blanc]'. Vous devez comprendre le contexte pour prédire le français. Les mécanismes d'attention sont très bons pour cela, alors que les LSTM ne fonctionnent pas aussi bien. Une autre chose pour laquelle les transformers sont bons est la prédiction de contexte, comme la recherche de cartes d'attention. Si j'ai un mot comme 'il', à quel nom correspond-il ? Nous pouvons lui donner une probabilité d'attention sur les activations possibles, et cela fonctionne bien mieux que les mécanismes existants.
Là où nous en étions en 2021, nous étaient sur le point de décoller. Nous commencions à réaliser le potentiel des transformers dans différents domaines. Nous avons résolu de nombreux problèmes de séquences longues comme le repliement des protéines, AlphaFold et le RL hors ligne. Nous avons commencé à voir une généralisation à partir de peu d'exemples (few-shot) et sans exemple (zero-shot). Nous avons vu des tâches multimodales et des applications comme la génération d'images à partir du langage avec DALL-E. Cela semble ancien mais ce n'était il y a seulement deux ans. C'est là que nous allions de 2021 à 2022 : nous sommes passés du point de décoller au décollage effectif. Nous voyons maintenant des applications uniques dans la génération audio, l'art, la musique et la narration. Nous commençons à voir des capacités de raisonnement comme le bon sens, le raisonnement logique et le raisonnement mathématique. Nous sommes également en mesure d'obtenir un alignement humain et une interaction. Nous utilisons l'apprentissage par renforcement à partir de commentaires humains (RLHF), c'est ainsi que ChatGPT est entraîné pour être très performant. Nous avons de nombreux mécanismes pour contrôler la toxicité, les biais et l'éthique, ainsi que des développements dans d'autres domaines comme les modèles de diffusion.
L'avenir est un vaisseau spatial et nous en sommes tous ravis. Il y a beaucoup d'autres applications que nous pouvons activer, et ce serait formidable si nous pouvions voir les transformers y fonctionner. Un grand exemple est la compréhension et la génération de vidéos. C'est quelque chose qui intéresse tout le monde et j'espère que nous verrons beaucoup de modèles dans ce domaine cette année, ainsi que dans la finance et les affaires. Je serais très excité de voir GPT écrire un roman, mais nous devons résoudre la modélisation de séquences très longues. La plupart des modèles de transformers sont encore limités à environ 4 000 jetons. Nous devons les amener à se généraliser beaucoup mieux sur de longues séquences. Nous voulons également des agents généralisés capables de faire des prédictions multi-tâches et multi-entrées comme Gato. Je pense que nous en verrons plus aussi. Enfin, nous voulons des modèles spécifiques à un domaine. Vous pourriez vouloir un modèle GPT pour la santé, comme un DoctorGPT, ou un LawyerGPT formé uniquement sur des données juridiques. Actuellement, we avons des modèles GPT formés sur tout, mais nous pourrions commencer à voir des modèles plus spécialisés qui sont bons pour une tâche. Nous pourrions avoir un mélange d'experts, où vous consultez des modèles d'IA experts pour vos différents besoins. Il manque encore des ingrédients pour que cela soit un succès. Le premier est la mémoire externe. Nous voyons cela avec des modèles comme ChatGPT où les interactions sont de courte durée, il n'y a pas de mémoire à long terme, et ils n'ont pas la capacité de se souvenir ou de stocker des conversations à long terme. C'est quelque chose que nous voulons corriger. Le second est de réduire la complexité de calcul. Le mécanisme d'attention est quadratique par rapport à la longueur de la séquence, ce qui est lent, et nous voulons le réduire. Nous voulons améliorer la contrôlabilité de ces modèles. Beaucoup de ces modèles peuvent être stochastiques et nous voulons contrôler le type de sortie que nous obtenons d'eux. Enfin, nous voulons aligner nos modèles de langage de pointe sur le fonctionnement du cerveau humain. Nous voyons ces recherches mais nous en avons encore besoin sur la façon dont ils peuvent imiter notre cerveau. Merci.
Contexte historique et convergence de l'IA
Salut. Je suis ravi d'être ici. J'habite tout près, alors j'ai reçu l'invitation à venir en classe et j'ai juste fait le trajet à pied. Mais ensuite, j'ai passé 10 heures sur les diapositives, donc ce n'était pas si simple. Je veux parler des transformers. Je vais sauter les deux premiers et parler de celui-là juste pour simplifier le cours puisque nous n'avons pas le temps. Je voulais donner un peu de contexte sur la raison pour laquelle ce cours sur les transformers existe même. Un peu de contexte historique : je me sens comme Bilbo là-bas. J'ai rejoint l'IA il y a environ une décennie, en 2012. À l'époque, on ne disait même pas qu'on rejoignait l'IA ; c'était un mot sale. À l'époque, ce n'était même pas l'apprentissage profond ; c'était l'apprentissage automatique. C'était le terme que vous utilisiez si vous étiez sérieux. Maintenant, l'IA est acceptable. Réalisez-vous à quel point vous avez de la chance d'entrer dans ce domaine vers 2023 ? En 2011, quand je travaillais sur la vision par ordinateur, vos pipelines ressemblaient à ceci : vous vouliez classer des images, vous alliez dans un article, et vous aviez trois pages décrivant un zoo de descripteurs de caractéristiques. Vous alliez à une session de posters et tout le monde avait ses propres descripteurs de caractéristiques qu'il proposait ; c'était totalement ridicule. Vous preniez des notes sur celui que vous devriez incorporer dans votre pipeline parce que vous les extrayiez tous et mettiez ensuite un SVM par-dessus. Vous deviez vous assurer d'obtenir vos histogrammes SIFT clairsemés, vos SSIM, vos histogrammes de couleurs, vos textons, vos images minuscules et vos histogrammes spécifiques à la géométrie. Tous avaient un code compliqué. Vous collectiez du code de partout et vous l'exécutiez et c'était un cauchemar total. En plus de cela, cela ne fonctionnait souvent pas. Vous obteniez des prédictions comme celle-ci et vous vous contentiez de hausser les épaules. Aujourd'hui, vous chercheriez un bug. Pire que cela, chaque domaine de l'IA avait son propre vocabulaire complètement séparé. Dans les articles de NLP, on parlait de marquage de parties du discours, d'analyse morphologique, d'analyse syntaxique et de résolution de coréférence. Le vocabulaire était complètement différent et vous ne pouviez pas lire d'articles dans différents domaines. Cela a changé à partir de 2012 quand Alex Krizhevsky et ses collègues ont démontré que si vous passez à l'échelle un grand réseau neuronal sur un grand ensemble de données, vous pouvez obtenir des performances très solides. Jusque-là, on se concentrait beaucoup sur les algorithmes, mais cela a montré que les réseaux neuronaux passent très bien à l'échelle. Vous devez maintenant vous soucier du calcul et des données, et si vous passez à l'échelle supérieure, cela fonctionne bien. Cette recette a été copiée-collée dans de nombreux domaines de l'IA. Nous avons commencé à voir des réseaux neuronaux apparaître partout en vision par ordinateur, NLP, parole, traduction et RL. Tout le monde a commencé à utiliser la même boîte à outils de modélisation. Maintenant, quand vous lisez des articles sur la traduction automatique, vous reconnaissez des mots comme réseau neuronal, paramètres et optimiseur. Cela a diminué la barrière à l'entrée dans différents domaines. Le plus important est que lorsque le transformer est sorti en 2017, les architectures ont convergé vers une seule architecture que vous copiez-collez partout. C'était un modeste article sur la traduction automatique, mais nous avons découvert depuis lors que vous pouvez simplement copier-coller cette architecture et l'utiliser partout. Ce qui change, ce sont les détails des données et la façon dont vous les introduisez. Cette convergence a été remarquable à observer au cours de la dernière décennie. Je pense que c'est un indice que nous convergeons vers quelque chose que le cerveau fait car le cerveau est très homogène sur tout le cortex. Vos cortex auditif et visuel se ressemblent beaucoup. Peut-être que nous convergeons vers une sorte d'algorithme d'apprentissage puissant et uniforme.
Mécanismes d'attention et auto-attention
Pourriez-vous expliquer un peu la différence entre l'auto-attention et l'attention multi-têtes ? Quel est l'avantage d'avoir plusieurs têtes ?
L'attention multi-têtes est simplement ce schéma d'attention appliqué plusieurs fois en parallèle. Plusieurs têtes signifient simplement des applications indépendantes de la même attention. Ce schéma de passage de messages se produit en parallèle plusieurs fois avec des poids différents pour la requête, la clé et la valeur. Vous pouvez le voir comme la recherche de différents types d'informations à partir de différents nœuds et la collecte de tout cela dans le même nœud. Les têtes sont des copier-coller en parallèle, et les couches sont des copier-coller en série. L'auto-attention fait référence à chaque nœud produisant une clé, une requête et une valeur à partir de ce nœud individuel. Lorsque vous avez une attention croisée provenant de l'encodeur, les requêtes sont toujours produites à partir de ce nœud, mais les clés et les valeurs sont produites en fonction des nœuds provenant de l'encodeur. J'ai mes requêtes parce que je cherche certaines choses en tant que cinquième mot dans une séquence. Les clés et les valeurs de la source d'information peuvent provenir de nœuds précédents dans la séquence de décodage actuelle ou du haut de l'encodeur. L'auto-attention et l'attention croisée ne diffèrent que par l'origine des clés et des valeurs, mais algorithmiquement les opérations mathématiques sont les mêmes.
Deux questions pour vous. La première question est la suivante : dans le paradigme du graphe de passage de messages, que représentent les couches ?
Chacun de ces nœuds est un jeton. Ils n'en ont pas une très bonne image dans le transformer, mais ce nœud ici pourrait représenter le troisième mot à la sortie du décodeur. Au début, c'est juste le plongement du mot. Je dois réfléchir un peu plus à cette analogie ; je l'ai trouvée ce matin.
Nous ne voulons pas simplement prendre trois mots et prédire le quatrième. Nous voulons prédire comment passer d'une phrase anglaise à une phrase française. Le problème clé était que vous pouviez avoir un nombre arbitraire de mots en anglais et un nombre arbitraire de mots en français. Comment obtenir une architecture capable de traiter cette entrée de taille variable ? Ici, ils ont utilisé un LSTM avec un encodeur sur la gauche qui consomme les mots un par un pour construire un contexte. Cela agit comme un vecteur de conditionnement pour le décodeur RNN qui traduit l'anglais vers le français. Le gros problème était le goulot d'étranglement de l'encodeur. La phrase anglaise entière est compressée dans un seul vecteur, ce qui représente trop d'informations à maintenir correctement. Les gens ont cherché des moyens d'atténuer cela, ce qui nous a amenés à l'article Neural Machine Translation by Jointly Learning to Align and Translate. Ils ont proposé d'étendre cela en permettant au modèle de rechercher automatiquement de manière souple (soft search) les parties de la phrase source pertinentes pour prédire un mot cible sans avoir à former ces parties explicitement. C'était un moyen de regarder en arrière les mots provenant de l'encodeur en utilisant la recherche souple. Votre vecteur de contexte provenant de l'encodeur est une somme pondérée des états cachés basée sur les compatibilités entre l'état de décodage actuel et les états cachés de l'encodeur. C'était la première fois que je voyais l'attention et le terme utilisé pour appeler ce mécanisme. J'ai envoyé un e-mail au premier auteur, Dzmitry, pour savoir d'où il avait tiré cela. Il m'a répondu qu'il voulait permettre au décodeur RNN d'apprendre où placer le curseur dans la séquence source. Cela a été inspiré par les exercices de traduction au collège où votre regard oscille entre la source et la cible au fur et à mesure que vous traduisez. Il a exprimé la recherche souple sous forme de softmax et de moyenne pondérée des états RNN, et cela a fonctionné dès le premier essai. Le nom attention vient de Yoshua Bengio lors de l'une des dernières révisions de l'article. Cela nous amène à 2017 et à Attention Is All You Need. Il dit que vous pouvez tout supprimer et ne garder que l'attention elle-même. C'était un mélange de plusieurs choses combinées d'une manière unique qui a atteint un bon minimum local dans l'espace des architectures. Étant donné que l'attention opère sur des ensembles, vous devez encoder la position des entrées. Ils ont incorporé des structures de réseaux résiduels, intercalé l'attention avec des perceptrons multicouches, utilisé des normalisations de couche et introduit plusieurs têtes d'attention en parallèle. Ils nous ont donné un bon ensemble d'hyperparamètres qui sont toujours utilisés aujourd'hui, comme le facteur d'expansion 4x dans le MLP. Les GPT que vous voyez aujourd'hui sont essentiellement l'architecture de 2017 d'il y a cinq ans. Elle s'est avérée remarquablement résiliente.
Implémentation technique : nanoGPT et architecture
Pourriez-vous approfondir un peu l'attention souple et l'attention multi-têtes ? Quel est l'avantage de ce type de mécanisme ?
L'attention souple et l'attention multi-têtes sont essentiellement le même mécanisme appliqué plusieurs fois en parallèle. Plusieurs têtes signifient des applications indépendantes du schéma d'attention avec des poids différents pour la requête, la clé et la valeur. En parallèle, je cherche différents types d'informations à partir de différents nœuds et je les collecte dans le même nœud. L'auto-attention signifie que chaque nœud produit sa propre clé, requête et valeur. Dans l'attention croisée, les requêtes sont produites à partir du nœud, mais les clés et les valeurs proviennent de l'encodeur. Algorithmiquement, ce sont les mêmes opérations mathématiques, elles diffèrent simplement par l'endroit d'où provient la source d'information pour les clés et les valeurs.
Juste une question de la première partie. Dans le paradigme du graphe de passage de messages, que représentent les couches ?
Chacun de ces nœuds est un jeton. Ce nœud ici pourrait représenter le troisième mot à la sortie du décodeur. Au début, c'est juste le plongement du mot. J'irai à l'implémentation de nanoGPT, qui est une implémentation minimale d'un transformer. Elle reproduit GPT-2 sur OpenWebText. C'est très lisible en 300 lignes. Regardons un transformer uniquement décodeur, qui est un modèle de langage prédisant le mot ou le caractère suivant dans une séquence. Nous prenons du texte comme du Shakespeare, et nous le convertissons en une séquence d'entiers. Chaque caractère reçoit un entier, et vous le concaténez en une longue séquence. Nous produisons des lots de données basés sur une taille de bloc, qui est la longueur maximale du contexte, et une taille de lot pour le traitement parallèle. Un seul lot d'exemples contient une tonne d'exemples individuels sur lesquels le transformer apprend en parallèle. La classe GPT encode par position l'identité des indices via une table de recherche de plongement. Les informations sur le quoi et le où sont combinées de manière additive. Cela alimente les blocs du transformer. À la fin, il y a une normalisation de couche et une projection linéaire pour obtenir la distribution de probabilité pour le caractère suivant. Les cibles sont les entrées décalées d'un temps, alimentant une perte d'entropie croisée. Ces blocs ont une phase de communication et une phase de calcul. Dans la phase de communication, les nœuds se parlent. Dans le décodeur, le premier nœud ne pointe que vers lui-même, le second nœud pointe vers le premier et lui-même, et ainsi de suite. Après avoir échangé des informations, elles sont traitées à l'aide du perceptron multicouche dans la phase de calcul. La partie auto-attention causale est la plus compliquée en raison du masquage de la connectivité afin que vous ne puissiez pas obtenir d'informations du futur. Nous calculons les requêtes, les clés et les valeurs. Nous évaluons le produit scalaire pour tous les éléments de lot, de tête et de temps. Nous effectuons un remplissage masqué pour fixer l'attention entre les nœuds qui ne sont pas censés communiquer à l'infini négatif, rendant leur attention nulle. Ensuite, nous faisons une somme pondérée des valeurs au niveau de ces nœuds. Cela implémente la phase de communication. Ensuite, vous pouvez générer du Shakespeare à l'infini en commençant par un jeton, en communiquant avec vous-même pour obtenir le caractère suivant, puis en le ré-encodant et en le réinjectant.
Pourriez-vous revenir sur le graphe ? Lorsque nous communiquons des informations, il s'agit essentiellement d'un graphe entièrement connecté entre tous les nœuds et nous apprenons ensuite les poids des arêtes. Le transformer fonctionne-t-il toujours comme s'il s'agissait d'un graphe dynamique où les connexions changent à chaque pas de temps ?
Je n'aime certainement pas l'approche de modélisation autorégressive. C'est bizarre d'échantillonner un jeton et de s'y engager. Peut-être existe-t-il des hybrides avec la diffusion, qui est une approche émergente que je trouve plus attrayante. Quand j'échantillonne du texte, je n'y vais pas mot par mot en m'engageant ; je fais un premier brouillon puis un second brouillon amélioré. Cela ressemble à un processus de diffusion. Ce serait mon espoir.
J'ai aussi une question. J'aime l'analogie du graphe parce qu'elle nous donne un moyen de visualiser ce qui se passe. Diriez-vous que l'auto-attention revient à calculer un poids d'arête en utilisant le produit scalaire sur les nœuds, puis à le multiplier par les valeurs pour le propager ?
Les valeurs coulent vers moi et me mettent à jour. Cela se produit pour chaque nœud individuellement et nous mettons à jour à la fin. Ce schéma de passage de messages est au cœur du transformer, se produisant de manière vectorisée et par lots, entrecoupé de normalisations de couche pour que l'entraînement se comporte mieux. C'est ce qui se passe dans le mécanisme d'attention à un haut niveau.
Dans la phase de communication, ce passage de messages se produit dans chaque tête en parallèle, puis dans chaque couche en série avec des poids différents. En termes de connectivité, tous les jetons de l'encodeur sont entièrement connectés et communiquent pleinement. Dans le décodeur, nous ne voulons pas de communication à partir des jetons futurs car ils donnent la réponse, de sorte que les jetons ne sont connectés qu'à tout ce qui les précède, créant une structure triangulaire. C'est le schéma de passage de messages qu'il implémente.
Dans l'attention croisée avec le décodeur, vous consommez les caractéristiques du haut de l'encodeur. Dans l'encodeur, tous les nœuds se regardent de nombreuses fois pour comprendre ce qui s'y trouve. Le décodeur regarde alors uniquement les nœuds du haut. C'est le schéma de passage de messages. J'allais passer à l'implémentation du transformer à moins qu'il n'y ait des questions.
Questions sur l'attention multi-têtes et les graphes
Pourriez-vous expliquer un peu l'auto-attention et l'attention multi-têtes ? Quel est l'effet d'avoir plusieurs têtes ?
L'attention multi-têtes est le schéma d'attention appliqué plusieurs fois en parallèle. Plusieurs têtes signifient des applications indépendantes de la même attention avec des poids différents pour la requête, la clé et la valeur. Vous recherchez différents types d'informations à partir de différents nœuds et vous les collectez dans le même nœud. Les têtes sont des copier-coller en parallèle, et les couches sont des copier-coller en série. L'auto-attention signifie que le nœud produit sa clé, sa requête et sa valeur à partir de lui-même. L'attention croisée signifie que les requêtes sont produites à partir du nœud, mais que les clés et les valeurs proviennent d'une source externe comme un encodeur. Algorithmiquement, ce sont les mêmes opérations mathématiques.
J'ai deux questions. Premièrement, la première question est dans le paradigme du graphe de passage de messages, à quoi correspondent les couches ?
Chacun de ces nœuds est un jeton. Ce nœud ici pourrait représenter le troisième mot à la sortie du décodeur. Au début, c'est juste le plongement du mot. Je dois réfléchir davantage à cette analogie ; je l'ai trouvée hier.
Avez-vous une autre question ? Un exemple d'instanciation serait une bonne intuition car s'agit-il de nœuds comme des blocs ou des plongements de mots ?
Ces nœuds sont essentiellement les vecteurs. J'irai à l'implémentation de nanoGPT, qui est un transformer minimal qui reproduit GPT-2 sur OpenWebText. C'est une implémentation sérieuse qui a nécessité suffisamment de calcul ; c'était un nœud de huit GPU pendant environ 38 heures. Il fait 300 lignes et est très lisible. Pour un transformer uniquement décodeur, nous modélisons le mot ou le caractère suivant dans une séquence. Nous convertissons du texte comme du Shakespeare en une séquence d'entiers. Nous intercalons plusieurs documents avec des jetons spéciaux de fin de texte afin que le transformer apprenne que ces séquences signifient qu'il doit effacer la mémoire. Nous produisons des lots où la taille du bloc indique la longueur maximale du contexte. Le lot unique d'exemples contient une tonne d'exemples individuels sur lesquels le transformer apprend en parallèle. Le contexte croît linéairement pour les prédictions faites le long de la direction temporelle. Dans la classe GPT, nous encodons l'identité des indices via une table de recherche de plongement et encodons ces vecteurs par position afin d'avoir à la fois l'identité et le lieu. Les plongements de jetons et de position sont ajoutés exactement. Cela alimente les blocs du transformer. À la fin, il y a une normalisation de couche et vous décodez les logits pour le mot suivant en utilisant une projection linéaire. Ces blocs ont une phase de communication où les nœuds se parlent et une phase de calcul utilisant le perceptron multicouche. Dans la partie auto-attention causale, vous masquez la connectivité afin de ne pas pouvoir obtenir d'informations du futur. Nous calculons les requêtes, les clés et les valeurs. Nous effectuons un remplissage masqué pour fixer l'attention entre les nœuds qui ne sont pas censés communiquer à l'infini négatif, rendant leur attention nulle. Ensuite, nous faisons une somme pondérée des valeurs. Cela implémente la phase de communication, puis vous pouvez générer du Shakespeare à l'infini en réinjectant les caractères dans le modèle. Si vous voulez un encodeur au lieu d'un décodeur, vous supprimez simplement la ligne de masquage afin que tous les nœuds communiquent entre eux. Pour l'attention croisée, les requêtes proviennent de X mais les clés et les valeurs proviennent du haut de l'encodeur.
Pouvez-vous revenir sur le graphe ? Lorsque nous effectuons le passage d'informations sur un graphe entièrement connecté à l'aide de l'attention multi-têtes, puis que nous le résumons à chaque étape, le transformer reste performant pour une séquence. C'est comme un graphe dynamique connecté différemment à chaque pas de temps. Ces contraintes sont imposées par le masquage, mais elles sont très importantes pour représenter la séquence.
Une analogie consiste à interpréter le graphe comme fixe, mais chaque fois que nous communiquons, nous utilisons des poids différents. Si nous avons une taille de bloc de huit, nous avons huit nœuds connectés de gauche à droite.
Mais pour différents problèmes, cela pourrait ne pas être le cas. Vous avez en fait un graphe où il est connecté comme une chaîne ou quelque chose du genre.
Habituellement, les connexions ne changent pas en fonction des données.
Mais pour quelque chose comme une molécule, vous avez un graphe réel avec des nœuds dynamiques auxquels vous voulez appliquer cela.
Je ne pense pas avoir vu d'exemple où la connectivité change dynamiquement en fonction des données. Habituellement, elle est fixe. Si vous entraînez un BERT, les jetons sont entièrement connectés. Si vous avez un modèle uniquement décodeur, vous avez cette structure triangulaire.
Si vous voyez cela comme si vous vous entraîniez sur ce graphe fixe et que vous avez ensuite l'infini négatif pour l'attention, je me demande si vous en savez plus sur la racine de D ? Avez-vous une idée du passage d'informations sur ces graphes de racine de D ?
Dans mon esprit, je ne pensais pas que était pour la connexion au graphe. Vous avez également le produit scalaire de la requête et de la clé.
Mais vous avez aussi des choses différentes comme la requête à la normalisation de couche et des choses comme le MLP.
C'est difficile à dire. C'est pourquoi cet article est si intéressant. Habituellement, on verrait quelque chose qui ne ressemble pas au transformer. Les ResNets n'ont pas de composante d'auto-attention, mais le MLP est présent. Le transformer a pris un ResNet et y a ajouté un bloc d'auto-attention en plus du bloc MLP. Il est intéressant qu'il se soit avéré si résilient même si tout le monde essaie de le changer. J'ai parlé aux auteurs de l'article et ils n'étaient pas conscients de l'impact qu'il aurait à l'époque. Quand on lit l'article aujourd'hui, il ressemble à un article de traduction automatique assez quelconque, ce qui peut être déroutant. Actuellement, je n'aime pas l'approche de modélisation autorégressive ; c'est bizarre d'échantillonner un jeton puis de s'y engager. J'espère que nous trouverons des hybrides avec la diffusion ou d'autres moyens d'éditer des séquences plus tard. La diffusion ressemble plus à un processus de rédaction, ce qui ressemble à la façon dont les humains travaillent. L'auto-attention revient en effet à calculer un poids d'arête à l'aide du produit scalaire sur les nœuds, puis à le multiplier par les valeurs pour le propager. Je pense qu'aujourd'hui, tout est un réseau de neurones sur graphes car le transformer est un processeur de réseau de neurones sur graphes. La représentation native est constituée d'ensembles reliés par des arêtes de manière dirigée.
Variantes d'architecture et gestion du contexte
Une fois que vous avez épuisé la taille du bloc, vous commencez à recadrer parce que le transformer ne fonctionne que pour les éléments de la dimension temporelle pour laquelle nous nous sommes entraînés. La plupart des transformers ont une taille de bloc ou une longueur de contexte finie, généralement 1 024 ou 2 048 jetons. Nous voulons augmenter la taille du contexte, mais cela devient délicat car l'attention est quadratique dans le cas naïf.
Si vous voulez un encodeur au lieu d'un décodeur, vous supprimez simplement la ligne masquée afin que tous les nœuds communiquent entre eux et que l'information circule entre eux tous. Vous permettez aux nœuds de communiquer entre eux en remontant le transformer.
Pour implémenter l'attention croisée pour un transformer complet encodeur-décodeur, nous ajoutons une pièce d'attention croisée au milieu de l'auto-attention et du MLP. Les requêtes proviendront de X, mais les clés et les valeurs proviendront du haut de l'encodeur, permettant à l'information de circuler de l'encodeur vers tous les nœuds à l'intérieur de X.
Vous pouvez avoir un modèle uniquement décodeur comme GPT, un modèle uniquement encodeur comme BERT, ou un modèle encodeur-décodeur comme T5. Dans BERT, on s'entraîne sur des objectifs légèrement différents comme la classification de sentiments où la phrase complète est autorisée à communiquer pleinement. Ceux-ci utilisent le masquage et d'autres techniques de débruitage.
C'est ça le transformer. Y a-t-il d'autres questions ?
Discussion sur les graphes dynamiques et la diffusion
Pourriez-vous revenir au graphe des nœuds ? Lorsque vous communiquez des informations, il s'agit essentiellement d'un graphe entièrement connecté, mais il est multi-arêtes et dirigé. Ensuite, vous additionnez les poids pour chaque nœud. Il semble qu'il s'agisse d'un graphe dynamique où les connexions peuvent changer à chaque instance. S'il s'agissait d'un graphe général, il serait très puissant pour représenter beaucoup de choses.
Vous pouvez interpréter ce graphe comme fixe, mais chaque fois que vous communiquez, nous utilisons des poids différents. Dans mon exemple avec une taille de bloc de huit, nous avons huit nœuds qui ne se connectent que de gauche à droite.
Pour différents problèmes, vous pouvez avoir un graphe connecté comme des chaînes. Habituellement, les connexions ne changent pas en fonction des données. Mais si vous voulez modéliser quelque chose comme une protéine, alors vous voulez appliquer cela à cela.
Je n'ai pas vu d'exemple où la connectivité change dynamiquement en fonction des données. Habituellement, elle est fixe. BERT est entièrement connecté, et les modèles uniquement décodeurs ont une structure triangulaire.
Avec la petite longueur de contexte, on a l'impression que vous faites une compression avec perte. Avez-vous une idée de si vous pouvez avoir une étude de relation temporelle entre les parties de la séquence originale qui sont les plus importantes pour le jeton suivant ? Je pense que c'est une application cool.
C'est difficile à dire. Cet article est intéressant parce que tout ce que l'on peut voir, ce sont des choses qui ne ressemblaient pas au transformer. Les ResNets ressemblent beaucoup à cela, sauf qu'ils n'ont pas la composante d'auto-attention. Le transformer a pris un ResNet et y a ajouté un bloc d'auto-attention en plus du bloc MLP. Il est intéressant que cela n'ait pas changé même si tout le monde essaie de le changer. C'est venu comme un tout. Les auteurs n'étaient pas conscients de l'impact qu'aurait le transformer ; il se lit comme un article de traduction automatique assez quelconque. Les gens qui le lisent aujourd'hui pourraient être confus.
Je n'aime certainement pas l'approche de modélisation autorégressive car c'est bizarre d'échantillonner un jeton puis de s'y engager. J'espère que nous trouverons des hybrides avec la diffusion ou d'autres moyens d'éditer des séquences plus tard dans un cadre autorégressif. La diffusion est une approche de modélisation que je trouve plus attrayante. Quand j'échantillonne du texte, je fais un brouillon puis un second brouillon amélioré ; cela ressemble à un processus de diffusion.
Diriez-vous que l'auto-attention revient à calculer un poids d'arête à l'aide d'un produit scalaire sur les nœuds, puis à le multiplier par les valeurs pour le propager ? Pensez-vous qu'il existe une analogie entre les réseaux de neurones sur graphes et l'auto-attention ?
Je trouve que le terme réseau de neurones sur graphes est déroutant car aujourd'hui, tout est un réseau de neurones sur graphes. Le transformer est un processeur de réseau de neurones sur graphes. La représentation native sur laquelle il opère est constituée d'ensembles reliés par des arêtes de manière dirigée.
Je devrais continuer car j'ai encore 30 diapositives.
Concernant la racine de D, si vous initialisez avec des poids aléatoires échantillonnés à partir d'une gaussienne, à mesure que votre taille de dimension augmente, la variance augmente également. Votre softmax deviendra simplement un vecteur one-hot. C'est un moyen de contrôler la variance et de l'amener dans une bonne plage pour une belle distribution diffuse.
Applications des Transformers au-delà du texte
Les transformers ont été appliqués à d'autres domaines de manière ridicule. En vision par ordinateur, avec les ViT, on découpe une image en petits carrés et on les injecte dans un transformer. Le transformer ne sait même pas d'où viennent ces patchs dans le cas le plus simple. Ils sont généralement encodés par position, mais il doit en redécouvrir la structure. Malgré cela, le simple fait de découper de grandes images en carrés fonctionne assez bien. Dans un encodeur de transformer, tous les patchs se parlent à travers tout le transformer.
Dans la reconnaissance vocale, on découpe son spectrogramme mel en tranches et on les injecte dans un transformer, comme on le voit dans Whisper. Dans l'apprentissage par renforcement, on prend les états, les actions et les récompenses et on fait comme s'il s'agissait d'un langage pour modéliser des séquences pour la planification. AlphaFold utilise également un transformer en son cœur.
Les transformers sont super flexibles. Chez Tesla, un ConvNet prend une image et fait des prédictions, mais injecter des informations supplémentaires comme des données radar ou cartographiques n'est pas toujours trivial. Avec un transformer, il suffit de découper ce que l'on veut en morceaux et de l'injecter avec le reste. On laisse l'auto-attention comprendre comment tout doit communiquer. Cela libère les réseaux neuronaux du fardeau de l'espace euclidien. Tout n'est qu'ensembles, et on peut jeter des trucs dans son ensemble de conditionnement et tout s'auto-attende. C'est beau et inattendu.
Apprentissage en contexte et efficacité matérielle
Qu'est-ce qui rend le transformer si efficace ? L'article GPT-3 soutient que les modèles de langage sont des apprenants à partir de peu d'exemples (few-shot), mais je dirais que les transformers sont capables d'apprentissage en contexte (in-context learning) ou de méta-apprentissage. Si vous donnez un passage et fournissez des exemples de questions et de réponses dans l'invite, à mesure que d'autres exemples sont donnés, la précision s'améliore. Cela suggère que le transformer est capable d'apprendre dans les activations sans faire de réglage fin (fine-tuning) via une descente de gradient. On dirait que le transformer fait une sorte de méta-apprentissage pendant qu'il lit l'invite.
Il y a une boucle externe avec une descente de gradient stochastique et une boucle interne d'apprentissage en contexte. La boucle interne se produit pendant que le transformer lit la séquence. Certains articles suggèrent qu'il se passe quelque chose qui ressemble à un apprentissage basé sur le gradient à l'intérieur des activations. L'apprentissage basé sur le gradient implique une passe avant, une passe arrière, puis une mise à jour. Cela ressemble à un ResNet car on ajoute aux poids. Puisqu'un transformer est un ResNet, il est possible que cela se produise.
Je pense que cette architecture optimise simultanément trois propriétés souhaitables : elle est très expressive dans la passe avant, elle est très optimisable grâce aux connexions résiduelles et aux normalisations de couche, et elle est extrêmement efficace. Le transformer est un réseau peu profond et large, ce qui est parfait pour les GPU. Je pense que le transformer a été conçu délibérément pour fonctionner efficacement sur les GPU, en réfléchissant à rebours à partir des contraintes matérielles.
Avec le recul, j'aurais appelé le transformer un ordinateur optimisable efficace à usage général au lieu de 'Attention Is All You Need'. Il propose un modèle expressif, efficace en termes d'utilisation du GPU et facilement optimisable par descente de gradient.
Si les réseaux neuronaux précédents étaient des ordinateurs à usage spécial, GPT est un ordinateur à usage général reconfigurable au moment de l'exécution pour exécuter des programmes en langage naturel. Les programmes sont donnés sous forme d'invites, et GPT exécute le programme en complétant le document. J'aime l'analogie avec un ordinateur puissant optimisable par descente de gradient.
Encodage de position et gestion de la mémoire
On découpe les images en patchs pour les mille premiers jetons. Le radar ou d'autres informations sur le véhicule arriveraient avec un jeton de plongement spécial qui peut être appris par descente de gradient.
Tout n'est qu'un ensemble, mais on peut encoder ces ensembles par position si on le souhaite. On n'a pas besoin de câbler la position en dur ; on peut juste avoir un vecteur qui traîne à un emplacement et qui peut être entraîné par rétropropagation.
Je n'aime pas la notion d'encodeur ; cela semble difficile pour l'intuition si on veut apprendre la structure de l'emplacement. Avez-vous des idées sur la façon dont je pourrais faire cela mieux ?
Les encodeurs de position ont très peu de biais inductif ; ce sont juste des vecteurs qui traînent dans un emplacement. Si on a assez de données, essayer de s'en mêler en introduisant des connaissances dans l'ensemble de données lui-même n'est généralement pas productif. À mesure que l'on passe à l'échelle, on veut en encoder moins. Si on a très peu de données, les circonvolutions sont une bonne idée car elles ont un biais inductif. On peut jouer avec les encodages pour mettre plus de structure, ou on peut aller dans le mécanisme d'attention et masquer ce que l'on ne veut pas communiquer. Les gens jouent avec cela parce que l'attention complète est inefficace, donc ils pourraient intercaler des couches qui ne communiquent que dans des patchs locaux avec des couches qui communiquent globalement.
Comment pourrait-on essayer d'optimiser la mémoire du transformer ? Vous avez mentionné qu'il a une mémoire comme un bloc-notes. Comment imaginez-vous que cela soit résolu à l'avenir ?
Il y a probablement environ 200 articles sur ce sujet maintenant, et il est difficile de tous les suivre. Je ne veux pas en choisir un favori.
On peut considérer un transformer comme un processeur capable de traiter des instructions de taille fixe et de produire un résultat. Dans le processeur, on stocke des variables et la mémoire et on exécute différents programmes plusieurs fois. Peut-être que si on utilise un transformer de cette façon, on peut obtenir de meilleurs résultats.
Une autre idée que j'aime bien est de garder la longueur du contexte fixe mais de permettre au réseau d'utiliser un bloc-notes. On apprend au transformer, via des exemples dans l'invite, qu'il peut utiliser un bloc-notes en émettant 'début bloc-notes' et 'fin bloc-notes'. Plus tard, vous avez une logique qui enregistre tout ce qu'il y met et lui permet d'y porter son attention. Vous pouvez lui apprendre dynamiquement à utiliser des gadgets pour étendre sa mémoire. C'est comme un humain qui apprend à utiliser un calepin. Garder des choses dans son cerveau, c'est comme la ligne de contexte ; lui donner un carnet lui permet de consulter, de lire et d'écrire.
Et on peut utiliser un transformer pour lire le carnet du transformer.
Je suppose que ChatGPT a utilisé une sorte d'ingénierie pour augmenter ce contexte de mémoire. Cela ressemble à l'idée du bloc-notes.
Je n'en suis pas sûr. On a l'impression d'une longue invite qui se déroule. Parfois, il oublie des choses ; j'ai vu un événement d'oubli et j'ai eu l'impression que la taille du bloc avait simplement été déplacée. Je ne connais pas les rouages internes de ChatGPT.
Questions finales et projets futurs
Deux questions en ligne. Une question est : que pensez-vous de l'architecture S4 ?
Je suis désolé, je ne connais pas S4.
Sur quoi allez-vous travailler ensuite, maintenant que vous n'êtes plus chez OpenAI ?
En ce moment, je travaille sur nanoGPT, qui est une réécriture de mon précédent minGPT. J'essaie de reproduire les GPT. Quelque chose comme ChatGPT amélioré de manière incrémentale sous forme de produit serait extrêmement intéressant, et je pense qu'il y a quelque chose comme un Google plus plus plus à construire.
Applaudissons bien fort notre conférencier.