Salta al contingut
Entendre els LLMs
Bloc 3nucli5-6 h
IntuïtiuMatemàtic

Abans d'això: RNN, LSTM, seq2seq i el naixement de l'atenció, Tokenització

11 · L'arquitectura Transformer

Aquest és el fitxer més important del curs. Si en surts entenent com flueix un vector des de l'entrada fins al logit, tota la resta són detalls.


1. Visió general# sense fórmules

Un Transformer decoder-only (el tipus que és qualsevol LLM actual) fa això:

tokens → embeddings → [ Bloc ] × N → norm final → projecció a V → logits → softmax → probabilitats
                          │
                          └─ Bloc = Atenció multicap + FFN, amb norm i residuals

Cada bloc té dos sublayers, cadascun embolcallat en una connexió residual:

x←x+Attn(Norm(x)),x←x+FFN(Norm(x))\mathbf{x} \leftarrow \mathbf{x} + \text{Attn}(\text{Norm}(\mathbf{x})), \qquad \mathbf{x} \leftarrow \mathbf{x} + \text{FFN}(\text{Norm}(\mathbf{x}))

El flux residual: la cinta transportadora

Un vector per token travessa tot el model. Cada sublayer el llegeix i hi suma alguna cosa. Quant hi suma cadascun, i què passa al logit si n'apagues un?

E[id]→ norm → logits1,15attn10,92ffn11,26attn20,75ffn21,18attn31,34ffn31,34attn40,92ffn44,45,4
atenció: mou informació entre tokensFFN: processa dins de cada tokenL'alçada de cada fletxa és la norma del que aquell sublayer hi suma.
Logits de la posició 7 («menja»), amb tots els sublayers i amb els que has apagat.
Tokenlogit sencerlogit amb l'ablaciódiferènciaprobabilitat
el-0,174-0,174—13,1 %
gat-0,765-0,765—7,2 %
negre-0,381-0,381—10,6 %
dorm0,5900,590—28,1 %
perquè0,2890,289—20,8 %
menja0,2590,259—20,2 %

Apaga un sublayer als botons de sota i torna a mirar la columna de la diferència. Les contribucions de l'FFN i les de l'atenció no mouen el logit igual, i la norma de la fletxa no és una bona predicció de quant el mouran: el que compta és en quina direcció escriuen, no com de fort.

4 × (atenció + FFN)

Cada bloc són dos sublayers, i cadascun escriu una vegada al flux.

7 · «menja»

Hi ha una cinta per token. Aquesta és la que estàs mirant.

La mateixa llavor dona sempre el mateix resultat.

Apaga la contribució d'un sublayer

Apagar-ne un vol dir calcular-lo i no sumar-lo. És exactament el que fa la interpretabilitat per saber què aporta una peça: no la treu del model, li tapa l'escriptura al flux.

norma de l’embedding
4,45
norma final
5,39
creixement
× 1,21
sublayers apagats
0 de 8
moviment màxim del logit
0,000
error de la reconstrucció
0
L'estat final és l'embedding més la suma de les contribucions, component a component

No és una metàfora que funcioni «més o menys»: és una igualtat. Com que cada sublayer entra al flux per una suma —x←x+Attn(Norm(x))\mathbf{x} \leftarrow \mathbf{x} + \text{Attn}(\text{Norm}(\mathbf{x})) i x←x+FFN(Norm(x))\mathbf{x} \leftarrow \mathbf{x} + \text{FFN}(\text{Norm}(\mathbf{x}))— el vector que surt de l'últim bloc és, exactament, la suma de 9 vectors: el de la taula d'embeddings i un per cada sublayer.

La pitjor component de la diferència entre les dues maneres de calcular-ho és 0 — zero exacte, no zero arrodonit.

Les primeres sis components del flux residual, reconstruïdes i reals
Component012345
embedding-0,492-0,2300,012-1,783-0,5830,486
+ Σ contribucions-1,2204140,7294860,219030-1,9431460,1532950,100500
estat final real-1,2204140,7294860,219030-1,9431460,1532950,100500
diferència000000

Això és la base de tota la interpretabilitat del fitxer 26. Si el final és una suma de termes identificables, es pot preguntar quin terme ha fet pujar un logit concret, i la pregunta té resposta. En una xarxa on cada capa substituís l'estat anterior en comptes de sumar-s'hi, la pregunta no en tindria cap.

El model no està entrenat: el que aquí es mesura és l'arquitectura, no el que ha après. Per això els logits no volen dir res i les normes de les contribucions són totes semblants. El mateix bloc entrenat de debò és el mini-GPT de la secció 7, i allà les contribucions deixen de ser iguals entre elles.

2. Embeddings d'entrada# sense fórmules

X=E[ids]∈RL×d\mathbf{X} = \mathbf{E}[\text{ids}] \in \mathbb{R}^{L\times d}

E∈RV×d\mathbf{E}\in\mathbb{R}^{V\times d} és una taula de consulta entrenable. Res més: la fila ii és el vector inicial del token ii.

La taula d'embeddings: una consulta i una geometria

E[ids] no calcula res: llegeix una fila. I aquella fila, que comença sent soroll, acaba col·locada en un lloc concret de l'espai. Quin, i per què?

La consulta: one-hot(i)⊤E=E[i]\text{one-hot}(i)^\top\mathbf{E} = \mathbf{E}[i]

E[5] =1,06-1,670,510,630,060,29-0,111,20-1,47-1,080,91-0,140,540,360,09-2,400,90-0,91-0,02-1,560,57-1,37-0,31-1,18

El vector de dalt és la consulta: 29 zeros amb un 1 a «pare». El de sota és el que en surt: la fila 5 de E\mathbf{E}, que són 24 números entrenables i res més.

La geometria: cosinus entre les files de les paraules amb classe

Matriu de cosinus entre les 24 paraules amb classe. Separació dins-fora: 0,006.
pareavifillgermàmareàviafillagermanagatgosocellcavallpapeixcarnfruitacasaescolaplaçaciutatmenjamiraesperaporta
pare1,000,250,11···0,12··0,16··0,310,080,11·0,13···0,040,03··
avi0,251,00·0,140,14·0,11·····0,20·0,06·0,060,03··0,05·0,10·
fill0,11·1,00·0,07·0,10····0,220,01··0,09·····0,030,05·
germà·0,14·1,00·0,15···0,12··0,07··0,06·0,19·0,12····
mare·0,140,07·1,000,23···0,070,280,08·0,090,26···0,23·0,270,300,41·
àvia···0,150,231,00·0,64·0,080,190,08·····0,100,32··0,15··
filla0,120,110,10···1,00··0,08··0,23·0,14··0,01·0,46·0,05·0,29
germana·····0,64·1,000,040,05·0,26··0,06·0,050,240,34··0,10·0,07
gat·······0,041,00·0,36·0,18··0,070,410,220,230,11··0,210,25
gos0,16··0,120,070,080,080,05·1,00·0,260,20·0,140,16··0,10··0,06·0,27
ocell····0,280,19··0,36·1,00·····0,02·0,290,15··0,280,03
cavall··0,22·0,080,08·0,26·0,26·1,000,310,330,450,340,15·0,41·····
pa0,310,200,010,07··0,23·0,180,20·0,311,00··0,010,300,01·0,15···0,48
peix0,08···0,09······0,33·1,000,310,340,30·0,42·0,200,220,36·
carn0,110,06··0,26·0,140,06·0,14·0,45·0,311,00··0,230,140,03·0,320,280,12
fruita··0,090,06····0,070,16·0,340,010,34·1,000,24··0,100,380,260,06·
casa0,130,06·····0,050,41·0,020,150,300,30·0,241,00·0,330,07··0,12·
escola·0,03·0,19·0,100,010,240,22···0,01·0,23··1,00······
plaça····0,230,32·0,340,230,100,290,41·0,420,14·0,33·1,00···0,280,14
ciutat···0,12··0,46·0,11·0,15·0,15·0,030,100,07··1,00···0,28
menja0,040,05··0,27········0,20·0,38····1,000,500,21·
mira0,03·0,03·0,300,150,050,10·0,06···0,220,320,26····0,501,000,09·
espera·0,100,05·0,41···0,21·0,28··0,360,280,060,12·0,28·0,210,091,000,06
porta······0,290,070,250,270,03·0,48·0,12···0,140,28··0,061,00
cosinus (els negatius, a zero)0,001,00

