Attention und Self-Attention in Python
Attention lässt jedes Token auf die anderen Tokens schauen und entscheiden, welche wichtig sind. Jedes Token hat eine Query (wonach es sucht), einen Key (was es anbietet) und einen Value (die Information, die es weitergibt).
Das Konzept in einfachen Worten
Attention lässt jedes Token auf die anderen Tokens schauen und entscheiden, welche wichtig sind. Jedes Token hat eine Query (wonach es sucht), einen Key (was es anbietet) und einen Value (die Information, die es weitergibt).
Berechne Scaled Dot-Product Attention von Hand mit Queries, Keys und Values und füge dann eine kausale Maske wie bei GPT hinzu.
Die wichtigsten Ideen
- Attention-Gewichte stammen aus einem Softmax, daher ergibt jede Zeile zusammen 1.
- Die Division durch √d verhindert, dass die Scores bei langen Vektoren zu groß werden.
- Eine kausale Maske verhindert beim Generieren, dass ein Token auf zukünftige Tokens schaut.
- Multi-Head-Attention führt mehrere Attentions parallel aus, und Positional Encoding fügt die Wortreihenfolge hinzu.
Wann wird dieser Ansatz verwendet?
- Verstehen, was in neuronalen Netzen und KI-Bibliotheken passiert.
- Die Idee lernen, bevor du sie in den passenden Challenges umsetzt.
- Dich auf Kurse zu maschinellem Lernen, Vorstellungsgespräche und Projekte vorbereiten.
Selbst ausprobieren
Klicke auf eine Zeile der Heatmap, um zu sehen, wohin dieses Token schaut. Schalte die kausale Maske ein, um künftige Tokens auszublenden, und ändere die Schärfe, um die Attention zu bündeln.
Beispielcode
import math
def softmax(row):
exps = [math.exp(v - max(row)) for v in row]
return [e / sum(exps) for e in exps]
# Three tokens, each with a query, key and value vector of size 2.
Q = [[1, 0], [0, 1], [1, 1]]
K = [[1, 0], [0, 1], [1, 1]]
V = [[10, 0], [0, 10], [5, 5]]
d = len(K[0])
def attention(causal=False):
out = []
for i, q in enumerate(Q):
# Score: how well this query matches every key, scaled by sqrt(d).
scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d) for k in K]
if causal: # a token may only look at itself and earlier tokens
scores = [s if j <= i else -1e9 for j, s in enumerate(scores)]
weights = softmax(scores)
out.append([round(sum(w * v[c] for w, v in zip(weights, V)), 2) for c in range(2)])
return out
print("attention:", attention())
print("causal attention:", attention(causal=True))
Erwartete Ausgabe
attention: [[6.02, 3.98], [3.98, 6.02], [5.0, 5.0]]
causal attention: [[10.0, 0.0], [3.3, 6.7], [5.0, 5.0]]
So funktioniert es
Für jede Query sind die Scores ihre Skalarprodukte mit allen Keys, geteilt durch √d. Softmax macht aus den Scores Gewichte, und die Ausgabe ist der gewichtete Mittelwert der Values. Mit der kausalen Maske sieht das erste Token nur sich selbst, daher ist seine Ausgabe genau sein eigener Value [10, 0].
Ändere die Werte und führe das Programm im CodeUtility Python Online-Compiler aus, ohne Python lokal zu installieren.
Übungsaufgaben
Verändere Eingaben und Randfälle, bevor du die Lösung mit größeren Datenmengen testest.
- Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
- Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
- Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
Mit einer Challenge üben
Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.
- Sinusförmige Positionskodierung Berechne die Sinus- und Kosinus-Positionsvektoren, die Transformer zu den Token-Embeddings addieren. Mittel
- Skalierte Skalarprodukt-Attention Implementiere die Attention-Operation, das Herzstück von Transformern und großen Sprachmodellen. Schwierig
- Kausale (maskierte) Self-Attention Implementiere die maskierte Attention von GPT-Modellen, bei der jedes Token nur sich selbst und frühere Tokens sehen kann. Mittel
- Multi-Head-Self-Attention Projiziere die Eingabe in Queries, Keys und Values, führe Attention in mehreren Heads parallel aus und kombiniere sie. Schwierig