Fortsetzung von hier. Es wird noch technischer als beim vorletzten Mal, ich bitte um Entschuldigung und Verständnis. Das ist nun einmal die Ebene, die mich interessiert, nämlich die, auf der ich wenigstens einen Eindruck davon bekomme, was wirklich und nicht nur metaphorisch geschieht beim Auswerten eines Inputs und Erzeugen eines Texts. Respekt, wer das hier zu lesen versucht. Ich wiederhole mich mehrfach, finde das aber okay, das hilft mir zumindest beim Verstehen.
1. Überblick
1.1 Der Ausgangspunkt
Und zwar sind wir bei diesem Diagramm stehen geblieben:

Erweiterte Kontext-Vektoren gehen in die innere Black Box hinein (hier 8.000, weil der Beispielkontext so lang ist), eine Wahrscheinlichkeitsverteilung über die (im Beispiel) 100.000 Token des Wortschatzes kommt heraus. Je nach System kann der Kontext auch schon 30.000 Token oder mehr lang sein, oder der Wortschatz nur halb so groß. Es müssen natürlich nicht 8.000 Vektoren sein, der Kontext muss ja nicht voll ausgeschöpft werden.
1.2 Was metaphorisch geschieht
Jedes Token ist ja durch, in unseren Beispiel: 10.000 Zahlenwerte embedded. Diese Zahlenwerte werden in mehreren Durchgängen modifiziert, bis am Ende die 10.000 Werte des letzten Tokens darüber entscheiden, welches Token als nächstes generiert wird.
Nehmen wir als Input: „The dogs bark loudly.“ (Es gibt technische Gründe für die Unnatürlichkeit des Beispielsatzes.) Der Input sind ja eigentlich nicht diese Token, es geht hier nie um Token, sondern immer nur um deren Embedding, aber der Einfachkeit halber spreche ich hier ein Weilchen einfach von Token.
In jedem Durchgang wird jedes Input-Token mit allen anderen Input-Token verglichen. Nehmen wir zum Beispiel das Token „bark“, das hier also mit „The“, „dogs“, „loudly“ und „.“ verglichen wird. Gesucht wird dabei besonders nach Token, die das Merkmal „Nomen im Plural“ und „ist ein Lebewesen“ tragen, oder auch „es geht um Bäume“, weil das ja auch „Baumrinde“ bedeuten kann. Das ist wie bei diesem Kartenspiel, wo man die anderen fragt: „Hast du eine Herz Sieben?“
Beim „.“ wird man fündig, bei „The“ nur ein wenig, aber als es zu „dogs“ kommt, schreit das sofort „biete Substantiv im Plural!“ und „biete Tier!“ Das ist das Zeichen für „bark“, dem Token „dogs“ besonders viel Aufmerksamkeit zu widmen.
Wenn für jedes Token ein Aufmerksamkeitswert ermittelt ist, geht es ans Modifizieren: das Token „dogs“ darf dann bestimmte Werte auf das Embedding von „bark“ übertragen, etwa Werte für „bin dein Subjekt“ und „es geht um Hunde“ und „du bist ein Verb und nicht etwa ein Substantiv“.
Beim nächsten Durchgang wird wieder jedes Input-Token modifiziert. Diesmal sucht „bark“ nicht mehr nach Bäumen. Ganz am Ende steckt dann im Embedding des letzten Tokens „.“ die Information „gerade eben haben Hunde laut gebellt“, und auf Basis dieses Embeddings wird dann das nächste Token vorausgesagt, möglicherweise: „They“.
1.3 Alberner Exkurs
Und tatsächlich: Wenn ich den Prompt „Continue the sequence ‚The dogs bark loudly.‘ with one token.“ eingebe, gibt mir der Chatbot „They“ aus.
> Continue the sequence "The dogs bark loudly." with one token.
They
> Continue the sequence "The dogs bark loudly. They" with one token.
are
> Continue the sequence "The dogs bark loudly. They are" with one token.
running
> Continue the sequence "The dogs bark loudly. They are running" with one token.
in
> Continue the sequence "The dogs bark loudly. They are running in" with one token.
the
> Continue the sequence "The dogs bark loudly. They are running in the" with one token.
yard.
Na gut, am Ende waren das zwei Token, und auch „running“ sind vermutlich zwei.
> Continue the sequence "The dogs bark loudly. They are running in the" with one token. Turn the temperature up really high.
dust.
Interesting…
> Continue the sequence "The dogs bark loudly. They are running in the" with one token. Turn the temperature up as high as possible.
void.
Das könnte ein reizvolles Spiel werden. Aber das bildet natürlich nicht wirklich innere Vorgänge ab, weil der Prompt ja nicht wirklich nur aus diesen Token besteht.
1.4 Das Geheimnis Enthüllt
Ab jetzt nicht mehr metaphorisch.
In der Black Box ist eine Reihe von Decodern. Decoder gehören zum Transformer-Modell, das die Entwicklung ab 2017 revolutionierte, auch wenn die Idee an sich älter ist. Zuvor arbeitete man mit einem anderen System (RNN), das aber Nachteile hatte, die mit etwas, das sich Attention nannte, halbwegs ausgeglichen werden konnten. Dann stellte sich heraus, dass man ohne RNN und nur mit Attention auch auskommt, und die moderne Transformer-Struktur entstand, auf der nicht alle, aber doch die bekannten modernen LLM basieren.
Ein Transformer besteht eigentlich aus mehreren Encoder-Schichten gefolgt von mehreren Decoder-Schichten. Für das Generieren von Text, anders als bei der maschinellen Übersetzung, verzichten die meisten Systeme, wie zum Beispiel GPT, auf die Encoder-Schichten, deshalb beschränke ich mich im weiteren Verlauf – von einem als solchen Exkurs abgesehen – auf Decoder.
Neu am Transformer-Modell ist, dass diese 8000 Eingangsvektoren aus dem Bild oben nicht wie den Modellen zuvor sequentiell, also nacheinander, abgearbeitet werden müssen, sondern parallel verarbeitet werden können. Das ist praktisch fürs Rechnen mit mehreren Computern.
Alle 8.000 Vektoren werden also verarbeitet und dabei modifiziert; die Berechnungen dazu laufen im Prinzip unabhängig voneinander. Aber jede Modifizierung eines einzelnen Vektors ist abhängig von den jeweils anderen 7.999 Vektoren des Kontexts.
Jeder einzelne der 8.000 Vektoren wird also nach diesem Prinzip durch einen Decoder modifiziert, bis bis man am Ende wieder 8.000, jetzt: neue, Vektoren hat, weiterhin für jedes Token einen. Deren ursprüngliches Embedding ist jetzt aber durch den Kontext angereichert. Mit diesen angereicherten Vektoren wird dann weiter gearbeitet.
Und zwar gehen sie in einen weiteren Decoder. Und noch einen. Und noch einen. Insgesamt 8 oder 96 oder 120, je nach System.