Les classes van en blocs de quatre: si s'agrupen, han de sortir quadrats a la diagonal.

5 · «pare»

La fila que la consulta ha de tornar.

Canviar-la torna a començar amb una taula nova.

Això entrena de debò i triga uns segons. Un Transformer de dues capes i 15,3 mil paràmetres sobre 4000 tokens de la gramàtica de joguina, amb l'objectiu de sempre: predir el token següent. Cap terme de la pèrdua no diu res sobre similitud entre paraules. Mentre entrena, la pàgina continua responent i pots aturar-ho quan vulguis; el model es queda on sigui.

passos entrenats
0
pèrdua
—
cosinus dins de la classe
0,006
cosinus entre classes
-0,000
separació
0,006
veí més pròxim de la classe
25 % (atzar: 13 %)
El producte one-hot × E dona la fila, bit a bit

E[ids]\mathbf{E}[\text{ids}] se sol escriure com un producte de matrius perquè encaixi amb la resta de la notació, però ningú no el calcula així: multiplicar un vector de 29 components per una matriu de 29×24 costa 696 multiplicacions per tornar el mateix que una lectura d'índex. Aquí s'han fet les dues coses i s'han comparat amb Object.is, que no perdona ni un bit:

24 de 24 components són el mateix número exacte, i la diferència més gran és 0. No és que s’hi assembli: és el mateix valor en coma flotant, perquè la suma té un sol terme no nul.

Les vuit primeres components: producte contra lectura directa
Component01234567
one-hot × E1,055637-1,6715340,5140710,6257320,0618110,290022-0,1102721,203104
E[5] directa1,055637-1,6715340,5140710,6257320,0618110,290022-0,1102721,203104
iguals bit a bitsísísísísísísísí
Sense entrenar: files quasi-ortogonals i cap agrupació

Amb 24 dimensions i components independents, el cosinus entre dues files té mitjana zero i desviació 1/d1/\sqrt{d} = 0,204: és la quasi-ortogonalitat del fitxer 01, que és el que fa que una taula de 29 vectors càpiga en 24 dimensions sense que cap parell s'estorbi.

Classecosinus mitjà de dinsParaules
família, masculí-0,035pare, avi, fill, germà
família, femení0,014mare, àvia, filla, germana
animals-0,029gat, gos, ocell, cavall
menjar0,078pa, peix, carn, fruita
llocs-0,058casa, escola, plaça, ciutat
verbs0,067menja, mira, espera, porta
entre classes diferents-0,000la fita amb què comparar

Ara mateix la separació és 0,006, del mateix ordre que el soroll 1/d1/\sqrt{d}: no hi ha cap agrupació, perquè encara no ha passat res. Prem «Entrena» i torna a mirar aquesta taula.

Aquesta és la mateixa geometria que el fitxer 08 treia de skip-gram, però per un camí diferent: allà l'objectiu era explícitament predir el context, i aquí és el modelatge de llenguatge sencer. Que les dues rutes hi arribin és el que fa que la hipòtesi distribucional no sigui una propietat de word2vec sinó del llenguatge.

3. Self-attention: el mecanisme# sense fórmules

3.1 Q, K, V

De cada vector de token en projectes tres coses:

Q=XWQ,K=XWK,V=XWV\mathbf{Q}=\mathbf{X}\mathbf{W}_Q,\qquad \mathbf{K}=\mathbf{X}\mathbf{W}_K,\qquad \mathbf{V}=\mathbf{X}\mathbf{W}_V

3.2 La fórmula

Attention(Q,K,V)=softmax ⁣(QK⊤dk+M)V\text{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \text{softmax}\!\left(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_k}} + \mathbf{M}\right)\mathbf{V}

Pas a pas:

  1. QK⊤∈RL×L\mathbf{Q}\mathbf{K}^\top \in \mathbb{R}^{L\times L}: similitud de cada token amb cada token (producte escalar!).
  2. /dk/\sqrt{d_k}: evita que la softmax se saturi (vegeu 03, secció 3).
  3. +M+\mathbf{M}: la màscara causal, amb −∞-\infty a les posicions futures → cada token només veu el passat. Això és el que fa el model autoregressiu.
  4. softmax per files: pesos que sumen 1.
  5. ×V\times\mathbf{V}: mitjana ponderada dels values.

3.3 Multi-head

En lloc d'una atenció amb dd dimensions, en fem HH de dh=d/Hd_h=d/H dimensions en paral·lel i concatenem:

MHA(X)=[head1;… ;headH] WO\text{MHA}(\mathbf{X}) = [\text{head}_1;\dots;\text{head}_H]\,\mathbf{W}_O

Multi-head: el mateix pressupost, partit

Partir l'atenció en H caps no afegeix cap paràmetre. Llavors, què hi guanya el model — i per què això és el que fa possible dir «aquest cap fa tal cosa»?

Els 4 caps miren la mateixa entrada i en treuen patrons diferents. Cadascun fa servir 8 de les 32 dimensions.

Cap 1escriu 1,056 al flux
Patró d'atenció del cap 1: quina posició mira cadascuna.
0·el1·gat2·negre3·dorm4·perquè5·el6·gat7·menja
0·el1,00·······
1·gat0,200,80······
2·negre0,290,140,56·····
3·dorm0,230,260,050,45····
4·perquè0,410,190,070,150,18···
5·el0,260,060,140,080,080,39··
6·gat·0,140,370,100,190,040,15·
7·menja0,200,170,080,110,110,190,100,04
Cap 2escriu 0,986 al flux
Patró d'atenció del cap 2: quina posició mira cadascuna.
0·el1·gat2·negre3·dorm4·perquè5·el6·gat7·menja
0·el1,00·······
1·gat0,720,28······
2·negre0,700,250,05·····
3·dorm0,130,170,230,47····
4·perquè0,240,080,140,130,41···
5·el0,400,240,080,15·0,12··
6·gat0,180,050,120,140,050,330,13·
7·menja0,160,270,040,250,040,050,19·
Cap 3escriu 0,744 al flux
Patró d'atenció del cap 3: quina posició mira cadascuna.
0·el1·gat2·negre3·dorm4·perquè5·el6·gat7·menja
0·el1,00·······
1·gat0,390,61······
2·negre0,320,260,42·····
3·dorm0,450,310,180,06····
4·perquè0,130,200,330,160,18···
5·el0,040,070,070,680,130,03··
6·gat0,070,110,170,220,230,080,13·
7·menja0,170,130,120,120,160,200,030,06
Cap 4escriu 0,854 al flux
Patró d'atenció del cap 4: quina posició mira cadascuna.
0·el1·gat2·negre3·dorm4·perquè5·el6·gat7·menja
0·el1,00·······
1·gat0,300,70······
2·negre0,250,290,46·····
3·dorm0,040,520,310,13····
4·perquè0,450,090,20·0,25···
5·el0,050,140,120,570,020,09··
6·gat0,030,130,040,160,530,040,08·
7·menja0,090,160,240,040,060,130,240,06
pes d'atenció0,001,00

