En inbäddning är en uppslagning, inte en funktion
Ett första lager efter en tokenizer
En tokenizer ger en modell heltal-ID:n: [256, 1842, 7301, ...]. En av de första sakerna en transformator gör är att omvandla varje ID till en vektor med d_model flyttal. Den vektorn lever i ett d_model-dimensionellt rum (768 dimensioner för ANDREA-120M).
En inbäddningslager är en uppslagningstabell, inte en funktion. Föreställ dig en stor matris:
form: (V, d_model)
rad 0: [e_0_0, e_0_1, ..., e_0_767]
rad 1: [e_1_0, e_1_1, ..., e_1_767]
...
rad 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
Token-ID i väljer rad i. Direkt arrayåtkomst. Ingen aritmetik, ingen aktivering. Bara ett index.
Träningsbara flyttal
Varje post i tabellen börjar som ett litet slumpmässigt flyttal (vanligtvis hämtat från en normalfördelning skalad med 1/sqrt(d_model)). Backpropagation uppdaterar varje rad varje gång dess token-ID förekommer i en batch. Efter träning hamnar liknande tokens (cat, dog, pet) med liknande vektorer; orelaterade tokens (cat, Tuesday, xylophone) ligger långt ifrån varandra i vektorutrymmet.
ANDREA-120M Token Embedding Cost
| Kvantitet | Värde |
|---|---|
| V | 8,449 |
| d_model | 768 |
| Parametrar | 6,488,832 |
Ungefär 6,5 miljoner parametrar finns bara i en token-embedding-tabell, cirka 5,4 % av ANDREA-120M:s totala antal. Varje vokabulärplats får dessa 768 flyttal.
Dimensionering av embedding-tabeller
Punktprodukter mäter likhet
Vektorer som pilar
En 768-dimensionell vektor lever i ett rum som människor inte kan visualisera, men samma algebra fungerar i alla dimensioner. Två viktiga operationer är relevanta för transformatorer:
Magnitud (längden på en pil):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Skalärprodukt (överensstämmelse mellan två pilar):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
Vad en skalärprodukt berättar
Två fakta som gäller i alla dimensioner:
- u · v = ||u|| × ||v|| × cos(theta), där theta är vinkeln mellan dem.
- Vektorer som pekar åt samma håll ger stora positiva skalärprodukter.
- Vektorer som pekar åt motsatta håll ger stora negativa skalärprodukter.
- Vektorer som står i rät vinkel ger en skalärprodukt på noll.
Skalärprodukt = onormaliserad likhet. Två tränade token-inbäddningar för cat & dog får en hög skalärprodukt eftersom backpropagation har dragit dem närmare varandra (båda förutsäger kontexter relaterade till husdjur). cat & Tuesday blir nästan ortogonala eftersom de förutsäger olika kontexter.
Varför en Transformer bryr sig
Aktivitet 5 (grow_a_language_model_attention) bygger attention från skalärprodukter: en query-vektor skalärproduktas med key-vektorer och ger poäng som visar vilka tidigare tokens som är viktiga för att förutsäga nästa. Embeddings och skalärprodukter tillsammans bär alla interaktioner inuti en transformer.
Förutsäg likhet
ANDREA använder inlärda positionsinbäddningar
Ett problem
En token-inbäddning talar om för en modell vilket ord som finns på denna position. Den talar inte om för modellen var det ordet sitter. Utan positionsinformation behandlar en transformator the cat sat on a mat och mat a on sat cat the identiskt: samma uppsättning tokens, utan ordningssignal.
Tre lösningar finns i transformatorlitteraturen:
Sinusoidal (Vaswani 2017). En fast matematisk formel baserad på sinus- och cosinusfunktioner. Position 0 får en specifik 768-vektor; position 1 får en annan; aldrig tränad, aldrig uppdaterad. Generaliserar till vilken position som helst via formeln.
RoPE (Rotary Position Embedding). Roterar query- och key-vektorer baserat på position. Används av LLaMA, Qwen. Inga extra parametrar; rotationen är inbyggd i attention.
Learned. En separat embedding-tabell med formen (T, d_model) där T är en kontextlängd. Varje rad tränas via backpropagation, precis som token-embeddings.
ANDREAs val: Learned
ANDREA ärver ett learned-position-tillvägagångssätt från microGPT, som ärvde det från nanoGPT, som ärvde det från GPT-2. En motivering:
- Enkelhet. Ingen speciell matematik i attention. En positionstabell ser ut som en tokentabell.
- Kompatibilitet med anpassad CUDA. ANDREA:s microgpt_cuda.cu-motor hanterar två inbäddningsuppslagningar identiskt; inga sin/cos-kärnor behövs.
- Tillräckligt för fast kontext. ANDREA begränsar T till 1024. En inlärd tabell fungerar bra för sekvenser med fast längd.
ANDREA-120M Position Embedding Cost
| Quantity | Value |
|---|---|
| T (kontext) | 1,024 |
| d_model | 768 |
| Parametrar | 786,432 |
0.79M parametrar för position. Kombinerat med token-inbäddningar: 6.49M + 0.79M = 7.27M inbäddningsparametrar totalt för ANDREA-120M.
Hur de kombineras
Vid varje position t i en indatasekvens:
x_t = token_embedding[token_id_t] + position_embedding[t]
Två 768-vektorer, summerade elementvis. Resultatet, x_t, flödar in i ett första transformerblock. En modell separerar dem aldrig igen; den lär sig att använda den kombinerade signalen.
Inlärd kontra sinusformad
Var inbäddningsparametrar finns
Ett komplett ANDREA-120M-inbäddningslager
| Komponent | Form | Parametrar |
|---|---|---|
| Token embedding table | 8,449 × 768 | 6,488,832 |
| Position embedding table | 1,024 × 768 | 786,432 |
| Total | 7,275,264 |
Ungefär 7,3M parametrar. ANDREA-120M:s totala parameterantal: ~120M. Endast embeddings-lagret: 6%. Resterande 94% finns i transformerblocken (attention + MLP, täcks i aktivitet 5-7).
Untied vs Tied Embeddings
Många transformermodeller (inklusive GPT-2) kopplar samman en tokeninbäddning med en slutlig utmatningsprojektion: samma V × d_model-matris används både vid inmatning och vid utmatning (logits över vokabulären). Kopplingen sparar V × d_model parametrar och förbättrar ofta kvaliteten.
ANDREA använder obundna inbäddningar: inmatningsinbäddningen och utmatningsprojektionen tränas som separata matriser. Aktivitet 7 (grow_a_language_model_transformer_block) täcker ett sista lager.
En framåtkörning hittills
Indata: token-ID:n [256, 1842, 7301, ...] (1024 stycken). Varje ID slår upp en 768-vektor. Varje position slår upp en 768-vektor. Summera elementvis. Resultat: en (1024, 768)-matris x av token-+-positionsvektorer. x flödar in i transformerblock 1.
Aktivitet 5 (grow_a_language_model_attention) täcker vad block 1 gör: skalad punktprodukt-uppmärksamhet med kausal mask och softmax.