Hallo zusammen, heute werden wir die Technik der Partizipien in Large Language Modelling (LLM) untersuchen. Leider ist die Disambiguierung ein komplexer und kniffliger Teil der aktuellen Top-LLMs, aber es ist sehr wichtig, einige ihrer Details zu verstehen, denn viele Leute machen neuronale Netze oder andere scheinbar mysteriöse Gründe für einige der Unzulänglichkeiten von LLMs verantwortlich, während die Quelle dieser Probleme in Wirklichkeit oft Disambiguierungstechniken sind.
Originaltext:https://github.com/karpathy/minbpe
Zuvor: Zeichenbasierte Segmentierung
Was ist also ein Subtext? In unserem vorherigen Video [Ein GPT von Grund auf neu erstellenIn [ ] haben wir über Semaphoren gesprochen, aber das ist nur eine sehr einfache und primitive Form der Zeichenebene. Wenn Sie sich das Video von [Google colabSeite sehen Sie, dass wir unsere Trainingsdaten verwenden ([Werke von Shakespeare], was in Python einfach eine sehr lange Zeichenkette ist:
First Citizen: Bevor wir fortfahren, hören Sie mir bitte zu.Alle: Nur zu, sagen Sie es.First Citizen: Sind Sie alle entschlossen, lieber zu sterben als zu verhungern?Alle: Entschlossen. Bestimmt.First Citizen: Zunächst einmal wissen Sie, dass Gaius Marcius der größte Feind des Volkes ist.Alle: Wir wissen, wir wissen.
Aber wie speisen wir die Zeichensequenzen in das Sprachmodell ein? Der erste Schritt besteht darin, eine Vokabeltabelle zu erstellen, die alle verschiedenen Zeichen enthält, die wir im Trainingsdatensatz finden:
``python# Dies ist das einzige Zeichen, das im Text erscheintchars = sorted(Liste(set(text)))vocab_size = len(zeichen)print(''.join(chars))print(vocab_size)# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65```
Unmittelbar danach erstellen wir eine Nachschlagetabelle für die Konvertierung zwischen einzelnen Zeichen und ganzzahligen Wörtern, die auf dem oben aufgeführten Vokabular basiert. Diese Nachschlagetabelle ist eigentlich ein Python-Wörterbuch:
``pythonstoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# Encoder: Empfängt eine Zeichenkette und gibt eine Liste der entsprechenden Ganzzahlen aus.encode = lambda s: [stoi[c] for c in s]# Decoder: empfängt eine Liste von Ganzzahlen und reduziert sie auf einen Stringdecode = lambda l: ''.join([itos[i] for i in l])print(encode("hii da"))print(decode(encode("hii da")))# [46, 47, 47, 1, 58, 46, 43, 56, 43]# hii da```
Nachdem wir die Sequenzen in ganze Zahlen umgewandelt haben, werden wir sehen, dass jede ganze Zahl als Index in einer zweidimensionalen trainierbaren Einbettungsmatrix verwendet wird. Da die Größe des Vokabulars `vocab_size=65` ist, hat diese Einbettungsmatrix auch 65 Zeilen:
``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)```
Hier extrahiert die "Ganzzahl" eine Zeile aus der Einbettungstabelle, die den Vektor darstellt, der das Token repräsentiert. Dieser Vektor wird dann in den Transformator als Eingabe für den entsprechenden Zeitschritt eingespeist.
Tokenisierung von "Zeichenblöcken" unter Verwendung des Byte-Pair-Encoding (BPE)-Algorithmus
Für ein rudimentäres Sprachmodell auf Zeichenebene ist dies ausreichend. In der Praxis verwenden moderne Sprachmodelle jedoch komplexere Schemata für den Aufbau von Markup-Vokabularen. Diese Schemata arbeiten nicht auf der Zeichenebene, sondern auf der Ebene der Zeichenblöcke. Diese Zeichenblockvokabulare werden mit Hilfe von Algorithmen wie Byte Pair Encoding (BPE) erstellt, ein Ansatz, den wir weiter unten näher erläutern werden.
Was die historische Entwicklung dieses Ansatzes betrifft, so hat das 2019 veröffentlichte GPT-2-Papier von OpenAI mit dem Titel "Language Models as Unsupervised Multitasking Learners" BPE-Algorithmen auf Byte-Ebene für die Etikettierung von Sprachmodellen populär gemacht. Lesen Sie Abschnitt 2.2 dieses Papiers über "Input Representation", um die Beschreibung und Motivation für diesen Algorithmus zu erfahren. Sie werden am Ende dieses Abschnitts erwähnt:
Das Vokabular wurde auf 50.257 erweitert. Wir haben auch die Kontextgröße von 512 auf 1024 Token erhöht und eine größere Stapelgröße von 512 verwendet.
Erinnern Sie sich daran, dass in der Aufmerksamkeitsschicht des Transformers jedes Token eine Aufmerksamkeit für eine endliche Anzahl von Token in der vorherigen Sequenz ist. In dem Papier wird erwähnt, dass die Kontextlänge des GPT-2 Modells 1024 Token beträgt, was eine Verbesserung gegenüber den 512 Token von GPT-1 darstellt. Mit anderen Worten: Token sind die Basiseinheiten, die als Input für das Linguistische Langzeitgedächtnis (LLM) dienen. Tokenisierung ist der Prozess der Umwandlung von rohen Zeichenketten in Python in Listen von Token und umgekehrt. Um ein weiteres populäres Beispiel für die Allgegenwart dieser Abstraktion zu nennen: Wenn Sie sich [Lama 2Das] Papier, noch einmal, suchen Sie nach "markers" und Sie erhalten 63 Erwähnungen. In dem Papier wird zum Beispiel behauptet, dass sie mit zwei Billionen Token trainiert haben und so weiter.
Bevor wir uns mit den Details der Implementierung befassen, lassen Sie uns kurz erörtern, warum wir uns mit dem Tokenisierungsprozess befassen müssen. Die Tokenisierung ist der Kern vieler Merkwürdigkeiten in LLMs, und ich würde empfehlen, dass wir sie nicht auf die leichte Schulter nehmen. Viele Probleme, die scheinbar mit der Struktur neuronaler Netze zusammenhängen, haben ihren Ursprung in der Tokenisierung. Hier sind ein paar Beispiele:
- Warum kann LLM Wörter nicht richtig buchstabieren?
- Warum kann der LLM keine einfachen Aufgaben wie die Umkehrung von Zeichenketten erledigen?
- Warum schneidet LLM bei nicht-englischen Sprachen (z.B. Japanisch) so schlecht ab?
- Warum schneidet der LLM bei einfachen arithmetischen Operationen so schlecht ab?
- Warum hat GPT-2 besondere Schwierigkeiten bei der Programmierung in Python?
- Warum funktioniert mein LLM plötzlich nicht mehr, wenn er auf die Zeichenfolge "" trifft?
- Was ist das für eine seltsame Warnung, die ich wegen "Leerzeichen am Ende" bekomme?
- Wenn ich nach "SolidGoldMagikarp" frage, warum stürzt der LLM ab?
- Warum sollte ich für die Interaktion mit LLMs lieber YAML als JSON verwenden?
- Warum ist LLM eigentlich kein echtes End-to-End-Sprachmodell?
- Was genau ist die Ursache des Leidens?
Wir werden am Ende des Videos auf diese Themen zurückkommen.
Als nächstes laden wir diese [Tokenisierung Online-Tools] Der Vorteil dieses Online-Tools ist, dass der Tokenisierungsprozess in Echtzeit in Ihrem Webbrowser stattfindet. Sie können ganz einfach eine Textzeichenfolge in das Eingabefeld eingeben und das Ergebnis der Tokenisierung sofort auf der rechten Seite sehen. Oben auf der Seite sehen Sie, dass wir derzeit Folgendes verwenden
gpt2
Tokeniser können wir sehen, dass die Zeichenkette im Beispiel in 300 Token zerlegt wird. Diese Token werden deutlich in verschiedenen Farben angezeigt:Zum Beispiel wird die Zeichenfolge "Tokenisation" als Token 30642 kodiert, gefolgt von Token 1634. Der Index des Tokens "ist" (beachten Sie, dass es hier drei Zeichen gibt, einschließlich des vorangehenden Leerzeichens, das wichtig ist!) Der Index des Tokens ist 318. Beachten Sie das Leerzeichen, da es tatsächlich in der Zeichenkette vorhanden ist und zusammen mit allen anderen Zeichen in Token umgewandelt werden muss, aber aus Gründen der visuellen Klarheit normalerweise weggelassen wird. Sie können die Anzeige von Leerzeichen am unteren Rand des Tools ein- und ausschalten. In ähnlicher Weise ist das Token "at" 379, "the" ist 262 und so weiter.
Sehen wir uns als nächstes ein einfaches arithmetisches Beispiel an. Hier stellen wir fest, dass Zahlen vom Tokenisierer auf inkonsistente Weise aufgeschlüsselt werden können. Zum Beispiel wird die Zahl 127 in ein einziges Token aus drei Zeichen zerlegt, während die Zahl 677 in zwei Token zerlegt wird: das Token " 6" (beachten Sie auch hier das führende Leerzeichen!) und das Token "77". Wir verlassen uns auf große Sprachmodelle, um diese Willkürlichkeit zu verstehen. Das Modell muss sowohl in seinen Parametern als auch während des Trainings lernen, dass die beiden Token ("6" und "77") tatsächlich zusammen die Zahl 677 darstellen. Wenn das LLM vorhersagen will, dass das Ergebnis dieser Addition 804 sein wird, muss es dies in zwei Schritten ausgeben: zuerst gibt es das Token "8" und dann das Token "04" aus. Beachten Sie, dass alle diese Zerlegungen völlig willkürlich zu sein scheinen. Im folgenden Beispiel sehen wir, dass 1275 in "12" und "75" zerlegt wird, 6773 ist eigentlich zwei Token "6" und "773", und 8041 wird in "8" und "041" zerlegt.
(Fortsetzung folgt...) (TODO: Solange wir keinen Weg finden, diese Inhalte automatisch aus Videos zu generieren, werden wir dies wahrscheinlich fortsetzen).