Tots els patrons són causals: el triangle de sobre la diagonal és zero exacte.

Què escriu cada cap al flux residual, a la posició 7 («menja»)

cap 1
1,056
cap 2
0,986
cap 3
0,744
cap 4
0,854
Nombre de caps HH

Amb H = 4, cada cap treballa amb dₕ = d/H = 8 dimensions. El total, H·dₕ, continua sent 32.

Posició que s'analitza

La descomposició per caps es calcula en aquesta posició del flux residual.

Apaga'l i els caps perden la noció de posició: els patrons es tornen més plans.

La mateixa llavor dona sempre el mateix resultat.

H
4
dₕ = d/H
8
paràmetres del bloc
12.608
norma de θ
24,830271
diversitat entre caps
0,311
error de la descomposició
2,22·10⁻¹⁶
La sortida de l'MHA és exactament Σₕ W_O⁽ʰ⁾·headₕ

WO\mathbf{W}_O multiplica una concatenació, i un producte per una concatenació es parteix en blocs: [head1;… ;headH] WO=∑hheadh WO(h)[\text{head}_1;\dots;\text{head}_H]\,\mathbf{W}_O = \sum_h \text{head}_h\,\mathbf{W}_O^{(h)}, on WO(h)\mathbf{W}_O^{(h)} són les dhd_h files de WO\mathbf{W}_O que corresponen a aquell cap. No és una aproximació ni una manera de parlar: és una identitat algebraica, i aquí està calculada per tots dos costats.

Contribuciónorma% del totalcomp. 0comp. 1comp. 2
cap 11,055629 %-0,0759-0,11040,1168
cap 20,986027 %0,01270,17160,0258
cap 30,743720 %0,12440,01070,0628
cap 40,854223 %-0,15720,03470,2475
suma dels caps——-0,0960520,1065610,452937
sortida real de l'MHA——-0,0960520,1065610,452937
diferència——0-2,78·10⁻¹⁷-1,11·10⁻¹⁶

La pitjor component de la diferència és 2,22·10⁻¹⁶. Que sigui zero és el que dona sentit a frases com «aquest és un induction head»: si la sortida fos una barreja no separable, la frase no tindria referent. Amb H=1H = 1 la taula té una sola fila i la descomposició no diu res — és el cas on no es pot atribuir res a ningú.

El recompte de paràmetres no depèn d'H: és literalment el mateix vector

Les quatre matrius de l'atenció són d×dd\times d passi el que passi: WQ\mathbf{W}_Q, WK\mathbf{W}_K i WV\mathbf{W}_V projecten a H⋅dh=dH\cdot d_h = d dimensions en total, i WO\mathbf{W}_O en torna. Els caps només diuen com es talla aquell dd en trossos a l'hora de fer els productes escalars.

Hdₕparàmetres d'atencióparàmetres del bloc‖θ‖
1324.09612.60824,830270530
2164.09612.60824,830270530
484.09612.60824,830270530
844.09612.60824,830270530

L'última columna és la que diu més: amb la mateixa llavor, la norma del vector de paràmetres és la mateixa a nou xifres per a tots els valors d'H, perquè és literalment el mateix vector. Canviar H no reinicialitza res ni afegeix res: només canvia per on es parteixen les columnes quan es fan els productes escalars. El que el model hi guanya no és capacitat, és poder atendre a diverses coses alhora — amb un sol cap, la softmax obliga a triar un únic patró per token.

La interpretabilitat ha identificat caps amb funcions concretes i reproduïbles: induction heads, que completen patrons ABAB i són probablement el mecanisme bàsic de l'in-context learning; previous-token heads; name-mover heads. Tots aquests noms només tenen sentit perquè la descomposició de dalt dona zero: cada cap escriu al flux residual per separat, i es pot mirar què hi escriu.

3.4 Cost

  • Temps: O(L2d)O(L^2 d) per l'atenció + O(Ld2)O(L d^2) per les projeccions.
  • Memòria (ingènua): O(L2)O(L^2) per la matriu de scores. FlashAttention ho redueix a O(L)O(L) sense materialitzar mai la matriu sencera (tiling + recomputació), amb la mateixa sortida exacta. Vegeu 14.
  • Amb LL petit domina d2d^2; quan LL arriba a l'ordre de dd domina L2L^2 (comptant les constants, 2L2d2L^2d contra 4Ld24Ld^2, es creuen a L=2dL = 2d). Per això el context llarg és car.

El camp de proves de l'atenció

La fórmula té cinc passos. Fes-los un a un i mira què canvia a cada matriu: on neix el cost quadràtic, què fa exactament el /√dₖ i per què el −∞ de la màscara és zero i no «poc».

0el1gat2negre3dorm4perquè5el6gat7menja
α=softmax ⁣(⋅)\alpha = \text{softmax}\!\left(\cdot\right)
4 · softmax: la matriu en aquest pas de la cadena.
elgatnegredormperquèelgatmenja
el1,00·······
gat0,160,84······
negre0,140,140,72·····
dorm0,120,120,120,63····
perquè0,110,110,110,110,56···
el0,360,070,070,070,070,36··
gat0,070,340,070,070,070,070,34·
menja0,080,080,080,080,080,080,080,42
pes αij\alpha_{ij}0,001,00

Files: la consulta. Columnes: la clau.

Pas de la cadena

Softmax per files. Cada fila passa a sumar 1 i a no tenir cap valor negatiu: són pesos, i el que ve ara és una mitjana ponderada.

Què busca la consulta (W_Q i W_K)

W_Q i W_K projecten sobre les dimensions de concepte i deixen fora la posició. Cada token busca els que comparteixen concepte amb ell: els dos «el» es troben, i els dos «gat» també.

6

Aquest cablejat demana dₖ = 6: projecta sobre unes dimensions concretes i no en pot fer servir més. Torna a «Sense entrenar» per moure-la.

Apaga-ho amb dₖ = 128 i mira la fila de pesos: la softmax es col·lapsa en un sol token.

Apagada, cada token veu tota la frase. És l’única diferència entre un GPT i un BERT.

La mateixa llavor dona sempre el mateix resultat.

dₖ
6
variància dels logits
6,41
predicció √dₖ
6
pes màxim de "menja"
0,422
abast efectiu
6,08 tokens
suma de la fila − 1
0
La variància dels logits és exactament dₖ, i dividir per √dₖ la torna a 1

El fitxer 03 ho va mesurar amb vectors gaussians solts. Aquí els logits surten de projectar els vectors de token per WQ\mathbf{W}_Q i WK\mathbf{W}_K, que és el que passa a dins d'un Transformer, i la predicció no canvia: si les components de q\mathbf{q} i k\mathbf{k} tenen variància 1, el producte escalar de dkd_k termes independents té variància dkd_k. La desviació creix com dk\sqrt{d_k}, i per això es divideix per dk\sqrt{d_k} i no per dkd_k.

