Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Das Innere eines Transformer-Blocks

Nach dieser Lektion: Ich kann ein Token durch die Schritte eines Transformer-Blocks verfolgen.

Lektion, 65 Min.2 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Der Teil, den ein Sprachmodell wiederholt

Ein Transformer-Block ist die Einheit, aus der ein Sprachmodell gebaut ist, und ein Modell ist derselbe Block, viele Male gestapelt. Er enthält maskierte Attention mit mehreren Köpfen, dann ein kleines Netz für jedes Token, mit Abkürzungen und Neuskalierung um beides.

Wer einen Block kennt, kennt die Form des ganzen Modells.

Am Ende dieser Lektion

Notiz

Ich kann ein Token durch die Schritte eines Transformer-Blocks verfolgen.

Schlüsselwörter

BegriffWas er bedeutet
Kausale Maskehindert ein Token daran, auf spätere Tokens zu schauen
Kopfein Attention-Schritt mit eigenen Tabellen für Query, Key und Value
Feed-Forward-Schrittein kleines Netz, das auf jedes Token einzeln wirkt
Residualverbindungaddiert die Eingabe eines Schritts zu seiner Ausgabe
Normalisierungskaliert einen Vektor, damit seine Zahlen eine stabile Größe behalten
BlockAttention und Feed-Forward mit ihren Residualen, wiederholt zu einem Modell

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine kausale Maske versteckt die Zukunft

Ein Sprachmodell lernt, das nächste Token zu raten. Könnte ein Token auf die Tokens danach schauen, sähe es die Antwort.

Darum lässt eine kausale Maske jedes Token nur auf sich selbst und die Tokens davor schauen. Ein späteres Token bekommt das Gewicht 0. In der Praxis setzt man seinen Score vor Softmax auf minus unendlich, denn e hoch minus unendlich ist 0.

Durchgerechnetes Beispiel: Gewichte mit maskierter Zukunft

TokenScoresDarf schauen aufGewichte
Erstes1, 2, 0nur das erste1, 0, 0
Zweites2, 1, 1das erste und zweite0,731, 0,269, 0
Drittes0, 1, 3alle drei0,042, 0,114, 0,844

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Zukunft in Python maskieren

Code: python
import math

# scores[i][j]: wie gut die Query von Token i zum Key von Token j passt.
scores = [[1, 2, 0], [2, 1, 1], [0, 1, 3]]

for i in range(3):
    potenzen = []
    for j in range(3):
        if j <= i:
            potenzen.append(math.exp(scores[i][j]))
        else:
            # Ein späteres Token: maskiert, also gar kein Gewicht.
            potenzen.append(0)
    summe = sum(potenzen)
    gewichte = []
    for p in potenzen:
        gewichte.append(round(p / summe, 3))
    print("Token", i, "Gewichte", gewichte)
# Ändern Sie j <= i in True, sodass nichts maskiert ist, und starten Sie erneut.
# Wie ändert sich die Zeile des ersten Tokens, und warum ist das geschummelt?

Dieselbe Maske mit NumPy

Befehl
docker exec jupyter python3 -c "import numpy as np; S = np.array([[1, 2, 0], [2, 1, 1], [0, 1, 3]], dtype=float); S[np.triu(np.ones((3, 3), dtype=bool), 1)] = -np.inf; W = np.exp(S) / np.exp(S).sum(axis=1, keepdims=True); print(W.round(3).tolist())"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Mehrere Köpfe suchen verschiedene Dinge

Ein Attention-Schritt kann nur auf eine Weise mischen. Darum laufen in einem Block mehrere Köpfe nebeneinander, jeder mit eigenen Tabellen für Query, Key und Value.

Ein Kopf verbindet vielleicht ein Wort mit dem Wort davor. Ein anderer verbindet ein Adjektiv mit dem Nomen, das es beschreibt. Ihre Ausgaben werden aneinandergehängt, dann mischt eine weitere gelernte Tabelle sie zurück auf die übliche Länge.

Durchgerechnetes Beispiel: zwei Köpfe verbinden

SchrittFür das Token voll
Ausgabe von Kopf 17,88, 2,12
Ausgabe von Kopf 21, 3
Aneinandergehängt7,88, 2,12, 1, 3
Nach der Mischtabellezurück auf die übliche Länge

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Feed-Forward, Residuale und Normalisierung

Nach der Attention geht jedes Token einzeln durch einen kleinen Feed-Forward-Schritt: zwei Schichten mit ReLU dazwischen, wie im Modul Deep Learning.

Eine Residualverbindung addiert die Eingabe jedes Schritts zu seiner Ausgabe, damit nichts Bekanntes verloren geht. Die Normalisierung skaliert jeden Vektor so, dass seine Zahlen im Mittel 0 sind und gleichmäßig streuen. Beides hält einen tiefen Stapel trainierbar.

Durchgerechnetes Beispiel: ein Residual, dann normalisieren

SchrittZahlen
Eingabe von voll1, 2
Ausgabe der Attention7,88, 2,12
Residual: beide addieren8,88, 4,12
Normalisiert: Mittelwert 01, -1

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Einen Vektor mit NumPy normalisieren

Befehl
docker exec jupyter python3 -c "import numpy as np; x = np.array([2.0, 4.0, 6.0]); print(x.mean(), ((x - x.mean()) / x.std()).round(2).tolist())"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, im Feed-Forward-Schritt würden die Tokens miteinander reden. Er wirkt aber auf jedes Token allein. Tokens teilen Information nur in der Attention, also muss eine Tatsache aus einem anderen Token zuerst dort ankommen.

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.