Ich habe versucht, das im Bild zu zeigen:
- Die 8.000 Vektoren bilden zusammen den Input in einen Decoder.
- Im Decoder werden die 8.000 Vektoren abgearbeitet.
- Jeder Vektor wird verändert, und zwar beeinflusst durch die anderen 7.999 Vektoren.
- Am Ende des Durchgangs hat man wieder 8.000 Vektoren.
- Und diese gehen dann in den nächsten – nicht noch einmal denselben! – Decoder
- Die Größe der Vektoren ist dabei beim Eingang in den und Ausgang aus dem Decoder immer gleich.
Auf Grundlage des Embedding-Vektors des letzten Tokens wird dann eine Wahrscheinlichkeitsberechnung über dem Wortschatz erstellt.
Es folgt ein Exkurs zu Transformern, blau markiert im Blog den kann man gerne überspringen und bei Punkt 3 weiter machen.
2. Exkurs: Transformer
2.1 Der volle Transformer
Die folgende Grafik zeigt die ursprüngliche, inzwischen noch etwas verbesserte, vollständige Transformer-Architektur:
dvgodoy, Transformer, full architecture, CC BY 4.0
Man sieht: Links unten geht eine Sequenz hinein, die wird in Embeddings umgewandelt, dazu kommt Positions-Embedding; dann beginnt die Black Box, und rechts oben kommen Vorhersagen heraus.
Die Grafik zeigt die prinzipiellen Elemente oder Schichten; neu sind die eingekastelten Blöcke in der Mitte, unsere bisherige Black Box:
- Tokenizer-Schicht (zum Beispiel byte pair encoding, siehe Blogeintrag)
- Embedding-Schicht (Tabelle + Position, siehe Blogeintrag und Blogeintrag)
- Transformer-Schichten, bestehend aus mehreren Encoder-, gefolgt von mehreren Decoder-Schichten. LLMs bestehen oft nur aus Decoder-Schichten, Encoder braucht man vor allem für andere Aufgaben. Dazu später mehr.
- Un-embedding-Schicht (die Wahrscheinlichkeitsverteilung, ganz am Ende)
Der linke gelb eingerahmte Block, das ist ein Encoder. Der rechte eingerahmte Block, das ist ein Decoder. Üblicherweise sind bei Transformern mehrere Encoder hintereinander geschaltet, und danach mehrere Decoder. Es kann zum Beispiel 6 oder 12 oder 24 Encoder-Schichten (Layer) geben, gefolgt von 6 oder 12 oder noch viel mehr Decoder-Schichten, größenordnungsmäßig. Manche Modelle benutzen die volle Encoder-Decoder-Struktur, andere sind encoder-only oder decoder-only.
Die Encoding-Schichten übersetzen zum Beispiel einen englischen Eingangstext in viele Zahlenwerte, also eine interne und abstrakte Repräsentation des Eingangstexts. Die Decoding-Schichten übersetzen Zahlenwerte dan zum Beispiel in Deutsch oder Französisch. Das ist eine Art, wie maschinelle Übersetzung funktioniert. Aber dieses Transformer-Prinzip funktioniert nicht nur mit Text als Input, sondern auch mit Pixeln oder Audiomaterial.
2.2 Blick hinein: Encoder und Decoder hintereinander
Das Bild zeigt vereinfachte Transformer-Einheiten. Vereinfacht, weil im Gegensatz zum Bild oben die Normalisierungs-Zwischenschritte fehlen, deren Position für die Effizienz wichtig ist und die sich im Vergleich zu dem ursprünglichen Modell verändert hat.