dₖVar mesuradaprediccióerrorVar després de /√dₖ
22,1226,0 %1,060
44,1644,1 %1,041
88,4485,6 %1,056
1616,93165,8 %1,058
3234,13326,7 %1,067
6464,28640,4 %1,004
128127,181280,6 %0,994

L'última columna és la que importa: surt 1 sigui quina sigui l'amplada del cap. Sense l'escalat, passar de dk=2d_k = 2 a dk=128d_k = 128 multiplicaria la desviació dels logits per vuit, i la softmax d'un model ample arrencaria saturada.

El cost: 2L²d contra 4Ld², que es creuen a L = 2d

Amb les constants comptades i no amagades dins d'una O(⋅)O(\cdot): les puntuacions i la mitjana ponderada fan 2L2d2L^2d multiplicacions, i les quatre projeccions (Q, K, V i O) en fan 4Ld24Ld^2. Els dos termes s'igualen a L=2dL = 2d, que amb d=4096d = 4096 vol dir 8.192 tokens de context.

L = 2d
  • total
  • atenció, 2L²d
  • projeccions, 4Ld²
4 k

Amb d = 4096, el de Llama 3.

A L = 4 k, l'atenció pròpiament dita és el 33,3 % del cost de la capa: 137,44 G multiplicacions contra 274,88 G de les projeccions. Puja el control fins a 128k i mira la fracció: per això el context llarg és car, i per això el fitxer 14 existeix.

Els vectors de token són conceptes escrits a mà, com la taula del fitxer 09: muntar-hi un encoder entrenat no ensenyaria res més de l'atenció. Tot el que ve després sí que és real, i les tres matrius de projecció estan construïdes, no dibuixades: «copia el token anterior» és una rotació d'un pas sobre les dues dimensions de posició, que és RoPE en dues dimensions quatre seccions abans que el text el presenti.

4. La xarxa feed-forward (FFN/MLP)# sense fórmules

FFN(x)=W2 σ(W1x),W1∈Rdff×d,  dff≈4d\text{FFN}(\mathbf{x}) = \mathbf{W}_2\,\sigma(\mathbf{W}_1\mathbf{x}) , \qquad \mathbf{W}_1\in\mathbb{R}^{d_{ff}\times d},\; d_{ff}\approx 4d

S'aplica independentment a cada posició. Conté aproximadament dos terços dels paràmetres del model.

En models moderns, σ\sigma és SwiGLU i hi ha tres matrius (Wgate\mathbf{W}_{gate}, Wup\mathbf{W}_{up}, Wdown\mathbf{W}_{down}).

L'FFN com a memòria clau-valor

Les files de W₁ són detectors i les columnes de W₂ són fets. Munta'n un amb les mans i comprova si el fet apareix al flux residual exactament quan el detector s'activa.

El flux residual que entra: «la Torre Eiffel»

CIUTAT
1,0
FRANÇA
1,0
ITÀLIA
0,0
PERSONA
0,0
PLURAL
0,0
PASSAT
0,0
NEGACIÓ
0,0
COLOR
0,0

En taronja, les dues direccions que formen la clau del detector: k=(CIUTAT+FRANC¸A)/2\mathbf{k} = (\text{CIUTAT} + \text{FRAN\c{C}A})/\sqrt{2}.

El que l'FFN hi suma: W2 σ(W1x)\mathbf{W}_2\,\sigma(\mathbf{W}_1\mathbf{x})

CIUTAT
-0,28
FRANÇA
0,25
ITÀLIA
-0,65
PERSONA
-0,05
PLURAL
0,03
PASSAT
-0,36
NEGACIÓ
-0,04
COLOR
2,14

En lila, la direcció del fet. Les altres components es mouen perquè les trenta-una neurones aleatòries també escriuen — però cap d'elles no escriu en aquella direcció.

Les 32 neurones de la capa oculta (ReLU)

En lila, la neurona 16: el detector que has muntat. Les altres també s'activen —no hi ha res especial en una neurona— però les seves columnes no toquen la direcció del fet.

Què hi ha al flux residual

Porta CIUTAT i FRANÇA: és exactament el que la clau busca.

1,20

La clau de la Torre Eiffel val √2 ≈ 1,41. Puja el llindar per sobre i el fet deixa d'escriure's.

4,00

Com d'abrupta és la resposta al voltant del llindar.

2,50

La norma de la columna de W₂: quant s'escriu al flux residual amb activació 1.

Direcció del fet

On s'escriu el fet. Posa-la a FRANÇA i el detector s'autoalimenta: la sortida reforça mitja clau.

Activació

ReLU tanca del tot; SiLU deixa passar una mica de senyal quan la preactivació és negativa.

Les altres 31 neurones són aleatòries. Canvia-la i mira que la comprovació no es mou.

clau · flux
1,414
preactivació
0,857
activació del detector
0,8569
el fet escrit al flux
2,1421
aportació de les altres 31
0
error de la predicció
0
El fet apareix exactament quan el detector s'activa, i en la mesura exacta

La sortida de l'FFN és ∑nan W2(:,n)\sum_n a_n\,\mathbf{W}_2^{(:,n)}: una suma de columnes, cadascuna ponderada per l'activació de la seva neurona. Projectada sobre la direcció del fet, tots els termes s'anul·len menys el del detector, perquè les altres columnes s'han construït ortogonals a aquella direcció. Queda una igualtat: ⟨FFN(x),v^⟩=adet⋅∥v∥\langle \text{FFN}(\mathbf{x}),\hat{\mathbf{v}}\rangle = a_{\text{det}}\cdot\|\mathbf{v}\|.

Per a cada subjecte: preactivació, activació, fet escrit i predicció
Flux residualpreactivacióactivaciófet escritpredicció a·‖v‖diferènciaaltres neurones
la Torre Eiffel0,8570,85692,14212,142100
el Louvre0,0080,00830,02080,020800
el Colosseu-1,9720,00000,00000,000000
el gat negre-4,8000,00000,00000,000000

La pitjor diferència de les quatre files és 0 i la pitjor aportació de les altres trenta-una neurones és 0. Amb ReLU, les files que no arriben al llindar escriuen zero exacte: el fet no hi és en absolut. Canvia a SiLU i torna a mirar la columna: deixen de ser zero.

Això és, literalment, la mecànica que exploten ROME i MEMIT: si un fet viu en una columna de W2\mathbf{W}_2 i s'activa amb una clau identificable de W1\mathbf{W}_1, canviar aquella columna canvia aquell fet i deixa la resta del model on era. Puja el llindar per sobre d'1,41 i hauràs esborrat el fet del model sense tocar cap altra cosa.

L'FFN conté aproximadament dos terços dels paràmetres d'un Transformer, i aquesta és la millor imatge que en tenim: un magatzem de parelles clau-fet distribuïdes. Aquí n'hi ha una de sola i escrita a mà; en un model real n'hi ha desenes de milers per capa, superposades en el mateix espai i repartides entre neurones —cap fet no ocupa una neurona sencera—, que és exactament el problema que el fitxer 26 ataca amb els autoencoders dispersos.

5. Codificació posicional# sense fórmules

L'atenció és permutació-equivariant: sense informació posicional, "el gos mossega l'home" i "l'home mossega el gos" donarien el mateix resultat. Amb la màscara causal no és ben bé així, perquè cada token veu un prefix diferent i d'aquí el model pot treure una mica de posició, però és un senyal feble i indirecte. Cal injectar la posició.

