Zurück zum Archiv
#ai#llm#glossary#aigen

Decode

Das erste Fragment der Antwort ist bereits erschienen. Das nächste muss berücksichtigen, was gerade geschrieben wurde: Nach „Heute trinke ich Tee“ hat das Modell einen anderen Kontext als nach „Heute trinke ich Wasser“. Dieser sich verändernde Text muss schrittweise erweitert werden.

Decode ist die Phase der Erzeugung einer Fortsetzung nach der Verarbeitung der anfänglichen Eingabe. In der üblichen Schleife verarbeitet das Modell das zuletzt gewählte Token — ein Textstück —, berechnet die Wahrscheinlichkeiten für das nächste, und eine Auswahlregel fügt einen der Kandidaten hinzu.

Das gewählte Fragment wird zur Eingabe des nächsten Schritts. Der KV Cache bewahrt benötigte Ergebnisse früherer Berechnungen auf, sodass nicht die gesamte Historie von Neuem verarbeitet werden muss.

So entsteht eine Abhängigkeit zwischen aufeinanderfolgenden Entscheidungen, obwohl mehrere unterschiedliche Antworten gemeinsam bearbeitet werden können. Decode bezeichnet hier das Erweitern des Textes durch das Modell, nicht nur die Umwandlung von Tokenkennungen in Zeichen. Prefill bereitet den anfänglichen Kontext vor.

Quelle des Mechanismus: Shazeer, Fast Transformer Decoding, §2.4.

Mechanismus und Details

Eine Reihe fertiger Strickmaschen endet mit einer neuen Masche, die auf der Nadel entsteht.

Das erste Antworttoken lässt sich aus dem Prefill-Ergebnis auswählen. Wird weitergeneriert, ist dieses Token die Eingabe des nächsten Modelldurchlaufs. Seine neuen K und V kommen in den KV-Cache, und das Query nutzt aktuelle und frühere Positionen. Die bloße Auswahl einer Token-ID ergänzt noch nicht deren Repräsentation im Cache. Das zeigt die Hugging-Face-Generierungsschleife, „Cache storage implementation“.

Token ausgewählt, aber noch nicht verarbeitet

Das eigene Miniaturmodell hat drei Tokens: A, B und C. Ihre Vektoren sind (1,0)(1,0), (0,1)(0,1) und (−1,−1)(-1,-1). Wir setzen Q=K=VQ=K=V gleich diesen Vektoren; Attention nutzt die Skala 1/21/\sqrt{2}. Aus dem Ergebnis h=(h0,h1)h=(h_0,h_1) bilden wir die Logits [h1,h0,−h0−h1][h_1,h_0,-h_0-h_1], und Greedy Decoding wählt den größten.

Der Prompt A B ergibt näherungsweise h=(0,330;0,670)h=(0{,}330;0{,}670). Das erste Antworttoken ist somit A. Der Cache enthält vorerst nur die zwei Promptpositionen. Erst der nächste Durchlauf verarbeitet das gewählte A.

Dies ist ein vollständig definiertes Demonstrationsmodell ohne Training, Positionen, mehrere Schichten oder Endtoken. Seine wiederholte Antwort hat keine sprachliche Bedeutung. Der Vergleich mit der Neuberechnung des gesamten Präfixes prüft die Ergebnisgleichheit. Der Zähler umfasst ausschließlich Positionen, für die K/V berechnet wurden.

Der Cache vermeidet wiederholte Berechnungen früherer K/V, aber Attention liest weiterhin den Kontext. Bei kleinen Batches wird oft die Übertragung der Gewichte oder des Caches zum begrenzenden Faktor; das hängt vom Modell, der Hardware und der Sequenzlänge ab. In der Architektur Disaggregated Serving [Polski] läuft Decode nach dem Empfang des Caches auf eigenen Ressourcen. Decode in diesem Sinn ist nicht die Rückumwandlung von Tokenkennungen in Text durch den Tokenizer.

Ich verwende KI-generierte Inhalte als Teil meines täglichen Lernprozesses.