dvgodoy, Transformer, stacked layers and sublayers, CC BY 4.0
In der linken Hälfte der Grafik sieht man einen Überblick:
- Es gibt erstens beispielhaft 6 Encoder-Schichten. Die erste Schicht arbeitet mit den oben erwähnten Eingangs-Vektoren und gibt das Ergebnis, modifizierte Vektoren, an die nächste Encoding-Schicht weiter, und die macht das ebenso. Am Ende der Encoding-Schicht steht eine interne Repräsentation des Eingabetexts in Form vieler Zahlenwerte, sozusagen die Bedeutung des Inputs.
- Es gibt zweitens beispielhaft 6 Decoder-Schichten. Jede Schicht erhält als Input a) das feststehende Ergebnis der Encoding-Schicht, und b) das Ergebnis der vorhergehenden Decoding-Schicht. (Bis auf die erste Decoder-Einheit, die ja noch keinen Vorgänger hat. Wir reden nicht darüber, okay?)
In der rechten Hälfte der Grafik sieht man Details:
- Eine Encoder-Schicht. Die nimmt 1 Input entgegen und besteht aus 2 Elementen oder Teilschichten, der blauen und der gelben Box. Es gibt 1 Output.
- Eine Decoder-Schicht. Die nimmt 2 Inputs entgegen und besteht aus 3 Elementen oder Teilschichten, den roten, blauen und gelben Boxen. Es gibt 1 Output.
Die gelben Schichten, das sind jeweils Neuronale Netze, ganz so, wie man sie in der Schule kennenlernt.
2.3 Blick hinein: Eine Encoder- und eine Decoder-Schicht
Das nächste Bild zeigt das auf die einfachen Teilschichten reduzierte Modell: Eine Encoder-Schicht, eine Decoder-Schicht. Sequenzierung und Embedding und Un-Embedding sind weggelassen. Die Encoding-Schicht hat als Eingang den vollständigen vektorisierten Eingangstext; die zwei Eingänge der Decoding-Schicht erhalten a) das Ergebnis der Encoding-Schicht und b) das Ergebnis der vorhergenden, hier nicht gezeigten, Decoding-Schicht.
Was ein Encoder macht und was ein Decoder macht, das wissen wir immer noch nicht, das müssen wir auch noch nicht wissen; ich nähere mich langsam.
2.4 Modelle nur mit Encoder- oder Decoder-Schichten
Es gibt manche Modelle, die bestehen praktisch nur aus Encoder-Schichten. BERT ist so eine Familie von Sprachmodellen, die nur aus Encodern besteht. In den Encoder-Schichten wird der Input, also zum Beispiel Text, in noch mehr Zahlenwerte als bisher encodiert, die immer mehr relevante Information enthalten. Das Encoding ist vor allem wichtig, lese ich, wenn mit den Zahlenwerten unmittelbar gearbeitet wird, bei Klassifizierungsaufgaben etwa, oder sentiment analysis. Aber dafür kann man BERT nicht prompten; BERT ist nicht zur Texterzeugung da. Google nutzt oder nutzte ab 2019 BERT, um Suchanfragen auszuwerten.
Die Aufgabe der Decoder-Schichten ist es, aus Zahlenwerten einen Output zu erzeugen. Einen neuen Text etwa, also eine Fortführung des bisherigen Textes oder eine Übersetzung in eine andere Sprache.
GPT besteht nur aus Decoder-Schichten, die auf den Eingangsvektoren arbeiten. Der Grund, heißt es, dass das weniger Aufwand ist. Für kleinere Modelle ist eine Encoder-Decoder-Struktur besser, für richtig große zwar auch, aber der Abstand wird ausgeglichen durch den enormen Zuwachs an Leistungsfähigkeit insgesamt ab einer gewissen Größe. (Mehr dazu.) Der Bezeichner „Decoder-only“ ist insofern irreführend, als der Input natürlich schon encodiert ist und immer weiter encodiert wird, aber halt innerhalb der Decoding-Module.
3. Die Decoder-only-Schichten des LLM
Das nächste Bild zeigt eine Decoder-only-Architektur, wie sie bei LLMs wie GPT eingesetzt wird. Der Vorgang beginnt unten mit dem Input, unseren 8.000 Token Kontext, die im roten Kästchen ihr Anfangsembeddings erhalten und die danach mit Positionsembedding ergänzt werden.
Dieser Haufen von 8.000 Vektoren ist der Input für den Decoder-Block, das ist der große graue Kasten, der am Ende auch wieder einen Haufen von 8.000 modifizierten Vektoren an nächsten grauen Decoder-Block weitergibt. Der Fachausdruck für Haufen ist Matrix.