MètodeComNotes
Sinusoïdal (2017)suma sinus/cosinus de diferents freqüènciessense paràmetres, extrapola malament
Apresa absoluta (BERT, GPT-2)una taula per posicióno extrapola més enllà del context entrenat
ALiBibiaix lineal negatiu a l'atenció segons distànciaextrapola bé, simple
RoPErota els parells de dimensions de Q i K segons la posiciól'estàndard actual

RoPE en detall

Divideix el vector en parells (x2i,x2i+1)(x_{2i}, x_{2i+1}) i aplica una rotació 2D d'angle mθim\theta_i on mm és la posició i θi=10000−2i/d\theta_i = 10000^{-2i/d}:

(x2i′x2i+1′)=(cos⁡mθi−sin⁡mθisin⁡mθicos⁡mθi)(x2ix2i+1)\begin{pmatrix}x'_{2i}\\x'_{2i+1}\end{pmatrix} = \begin{pmatrix}\cos m\theta_i & -\sin m\theta_i\\ \sin m\theta_i & \cos m\theta_i\end{pmatrix}\begin{pmatrix}x_{2i}\\x_{2i+1}\end{pmatrix}

La "base" θ\theta (10000 per defecte) es pot modificar postentrenament per estendre el context: aquesta és la idea darrere de NTK-aware scaling i YaRN (14).

La posició: per què cal, i per què RoPE és relativa

Sense informació posicional, «el gos mossega l'home» i «l'home mossega el gos» donen el mateix. Mesura-ho, i després mira com una rotació ho arregla.

Permutació del prefix: amb RoPE

originalelgosmossegal’homeavui
permutadagosl’homeelmossegaavui

Les mateixes paraules, en un altre ordre. L’última es queda on és, perquè la pregunta és què prediu després.

Amb RoPE, els logits de l'última posició canvien en 0,319: el model distingeix les dues frases.

La rotació: (x2i,x2i+1)(x_{2i}, x_{2i+1}) gira un angle mθim\theta_i

qkq12k5

Un sol punt per cada diferència, perquè totes les parelles amb la mateixa diferència donen el mateix número. Mou mm i nn mantenint la diferència i el cercle marcat no es mou.

Les parelles de dimensions, de la més ràpida a la més lenta (base 10 k)
Parella iθᵢlongitud d'ona 2π/θᵢquè codifica
01,00006,3token a token: distingeix veïns immediats
10,100062,8distàncies intermèdies
20,0100628,3distàncies intermèdies
30,00106,3 kdistàncies molt llargues; és la que limita el context

Apagat, el model no té cap manera de saber en quin ordre li han arribat els tokens.

Tria una permutació diferent del prefix de la frase.

Base θ\theta de RoPE

10.000 és la del paper original. Pujar-la és el que fan NTK-aware scaling i YaRN per estendre el context sense reentrenar.

8

RoPE treballa amb parelles: hi ha dₕ/2 rotacions, cadascuna amb el seu angle.

12
5

Mou les dues mantenint la diferència i mira que el producte escalar no es mogui gens.

La query i la key de la comprovació.

m − n
7
qₘ · kₙ
-2,623348
dispersió del seu grup
1,33·10⁻¹⁵
‖q‖ abans de rotar
2,108006239
‖qₘ‖ després
2,108006239
longitud d’ona més llarga
6,3 k
Sense posició, permutar la frase no canvia res: la diferència és zero

El context és ∑jαijvj\sum_j \alpha_{ij}\mathbf{v}_j, una mitjana ponderada. Els pesos surten de productes escalars entre vectors de token, i els vectors de token no porten cap marca d'on eren: si es permuten les paraules del prefix, es permuten els sumands i la suma no es mou. Aquí s'ha permutat «el gos mossega l’home» i s'han comparat els logits de l'última posició.

Tokensense RoPE, originalsense RoPE, permutadadiferènciaamb RoPE, diferència
el-0,993877-0,9938772,22·10⁻¹⁶0,319
gos-1,266789-1,2667890-0,018
mossega0,5467500,5467502,22·10⁻¹⁶0,040
l’home0,3533300,3533300-0,073
avui0,7995630,7995630-0,079

Sense RoPE, la pitjor diferència és 2,22·10⁻¹⁶, que és l'arrodoniment de fp64 sobre una suma feta en un altre ordre: zero, vaja. Amb RoPE és 0,319. El model sense posicions no és que ho faci malament: és que no pot distingir les dues frases, perquè li arriben com el mateix conjunt de vectors.

Dos matisos que val la pena tenir presents. El primer: la màscara causal ja trenca part de la simetria, perquè cada posició veu un prefix diferent — el zero exacte és el de l'última posició, que les veu totes. El segon: per això el model d'aquesta mesura té una sola capa. Amb dues, les posicions intermèdies han vist prefixos diferents i el que arriba a l'última ja no és el mateix conjunt de vectors; la invariància deixa de ser exacta encara que el model continuï sense saber res de posicions.

El producte escalar depèn només de m − n, amb dispersió zero

Es prenen una query i una key, es col·loquen a totes les parelles de posicions de 0 a 24 —625 parelles— i s'agrupen els productes escalars per m−nm-n. Si la promesa és certa, dins de cada grup tots els valors han de ser el mateix número.

m − nparellesqₘ · kₙdispersió dins del grup
-322-1,7887378,88·10⁻¹⁶
-223-2,1401368,88·10⁻¹⁶
-124-2,6269591,33·10⁻¹⁵
025-2,7901101,33·10⁻¹⁵
124-2,4709751,33·10⁻¹⁵
223-1,9572268,88·10⁻¹⁶
322-1,7182911,11·10⁻¹⁵
421-1,9736861,11·10⁻¹⁵

La pitjor dispersió dels 49 grups és 1,33·10⁻¹⁵, i el canvi de norma més gran de tota la taula és 4,44·10⁻¹⁶. Això és el que vol dir «posicionament relatiu amb una operació absoluta»: cada vector es rota pel seu compte, sense saber res dels altres, i el producte escalar que en surt només sap la distància. I com que una rotació és ortogonal, no altera les normes — de manera que RoPE no toca ni l'escala dels logits ni el dk\sqrt{d_k} que els calibra.

Pujar la base θ estira les longituds d'ona: amb 10.000 la parella més lenta fa una volta sencera cada ~52.000 posicions, i amb 1.000.000 triga vint vegades més. Un model entrenat amb 8k de context i servit amb 128k es troba amb angles que no ha vist mai; estirar la base els torna al rang familiar a canvi de perdre resolució a les distàncies curtes. Aquesta és la idea de NTK-aware scaling, i YaRN l'afina estirant només les freqüències baixes i deixant les altes on són. El fitxer 14 ho desenvolupa.

6. La sortida# sense fórmules

logits=Norm(xL) Wout⊤∈RV,p=softmax(logits)\text{logits} = \text{Norm}(\mathbf{x}_L)\,\mathbf{W}_{out}^\top \in\mathbb{R}^{V}, \qquad p = \text{softmax}(\text{logits})

Durant l'entrenament, es calcula la pèrdua a totes les posicions alhora (gràcies a la màscara causal, cada posició prediu la següent) — això és el que fa l'entrenament tan eficient comparat amb una RNN.

La sortida: logits, softmax i la pèrdua a totes les posicions alhora

Un sol forward dona L supervisions, no una. Comprova que la pèrdua de cop és exactament la mitjana de les pèrdues d'una en una, i mira què costa cada manera.

