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

Token-Embeddings und Positionskodierung

Nach dieser Lektion: Ich kann die Eingabevektoren eines Transformers aus Token-IDs und Positionen bauen.

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

Von Token-IDs zu brauchbaren Zahlen

Ein Token-Embedding ist eine Zeile Zahlen, die für ein Token steht, und die Positionskodierung fügt ein Signal hinzu, das sagt, wo das Token steht. Zusammen sind sie die Eingabe jedes Transformers.

Eine Token-ID ist nur ein Etikett. Die Zahl 2 ist nicht „mehr“ als die Zahl 1. Das Modell braucht Zahlen, mit denen es multiplizieren und addieren kann.

Am Ende dieser Lektion

Notiz

Ich kann die Eingabevektoren eines Transformers aus Token-IDs und Positionen bauen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Vektoreine Liste von Zahlen[1, 0, 2]
Embedding-Tabelleeine Tabelle mit einer Zeile Zahlen für jedes Token
Embeddingdie Zeile der Tabelle für ein Token
Positionwo ein Token im Text steht, ab 0 gezählt
Positionssignalein Vektor, der für eine Position steht
Eingabevektordas Embedding plus das Positionssignal

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

Eine Embedding-Tabelle macht aus einer ID Zahlen

Eine Embedding-Tabelle hat eine Zeile für jedes Token im Vokabular. Um ein Token einzubetten, nimmt man die Zeile mit der Nummer seiner Token-ID. Diese Zeile ist das Embedding des Tokens.

Unsere Tabelle hat vier Tokens und drei Zahlen pro Zeile. Die Zahlen beginnen zufällig und ändern sich im Training. So bekommen ähnlich gebrauchte Tokens ähnliche Zeilen.

Durchgerechnetes Beispiel: eine winzige Embedding-Tabelle

TokenIDZeile Zahlen
Hund01, 0, 2
beißt10, 1, 0
Mann22, 1, 1
Katze32, 1, -1

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

Zeilen nachschlagen und Positionen addieren

Code: python
# Eine Zeile Zahlen je Token-ID: Hund, beißt, Mann, Katze.
tabelle = [[1, 0, 2], [0, 1, 0], [2, 1, 1], [2, 1, -1]]
# Eine Zeile je Position im Satz: erste, zweite, dritte.
positionen = [[1, 1, 0], [0, 1, 1], [1, 0, 1]]

ids = [0, 1, 2]  # Hund beißt Mann

for platz in range(len(ids)):
    zeile = tabelle[ids[platz]]
    signal = positionen[platz]
    vektor = []
    for j in range(3):
        vektor.append(zeile[j] + signal[j])
    print("ID", ids[platz], "Zeile", zeile, "plus Position", signal, "ergibt", vektor)
# Ändern Sie ids in [2, 1, 0], also Mann beißt Hund, und starten Sie erneut.
# Welcher Vektor ändert sich, welcher bleibt gleich?

Wie groß eine echte Tabelle wird

Befehl
docker exec jupyter python3 -c "print(50000 * 512)"

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

Die Reihenfolge zählt, die Tabelle zeigt sie nicht

„Hund beißt Mann“ und „Mann beißt Hund“ enthalten dieselben drei Tokens, bedeuten aber etwas ganz anderes. Das Nachschlagen gibt jedem Token dieselbe Zeile, egal wo es steht.

Der Schritt der nächsten Lektion, Attention, mischt die Vektoren der Tokens. Für sich allein behandelt er sie wie einen Beutel ohne Reihenfolge. Ohne Hilfe könnte das Modell die beiden Sätze also nicht unterscheiden.

Durchgerechnetes Beispiel: zwei Reihenfolgen, dieselben Zeilen

SatzErstesZweitesDrittes
Hund beißt MannHund: 1, 0, 2beißt: 0, 1, 0Mann: 2, 1, 1
Mann beißt HundMann: 2, 1, 1beißt: 0, 1, 0Hund: 1, 0, 2

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

Ein häufiger Fehler

Warnung

Viele denken, ein Modell kenne die Wortfolge, weil die Tokens der Reihe nach ankommen. Attention behandelt sie aber wie einen Beutel. Das Modell kennt die Reihenfolge nur, wenn vor der ersten Schicht zu jedem Token ein Positionssignal addiert wird.

Zu jedem Token kommt ein Positionssignal

Eine zweite Tabelle hat eine Zeile für jede Position: erste, zweite, dritte. Addieren Sie die Zeile der Position eines Tokens zu seinem Embedding, Zahl für Zahl. Das Ergebnis ist der Eingabevektor.

Jetzt bekommen „Hund“ an erster und „Hund“ an dritter Stelle verschiedene Eingabevektoren. Manche Modelle lernen die Positionstabelle im Training. Andere nutzen feste Wellenmuster, die nichts lernen müssen.

Durchgerechnetes Beispiel: die Positionssignale addieren

PlatzPositionssignal„Hund beißt Mann“„Mann beißt Hund“
Erster1, 1, 0Hund: 1+1, 0+1, 2+0 = 2, 1, 2Mann: 3, 2, 1
Zweiter0, 1, 1beißt: 0, 2, 1beißt: 0, 2, 1
Dritter1, 0, 1Mann: 3, 1, 2Hund: 1+1, 0+0, 2+1 = 2, 0, 3

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

Beide Sätze mit NumPy einbetten

Befehl
docker exec jupyter python3 -c "import numpy as np; E = np.array([[1, 0, 2], [0, 1, 0], [2, 1, 1], [2, 1, -1]]); P = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]]); print((E[[0, 1, 2]] + P).tolist()); print((E[[2, 1, 0]] + P).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.

Ü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.