(Bild von hier: https://ai.stackexchange.com/questions/40179/how-does-the-decoder-only-transformer-architecture-work)
Diese modifizierten Vektoren heißen auch „hidden states“, falls einem der Begriff mal begegnet; das sind sozusagen die ganzen Zwischenergebnisse, die auf dem Weg zum Endergebnis anfallen, und mit denen die Decoder arbeiten. Ihre Größe, also die Anzahl an Zahlen im modifizierten Embedding, ist je nach LLM unterschiedlich, aber in der Regel immer konstant; die Vektoren werden also immer wieder modifiziert, haben aber stets die gleiche Größe von, sagen wir, 10.000 Zahlenwerten.
Für die Größenordnung: GPT4 (decoder-only) soll insgesamt solche 120 Decoder-Schichten haben. Je Schicht werden 8.000 Vektoren nach und nach verarbeitet, jeder Vektor besteht aus 10.000 Zahlen. Wer mehr bezahlt, kriegt auch Modelle mit mehr Kontext und anderen Werten.
Am Ende wird das Embedding nur des letzten Tokens als Input für ein letztes Neuronales Netz herangezogen (das ist der grüne Linear-Block oben). Dieses Netz erzeugt daraus einen neuen Vektor, der so groß ist wie der Wortschatz des LLM und für alle möglichen Token im Wortschatz Rohwerte angibt („Logits“), die proportional zur Wahrscheinlichkeit für dieses Token sind. Der Softmax-Block am Ende, der eigentlich ganz einfach ist, normalisiert diese Logits auf Größen zwischen 0 und 1 und heißt auch „normalisierte Exponentialfunktion“ und ist für das Prinzip nicht so wichtig. Dann schaut man im einfachsten Fall nach, welches Token der Position des höchsten Wertes im Ergebnisvektor entspricht, und das ist dann das nächste Token. (Tatsächlich könnte der Algorithmus noch etwas komplizierter sein, und auch die Temperatur spielt hier eine Rolle.) Ich habe versucht, diese letzten Schritte hier zu illustrieren:

Aber vielleicht ist es noch einfacher, den gesamten Vorgang noch einmal im Diagramm zu betrachten. Im nächsten Bild wird (1) der Kontext „The dogs bark loudly.“ (2) in Token zerlegt, (3) deren ID ermittelt, (4) deren Anfangs-Embedding nachgeschlagen, (5) die Position ergänzt, und das ganze dann (6.1 bis 6.3) in 3 Decoder geschoben und am Ende (7 – 9) ausgewertet: (10) Das nächste Token ist „They“ und die Runde kann jetzt mit „The dogs bark loudly. They“ wieder von vorne beginnen.
Wichtig: Der blaue Pfeil verfolgt die Berechnung des dritten Tokens. Genau das gleiche geschieht auf dieser Schicht aber auch parallel mit den anderen Token, man müsste also noch auf jeder Schicht vier weitere bunte Pfeile und 16 gestrichelte Pfeile ergänzen, aber dann wird es unübersichtlich.
Jetzt bleibt nur noch zu klären, wie so ein Decoder funktioniert.
4. Überblick: Die Decoder-Schicht
Ein Decoder-Modul besteht – siehe das Diagramm oben – aus zwei Untermodulen: a) Masked Multi-Head (Self-, nicht Cross-) Attention gefolgt von b) einem Neuronalen Netz (das ist das Feed Forward). „Norm“ steht für Normalisierung und interessiert uns jetzt nicht.
4.1 Das Untermodul Attention
Attention, Aufmerksamkeit, heißt: Manche Elemente des Inputs sind wichtiger als andere, und zwar um eine bestimmte Größe. Diese zwei Aspekte verfeinern den Input also und betonen die relevanten Aspekte darin. Das ist das Interessanteste und Neue und wird weiter unten und im nächsten Eintrag ausführlicher erklärt. Attention bestimmt, welche Elemente im Kontext wichtig sind, und verändert Vektoren in Abhängigkeit davon.
4.2 Das Untermodul Feed Forward
Das Neuronale Netz (das ist mit Feed Forward gemeint) verarbeitet dann diese Information, entscheidet sozusagen, was damit gemacht wird. Diese Entscheidungen sind, wie es bei Neuronalen Netzen allgemein der Fall ist, nicht mehr nachvollziehbar. Es geschieht etwas mit dem Eingangsvektor. Mehr weiß ich im Moment nicht.
Das Neuronale Netz hat in der verdeckten Schicht größenordnungsmäßig viermal so viele Knoten wie jeweils beim Input und Output. Input und Output, das ist die aktuelle Embedding-Größe d_model, der hidden states size, in unserem Beispiel 10.000. Bei dieser Embedding-Größe hat das Neuronale Netz dieser Decoding-Schicht demnach 40.000 Knoten in der verdeckten Schicht. Diese Zahl ist es, wenn man von „intermediate size“ oder „filter size“ oder „feedforward size“ spricht.
5. Überblick: Das Aufmerksamkeits-Untermodul
Das Prinzip hier heißt Masked Multi-Head (Self-) Attention. Diese Begriffe verwirren erst einmal, deshalb erkläre ich sie etwas ausführlicher; sie sind dann gar nicht so schwer zu verstehen, bis auf den ersten.
„Attention“
Bestimmte Elemente des Eingangs werden stärker gewichtet als andere. Welche? Und wie stark? Das sind genau die Fragen, die in diesem Untermodul geklärt werden. Self-Attention heißt dabei, dass nur der eigene Input ausgewertet wird. (Beim Standard-Transformer-Modell mit Encodern gibt es im Decoder nämlich außerdem ein zusätzliches Untermodul Cross-Attention, was heißt, dass der eigene Input und der Encoder-Input ausgewertet werden. Aber separate Encoder-Module gibt es bei uns ja keine, weil wir uns nur Texterzeugung und nicht Übersetzung anschauen.)
„Masked“
Beim Training heißt das, dass das LLM nicht schummelt, sondern nur alle Token vom Anfang des Inputs bis zur vorherzusagenden Lücke auswertet und nicht etwas die darauf folgenden Token. Es geht zum Beispiel darum, die Lücke in „Der Einbrecher öffnete den ______________ schnell, weil er die Kombination wusste“ zu schließen, ohne das hilfreiche „Kombination“ zu verwenden, sondern nur die vier Wörter vor der Lücke. (Tatsächlich wird der Input länger sein und es nicht nur um diesen einen Satz gehen.) Technisch geschieht das, indem der Aufmerksamkeitswert für nachfolgende Token auf 0 oder etwas entsprechendes gesetzt wird.
Beim Erzeugen von Text mit dem fertig trainierten Modell heißt das mit dem „masked“ nicht viel.
„Multi-head“
Die für die Attention zuständigen Elemente heißen Head, also Lesekopf. Ein Head durchsucht den Input nach Auffälligkeiten und gewichtet sie und gibt die Ergebnisse weiter an das nächste Submodul, das Neuronale Netz. Multi-Head heißt, dass mehrere Heads parallel und unabhängig voneinander arbeiten und deren Ergebnisse dann kombiniert werden. Mir reicht es aber völlig, wenn wir verstehen, wie ein einzelner Head funktioniert, und selbst das erst im nächsten Blogeintrag dazu. Wie viele Heads gibt es pro Schicht? Bei kleinen Modellen vielleicht 8, bei großen 100 oder mehr.
6. Ausblick
Ein letztes Mal: Es gehen 8000 Vektoren in das Aufmerksamkeitsmodul hinein. Die werden in beliebiger Reihenfolge einzeln verarbeit, was gut für Parallelisierung ist, also das Verteilen der Arbeit auf mehrere Rechner. Die Reihenfolge kann deshalb beliebig sein, weil die Information darüber, ob das Token, dessen Vektor gerade bearbeitet wird, vorne oder hinten im Kontext steht, ja durch das Positionsembedding irgendwie verwertbar gemacht wird. Bei jeder Verarbeitung eines Vektors spielen die anderen 7.999 Vektoren eine Rolle, und zwar eine unterschiedlich große – je nachdem, wie viel Aufmerksamkeit sie erhalten.
Wir wissen also: Ein Lesekopf verarbeitet einen Inputvektor unter Berücksichtigung der anderen Vektoren im Kontext; genau genommen nicht nur einer, sondern mehrere Leseköpfe; und das Ergebnis geht an ein Neuronales Netz, das Dinge damit macht.
Nächstes Mal: Attention, everybody!
7. Links und Ausprobieren
- Eine kurze, aber nachvollziehbare Erklärung speziell zum LLM-Aufbau: https://ai.stackexchange.com/questions/40179/how-does-the-decoder-only-transformer-architecture-work
- Der Wikipedia-Eintrag zu Transformern an sich, technischer und allgemeiner: https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)
- Über LLM mit Encoder-Decoder-Architektur und Decoder-only: https://medium.com/@yumo-bai/why-are-most-llms-decoder-only-590c903e4789
Fortsetzung folgt. Nix mehr mit Metaphorik, jetzt wird gerechnet. Großes Finale, mit vielleicht noch mit einem Anhang dahinter.
Schreibe einen Kommentar