Pèrdua per posició (nats). Cada barra és una supervisió del mateix forward.

paraula d'una classe: quina de les quatre és imprevisible, terra log 4 = 1,386paraula de funció: predictible del tot

La distribució de la posició 1: p=softmax(Norm(x) Wout⊤)p = \text{softmax}(\text{Norm}(\mathbf{x})\,\mathbf{W}_{out}^\top)

cavall
18,8 %
àvia
14,2 %
plaça
6,5 %
amb
6,0 %
.
5,0 %
porta
4,6 %
el
4,2 %
avi
3,9 %

La pèrdua d'aquesta posició és −log⁡p(correcte)-\log p(\text{correcte}) = 4,1974 nats. Les classes de la gramàtica són fam·m, fam·f, animal, menjar, lloc, verb: quan el que toca és una classe sencera, un model perfecte reparteix el 25 % entre les quatre i no pot fer-ho millor.

1 · després de «pare»

La distribució de sortida d'aquesta posició es dibuixa a sota.

Sense entrenar, la distribució és plana i totes les posicions tenen la mateixa pèrdua: log 29 = 3,367 nats. La comprovació de sota ja és certa ara —no depèn de si el model ha après res— però les barres no diuen gran cosa fins que no ha entrenat uns segons.

passos entrenats
0
pèrdua mitjana
4,2163 nats
perplexitat
67,79
posicions supervisades
11 amb 1 forward
un sol forward
1,12 ms
11 forwards de prefix
4,05 ms
La pèrdua de cop és exactament la mitjana de les pèrdues d'una en una

Són dos càlculs diferents: el primer fa un sol forward sobre les 11 posicions i fa la mitjana de les seves entropies creuades; el segon fa 11 forwards, un per cada prefix, i es queda la pèrdua de l'última posició de cadascun. Han de coincidir, i el motiu és la màscara causal: la posició ii del forward sencer ha vist exactament els mateixos tokens que veuria el forward del prefix fins a ii, ni un més.

Posiciócontextha de predirde copd'una en unadiferència
0…elpare3,0394363,0394360
1…paremenja4,1973614,1973610
2…menjael3,3286403,3286400
3…elpa4,4362614,4362610
4…pa.5,4350975,4350970
5….la3,1173713,1173710
6…lamare3,8294023,8294020
7…maremira4,7718614,7718610
8…mirael4,1397544,1397540
9…elgat5,0198785,0198780
10…gat.5,0647075,0647070
mitjana4,2163424994,2163424990

La pitjor diferència posició a posició és 0: zero exacte, perquè els dos càlculs fan literalment les mateixes operacions en el mateix ordre. Si la màscara causal no hi fos, aquesta columna no seria zero: la posició ii del forward sencer hauria vist el futur i prediria millor que el forward del prefix.

I això és el que fa l'entrenament eficient: un forward, L supervisions

Cronometrat en aquesta màquina, ara mateix: un sol forward sobre les 11 posicions ha costat 1,12 ms, i fer els 11 forwards de prefix n'ha costat 4,05 — 3,6× més. El factor creix amb la longitud: amb LL posicions, la feina dels prefixos és d'ordre L/2L/2 vegades la d'un forward sencer.

Una RNN no pot evitar aquesta segona columna: l'estat del pas tt necessita el del t−1t-1, i els passos han d'anar en fila. El Transformer calcula totes les posicions alhora perquè cap d'elles no depèn del resultat d'una altra — només de les entrades de les altres, que ja les té. Aquest és el bescanvi de la taula del fitxer 09: cost quadràtic en longitud a canvi de paral·lelisme total.

La pèrdua d'algunes posicions no pot baixar de log 4 = 1,386 nats per molt que s'entreni: la gramàtica tria quina de les quatre paraules d'una classe posa, i això és imprevisible per construcció. És entropia irreductible, la mateixa del fitxer 04, i és el terra de qualsevol model de llenguatge: una part del text no és predictible i cap arquitectura no ho arreglarà.

7. Implementació mínima però real#

import torch, torch.nn as nn, torch.nn.functional as F, math

class Block(nn.Module):
    def __init__(self, d, n_heads, d_ff):
        super().__init__()
        self.h = n_heads; self.dh = d // n_heads
        self.n1, self.n2 = nn.RMSNorm(d), nn.RMSNorm(d)
        self.qkv = nn.Linear(d, 3*d, bias=False)
        self.proj = nn.Linear(d, d, bias=False)
        self.w_gate = nn.Linear(d, d_ff, bias=False)
        self.w_up   = nn.Linear(d, d_ff, bias=False)
        self.w_down = nn.Linear(d_ff, d, bias=False)

    def attn(self, x, freqs):
        B, L, D = x.shape
        q, k, v = self.qkv(x).split(D, dim=-1)
        q, k, v = (t.view(B, L, self.h, self.dh).transpose(1, 2) for t in (q, k, v))
        q, k = apply_rope(q, freqs), apply_rope(k, freqs)
        # is_causal aplica la màscara; sota el capó fa servir FlashAttention
        o = F.scaled_dot_product_attention(q, k, v, is_causal=True)
        return self.proj(o.transpose(1, 2).reshape(B, L, D))

    def forward(self, x, freqs):
        x = x + self.attn(self.n1(x), freqs)                      # comunicació entre tokens
        h = self.n2(x)
        x = x + self.w_down(F.silu(self.w_gate(h)) * self.w_up(h))  # càlcul per token
        return x

Un GPT que entrena aquí dins

Un Transformer decoder-only sencer, amb RMSNorm, RoPE, SwiGLU i màscara causal, entrenant sobre text en català davant teu. Arribarà a passar el bigrama del fitxer 08?

uniformeunigramabigramatrigrama
  • el Transformer
  • bigrama del fitxer 08
  • trigrama

Mostres generades (temperatura 0,80)

Encara no n'hi ha cap. Se'n pren una cada 100 passos durant l'entrenament, i el botó de dalt en genera una quan vulguis — també ara, abans d'entrenar res, que és la manera de veure d'on parteix.

Els dotze primers caràcters són el context inicial, tret del corpus; la resta els escriu el model. Al principi és soroll; cap al pas 300 ja hi ha paraules amb forma catalana; cap al 2.000, frases.

On van els 202.304 paràmetres d'aquesta configuració
Partparàmetresfracció
Taula d'embeddings (56 × 64)3.5841,8 %
Atenció, 4 capes × 4d²65.53632,4 %
FFN SwiGLU, 4 capes × 3·d·d_ff129.02463,8 %
Normes (γ)5760,3 %
Capa de sortida3.5841,8 %

Avís: això és un entrenament de debò i és llarg. Amb la configuració d'ara —202.304 paràmetres— cada pas costa uns 320 ms (estimats), de manera que 2.000 passos són uns 10 min 40 s. Mentre entrena, la pàgina continua responent —el càlcul va per trossos— i pots aturar-ho quan vulguis sense perdre el que porti après. Deixa aquesta pestanya a la vista: els navegadors alenteixen molt els temporitzadors de les pestanyes de fons i l'entrenament continuaria, però molt més a poc a poc.

Amplada dd

El cost per pas creix amb el quadrat: passar de 32 a 64 el multiplica per quatre.

Capes

El cost hi creix de manera lineal.

Caps HH

No canvia ni el recompte de paràmetres ni el cost: només com es parteix d.

64

Quants caràcters enrere pot mirar cada posició.

4

