KI-Konzepte in Python

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

Code ausführen →
main.py
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.

  1. Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
  2. Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
  3. Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
In der Python-IDE ausführen →

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.

Alle Challenges