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:
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?
| Token | logit sencer | logit amb l'ablació | diferència | probabilitat |
|---|---|---|---|---|
| el | -0,174 | -0,174 | — | 13,1 % |
| gat | -0,765 | -0,765 | — | 7,2 % |
| negre | -0,381 | -0,381 | — | 10,6 % |
| dorm | 0,590 | 0,590 | — | 28,1 % |
| perquè | 0,289 | 0,289 | — | 20,8 % |
| menja | 0,259 | 0,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.
Cada bloc són dos sublayers, i cadascun escriu una vegada al flux.
Hi ha una cinta per token. Aquesta és la que estàs mirant.
La mateixa llavor dona sempre el mateix resultat.
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
No és una metàfora que funcioni «més o menys»: és una igualtat. Com que cada sublayer entra al flux per una suma — i — 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.
| Component | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| embedding | -0,492 | -0,230 | 0,012 | -1,783 | -0,583 | 0,486 |
| + Σ contribucions | -1,220414 | 0,729486 | 0,219030 | -1,943146 | 0,153295 | 0,100500 |
| estat final real | -1,220414 | 0,729486 | 0,219030 | -1,943146 | 0,153295 | 0,100500 |
| diferència | 0 | 0 | 0 | 0 | 0 | 0 |
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.
2. Embeddings d'entrada# sense fórmules
és una taula de consulta entrenable. Res més: la fila és el vector inicial del token .
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:
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 , que són 24 números entrenables i res més.
La geometria: cosinus entre les files de les paraules amb classe
| pare | avi | fill | germà | mare | àvia | filla | germana | gat | gos | ocell | cavall | pa | peix | carn | fruita | casa | escola | plaça | ciutat | menja | mira | espera | porta | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| pare | 1,00 | 0,25 | 0,11 | · | · | · | 0,12 | · | · | 0,16 | · | · | 0,31 | 0,08 | 0,11 | · | 0,13 | · | · | · | 0,04 | 0,03 | · | · |
| avi | 0,25 | 1,00 | · | 0,14 | 0,14 | · | 0,11 | · | · | · | · | · | 0,20 | · | 0,06 | · | 0,06 | 0,03 | · | · | 0,05 | · | 0,10 | · |
| fill | 0,11 | · | 1,00 | · | 0,07 | · | 0,10 | · | · | · | · | 0,22 | 0,01 | · | · | 0,09 | · | · | · | · | · | 0,03 | 0,05 | · |
| germà | · | 0,14 | · | 1,00 | · | 0,15 | · | · | · | 0,12 | · | · | 0,07 | · | · | 0,06 | · | 0,19 | · | 0,12 | · | · | · | · |
| mare | · | 0,14 | 0,07 | · | 1,00 | 0,23 | · | · | · | 0,07 | 0,28 | 0,08 | · | 0,09 | 0,26 | · | · | · | 0,23 | · | 0,27 | 0,30 | 0,41 | · |
| àvia | · | · | · | 0,15 | 0,23 | 1,00 | · | 0,64 | · | 0,08 | 0,19 | 0,08 | · | · | · | · | · | 0,10 | 0,32 | · | · | 0,15 | · | · |
| filla | 0,12 | 0,11 | 0,10 | · | · | · | 1,00 | · | · | 0,08 | · | · | 0,23 | · | 0,14 | · | · | 0,01 | · | 0,46 | · | 0,05 | · | 0,29 |
| germana | · | · | · | · | · | 0,64 | · | 1,00 | 0,04 | 0,05 | · | 0,26 | · | · | 0,06 | · | 0,05 | 0,24 | 0,34 | · | · | 0,10 | · | 0,07 |
| gat | · | · | · | · | · | · | · | 0,04 | 1,00 | · | 0,36 | · | 0,18 | · | · | 0,07 | 0,41 | 0,22 | 0,23 | 0,11 | · | · | 0,21 | 0,25 |
| gos | 0,16 | · | · | 0,12 | 0,07 | 0,08 | 0,08 | 0,05 | · | 1,00 | · | 0,26 | 0,20 | · | 0,14 | 0,16 | · | · | 0,10 | · | · | 0,06 | · | 0,27 |
| ocell | · | · | · | · | 0,28 | 0,19 | · | · | 0,36 | · | 1,00 | · | · | · | · | · | 0,02 | · | 0,29 | 0,15 | · | · | 0,28 | 0,03 |
| cavall | · | · | 0,22 | · | 0,08 | 0,08 | · | 0,26 | · | 0,26 | · | 1,00 | 0,31 | 0,33 | 0,45 | 0,34 | 0,15 | · | 0,41 | · | · | · | · | · |
| pa | 0,31 | 0,20 | 0,01 | 0,07 | · | · | 0,23 | · | 0,18 | 0,20 | · | 0,31 | 1,00 | · | · | 0,01 | 0,30 | 0,01 | · | 0,15 | · | · | · | 0,48 |
| peix | 0,08 | · | · | · | 0,09 | · | · | · | · | · | · | 0,33 | · | 1,00 | 0,31 | 0,34 | 0,30 | · | 0,42 | · | 0,20 | 0,22 | 0,36 | · |
| carn | 0,11 | 0,06 | · | · | 0,26 | · | 0,14 | 0,06 | · | 0,14 | · | 0,45 | · | 0,31 | 1,00 | · | · | 0,23 | 0,14 | 0,03 | · | 0,32 | 0,28 | 0,12 |
| fruita | · | · | 0,09 | 0,06 | · | · | · | · | 0,07 | 0,16 | · | 0,34 | 0,01 | 0,34 | · | 1,00 | 0,24 | · | · | 0,10 | 0,38 | 0,26 | 0,06 | · |
| casa | 0,13 | 0,06 | · | · | · | · | · | 0,05 | 0,41 | · | 0,02 | 0,15 | 0,30 | 0,30 | · | 0,24 | 1,00 | · | 0,33 | 0,07 | · | · | 0,12 | · |
| escola | · | 0,03 | · | 0,19 | · | 0,10 | 0,01 | 0,24 | 0,22 | · | · | · | 0,01 | · | 0,23 | · | · | 1,00 | · | · | · | · | · | · |
| plaça | · | · | · | · | 0,23 | 0,32 | · | 0,34 | 0,23 | 0,10 | 0,29 | 0,41 | · | 0,42 | 0,14 | · | 0,33 | · | 1,00 | · | · | · | 0,28 | 0,14 |
| ciutat | · | · | · | 0,12 | · | · | 0,46 | · | 0,11 | · | 0,15 | · | 0,15 | · | 0,03 | 0,10 | 0,07 | · | · | 1,00 | · | · | · | 0,28 |
| menja | 0,04 | 0,05 | · | · | 0,27 | · | · | · | · | · | · | · | · | 0,20 | · | 0,38 | · | · | · | · | 1,00 | 0,50 | 0,21 | · |
| mira | 0,03 | · | 0,03 | · | 0,30 | 0,15 | 0,05 | 0,10 | · | 0,06 | · | · | · | 0,22 | 0,32 | 0,26 | · | · | · | · | 0,50 | 1,00 | 0,09 | · |
| espera | · | 0,10 | 0,05 | · | 0,41 | · | · | · | 0,21 | · | 0,28 | · | · | 0,36 | 0,28 | 0,06 | 0,12 | · | 0,28 | · | 0,21 | 0,09 | 1,00 | 0,06 |
| porta | · | · | · | · | · | · | 0,29 | 0,07 | 0,25 | 0,27 | 0,03 | · | 0,48 | · | 0,12 | · | · | · | 0,14 | 0,28 | · | · | 0,06 | 1,00 |
Les classes van en blocs de quatre: si s'agrupen, han de sortir quadrats a la diagonal.
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 %)
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.
| Component | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| one-hot × E | 1,055637 | -1,671534 | 0,514071 | 0,625732 | 0,061811 | 0,290022 | -0,110272 | 1,203104 |
| E[5] directa | 1,055637 | -1,671534 | 0,514071 | 0,625732 | 0,061811 | 0,290022 | -0,110272 | 1,203104 |
| iguals bit a bit | sí | sí | sí | sí | sí | sí | sí | sí |
Amb 24 dimensions i components independents, el cosinus entre dues files té mitjana zero i desviació = 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.
| Classe | cosinus mitjà de dins | Paraules |
|---|---|---|
| família, masculí | -0,035 | pare, avi, fill, germà |
| família, femení | 0,014 | mare, àvia, filla, germana |
| animals | -0,029 | gat, gos, ocell, cavall |
| menjar | 0,078 | pa, peix, carn, fruita |
| llocs | -0,058 | casa, escola, plaça, ciutat |
| verbs | 0,067 | menja, mira, espera, porta |
| entre classes diferents | -0,000 | la fita amb què comparar |
Ara mateix la separació és 0,006, del mateix ordre que el soroll : no hi ha cap agrupació, perquè encara no ha passat res. Prem «Entrena» i torna a mirar aquesta taula.
3. Self-attention: el mecanisme# sense fórmules
3.1 Q, K, V
De cada vector de token en projectes tres coses:
3.2 La fórmula
Pas a pas:
- : similitud de cada token amb cada token (producte escalar!).
- : evita que la softmax se saturi (vegeu 03, secció 3).
- : la màscara causal, amb a les posicions futures → cada token només veu el passat. Això és el que fa el model autoregressiu.
- softmax per files: pesos que sumen 1.
- : mitjana ponderada dels values.
3.3 Multi-head
En lloc d'una atenció amb dimensions, en fem de dimensions en paral·lel i concatenem:
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.
| 0·el | 1·gat | 2·negre | 3·dorm | 4·perquè | 5·el | 6·gat | 7·menja | |
|---|---|---|---|---|---|---|---|---|
| 0·el | 1,00 | · | · | · | · | · | · | · |
| 1·gat | 0,20 | 0,80 | · | · | · | · | · | · |
| 2·negre | 0,29 | 0,14 | 0,56 | · | · | · | · | · |
| 3·dorm | 0,23 | 0,26 | 0,05 | 0,45 | · | · | · | · |
| 4·perquè | 0,41 | 0,19 | 0,07 | 0,15 | 0,18 | · | · | · |
| 5·el | 0,26 | 0,06 | 0,14 | 0,08 | 0,08 | 0,39 | · | · |
| 6·gat | · | 0,14 | 0,37 | 0,10 | 0,19 | 0,04 | 0,15 | · |
| 7·menja | 0,20 | 0,17 | 0,08 | 0,11 | 0,11 | 0,19 | 0,10 | 0,04 |
| 0·el | 1·gat | 2·negre | 3·dorm | 4·perquè | 5·el | 6·gat | 7·menja | |
|---|---|---|---|---|---|---|---|---|
| 0·el | 1,00 | · | · | · | · | · | · | · |
| 1·gat | 0,72 | 0,28 | · | · | · | · | · | · |
| 2·negre | 0,70 | 0,25 | 0,05 | · | · | · | · | · |
| 3·dorm | 0,13 | 0,17 | 0,23 | 0,47 | · | · | · | · |
| 4·perquè | 0,24 | 0,08 | 0,14 | 0,13 | 0,41 | · | · | · |
| 5·el | 0,40 | 0,24 | 0,08 | 0,15 | · | 0,12 | · | · |
| 6·gat | 0,18 | 0,05 | 0,12 | 0,14 | 0,05 | 0,33 | 0,13 | · |
| 7·menja | 0,16 | 0,27 | 0,04 | 0,25 | 0,04 | 0,05 | 0,19 | · |
| 0·el | 1·gat | 2·negre | 3·dorm | 4·perquè | 5·el | 6·gat | 7·menja | |
|---|---|---|---|---|---|---|---|---|
| 0·el | 1,00 | · | · | · | · | · | · | · |
| 1·gat | 0,39 | 0,61 | · | · | · | · | · | · |
| 2·negre | 0,32 | 0,26 | 0,42 | · | · | · | · | · |
| 3·dorm | 0,45 | 0,31 | 0,18 | 0,06 | · | · | · | · |
| 4·perquè | 0,13 | 0,20 | 0,33 | 0,16 | 0,18 | · | · | · |
| 5·el | 0,04 | 0,07 | 0,07 | 0,68 | 0,13 | 0,03 | · | · |
| 6·gat | 0,07 | 0,11 | 0,17 | 0,22 | 0,23 | 0,08 | 0,13 | · |
| 7·menja | 0,17 | 0,13 | 0,12 | 0,12 | 0,16 | 0,20 | 0,03 | 0,06 |
| 0·el | 1·gat | 2·negre | 3·dorm | 4·perquè | 5·el | 6·gat | 7·menja | |
|---|---|---|---|---|---|---|---|---|
| 0·el | 1,00 | · | · | · | · | · | · | · |
| 1·gat | 0,30 | 0,70 | · | · | · | · | · | · |
| 2·negre | 0,25 | 0,29 | 0,46 | · | · | · | · | · |
| 3·dorm | 0,04 | 0,52 | 0,31 | 0,13 | · | · | · | · |
| 4·perquè | 0,45 | 0,09 | 0,20 | · | 0,25 | · | · | · |
| 5·el | 0,05 | 0,14 | 0,12 | 0,57 | 0,02 | 0,09 | · | · |
| 6·gat | 0,03 | 0,13 | 0,04 | 0,16 | 0,53 | 0,04 | 0,08 | · |
| 7·menja | 0,09 | 0,16 | 0,24 | 0,04 | 0,06 | 0,13 | 0,24 | 0,06 |
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»)
Amb H = 4, cada cap treballa amb dₕ = d/H = 8 dimensions. El total, H·dₕ, continua sent 32.
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⁻¹⁶
multiplica una concatenació, i un producte per una concatenació es parteix en blocs: , on són les files de 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 total | comp. 0 | comp. 1 | comp. 2 |
|---|---|---|---|---|---|
| cap 1 | 1,0556 | 29 % | -0,0759 | -0,1104 | 0,1168 |
| cap 2 | 0,9860 | 27 % | 0,0127 | 0,1716 | 0,0258 |
| cap 3 | 0,7437 | 20 % | 0,1244 | 0,0107 | 0,0628 |
| cap 4 | 0,8542 | 23 % | -0,1572 | 0,0347 | 0,2475 |
| suma dels caps | — | — | -0,096052 | 0,106561 | 0,452937 |
| sortida real de l'MHA | — | — | -0,096052 | 0,106561 | 0,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 la taula té una sola fila i la descomposició no diu res — és el cas on no es pot atribuir res a ningú.
Les quatre matrius de l'atenció són passi el que passi: , i projecten a dimensions en total, i en torna. Els caps només diuen com es talla aquell en trossos a l'hora de fer els productes escalars.
| H | dₕ | paràmetres d'atenció | paràmetres del bloc | ‖θ‖ |
|---|---|---|---|---|
| 1 | 32 | 4.096 | 12.608 | 24,830270530 |
| 2 | 16 | 4.096 | 12.608 | 24,830270530 |
| 4 | 8 | 4.096 | 12.608 | 24,830270530 |
| 8 | 4 | 4.096 | 12.608 | 24,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.
3.4 Cost
- Temps: per l'atenció + per les projeccions.
- Memòria (ingènua): per la matriu de scores. FlashAttention ho redueix a sense materialitzar mai la matriu sencera (tiling + recomputació), amb la mateixa sortida exacta. Vegeu 14.
- Amb petit domina ; quan arriba a l'ordre de domina (comptant les constants, contra , es creuen a ). 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».
| el | gat | negre | dorm | perquè | el | gat | menja | |
|---|---|---|---|---|---|---|---|---|
| el | 1,00 | · | · | · | · | · | · | · |
| gat | 0,16 | 0,84 | · | · | · | · | · | · |
| negre | 0,14 | 0,14 | 0,72 | · | · | · | · | · |
| dorm | 0,12 | 0,12 | 0,12 | 0,63 | · | · | · | · |
| perquè | 0,11 | 0,11 | 0,11 | 0,11 | 0,56 | · | · | · |
| el | 0,36 | 0,07 | 0,07 | 0,07 | 0,07 | 0,36 | · | · |
| gat | 0,07 | 0,34 | 0,07 | 0,07 | 0,07 | 0,07 | 0,34 | · |
| menja | 0,08 | 0,08 | 0,08 | 0,08 | 0,08 | 0,08 | 0,08 | 0,42 |
Files: la consulta. Columnes: la clau.
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.
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é.
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
El fitxer 03 ho va mesurar amb vectors gaussians solts. Aquí els logits surten de projectar els vectors de token per i , que és el que passa a dins d'un Transformer, i la predicció no canvia: si les components de i tenen variància 1, el producte escalar de termes independents té variància . La desviació creix com , i per això es divideix per i no per .
| dₖ | Var mesurada | predicció | error | Var després de /√dₖ |
|---|---|---|---|---|
| 2 | 2,12 | 2 | 6,0 % | 1,060 |
| 4 | 4,16 | 4 | 4,1 % | 1,041 |
| 8 | 8,44 | 8 | 5,6 % | 1,056 |
| 16 | 16,93 | 16 | 5,8 % | 1,058 |
| 32 | 34,13 | 32 | 6,7 % | 1,067 |
| 64 | 64,28 | 64 | 0,4 % | 1,004 |
| 128 | 127,18 | 128 | 0,6 % | 0,994 |
L'última columna és la que importa: surt 1 sigui quina sigui l'amplada del cap. Sense l'escalat, passar de a multiplicaria la desviació dels logits per vuit, i la softmax d'un model ample arrencaria saturada.
Amb les constants comptades i no amagades dins d'una : les puntuacions i la mitjana ponderada fan multiplicacions, i les quatre projeccions (Q, K, V i O) en fan . Els dos termes s'igualen a , que amb vol dir 8.192 tokens de context.
- total
- atenció, 2L²d
- projeccions, 4Ld²
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.
4. La xarxa feed-forward (FFN/MLP)# sense fórmules
S'aplica independentment a cada posició. Conté aproximadament dos terços dels paràmetres del model.
En models moderns, és SwiGLU i hi ha tres matrius (, , ).
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»
En taronja, les dues direccions que formen la clau del detector: .
El que l'FFN hi suma:
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.
Porta CIUTAT i FRANÇA: és exactament el que la clau busca.
La clau de la Torre Eiffel val √2 ≈ 1,41. Puja el llindar per sobre i el fet deixa d'escriure's.
Com d'abrupta és la resposta al voltant del llindar.
La norma de la columna de W₂: quant s'escriu al flux residual amb activació 1.
On s'escriu el fet. Posa-la a FRANÇA i el detector s'autoalimenta: la sortida reforça mitja clau.
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
La sortida de l'FFN és : 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: .
| Flux residual | preactivació | activació | fet escrit | predicció a·‖v‖ | diferència | altres neurones |
|---|---|---|---|---|---|---|
| la Torre Eiffel | 0,857 | 0,8569 | 2,1421 | 2,1421 | 0 | 0 |
| el Louvre | 0,008 | 0,0083 | 0,0208 | 0,0208 | 0 | 0 |
| el Colosseu | -1,972 | 0,0000 | 0,0000 | 0,0000 | 0 | 0 |
| el gat negre | -4,800 | 0,0000 | 0,0000 | 0,0000 | 0 | 0 |
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 i s'activa amb una clau identificable de , 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.
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ètode | Com | Notes |
|---|---|---|
| Sinusoïdal (2017) | suma sinus/cosinus de diferents freqüències | sense paràmetres, extrapola malament |
| Apresa absoluta (BERT, GPT-2) | una taula per posició | no extrapola més enllà del context entrenat |
| ALiBi | biaix lineal negatiu a l'atenció segons distància | extrapola bé, simple |
| RoPE | rota els parells de dimensions de Q i K segons la posició | l'estàndard actual |
RoPE en detall
Divideix el vector en parells i aplica una rotació 2D d'angle on és la posició i :
La "base" (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
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ó: gira un angle
Un sol punt per cada diferència, perquè totes les parelles amb la mateixa diferència donen el mateix número. Mou i mantenint la diferència i el cercle marcat no es mou.
| Parella i | θᵢ | longitud d'ona 2π/θᵢ | què codifica |
|---|---|---|---|
| 0 | 1,0000 | 6,3 | token a token: distingeix veïns immediats |
| 1 | 0,1000 | 62,8 | distàncies intermèdies |
| 2 | 0,0100 | 628,3 | distàncies intermèdies |
| 3 | 0,0010 | 6,3 k | distà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.
10.000 és la del paper original. Pujar-la és el que fan NTK-aware scaling i YaRN per estendre el context sense reentrenar.
RoPE treballa amb parelles: hi ha dₕ/2 rotacions, cadascuna amb el seu angle.
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
El context és , 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ó.
| Token | sense RoPE, original | sense RoPE, permutada | diferència | amb RoPE, diferència |
|---|---|---|---|---|
| el | -0,993877 | -0,993877 | 2,22·10⁻¹⁶ | 0,319 |
| gos | -1,266789 | -1,266789 | 0 | -0,018 |
| mossega | 0,546750 | 0,546750 | 2,22·10⁻¹⁶ | 0,040 |
| l’home | 0,353330 | 0,353330 | 0 | -0,073 |
| avui | 0,799563 | 0,799563 | 0 | -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.
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 . Si la promesa és certa, dins de cada grup tots els valors han de ser el mateix número.
| m − n | parelles | qₘ · kₙ | dispersió dins del grup |
|---|---|---|---|
| -3 | 22 | -1,788737 | 8,88·10⁻¹⁶ |
| -2 | 23 | -2,140136 | 8,88·10⁻¹⁶ |
| -1 | 24 | -2,626959 | 1,33·10⁻¹⁵ |
| 0 | 25 | -2,790110 | 1,33·10⁻¹⁵ |
| 1 | 24 | -2,470975 | 1,33·10⁻¹⁵ |
| 2 | 23 | -1,957226 | 8,88·10⁻¹⁶ |
| 3 | 22 | -1,718291 | 1,11·10⁻¹⁵ |
| 4 | 21 | -1,973686 | 1,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 que els calibra.
6. La sortida# sense fórmules
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.
La distribució de la posició 1:
La pèrdua d'aquesta posició és = 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.
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
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ó del forward sencer ha vist exactament els mateixos tokens que veuria el forward del prefix fins a , ni un més.
| Posició | context | ha de predir | de cop | d'una en una | diferència |
|---|---|---|---|---|---|
| 0 | …el | pare | 3,039436 | 3,039436 | 0 |
| 1 | …pare | menja | 4,197361 | 4,197361 | 0 |
| 2 | …menja | el | 3,328640 | 3,328640 | 0 |
| 3 | …el | pa | 4,436261 | 4,436261 | 0 |
| 4 | …pa | . | 5,435097 | 5,435097 | 0 |
| 5 | …. | la | 3,117371 | 3,117371 | 0 |
| 6 | …la | mare | 3,829402 | 3,829402 | 0 |
| 7 | …mare | mira | 4,771861 | 4,771861 | 0 |
| 8 | …mira | el | 4,139754 | 4,139754 | 0 |
| 9 | …el | gat | 5,019878 | 5,019878 | 0 |
| 10 | …gat | . | 5,064707 | 5,064707 | 0 |
| mitjana | 4,216342499 | 4,216342499 | 0 | ||
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ó del forward sencer hauria vist el futur i prediria millor que el forward del prefix.
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 posicions, la feina dels prefixos és d'ordre vegades la d'un forward sencer.
Una RNN no pot evitar aquesta segona columna: l'estat del pas necessita el del , 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.
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?
- 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.
| Part | paràmetres | fracció |
|---|---|---|
| Taula d'embeddings (56 × 64) | 3.584 | 1,8 % |
| Atenció, 4 capes × 4d² | 65.536 | 32,4 % |
| FFN SwiGLU, 4 capes × 3·d·d_ff | 129.024 | 63,8 % |
| Normes (γ) | 576 | 0,3 % |
| Capa de sortida | 3.584 | 1,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.
El cost per pas creix amb el quadrat: passar de 32 a 64 el multiplica per quatre.
El cost hi creix de manera lineal.
No canvia ni el recompte de paràmetres ni el cost: només com es parteix d.
Quants caràcters enrere pot mirar cada posició.
Finestres per pas. Més gran vol dir un gradient menys sorollós i un pas més car.
AdamW amb weight decay 0,01. Per sobre de 0,01 la pèrdua es torna inestable.
Només afecta el text generat, no l'entrenament.
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
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.
| Model | nats per caràcter | perplexitat | bits per caràcter |
|---|---|---|---|
| uniforme sobre 56 caràcters | 4,0254 | 56,00 | 5,807 |
| unigrama | 2,8861 | 17,92 | 4,164 |
| bigrama (la fita) | 2,2967 | 9,94 | 3,313 |
| trigrama | 2,1289 | 8,41 | 3,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.
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 amb , 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.
8. Variants arquitectòniques# sense fórmules
| Tipus | Atenció | Exemples | Ús |
|---|---|---|---|
| Encoder-only | bidireccional | BERT, RoBERTa, ModernBERT | classificació, embeddings, reranking |
| Decoder-only | causal | GPT, Llama, Claude, Qwen | generació — el 99% dels LLMs |
| Encoder-decoder | encoder bidireccional + cross-attention | T5, BART, Whisper | traducció, 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)
| 0·el | 1·gat | 2·negre | 3·dorm | 4·→ | 5·the | 6·black | 7·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
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.
| Tipus | Atenció | Exemples | Ús |
|---|---|---|---|
| Encoder-only | bidireccional | BERT, RoBERTa, ModernBERT | classificació, embeddings, reranking |
| Decoder-only | causal | GPT, Llama, Claude, Qwen | generació — el 99 % dels LLMs |
| Encoder-decoder | encoder bidireccional + cross-attention | T5, BART, Whisper | traducció, veu, tasques seq2seq |
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.
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
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.
| Variant | canvi màxim a les posicions anteriors | canvi màxim de la tocada endavant | posicions afectades |
|---|---|---|---|
| Encoder-only | 0,320 | 2,6697 | 8 de 8 |
| Decoder-only | 0 | 2,7719 | 2 de 8 |
| Encoder-decoder | 0 | 2,8158 | 2 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ó , 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.
9. Comptar paràmetres i FLOPs (fes-ho de memòria)# sense fórmules
Per capa, amb MHA i FFN densa:
- Atenció: (Q, K, V, O)
- FFN amb SwiGLU: (amb )
- Total per capa ≈
Model sencer: (embeddings).
FLOPs d'entrenament: (6 = 2 forward + 4 backward, per paràmetre i token). Inferència: 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 → 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
L'FFN se'n porta dos terços dels paràmetres de cada capa —8 de 12 —, 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.
| Model | d | capes | recompte | regla 12nd² + Vd | error |
|---|---|---|---|---|---|
| El mini-GPT de la secció 7 | 64 | 4 | 198,72 k | 200,19 k | 0,74 % |
| GPT-2 small | 768 | 12 | 123,55 M | 123,53 M | 0,02 % |
| Llama 3 8B | 4.096 | 32 | 6,97 G | 6,97 G | 0,01 % |
| Llama 3 70B | 8.192 | 80 | 65,48 G | 65,48 G | 0,01 % |
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.
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.
Llama 3 es va entrenar amb 15 bilions.
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
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 theta | 202.304 |
| Suma del desglossament peça a peça | 202.304 |
| Diferència | 0 |
| La regla: 12 × 4 × 64² + 56 × 64 | 200.192 |
| Diferència amb la regla | 2.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 de les normes (9 vectors de 64), suposa 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 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.
= 6,30·10²⁴ FLOPs. Amb 16.000 H100 a 400 TFLOP/s efectius, la màquina sencera fa 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 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.
10. Comprova que ho has entès#
0 de 6 resoltes
- Explica QKV amb l'analogia de la base de dades i digues què representa cada matriu.
- Per què es divideix per i no per ?
- 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 - Per què RoPE dona posicionament relatiu tot i aplicar-se de manera absoluta?
- Quants paràmetres té un model amb 32 capes, i ? Fes-ho de memòria amb la regla per capa.Marge acceptat: 3 %
- Quina part del model mou informació entre tokens i quina l'emmagatzema?
11. Recursos#
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).