0.1.5. Einbettungen
Eine Token-ID lässt sich nicht sinnvoll multiplizieren. Eine Einbettung ist der gelernte Vektor, der für diese ID steht. Das Paket model hält zwei Tabellen. Jeder Eintrag ist ein Parameter, also ein trainierbarer Skalar aus autograd.
| Tabelle | Zeilen | Länge einer Zeile | Index |
|---|---|---|---|
WTE |
Vokabulargröße | 16 | Token-ID |
WPE |
16 | 16 | Position 0 … 15 |
embedAdd liest beide Zeilen und addiert sie koordinatenweise:
x[d] = WTE[t][d] + WPE[i][d]
x ist der Residualstrom dieser Position. Es gibt keine Verkettung und keine weitere Matrix davor. i ist der Index in der aktuellen Tokenfolge, beginnend bei 0 für das öffnende BOS.
Ohne WPE hätte Attention keine Angabe zur Reihenfolge. Die Tabelle wird gelernt, nicht als feste Sinusfunktion eingesetzt. Dieselbe Token-ID benutzt immer dieselbe Zeile. Zwei Vorkommen von a unterscheiden sich durch die Positionszeile und durch die Schlüssel, die schon im Cache stehen.
Zu Beginn zieht New jeden Eintrag aus einer Normalverteilung mit Standardabweichung 0.08. Die Zeile von a druckt das Programm vor dem Training und nach der letzten Stufe. Die Zahlen haben sich dann bewegt. Die Zeile ist kein Wahrscheinlichkeitsvektor und wird hier nicht durch Softmax geschickt. Die erste RMSNorm kommt erst im Vorwärtspass, nach der Addition.
WTE ist nicht mit der Ausgabetabelle LMHead verbunden. Die Zeile, die „dieses Zeichen kam herein“ bedeutet, und die Zeile, die „dieses Zeichen soll folgen“ abstimmt, dürfen sich unterscheiden.
0.1.6. Attention mischt die bisher sichtbaren Positionen in diesen Strom.