Finestres per pas. Més gran vol dir un gradient menys sorollós i un pas més car.

3,00·10⁻³

AdamW amb weight decay 0,01. Per sobre de 0,01 la pèrdua es torna inestable.

0,80

Només afecta el text generat, no l'entrenament.

100 passos

Generar 48 caràcters costa un segon llarg amb el model gros: no ho posis massa sovint.

La mateixa llavor dona sempre el mateix resultat.

paràmetres
202.304
passos
0
pèrdua
—
perplexitat
—
bigrama del fitxer 08
2,2967 nats
tokens vistos
0,00
Encara no ha passat el bigrama (2,297 nats)

La fita no se l'inventa aquest widget: surt de trainNgram i evaluateNgram, les funcions del fitxer 08, entrenades i avaluades sobre exactament el mateix text —els primers 12.000 caràcters del corpus— i amb el mateix tokenitzador de caràcters. Totes dues són pèrdues sobre el text d'entrenament, de manera que la comparació és justa en tots dos sentits.

Modelnats per caràcterperplexitatbits per caràcter
uniforme sobre 56 caràcters4,025456,005,807
unigrama2,886117,924,164
bigrama (la fita)2,29679,943,313
trigrama2,12898,413,071
aquest Transformer, 0 passos———

Encara no ha fet cap pas. Prem un dels botons de dalt i mira la corba: a la configuració per defecte, la pèrdua sol creuar la línia del bigrama entre el pas 50 i el 100.

El gradient, contra diferències finites centrades

Això és el que separa «entrena de debò» de «hi ha un bucle que fa baixar un número». Es pren el model tal com està ara, es calcula el gradient analític del backward i es compara amb (L(θi+h)−L(θi−h))/2h\big(\mathcal{L}(\theta_i + h) - \mathcal{L}(\theta_i - h)\big)/2h amb h=10−5h = 10^{-5}, sobre una finestra de 24 caràcters. Hi ha una sonda a cada bloc de paràmetres: si al backward hi faltés un terme —el de RoPE, el de la norma, el de la branca de la porta de SwiGLU— la seva fila ho diria.

Prem el botó: pots fer-ho abans d’entrenar, a mitges o al final, i ha de sortir bé sempre.

Això és el projecte central del curs fet petit: la implementació de la secció 7 sencera, amb el gradient escrit a mà i comprovat. El que li falta respecte d'un model de debò no és arquitectura —la té tota— sinó escala, dades i un tokenitzador de subparaules. La següent passa natural és nanoGPT de Karpathy sobre una GPU: el mateix codi, tres ordres de magnitud més gran.

8. Variants arquitectòniques# sense fórmules

TipusAtencióExemplesÚs
Encoder-onlybidireccionalBERT, RoBERTa, ModernBERTclassificació, embeddings, reranking
Decoder-onlycausalGPT, Llama, Claude, Qwengeneració — el 99% dels LLMs
Encoder-decoderencoder bidireccional + cross-attentionT5, BART, Whispertraducció, veu, tasques seq2seq

Per què va guanyar decoder-only? Simplicitat (una sola pila), objectiu d'entrenament uniforme que aprofita cada token com a supervisió, escalabilitat demostrada, i el fet que qualsevol tasca es pot formular com a generació de text condicionada.

Les tres variants: tot és la forma de la màscara

Encoder-only, decoder-only i encoder-decoder. Toca un token i mira quines posicions se n'assabenten: aquesta és la diferència, i es pot mesurar.

La màscara: quines posicions (columnes) pot mirar cadascuna (files)

Màscara de Decoder-only: 36 de 64 cel·les obertes.
0·el1·gat2·negre3·dorm4·→5·the6·black7·cat
0·el✓·······
1·gat✓✓······
2·negre✓✓✓·····
3·dorm✓✓✓✓····
4·→✓✓✓✓✓···
5·the✓✓✓✓✓✓··
6·black✓✓✓✓✓✓✓·
7·cat✓✓✓✓✓✓✓✓

Els cinc primers tokens fan de font i la resta, de destí. A l'encoder-decoder, les cinc primeres columnes queden obertes per a tothom.

Quant es mouen els logits de cada posició en tocar el token 6

0·el
0 exacte
1·gat
0 exacte
2·negre
0 exacte
3·dorm
0 exacte
4·→
0 exacte
5·the
0 exacte
6·black
2,7719
7·cat
0,2989

Les files que diuen «0 exacte» no són arrodoniments: el token tocat no arriba a aquella posició per cap camí del graf de còmput.

Les tres variants arquitectòniques
TipusAtencióExemplesÚs
Encoder-onlybidireccionalBERT, RoBERTa, ModernBERTclassificació, embeddings, reranking
Decoder-onlycausalGPT, Llama, Claude, Qwengeneració — el 99 % dels LLMs
Encoder-decoderencoder bidireccional + cross-attentionT5, BART, Whispertraducció, veu, tasques seq2seq
Variant

Cada posició només veu el passat i ella mateixa. És l’única cosa que fa el model autoregressiu, i és el que permet supervisar totes les posicions d’un sol forward.

Quin token es toca

Es canvia per un altre token del vocabulari i es torna a fer el forward.

La mateixa llavor dona sempre el mateix resultat.

atenció
causal
cel·les visibles
36 de 64
token tocat
6 · black
canvi màxim abans
0
canvi màxim des d’allà
2,7719
posicions afectades
2 de 8
Amb màscara causal, tocar el futur no mou el passat ni un bit

La mesura és la mateixa per a les tres variants: es canvia el token 6 («black») per un altre, es torna a fer el forward i es mira quant es mouen els logits de cada posició. El que canvia és només la màscara.

Variantcanvi màxim a les posicions anteriorscanvi màxim de la tocada endavantposicions afectades
Encoder-only0,3202,66978 de 8
Decoder-only02,77192 de 8
Encoder-decoder02,81582 de 8

La columna que importa és la primera de números. Amb decoder-only val 0: les posicions anteriors a la tocada no es mouen, i no perquè el canvi sigui petit sinó perquè aquella informació no els arriba per cap camí. Amb encoder-only val 0,3203, i això és el que fa que un BERT no serveixi per generar: quan hagués de predir la posició ii, ja hauria llegit la resposta.

Amb encoder-decoder, la mateixa mesura separa les dues meitats: tocar un token de la font (posicions 0 a 4) mou tot el destí, perquè la font es mira sencera des de tot arreu; tocar un token del destí només mou el que ve després. Prova-ho canviant el token tocat d'una banda a l'altra. Això és, exactament, el que vol dir «cross-attention»: no és un mecanisme nou sinó la mateixa atenció amb una màscara que deixa el prefix sempre obert.

Per què va guanyar decoder-only? Per simplicitat —una sola pila en comptes de dues i un pont entre elles—, per un objectiu d'entrenament uniforme que aprofita cada token com a supervisió, per una escalabilitat demostrada, i perquè qualsevol tasca es pot formular com a generació de text condicionada: classificar és generar l'etiqueta, traduir és generar la traducció després de la font. L'encoder-decoder sobreviu on la font i el destí són de natures diferents, com a Whisper, on l'entrada és àudio.

9. Comptar paràmetres i FLOPs (fes-ho de memòria)# sense fórmules

Per capa, amb MHA i FFN densa:

  • Atenció: 4d24d^2 (Q, K, V, O)
  • FFN amb SwiGLU: 3⋅d⋅dff≈8d23\cdot d\cdot d_{ff} \approx 8d^2 (amb dff=83dd_{ff}=\frac{8}{3}d)
  • Total per capa ≈ 12d212d^2

