14 · Context llarg i atenció eficient
Idea central: el context llarg és alhora un problema de cost (), un problema de generalització posicional (el model mai no ha vist posicions tan altes) i un problema de capacitat d'ús (tenir la informació al context no garanteix fer-ne cas).
1. Els tres problemes, per separat# sense fórmules
| Problema | Símptoma | Solucions |
|---|---|---|
| Cost computacional | latència i memòria disparades | FlashAttention, atenció esparsa, GQA/MLA, atenció lineal |
| Extrapolació posicional | el model es trenca més enllà del context entrenat | RoPE scaling (NTK, YaRN), ALiBi, entrenament per fases |
| Ús efectiu del context | "es perd al mig", ignora informació present | dades d'entrenament de context llarg, reordenació, RAG |
Confondre'ls porta a conclusions errònies del tipus "aquest model té 1M de context però no serveix": la finestra nominal, la finestra entrenada i la finestra efectiva són tres coses diferents.
Els tres problemes, per separat
«1M de context però no serveix» barreja tres coses diferents. Mesura-les una per una sobre el mateix model i mira que no tenen res a veure.
Un mini-GPT de 32 dimensions i 2 capes entrenat amb seqüències de 32 tokens, sobre el mateix corpus en català que la resta del curs. Amb 150 passos ja es veuen els dos efectes; amb 400, la pèrdua baixa per sota de la fita del bigrama (2,30) i el contrast és més net. El problema del cost ja és mesurat i no demana entrenar res.
- parelles d’atenció: creixen amb L²
- KV-cache: creix amb L
Les dues rectes tenen pendents diferents i és tota la qüestió: passar de 2k a 32k multiplica el cache per 16 i les parelles d'atenció per 256. El cost d'atenció és el que domina, i és el que FlashAttention i els patrons esparsos van a buscar —cadascun per un costat diferent: l'un no el redueix i l'altre sí.
Cadascun es mesura amb una magnitud diferent, i és aquesta la qüestió.
Canviar-ho torna a començar l'entrenament.
4,0× el context entrenat.
- passos
- 0
- pèrdua
- —
- dins del context
- —
- més enllà
- —
- finestra efectiva
- —
- de les que li caben
- —
El primer problema —el cost— es compta sense cap model i ja és al gràfic. Els altres dos demanen un model entrenat, perquè el que es mesura és com de bé prediu: la pèrdua a posicions que no ha vist mai, i si fa cas o no del context que té.
2. FlashAttention: la mateixa matemàtica, molta menys memòria# sense fórmules
L'atenció ingènua materialitza a la HBM. Amb i 32 caps, són desenes de GB només d'scores.
FlashAttention (Dao et al., 2022; v2 2023; v3 2024) reorganitza el càlcul per blocs (tiling) dins la SRAM del xip i usa la softmax en línia (estadístiques acumulatives) per no haver de guardar mai la matriu sencera. En el backward, recomputa el que cal.
- És exacta (no és una aproximació).
- Passa de a de memòria.
- És IO-aware: el guany ve de reduir moviments de memòria, no FLOPs. Aquesta és la lliçó general del hardware modern: el coll d'ampolla és l'ample de banda de memòria, no el càlcul.
Avui és transparent: F.scaled_dot_product_attention de PyTorch ja en fa servir un kernel equivalent.
FlashAttention: la mateixa resposta, molta menys memòria
Si fa els mateixos FLOPs i dona el mateix resultat, d'on surt el guany? Mou la mida del bloc i mira els dos comptadors alhora.
- atenció ingènua: la matriu sencera
- per blocs de 16: només un tros
Les dues escales són logarítmiques. La recta de dalt té pendent 2 i la de baix, 1: doblar L quadruplica la memòria de l'una i només dobla la de l'altra. A 32k tokens la distància és de 2.048×, i és la raó per la qual hi ha models de context llarg.
Les estadístiques acumulatives
El que fa possible no veure la fila sencera abans de començar a sumar són dos números per fila: el màxim corrent i la suma corrent . Quan un bloc nou porta un màxim més gros, el que ja s'havia acumulat es reescala pel factor i s'hi continua sumant:
| màxim nou | |
| suma | |
| acumulador | |
| al final |
Amb els controls d'ara hi ha hagut 59 reescalades sobre 576 visites a un bloc. Les altres no han calgut: quan el màxim no puja, el factor val exactament 1 i no es toca res —i per això la de blocs no acumula error com es podria témer.
El càlcul es fa de debò a aquesta longitud. La corba de sota extrapola els comptadors fins a 32k.
Amb 16, la matriu de puntuacions es materialitza en 6 trossos de 96×16.
Canvia els vectors. La conclusió no s'hi mou: prova-ho.
- memòria ingènua
- 9,2 k
- memòria per blocs
- 1,5 k
- reducció
- 6,0×
- MAC ingènua
- 148,99 k
- MAC per blocs
- 148,99 k
- FLOPs extra
- 0,67 %
«Exacta» vol dir que calcula la mateixa funció, no que en surtin els mateixos bits. Reassociar una suma en coma flotant mou l'últim bit, i això és inevitable —és el mateix fenomen que el §6 del fitxer 15 invoca per dir que temperature=0 no dona determinisme bit a bit. El que distingeix una reordenació d'una aproximació és la magnitud, i es veu posant al costat dues tècniques que sí que canvien la resposta:
| Contra l'atenció ingènua | diferència màxima | en ULP | què és |
|---|---|---|---|
| Softmax en línia per blocs | 5,55·10⁻¹⁶ | 1,3 | reordenació de sumes |
| Finestra lliscant (w = 24) | 1,18 | 2.653,1 T | aproximació |
| Atenció lineal φ(Q)(φ(K)ᵀV) | 0,89 | 1.994,6 T | una altra funció |
Entre 1,3 ULP i 2.653,1 T hi ha uns quants ordres de magnitud, i és tota la diferència entre «l'últim bit balla» i «la resposta és una altra».
La prova que no és una aproximació: es calcula la mateixa atenció una tercera vegada amb suma compensada —que dona gairebé el doble de precisió— i es mira a quina distància n'està cadascuna. Si la versió per blocs fos una aproximació, la seva columna creixeria en fer el bloc més petit, perquè hi hauria més reescalades i cada una perdria una mica. Mira què passa de debò:
| bloc | reescalades | ULP de la ingènua | ULP de la de blocs |
|---|---|---|---|
| 1 | 280 | 1,3 | 1,3 |
| 2 | 226 | 1,3 | 1,3 |
| 4 | 166 | 1,3 | 1,3 |
| 8 | 111 | 1,3 | 1,3 |
| 16 | 59 | 1,3 | 1,3 |
| 32 | 30 | 1,3 | 1,3 |
| 64 | 9 | 1,3 | 1,3 |
L'última columna no creix: amb blocs d'una clau hi ha 280 reescalades i amb un sol bloc n'hi ha 0, i la precisió és la mateixa. Aquesta és la prova: una aproximació que acumulés error a cada reescalada no podria donar la mateixa columna amb 280 que amb cap.
Les dues versions queden a 0,0 ULP l'una de l'altra respecte de la referència —1,3 la ingènua i 1,3 la de blocs— i quina de les dues hi queda més a prop és la mateixa a totes dues. Mou la llavor i l'ordre s'intercanvia: cap de les dues no és sistemàticament millor, que és exactament el que vol dir que totes dues siguin arrodoniments correctes del mateix número.
Aquesta és la frase del text —«el guany ve de reduir moviments de memòria, no FLOPs»— amb els dos comptadors al costat. Els productes escalars de i les acumulacions de són els mateixos, a la unitat: 148.992 contra 148.992. El que canvia és quanta matriu de puntuacions hi ha viva alhora: 9.216 escalars contra 1.536.
I un matís que el text s'estalvia i que el comptador destapa: els FLOPs no són exactament els mateixos. Reescalar l'acumulador quan apareix un màxim més gros costa 1.003 multiplicacions de més, que aquí són un 0,67 %. Amb blocs de la mida que fa servir un kernel de debò —64 o 128 claus— cauen per sota de l'1 %, i per això el text hi pot dir «els mateixos» sense mentir gaire. És el bescanvi sencer: uns FLOPs de regal a canvi de no tocar la HBM.
3. Patrons d'atenció esparsa# sense fórmules
Si no pots atendre-ho tot, atén selectivament:
- Finestra lliscant (Mistral, Longformer): cada token mira els anteriors. Amb capes, el camp receptiu efectiu és .
- Atenció global + local: uns quants tokens especials veuen tota la seqüència (BigBird, Longformer).
- Alternança de capes (Gemma 2/3, Llama 4): capes de finestra local alternades amb capes d'atenció completa (p. ex. 5:1). Retalla molt el KV-cache mantenint la capacitat de fer salts llargs.
- Atenció esparsa apresa / nativa (NSA de DeepSeek, etc.): el model aprèn quins blocs comprimir, seleccionar o mirar amb finestra.
- StreamingLLM: manté uns pocs attention sinks inicials + una finestra recent → permet generació infinita amb memòria constant (però sense recordar el mig).
Patrons d'atenció esparsa
Si no pots atendre-ho tot, què hi perds? Mira el camp receptiu i el cache alhora: cada patró els bescanvia d'una manera diferent.
La línia de punts és l'atenció completa, on cada consulta abasta tot el seu passat. La línia plena és el patró triat: quan es queda plana, el camp receptiu ha tocat sostre i per molt llarga que es faci la seqüència, no arribarà més enrere.
Qui pot mirar qui, a la capa 1 i després de les 4
A l'esquerra, la màscara d'una capa; a la dreta, on arriba la influència després de totes. La banda diagonal de l'esquerra s'eixampla a la dreta per acumulació: és així com una finestra estreta acaba veient lluny, i és exactament el que la fórmula resumeix. Es dibuixen les primeres 48 posicions.
Cada token mira els w anteriors (Mistral, Longformer). El cache es queda a w tokens passi el que passi, i el camp receptiu creix amb la profunditat.
Quants tokens anteriors pot mirar cadascun.
Tokens del principi que tothom pot mirar. Només els fan servir global+local i StreamingLLM.
Gemma 2/3 fa servir 1:5; Llama 4, una proporció semblant.
- camp receptiu
- 17 tok
- fórmula n·w+1
- 17
- cache / capa
- 5,0 claus
- reducció de cache
- 12,80×
- parelles d’atenció
- 1,2 k
- contra l’atenció completa
- 15 %
La fila del text diu que «amb capes, el camp receptiu efectiu és ». Aquí no s'aplica la fórmula: s'arrenca de la identitat —cada posició s'influeix a si mateixa— i a cada capa es propaga quina posició pot influir quina, componint la màscara d'aquella capa amb l'abast acumulat. Amb finestra lliscant, les dues xifres coincideixen sempre, i el «+1» és la posició mateixa.
La raó de mesurar-ho en comptes de calcular-ho és la fila següent de la taula: amb alternança de capes la fórmula no val, i la propagació sí. Amb finestra 4 i 4 capes, la fórmula diria 17; amb una capa completa cada 4, el que surt de debò és 64. Una sola capa que ho miri tot recupera el camp receptiu sencer, i el cache el paga només aquella capa.
| Patró | camp receptiu | arriba al token 0? | claus al cache | reducció | parelles |
|---|---|---|---|---|---|
| Atenció completa | 64 | ✓ | 256 | 1,00× | 8,3 k |
| Finestra lliscant | 17 | ✗ | 20 | 12,80× | 1,2 k |
| Global + local | 64 | ✓ | 28 | 9,14× | 1,7 k |
| Alternança de capes | 64 | ✓ | 79 | 3,24× | 3,0 k |
| StreamingLLM | 64 | ✓ | 28 | 9,14× | 1,7 k |
La columna «arriba al token 0?» separa dues coses que es confonen. Global+local i StreamingLLM hi arriben en una sola capa, perquè els primers tokens són visibles per a tothom —però només hi arriben a ells: el que hi ha al mig i no és ni global ni recent queda fora del camp receptiu encara que la columna digui que sí. La finestra lliscant, en canvi, hi arriba per acumulació de capes i no es deixa res pel camí.
4. Extensió de context: RoPE scaling# sense fórmules
Un model entrenat amb 8k tokens falla estrepitosament a 32k perquè les freqüències de RoPE produeixen angles mai vistos. Tècniques per estendre'l:
- Interpolació posicional (PI): comprimeix les posicions () perquè caiguin dins del rang conegut. Simple però degrada la resolució local.
- NTK-aware scaling: en lloc d'interpolar totes les freqüències per igual, canvia la base , comprimint més les freqüències baixes (que codifiquen distàncies llargues) i preservant les altes (distàncies curtes).
- YaRN: combina NTK per bandes de freqüència amb un ajust de la temperatura de l'atenció. És el mètode més usat: amb un fine-tuning curt (unes poques centenes de passos) estén el context 8-16×.
- Entrenament per fases: el més habitual en models grans — preentrenar amb 4-8k (barat), i fer una fase final de long-context training amb dades llargues reals, augmentant la base de RoPE.
RoPE scaling: PI, NTK-aware i YaRN
Els tres mètodes fan que una posició alta doni un angle conegut. La diferència és a quines bandes de freqüència toquen, i és la que decideix què hi perds.
La longitud d'ona de cada banda, abans i després
- original
- amb YaRN
L'escala vertical és logarítmica. Com més separades van les dues línies, més s'ha comprimit aquella banda. Amb PI van separades per igual a tot arreu; amb NTK s'ajunten a l'esquerra; amb YaRN hi ha un colze visible a la rampa. Sense escalar, coincideixen.
Per a la segona meitat cal un model entrenat amb context curt. Aquest té 32 dimensions i 2 capes, i s'entrena amb seqüències de 32 tokens sobre el corpus en català. Després se li donen 128 —4,0× el que ha vist— i es mesura la pèrdua amb cada joc d'angles. No es reentrena res entremig: és el cas que el text descriu.
Decideix banda per banda segons quantes voltes dona cada component dins del context entrenat, i ajusta la temperatura de l’atenció. És el que més s’usa.
Amb s = 1 els tres mètodes són la identitat. Aquí el context passa de 32 a 128.
La base original. NTK és l'únic mètode que la mou.
Els models reals fan servir 64 o 128. El mini-GPT de sota en té 8, i amb quatre bandes la separació de YaRN no es veuria.
- compressió banda ràpida
- 1,00×
- compressió banda lenta
- 4,00×
- base efectiva
- 10,00 k
- temperatura
- 1,139
- pèrdua a 128
- —
- sense escalar
- —
La comprovació que val per a tots tres: un mètode d'extensió que no sigui exactament la identitat quan no s'estira res està trencat, i qualsevol model que no necessiti estirar-se en pagaria el preu. Aquí es comprova a zero de màquina, component a component:
| Mètode | màx |θ' − θ| amb s = 1 | idèntic bit a bit | màx |θ' − θ| amb s = 4,0 |
|---|---|---|---|
| Cap (extrapolar) | 0 | ✓ | 0 |
| Interpolació posicional (PI) | 0 | ✓ | 0,75 |
| NTK-aware | 0 | ✓ | 0,05 |
| YaRN | 0 | ✓ | 0,65 |
Per a YaRN això no surt sol: la barreja entre interpolar i no interpolar s'ha d'escriure ancorada a l'extrapolació —— i no com . Les dues són la mateixa recta; amb , la primera dona zero exacte al parèntesi i la segona fa dues multiplicacions i una suma que poden moure l'últim bit.
| Mètode | banda ràpida (i = 0) | banda mitjana | banda lenta | què vol dir |
|---|---|---|---|---|
| Cap (extrapolar) | 1,00× | 1,00× | 1,00× | res no es toca, i per això es trenca |
| Interpolació posicional (PI) | 4,00× | 4,00× | 4,00× | tot per igual: la resolució local en pateix |
| NTK-aware | 1,00× | 2,05× | 4,00× | la ràpida intacta, la lenta com PI |
| YaRN | 1,00× | 2,61× | 4,00× | per bandes, segons les voltes que hi dona |
La fila de PI és la que explica la seva mala fama: comprimeix la banda ràpida 4,0× igual que la lenta, i la banda ràpida és la que distingeix «el token del costat» de «dos més enllà». NTK la deixa a 1,00× —pràcticament intacta— i paga la diferència a la lenta, on comprimeix exactament 4,0×, que és el que PI feia a tot arreu. Aquest no és un accident: l'exponent de la base està triat perquè surti així.
YaRN ho decideix explícitament: compta quantes voltes senceres dona cada component dins del context entrenat i, si en dona més de 32, no la toca; si no n'arriba a fer 1, la interpola del tot; i entremig, barreja. De les 32 bandes d'un cap de 64, ara mateix n'hi ha 11 intactes, 9 interpolades del tot i 12 a la rampa.
5. Qualitat efectiva: què mesurar# sense fórmules
- Needle in a Haystack (NIAH): amaga una frase en un text llarg i pregunta-la. Gairebé tots els models moderns el saturen → ja no discrimina res.
- Lost in the middle (Liu et al., 2023): el rendiment és alt per a informació al principi i al final del context, i cau al mig. Segueix sent cert en graus diversos. Implicació pràctica: posa el més important al principi o al final del prompt.
- Benchmarks seriosos de context llarg: RULER (NIAH sintètic multinivell amb variants de traça i agregació), LongBench, ∞Bench, i tasques de multi-hop real sobre documents llargs. Mostren que la longitud efectiva sol ser una fracció (sovint 1/4 o menys) de la nominal.
- Degradació per distractors: el rendiment cau molt més quan el context conté informació semblant però irrellevant que quan conté text neutre. Aquest és el cas real en RAG.
Es perd al mig? Posa el mateix fet a totes les posicions
El text diu que el rendiment cau al mig del context. Mesura-ho: amaga la mateixa parella a cada posició, una per una, i mira què hi dona el model.
Un mini-GPT de 32 dimensions i 2 capes sobre la tasca de recuperació. Amb 300 passos ja recupera per sobre del 95 % i amb 600 s'acosta al 99, i a partir d'aquí s'hi queda. No és el corpus en català: sobre text de caràcters, un model d'aquesta mida no forma cap induction head i la sonda dona zero a totes les posicions —hi ha la mesura al costat del codi.
Una seqüència de la tasca
En destacat, l'agulla: la parella marca → valor que s'ha de recuperar. En groc, els distractors, que són parelles del mateix tipus amb una marca diferent. Al final, les consultes. El valor canvia a cada seqüència, de manera que memoritzar no serveix de res: cal buscar la marca enrere i copiar el que hi anava darrere.
Canviar-ho torna a començar l'entrenament.
Parelles del mateix tipus amb marques diferents. Informació semblant però irrellevant, que és el cas real en RAG.
- passos
- 0
- recuperació mitjana
- —
- dispersió de la corba
- —
- hi ha U?
- —
- amb distractors
- —
- amb StreamingLLM
- —
La tasca és la de la dreta: entre farciment aleatori hi ha una parella marca → valor, i al final es repeteix la marca unes quantes vegades. L'única manera d'encertar el valor és buscar la marca enrere i copiar el que hi anava darrere. El valor canvia a cada seqüència, de manera que no hi ha cap associació fixa a memoritzar: o es recupera del context o no es pot saber.
6. Context llarg vs RAG: el debat, resolt en la pràctica# sense fórmules
| Criteri | Context llarg | RAG |
|---|---|---|
| Cost per consulta | alt (pagues tots els tokens) | baix (pagues el que recuperes) |
| Latència (TTFT) | alta (prefill llarg) | baixa |
| Corpus de mida arbitrària | ❌ | ✅ |
| Actualització en temps real | recarregar tot | actualitzar índex |
| Raonament sobre tot el corpus | ✅ si hi cap | limitat pel retriever |
| Atribució de fonts | difusa | explícita |
| Cache reutilitzable | ✅ (prompt caching) canvia molt l'economia | ✅ |
Resposta pràctica el 2026: no són alternatives. El patró dominant és recuperar bé i després donar molt context — retriever generós + reranker + finestra gran, sovint dins d'un bucle agèntic que decideix quan buscar més. El prompt caching (reutilitzar el KV-cache d'un prefix estable) ha abaratit molt l'opció de context llarg per a corpus petits i estables.
Context llarg contra RAG: la calculadora
No són alternatives, però una de les dues et surt més barata. Quina, i a partir de quantes consultes canvia la resposta?
- context llarg: tot el corpus a cada consulta
- RAG: només el que es recupera
Les dues escales són logarítmiques i les dues corbes són rectes de pendent 1: el cost és lineal en les consultes. El que canvia és el pendent —el cost per consulta— i l'ordenada a l'origen. El cercle marca el creuament, si en queda algun dins del rang. Amb el prompt caching actiu, el primer tram de la corba de context llarg és més costerut: la primera consulta paga el prefix sencer i les altres no.
| Criteri | Context llarg | RAG |
|---|---|---|
| Cost per consulta | 0,07 dòlars | 0,02 dòlars |
| Tokens d’entrada | 200 k | 4 k |
| TTFT relatiu | 50× | 1× (referència) |
| Corpus de mida arbitrària | ✗ limitat per la finestra | ✓ |
| Actualització en temps real | recarregar tot | actualitzar índex |
| Raonament sobre tot el corpus | ✓ si hi cap | limitat pel retriever |
| Atribució de fonts | difusa | explícita |
| Cache reutilitzable | ✓ al 10 % del preu | ✓ |
El que hauries de posar al prompt si ho hi poses tot.
El patró del 2026 és generós: recuperar molt i deixar que el model triï.
Els preus caduquen. El que no caduca és l'estructura del càlcul.
Els proveïdors cobren els tokens ja a la memòria cau a una fracció del preu.
Reutilitzar el KV-cache d'un prefix estable. És el que ha canviat l'economia.
- context llarg, 1a consulta
- 0,61 dòlars
- context llarg, següents
- 0,07 dòlars
- RAG, per consulta
- 0,02 dòlars
- total a 1 k consultes
- 68,04 dòlars / 19,50 dòlars
- més barat
- RAG
- creuament
- sempre RAG
El càlcul té tres termes i val la pena veure'ls separats, perquè quin mana canvia del tot la resposta:
| Terme | tokens | context llarg | RAG |
|---|---|---|---|
| Prefill, primera consulta | 200 k | 0,60 dòlars | 0,01 dòlars |
| Prefill, consultes següents (amb memòria cau) | 200 k | 0,06 dòlars | 0,01 dòlars |
| Decode | 500 | 7,50·10⁻³ dòlars | 7,50·10⁻³ dòlars |
| Indexar el corpus (una vegada) | 200 k | — | 4,00·10⁻³ dòlars |
La fila que decideix és la segona. Sense prompt caching, cada consulta de context llarg torna a pagar el corpus sencer i RAG guanya de 50× a partir de la primera consulta —que és exactament la ràtio de tokens. Amb prompt caching, les consultes següents paguen el corpus al 10 %, i el creuament es desplaça a un altre règim.
La taula del §6 té set files i el cost només n'és una. Les altres no es poden posar en dòlars i decideixen igual o més:
- Latència. El TTFT de context llarg és el prefill de 200 k tokens; el de RAG, el de 4 k. Són 50× de diferència en el temps que l'usuari espera abans de veure la primera lletra, i el prompt caching també l'ataca: amb el prefix a la memòria cau, el TTFT baixa tant com el cost.
- Mida del corpus. Si el corpus no cap a la finestra, no hi ha debat. Amb 200 k tokens, context llarg hi cap.
- Ús efectiu. Pagar per 200 k tokens no vol dir que el model els faci servir —és el problema 3 del §1, i el widget d'allà el mesura. I posar-n'hi molts de semblants és fabricar distractors, que és el que el §5 mesura.
- Actualització i atribució. Un índex es refresca per trossos; un prompt s'ha de tornar a muntar sencer i el seu cache s'invalida del tot. I RAG sap dir d'on ha tret cada cosa.
Per això la resposta del text no és cap de les dues: recuperar bé i després donar molt context. En aquesta calculadora, això és moure «tokens recuperats» cap amunt fins que la qualitat s'aguanti, que és el règim on les dues corbes són a prop i on el que decideix ja no és el preu.
7. Atenció lineal i alternatives# sense fórmules
Si vols de debò, has de renunciar a l'atenció completa:
Canviant l'ordre d'associació, el cost passa de a . La família inclou Performer, Linear Transformer, RetNet, RWKV, GLA i els models d'espai d'estats (Mamba). Tots comparteixen una idea: mantenir un estat de mida fixa en lloc d'un cache creixent.
El compromís empíric conegut: l'atenció completa és millor en tasques de recall precís (recuperar un detall exacte del context) i els mètodes lineals guanyen en cost. Per això el 2026 la resposta guanyadora és híbrida: unes poques capes d'atenció completa entre moltes capes lineals/SSM. Ho desenvolupem a 30pendent.
Atenció lineal: canviar l'ordre d'associació
El mateix argument del fitxer 01, aplicat a l'atenció. Una de les dues coses que passen aquí és gratis i l'altra no: quina?
- primer φ(Q)φ(K)ᵀ: pendent 2
- primer φ(K)ᵀV: pendent 1
El cercle marca el creuament. A la dreta d'aquest punt, l'ordre lineal guanya, i la distància creix sense aturador: a 64k tokens són 2.048×.
Les dues coses que passen al §7
1. Reassociar és exacte
Diferència mesurada: 6,66·10⁻¹⁶. És el que dona el O(L).
2. Canviar la softmax no ho és
Diferència mesurada: 1,31. És el que costa el O(L).
Amb d_v = 16, el creuament és a L = 31,0.
Ha de ser positiu perquè el denominador tingui sentit. És l'única cosa que el softmax donava de franc.
Amb causalitat, la versió lineal manté un estat que s'actualitza token a token: és l'«estat de mida fixa» del text.
- cost (φ(Q)φ(K)ᵀ)V
- 66,56 k
- cost φ(Q)(φ(K)ᵀV)
- 32,77 k
- ràtio
- 2,03×
- creuament
- L = 31,0
- estat de mida fixa
- 272 esc.
- KV-cache equivalent
- 2.048 esc.
Això és associativitat de matrius i prou, i per això la diferència és de l'arrodoniment i no de res més. Un cop tens i , pots multiplicar per l'esquerra o per la dreta i obtens el mateix número; el que canvia és què materialitzes pel camí:
| Ordre | matriu intermèdia | mida | MAC |
|---|---|---|---|
| L × L | 4.096 | 66.560 | |
| d × d_v | 256 | 32.768 |
La segona matriu no creix amb L, i aquí hi ha tota la família: Performer, Linear Transformer, RetNet, RWKV, GLA i els models d'espai d'estats com Mamba comparteixen aquesta idea. Amb causalitat, aquesta és literalment un estat que s'actualitza token a token i que substitueix el KV-cache: aquí en són 272 escalars fixos contra 2.048 que creixen. A 1M de tokens la diferència deixa de ser una optimització i passa a ser la diferència entre poder i no poder.
Aquesta és la meitat que no és gratis, i és la que separa l'atenció lineal de FlashAttention. El pas del §7 no és només reordenar: primer cal canviar per , i aquest canvi és una altra funció.
El motiu és concret: l'exponencial d'un producte escalar no es pot escriure com un producte d'una funció de per una de , i sense aquesta factorització no hi ha res a reassociar. Per això s'hi posa una que sí que factoritza, i per això n'hi ha tantes de proposades: cadascuna és un intent d'aproximar millor el que el softmax feia.
Posa-ho al costat del widget de FlashAttention i la taula queda completa: allà la diferència era de ≈ 2 ULP i aquí és de 2.943,3 T. La primera és un algorisme exacte executat en un altre ordre; la segona és un model diferent. És per això que el text diu que l'atenció completa guanya en recall precís: el que es perd amb és justament la capacitat de la softmax de concentrar tot el pes en un token, i recuperar un detall exacte és exactament això.
El creuament no és cap detall: amb 16 i 16, les dues expressions valen el mateix a , i per sota d'aquí materialitzar la és més barat que materialitzar la . És el mateix fenomen que el fitxer 01 mesura amb el cost d'associativitat, i el mateix que el fitxer 11 diu del creuament contra a .
Amb la d'ara (64) l'ordre lineal guanya per 2,03×. Mou amunt i el creuament se'n va cap a la dreta: com més ample és el model, més llarg ha de ser el context perquè l'atenció lineal surti a compte.
8. Comprova que ho has entès#
0 de 5 resoltes
- Per què FlashAttention és més ràpida si fa els mateixos FLOPs?
- Explica la diferència entre interpolació posicional (PI) i NTK-aware scaling.
- Què és «lost in the middle» i com afecta la manera com escrius els teus prompts? Fes servir el widget per veure què hi passa amb distractors.
Objectiu:Al widget de la recuperació, entrena el model i puja els distractors per sobre de 3: la corba que no es movia amb la posició sí que es mou amb informació semblant.
Vés al widget ↑distractors = per defecte - Per què NIAH (Needle in a Haystack) ja no és un bon benchmark?
- Un corpus de 200.000 tokens, preguntes que generen 500 tokens de resposta, i preus de 3 dòlars per milió d'entrada i 15 per milió de sortida. Quant costa una consulta posant el corpus sencer al prompt, sense prompt caching? Dona la xifra en dòlars.dòlarsMarge acceptat: 2 %
9. Recursos#
Dao et al. (2022), FlashAttention; Dao (2023), FlashAttention-2; Shah et al. (2024), FlashAttention-3.
Peng et al. (2023), YaRN: Efficient Context Window Extension.
Liu et al. (2023), Lost in the Middle.
Hsieh et al. (2024), RULER: What's the Real Context Size of your Long-Context LMs?
Xiao et al. (2023), StreamingLLM.