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, da viele Leute neuronale Netze oder andere scheinbar mysteriöse Gründe für einige der Unzulänglichkeiten von LLMs verantwortlich machen, während die Quelle dieser Probleme in Wirklichkeit oft Disambiguierungstechniken sind.
Ursprünglicher Text:https://github.com/karpathy/minbpe
Zuvor: Zeichenbasierte Segmentierung
Was ist also ein Subtext? In unserem vorherigen Video [Aufbau eines GPT von Grund aufIn [ ] haben wir über das gebrochene Wort gesprochen, aber das ist nur eine sehr einfache und primitive Form der Zeichenebene. Wenn Sie sich das Video von [Google-KolaborSeite 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: Na los, sagen Sie es.
First Citizen: Seid ihr alle entschlossen, lieber zu sterben als zu verhungern?
Alle: Entschlossen. Festgelegt.
First Citizen: Zunächst einmal wissen Sie, dass Gaius Marcius der größte Feind des Volkes ist.
Alle: Wir wissen, wir wissen.
Wie aber 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 erscheint chars = sorted(list(set(text)))vocab_size = len(chars)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: nimmt einen String entgegen und gibt eine Liste entsprechender Ganzzahlen aus encode = lambda s: [stoi[c ] for c in s]# Decoder: nimmt eine Liste von Ganzzahlen und reduziert sie zurück 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 ebenfalls 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 einen Vektor darstellt, der das Token repräsentiert. Anschließend wird dieser Vektor in den Transformator als Eingabe für den entsprechenden Zeitschritt eingespeist (Transformator).
Tokenisierung von "Zeichenblöcken" unter Verwendung des Byte-Pair-Encoding (BPE)-Algorithmus
Dies ist für ein rudimentäres Sprachmodell auf Zeichenebene ausreichend. In der Praxis verwenden moderne Sprachmodelle jedoch komplexere Schemata für den Aufbau von Auszeichnungsvokabularen. 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 angeht, so führte das 2019 veröffentlichte GPT-2-Papier von OpenAI mit dem Titel "Language Models as Unsupervised Multitasking Learners" zur Popularität von BPE-Algorithmen auf Byte-Ebene für die Kennzeichnung von Sprachmodellen. Lesen Sie Abschnitt 2.2 dieses Papiers über "Input Representation" für die Beschreibung und Motivation für diesen Algorithmus. Sie werden am Ende dieses Abschnitts erwähnt:
Das Vokabular wurde auf 50.257 erweitert. Außerdem haben wir die Kontextgröße von 512 auf 1024 Token erhöht und eine größere Stapelgröße von 512 verwendet.
In der Aufmerksamkeitsschicht des Transformers ist jedes Token eine Aufmerksamkeit für eine endliche Anzahl von Token in der vorherigen Sequenz. 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 Grundeinheiten, die als Input für das Modell des linguistischen Langzeitgedächtnisses (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 geben: Wenn Sie die [Lama 2The] paper, again, search for "markers" and you get 63 mentions. Zum Beispiel behauptet das Papier, dass sie auf zwei Billionen Token und so weiter trainiert haben.
Bevor wir uns mit den Einzelheiten der Implementierung befassen, wollen wir kurz darauf eingehen, 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 schlecht ab, wenn es um nicht-englische Sprachen geht (z.B. Japanisch)?
- Warum schneidet der LLM bei der Durchführung einfacher arithmetischer Operationen schlecht ab?
- Warum hat der 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 besteht darin, dass der Tokenisierungsprozess in Echtzeit in Ihrem Webbrowser stattfindet. Sie können 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 verwendengpt2
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, denn es ist tatsächlich in der Zeichenkette vorhanden und muss zusammen mit allen anderen Zeichen in Token umgewandelt werden, wird aber normalerweise aus Gründen der visuellen Klarheit weggelassen. Sie können die Anzeige von Leerzeichen am unteren Rand des Werkzeugs umschalten. In ähnlicher Weise ist das Token "at" 379, "the" 262 und so weiter.
Betrachten wir als nächstes ein einfaches arithmetisches Beispiel. Hier stellen wir fest, dass Zahlen vom Tokenisierer auf inkonsistente Weise zerlegt werden können. So wird beispielsweise die Zahl 127 in ein einziges Token aus drei Zeichen zerlegt, während die Zahl 677 in zwei Token zerlegt wird: das Token " 6" (auch hier ist das führende Leerzeichen zu beachten!) und das Token "77". Um diese Willkür zu verstehen, sind wir auf große Sprachmodelle angewiesen. 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 ergeben. Wenn das LLM vorhersagen will, dass das Ergebnis dieser Addition die Zahl 804 sein wird, muss es die Zahl 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 wird 1275 in "12" und "75" zerlegt, 6773 ist eigentlich zwei Token "6" und "773", und 8041 wird in "8" und "041" zerlegt.
(Fortsetzung folgt...) (TODO: Solange wir keinen Weg finden, diesen Inhalt automatisch aus Videos zu generieren, werden wir dies wahrscheinlich fortsetzen).