Model sencer: N≈12 ncapes d2+VdN \approx 12\,n_{capes}\,d^2 + V d (embeddings).

FLOPs d'entrenament: C≈6NDC \approx 6ND (6 = 2 forward + 4 backward, per paràmetre i token). Inferència: ≈2N\approx 2N per token generat. Aquestes dues fórmules et deixen estimar cost i temps de qualsevol entrenament en un sobre.

Exemple: Llama 3 70B entrenat amb 15T tokens → 6×7×1010×1.5×1013≈6.3×10246\times 7\times10^{10}\times1.5\times10^{13} \approx 6.3\times10^{24} FLOPs. Amb 16.000 H100 a ~400 TFLOP/s efectius: ~11 dies. Quadra amb les xifres publicades.

Comptar paràmetres i FLOPs de memòria

12d² per capa, 6ND per entrenar, 2N per token generat. Tres regles que es fan de memòria: comprova-les contra un model comptat de debò i contra l'exemple de Llama 3.

On van els 65,48 G paràmetres

Atenció: 4d² × 80 capes
21,47 G32,8 %
FFN: 3·d·d_ff × 80 capes
42,95 G65,6 %
Normes (γ): 2d × 80 + d
1,32 M0,0 %
Embeddings: V × d
1,05 G1,6 %

L'FFN se'n porta dos terços dels paràmetres de cada capa —8 de 12 d2d^2—, que és el número que hi ha darrere de «l'atenció mou informació i l'FFN emmagatzema coneixement». Baixa el vocabulari o puja les capes i mira com canvia el pes relatiu dels embeddings: als models petits són la meitat del model, i als grans, una engruna.

La regla contra el recompte, a quatre escales
Modeldcapesrecompteregla 12nd² + Vderror
El mini-GPT de la secció 7644198,72 k200,19 k0,74 %
GPT-2 small76812123,55 M123,53 M0,02 %
Llama 3 8B4.096326,97 G6,97 G0,01 %
Llama 3 70B8.1928065,48 G65,48 G0,01 %
Models coneguts

El de l’exemple de FLOPs del text. Aquí en surten 65 mil milions i no 70: el model real fa servir d_ff = 3,5d en comptes de 8d/3 i estalvia per l’altra banda amb GQA. La regla és una estimació a un 10 %, no un recompte — i per a un càlcul de sobre, n’hi ha prou.

8.192
80
128 k
Forma de l'FFN

Les dues sumen 8d² per capa: tres matrius de d×(8d/3) i dues de d×4d donen exactament el mateix. Per això la regla dels 12d² no depèn de quina es faci servir.

15,0 T

Llama 3 es va entrenar amb 15 bilions.

16.000
400 TFLOP/s

Una H100 en bf16 en dona uns 400 de sostinguts amb bona utilització.

paràmetres
65,48 G
la regla 12nd² + Vd
65,48 G
error de la regla
0,002 %
FLOPs d’entrenament
5,89·10²⁴
temps
10,7 dies
sostre de generació
3.055 tok/s
Els paràmetres del mini-GPT, comptats de debò contra la regla

El model de la secció 7 no és una maqueta: té un vector de paràmetres, i es pot mesurar quant fa. Aquí es compara la seva longitud real amb el desglossament peça a peça i amb la regla del text.

Longitud real del vector theta202.304
Suma del desglossament peça a peça202.304
Diferència0
La regla: 12 × 4 × 64² + 56 × 64200.192
Diferència amb la regla2.112 (1,0 %)

El recompte real i el desglossament coincideixen exactament: 0 de diferència. Amb la regla en falten 2.112, i se sap d'on surten: la regla ignora les γ\gamma de les normes (9 vectors de 64), suposa dff=8d/3d_{ff} = 8d/3 exacta quan el model l'arrodoneix a un múltiple de vuit, i compta els embeddings una sola vegada quan aquest model té la capa de sortida separada. A aquesta escala això és un 1 %; a escala de Llama, on el terme 12nd212nd^2 domina de llarg, baixa per sota del mig per cent. Mou els controls fins a Llama 3 8B i mira l'«error de la regla» del readout.

L'exemple del text: Llama 3 70B en ~11 dies

C≈6ND=6×7⋅1010×1,5⋅1013C \approx 6ND = 6 \times 7\cdot10^{10} \times 1{,}5\cdot10^{13} = 6,30·10²⁴ FLOPs. Amb 16.000 H100 a 400 TFLOP/s efectius, la màquina sencera fa 1,6⋅104×4⋅1014=6,4⋅10181{,}6\cdot10^{4}\times4\cdot10^{14} = 6{,}4\cdot10^{18} FLOP/s, de manera que hi caldrien 984.375,00 segons = 11,4 dies. El text diu «~11 dies», i quadra amb les xifres publicades.

El 6 no és arbitrari: són 2 FLOPs per paràmetre i token al forward —una multiplicació i una suma— i 4 més al backward, que calcula dos gradients per capa, el dels pesos i el de l'entrada. La regla no mira l'arquitectura: serveix igual per a un MoE si NN són els paràmetres actius, que és el que el fitxer 13 explota.

Amb la configuració que tens ara: 65,48 G paràmetres i 15,0 T tokens són 5,89·10²⁴ FLOPs, que amb 16.000 GPUs a 400 TFLOP/s són 10,7 dies. Aquestes dues fórmules et deixen estimar el cost de qualsevol entrenament en un sobre, i és exactament el que es fa abans de demanar el pressupost.

La regla de Chinchilla diu que, per a un pressupost de còmput donat, el repartiment òptim és d'uns 20 tokens per paràmetre. Llama 3 70B se'n va molt amunt —214 tokens per paràmetre— perquè l'objectiu ja no era el model més bo per un cost d'entrenament donat sinó el més bo per un cost d'inferència donat: un model petit sobreentrenat surt més barat de servir. El fitxer 16 desenvolupa el bescanvi.

10. Comprova que ho has entès#

0 de 6 resoltes

  1. Explica QKV amb l'analogia de la base de dades i digues què representa cada matriu.
  2. Per què es divideix per dk\sqrt{d_k} i no per dkd_k?
  3. Què passaria si traguessis la màscara causal d'un model de generació? Apaga-la al camp de proves d'atenció i mira la primera fila de la matriu de pesos.

    Objectiu:Apaga la màscara causal al camp de proves de l'atenció i deixa-la apagada.

    Vés al widget ↑causal = per defecte · escala = per defecte
  4. Per què RoPE dona posicionament relatiu tot i aplicar-se de manera absoluta?
  5. Quants paràmetres té un model amb 32 capes, d=4096d=4096 i V=128kV=128k? Fes-ho de memòria amb la regla 12d212d^2 per capa.
    Marge acceptat: 3 %
  6. Quina part del model mou informació entre tokens i quina l'emmagatzema?

11. Recursos#

Marca els que hagis llegit
  • Vaswani et al. (2017), Attention Is All You Need.

  • Karpathy, Let's build GPT: from scratch, in code, spelled out + nanoGPT.

  • Jay Alammar, The Illustrated Transformer.

  • The Annotated Transformer (Harvard NLP).

  • Elhage et al. (2021), A Mathematical Framework for Transformer Circuits (Anthropic) — canvia com penses en l'arquitectura.

  • Su et al. (2021), RoFormer (RoPE).