Aufmerksamkeit
Wie jedes Wortstück in einem Sprachmodell auf die anderen schaut – und so herausfindet, was es im Zusammenhang bedeutet.
Aufmerksamkeit (englisch attention) ist der Kernmechanismus heutiger Sprachmodelle. Jedes Token fragt: Welche der Tokens vor mir sind gerade wichtig für mich? Es gewichtet sie und mischt deren Informationen in sich hinein.
Technisch passiert das mit drei Vektoren pro Token: Query (was suche ich?), Key (was biete ich an?) und Value (was gebe ich weiter?). Man kann es sich als unscharfe Map vorstellen, die nicht einen Treffer liefert, sondern eine gewichtete Mischung aller Einträge.
Das Problem: Wörter brauchen Kontext
Am Anfang bekommt jedes Token einen festen Zahlenvektor aus einer Tabelle, sein Embedding. „Bank“ hat dort immer denselben Vektor – egal ob Geldinstitut oder Parkbank. Damit das Modell den Unterschied erkennt, muss „Bank“ auf seine Nachbarn schauen. Genau das leistet Aufmerksamkeit.
Query, Key, Value
Wie entscheidet ein Token, worauf es achtet? Jedes Token erzeugt aus seinem Vektor drei neue, jeweils mit einer eigenen gelernten Matrix:
„Bank“ sucht etwa nach Hinweisen auf Geld oder Natur.
„Geld“ signalisiert etwa: Ich bin ein Finanz-Hinweis.
Der Inhalt, der tatsächlich übernommen wird.
Dann läuft für jedes Token dasselbe Verfahren:
- Seine Query wird mit dem Key jedes anderen Tokens verglichen – per Skalarprodukt: Je ähnlicher die Richtung, desto höher die Punktzahl.
- Die Punktzahlen werden mit Softmax in Gewichte umgewandelt, die zusammen 100 % ergeben.
- Die Values aller Tokens werden mit diesen Gewichten gemischt. Das Ergebnis ist der neue, kontextbewusste Vektor.
Selbst rechnen
Hier mit zweidimensionalen Vektoren, damit man es zeichnen kann. Drei Tokens haben je einen Key (orange). Dreh die Query (blau) und sieh, wie sich Punktzahlen und Gewichte verändern:
In einer Formel zusammengefasst – das ist die berühmteste Zeile der modernen KI:
Attention(Q, K, V) = softmax( Q · Kᵀ / √d ) · VQ, K und V sind hier Matrizen mit einer Zeile pro Token. Die Matrizen, mit denen sie erzeugt werden, sind Parameter – im Training gelernt. Niemand legt fest, dass „Bank“ nach „Geld“ suchen soll; das ergibt sich.
Viele Köpfe, viele Schichten
Ein Token muss auf vieles gleichzeitig achten: Wer ist das Subjekt? Worauf bezieht sich „es“? Welches Wort stand direkt davor? Deshalb gibt es nicht eine Aufmerksamkeit, sondern viele parallel, sogenannte Köpfe (heads) – typisch sind Dutzende pro Schicht. Jeder hat eigene Q-, K- und V-Matrizen und lernt, auf etwas anderes zu achten.
Und das Ganze wiederholt sich in jeder Schicht – große Modelle haben Dutzende davon hintereinander. Frühe Schichten erfassen eher Grammatik und Wortnachbarschaft, spätere eher Bedeutung und Zusammenhänge über weite Strecken. Am Ende trägt jedes Token Informationen aus dem gesamten Text vor ihm.
Nur nach hinten schauen
In Sprachmodellen, die Text erzeugen, darf jedes Token nur auf sich selbst und auf frühere Tokens achten, nie auf spätere – die gibt es beim Schreiben ja noch nicht. Das nennt man kausale Maske.
Für Entwickler übersetzt
| Begriff | Entspricht ungefähr |
|---|---|
| Aufmerksamkeit | eine unscharfe Map.get(): Statt eines exakten Treffers kommt eine gewichtete Mischung aller Werte |
| Query | der Suchschlüssel |
| Key | die Schlüssel der Einträge – verglichen wird per Ähnlichkeit, nicht per equals() |
| Value | die Werte der Einträge |
| Kopf | eine von vielen solchen Maps parallel, jede mit eigener Vorstellung von „ähnlich“ |
| Kausale Maske | die Map enthält nur Einträge mit kleinerem oder gleichem Index |
// Aufmerksamkeit für EIN Token, als unscharfe Map
float[] attention(float[] query, float[][] keys, float[][] values) {
int n = keys.length;
double[] w = new double[n];
for (int i = 0; i < n; i++)
w[i] = dot(query, keys[i]) / Math.sqrt(query.length); // wie gut passt Eintrag i?
softmaxInPlace(w); // → Gewichte, Summe = 1
float[] out = new float[values[0].length];
for (int i = 0; i < n; i++)
for (int j = 0; j < out.length; j++)
out[j] += w[i] * values[i][j]; // gewichtete Mischung
return out;
}
// keys/values enthalten nur Tokens 0..aktuell → kausale Maske