Um die hier vorgenommenen Änderungen zu verstehen, müssen wir zunächst den Key-Worth-Cache besprechen. Innerhalb des Transformators haben wir 3 Vektoren, die für die Funktion der Aufmerksamkeit entscheidend sind – Schlüssel, Wert und Abfrage. Auf einer hohen Ebene ist Aufmerksamkeit die Artwork und Weise, wie wir wichtige Informationen über die vorherigen Token an den aktuellen Token weitergeben, damit dieser den nächsten Token vorhersagen kann. Im Beispiel der Selbstaufmerksamkeit mit einem Kopf multiplizieren wir den Abfragevektor des aktuellen Tokens mit den Schlüsselvektoren der vorherigen Token und normalisieren dann die resultierende Matrix (die resultierende Matrix nennen wir das Aufmerksamkeitsmuster). Wir multiplizieren nun die Wertvektoren mit dem Aufmerksamkeitsmuster, um die Aktualisierungen für jeden Token zu erhalten. Diese Daten werden dann zur Einbettung des aktuellen Tokens hinzugefügt, sodass sie nun den Kontext haben, um zu bestimmen, was als Nächstes kommt.
Wir erstellen das Aufmerksamkeitsmuster für jedes einzelne neue Token, das wir erstellen. Während sich die Abfragen ändern, bleiben die Schlüssel und Werte konstant. Daher versuchen die aktuellen Architekturen, die Rechenzeit zu reduzieren, indem sie die Schlüssel- und Wertevektoren zwischenspeichern, während sie in jeder nachfolgenden Aufmerksamkeitsrunde generiert werden. Dieser Cache wird als Schlüssel-Wert-Cache bezeichnet.
Obwohl Architekturen wie Nur-Encoder- und Encoder-Decoder-Transformatormodelle erfolgreich waren, gehen die Autoren davon aus, dass die oben gezeigte Autoregression und die Geschwindigkeit, die sie ihren Modellen ermöglicht, der Grund dafür ist, dass Nur-Decoder-Modelle heutzutage am häufigsten verwendet werden.
Um die YOCO-Architektur zu verstehen, müssen wir zunächst verstehen, wie ihre Schichten aufgebaut sind.
Für eine Hälfte des Modells verwenden wir eine Artwork von Aufmerksamkeit, um die Vektoren zu generieren, die zum Füllen des KV-Cache erforderlich sind. Sobald es in die zweite Hälfte übergeht, wird der KV-Cache ausschließlich für die Schlüssel- bzw. Wertevektoren verwendet und generiert nun die Ausgabetoken-Einbettungen.
Diese neue Architektur erfordert zwei Arten von Aufmerksamkeit: effiziente Selbstaufmerksamkeit und gegenseitige Aufmerksamkeit. Im Folgenden werden wir auf beide Arten eingehen.
Environment friendly Self-Consideration (ESA) ist darauf ausgelegt, einen konstanten Inferenzspeicher zu erreichen. Anders ausgedrückt: Wir möchten, dass die Cache-Komplexität nicht von der Eingabelänge abhängt, sondern von der Anzahl der Schichten in unserem Block. In der folgenden Gleichung haben die Autoren ESA abstrahiert, aber der Relaxation des Selbstdecoders ist konsistent, wie unten gezeigt.
Gehen wir die Gleichung Schritt für Schritt durch. X^l ist unsere Token-Einbettung und Y^l ist eine Zwischenvariable, die zur Generierung der nächsten Token-Einbettung X^l+1 verwendet wird. In der Gleichung ist ESA Environment friendly Self-Consideration, LN ist die Schichtnormalisierungsfunktion – die hier immer Root Imply Sq. Norm warfare (RMSNorm
), und schlussendlich SwiGLU
. SwiGLU
wird wie folgt definiert:
Hier swish = x*sigmoid (Wg * x)
wobei Wg ein trainierbarer Parameter ist. Wir finden dann das elementweise Produkt (Hadamard-Produkt) zwischen diesem Ergebnis und X*W1, bevor wir das gesamte Produkt mit W2 multiplizieren. Das Ziel mit SwiGLU
besteht darin, eine Aktivierungsfunktion zu erhalten, die unterschiedliche Informationsmengen bedingt durch die Schicht an das nächste Token weiterleitet.
Nachdem wir nun wissen, wie der Selbstdecoder funktioniert, wollen wir uns die beiden Möglichkeiten ansehen, die die Autoren zur Implementierung von ESA in Betracht zogen.
Zunächst betrachteten sie das sogenannte Gated Retention. Retention und Self-Consideration sind sich zugegebenermaßen sehr ähnlich. Die Autoren des Artikels „Retentive Community: A Successor to Transformer for Giant Language Fashions“ sagen, dass der Hauptunterschied in der Aktivierungsfunktion liegt – Retention entfernt Softmax und ermöglicht eine rekurrente Formulierung. Sie verwenden diese rekurrente Formulierung zusammen mit der Parallelisierbarkeit, um die Speichereffizienz zu steigern.
Um in die mathematischen Particulars einzutauchen:
Wir haben unsere typischen Matrizen von Q, Ok und V – jede davon wird mit den lernbaren Gewichten multipliziert, die mit jeder Matrix verknüpft sind. Dann finden wir das Hadamard-Produkt zwischen den gewichteten Matrizen und dem Skalar Θ. Das Ziel bei der Verwendung von Θ ist es, einen exponentiellen Abfall zu erzeugen, während wir dann die D-Matrix verwenden, um bei der gelegentlichen Maskierung (Verhindern, dass zukünftige Token mit aktuellen Token interagieren) und Aktivierung zu helfen.
Gated Retention unterscheidet sich von Retention über den γ-Wert. Hier wird die Matrix Wγ verwendet, um unsere ESA datengesteuert zu machen.
Sliding Window ESA führt die Idee ein, zu begrenzen, wie viele Token das Aufmerksamkeitsfenster beachten soll. Während bei normaler Selbstaufmerksamkeit alle vorherigen Token in irgendeiner Weise beachtet werden (selbst wenn ihr Wert 0 ist), wählen wir bei Sliding Window ESA einen konstanten Wert C, der die Größe dieser Matrizen begrenzt. Dies bedeutet, dass der KV-Cache während der Inferenzzeit auf eine konstante Komplexität reduziert werden kann.
Um noch einmal in die Mathematik einzutauchen:
Wir lassen unsere Matrizen anhand ihrer entsprechenden Gewichte skalieren. Als Nächstes berechnen wir den Kopf ähnlich wie die Multi-Head-Aufmerksamkeit, wobei B sowohl als kausale Karte fungiert als auch sicherstellt, dass nur die Token C zurück beachtet werden.