A 04-03 vam deixar un problema assenyalat amb nom i cognoms: en els models seqüència-a-seqüència, tota la frase d'entrada s'havia de comprimir en un únic vector abans de generar la sortida — el coll d'ampolla que degrada les seqüències llargues, com resumir una ressenya de 300 paraules en una nota adhesiva i traduir des de la nota. Aquesta lliçó presenta la solució, l'atenció, i l'arquitectura que va néixer de portar-la a l'extrem: el Transformer, que des de 2017 va destronar les RNN i és la base de BERT, GPT i els LLMs actuals — tancant l'arc històric que vam obrir a 01-02. Per a TecnoMarket, entendre aquesta peça explica per què la via pràctica per analitzar les seves ressenyes ja no és entrenar LSTMs des de zero, sinó recolzar-se en models de llenguatge preentrenats: el transfer learning de 05-03 aplicat al text.
Contingut
- El coll d'ampolla, revisitat
- L'atenció: mirar tota la seqüència i ponderar
- Consulta, clau i valor: l'analogia del catàleg
- Self-attention pas a pas amb números
- Multi-head: diversos focus alhora
- L'arquitectura Transformer a alt nivell
- Per què va destronar les RNN
- De BERT i GPT als LLMs
- Què significa per a TecnoMarket
- MultiHeadAttention en Keras: classificador de ressenyes
El coll d'ampolla, revisitat
Recorda l'esquema seq2seq de 04-03: un encoder RNN llegeix la frase paraula a paraula i el seu últim estat ocult —un sol vector— és tot el que el decoder rep per produir la sortida. Els problemes:
- Compressió forçosa: tant és si l'entrada té 5 paraules o 300; tot ha de cabre en el mateix vector de mida fixa.
- Biaix de proximitat: allò llegit al final està "fresc" a l'estat; allò del principi s'ha anat diluint pas a pas (parent del vanishing gradient de 02-03, que la LSTM alleuja amb la seva cinta transportadora però no elimina en seqüències llargues).
- Processament seqüencial: per representar la paraula 300 cal haver processat les 299 anteriors, una a una. Res no es pot paral·lelitzar.
La pregunta que va conduir a l'atenció: i si el decoder, en lloc de dependre d'un resum únic, pogués tornar a mirar tota la seqüència d'entrada cada vegada que ho necessita?
L'atenció: mirar tota la seqüència i ponderar
Aquesta és exactament la idea. Amb atenció, el model conserva un vector per cada posició de l'entrada (no només l'últim) i, cada vegada que necessita produir o representar alguna cosa, calcula quant importa cada posició per a allò que està fent ara i construeix una mitjana ponderada.
Intuïtivament: en traduir "no" en una frase, el model posa gairebé tot el pes en la paraula de negació de l'entrada i ignora la resta; en decidir el sentiment de "la bateria és pèssima però la pantalla és excel·lent", pot repartir el seu focus entre "pèssima" i "excel·lent" sense que la distància entre elles importi. Els pesos d'atenció s'aprenen — són el resultat d'entrenar, no regles escrites a mà — i a més són inspeccionables: pots visualitzar a què va atendre el model, un extra d'interpretabilitat que les RNN no oferien.
Consulta, clau i valor: l'analogia del catàleg
La formulació moderna de l'atenció fa servir tres papers: consulta (query, Q), clau (key, K) i valor (value, V). L'analogia natural a TecnoMarket és buscar al seu catàleg:
- Escrius al cercador "cafetera espresso barata" — aquesta és la teva consulta (Q).
- Cada producte del catàleg té una fitxa indexada: títol, categoria, etiquetes — aquesta és la seva clau (K).
- El cercador compara la teva consulta amb totes les claus i assigna a cada producte una puntuació de rellevància.
- El que t'emportes de cada producte no és la seva clau, sinó el seu contingut: preu, descripció, imatge — el seu valor (V).
- El "resultat" és una barreja dominada pels productes més rellevants.
L'atenció fa exactament això amb vectors: la puntuació de rellevància és un producte escalar Q·K (et sona? és la mateixa operació que la similitud cosinus amb què vam comparar embeddings a 03-04 i 04-03 — sense normalitzar), les puntuacions passen per una softmax (02-02) que les converteix en pesos que sumen 1, i la sortida és la suma ponderada dels valors.
A la self-attention (autoatenció), la volta de rosca clau del Transformer, cada paraula d'una frase fa els tres papers alhora: cada paraula genera la seva Q, la seva K i la seva V (mitjançant tres matrius de pesos apreses), llança la seva consulta contra les claus de totes les paraules de la frase —inclosa ella mateixa— i es re-representa com a barreja dels valors. Resultat: la representació de cada paraula passa a incorporar el seu context. La paraula "banc" acaba representada de manera diferent a "banc de peixos" i a "banc online", perquè va atendre veïnes diferents.
Self-attention pas a pas amb números
Vegem-ho amb una frase mínima de tres tokens d'una ressenya: "no funciona bé". Farem servir vectors de joguina de dimensió 2 i ens centrarem en com la paraula "funciona" es re-representa. Suposa que, després d'aplicar les matrius apreses, tenim:
| Token | Q | K | V |
|---|---|---|---|
| no | (1, 0) | (1, 0) | (−1, 0) |
| funciona | (1, 1) | (0, 1) | (0, 1) |
| bé | (0, 1) | (0, 1) | (1, 1) |
Pas 1 — puntuacions: la consulta de "funciona", Q = (1, 1), es multiplica (producte escalar) amb la clau de cada token:
- amb "no": (1, 1)·(1, 0) = 1
- amb "funciona": (1, 1)·(0, 1) = 1
- amb "bé": (1, 1)·(0, 1) = 1
(A la pràctica es divideix per l'arrel de la dimensió per estabilitzar — amb dim 2, entre √2 ≈ 1.41: totes queden en ≈ 0.71.)
Pas 2 — softmax: les tres puntuacions són iguals, així que la softmax reparteix el pes per igual: (0.33, 0.33, 0.33). Si la puntuació amb "no" hagués estat 2 en lloc d'1 (després d'escalar, 1.41 davant de 0.71), la softmax donaria ≈ (0.50, 0.25, 0.25): la negació dominaria la barreja — així és com "funciona" s'assabenta que està negada.
Pas 3 — barreja de valors: la nova representació de "funciona" és la suma ponderada dels V:
0.33·(−1, 0) + 0.33·(0, 1) + 0.33·(1, 1) = (0, 0.67)
Això és tot el mecanisme: producte escalar → softmax → mitjana ponderada. Tres operacions que ja coneixies per separat, i que es calculen per a totes les paraules alhora com a productes de matrius — d'aquí la seva eficiència en GPU. I fixa't en el detall crucial: la distància entre paraules no apareix enlloc. "no" influeix sobre "funciona" igual si és al costat que a 200 paraules: el coll d'ampolla i el biaix de proximitat han desaparegut.
Multi-head: diversos focus alhora
Una sola atenció barreja tota la rellevància en un únic repartiment de pesos. Però en una frase hi conviuen relacions diferents: la sintaxi ("funciona" es relaciona amb el seu subjecte), la negació ("no" modifica "funciona"), la correferència ("la" es refereix a "bateria")... La solució del Transformer és l'atenció multi-cap (multi-head attention): executar en paral·lel diverses atencions independents —cadascuna amb les seves pròpies matrius Q/K/V, cadascuna un "focus" diferent— i concatenar-ne els resultats.
L'analogia amb les CNN és directa: igual que a 03-02 cada filtre d'una capa convolucional s'especialitzava en un patró (vores verticals, certa textura), cada cap d'atenció tendeix a especialitzar-se en un tipus de relació. Vuit o dotze focus mirant la mateixa frase des d'angles diferents.
L'arquitectura Transformer a alt nivell
L'article "Attention Is All You Need" (2017) va fer l'aposta radical que el seu títol anuncia: eliminar la recurrència per complet i construir-ho tot amb atenció. L'arquitectura, a vista d'ocell:
flowchart TB
T[Tokens de la frase] --> E[Embeddings<br/>un per token]
P[Codificacio posicional<br/>marca l'ORDRE] --> S
E --> S((suma))
S --> B1[Bloc Transformer 1]
B1 --> B2[Bloc Transformer 2]
B2 --> BN[... bloc N]
BN --> OUT[Representacions contextuals<br/>una per token]
subgraph Bloc[Cada bloc Transformer]
A[Self-attention multi-cap<br/>cada token mira a tots] --> FF[Xarxa feed-forward<br/>processa cada posicio]
end
Les peces, i per què gairebé totes et sonen:
- Embeddings: la mateixa capa de 04-03 — cada token es converteix en un vector dens.
- Codificació posicional: en eliminar la recurrència es perd la noció d'ordre (l'atenció tracta la frase com un conjunt: "gos mossega home" = "home mossega gos"). La solució és sumar a cada embedding un vector que en codifica la posició, retornant l'ordre a la xarxa.
- Blocs apilats (6, 12, 96...): cadascun combina self-attention multi-cap (comunicació entre posicions) amb una petita xarxa feed-forward (processament de cada posició per separat), més connexions residuals —les skip connections de ResNet que vam veure a 03-03, l'"autopista del gradient" imprescindible per apilar tants blocs— i normalització de capa (cosina germana de la BatchNormalization de 05-04).
- Sense recurrència: res no espera res. Totes les posicions es processen en paral·lel, i aquesta és la propietat que va canviar la història: permet entrenar amb volums de text i mides de model que una RNN, condemnada a llegir paraula a paraula, mai no podria digerir.
Per què va destronar les RNN
| Aspecte | RNN / LSTM (mòdul 4) | Transformer |
|---|---|---|
| Processament de la seqüència | Seqüencial: token a token | Paral·lel: tots els tokens alhora |
| Dependències llargues | Es degraden amb la distància (malgrat la cinta transportadora de la LSTM) | Distància irrellevant: qualsevol token atén qualsevol altre en un pas |
| Coll d'ampolla | Sí: l'estat ocult ho resumeix tot | No: una representació per token, sempre accessible |
| Velocitat d'entrenament en GPU | Limitada (no paral·lelitza en el temps) | Excel·lent (productes de matrius) |
| Escalabilitat a models/dades enormes | Pobra | La raó de l'era dels LLMs |
| Cost amb seqüències molt llargues | Lineal en longitud | Quadràtic (cada token amb cada token): el seu taló d'Aquil·les |
| Interpretabilitat | Estat ocult opac | Pesos d'atenció visualitzables |
| Continua tenint sentit fer-la servir? | Sí: sèries temporals, dispositius modestos, seqüències molt llargues amb pocs recursos | Estàndard en NLP i en expansió (visió, àudio) |
La LSTM del teu classificador de ressenyes no era dolenta; és que el Transformer menja millor amb els mateixos recursos, i sobretot escala allà on la RNN s'encalla.
De BERT i GPT als LLMs
Sobre l'arquitectura Transformer es van construir les dues famílies que defineixen el NLP modern. Totes dues exploten la mateixa idea que el transfer learning de 05-03: preentrenar caríssim una vegada, adaptar barat moltes vegades.
- BERT (2018) — comprensió. Es preentrena tapant paraules a l'atzar en milers de milions de frases i demanant a la xarxa que les endevini mirant el context en totes dues direccions (recorda
Bidirectionalde 04-02, elevat al cub). El resultat és un model que "entén" l'idioma i que s'afina en hores per a sentiment, classificació, extracció d'entitats o cerca semàntica. És la base congelada de MobileNetV2, però per a text. - GPT — generació. Es preentrena amb la tasca més simple imaginable: predir la paraula següent, una vegada i una altra, sobre quantitats enormes de text, atenent només el context anterior. D'aquesta tasca humil, a prou escala, n'emergeix la capacitat de redactar, resumir, traduir i conversar.
- Els LLMs actuals (GPT-4 i successors, Claude, Llama, Gemini...) són, en l'essencial, la mateixa recepta a escala brutal — més blocs, més caps, més dades, més GPU — més tècniques d'afinat posterior per seguir instruccions. Aquí es tanca l'arc que vam obrir a la història de 01-02: del perceptró a AlexNet va ser mig segle; d'"Attention Is All You Need" als LLMs conversacionals, un lustre. Les tendències i el que ve després ho tractem a 08-03.
Què significa per a TecnoMarket
La conseqüència pràctica és la moralitat de 05-03 aplicada al llenguatge: TecnoMarket no ha d'entrenar models de llenguatge des de zero. El seu full de ruta raonable per a les ressenyes:
- Curt termini: mantenir el classificador LSTM de 04-03 allà on ja funciona (és barat i està en producció amb el seu llindar de confiança).
- Pas següent: substituir-lo per un model tipus BERT preentrenat en català, afinat amb les ressenyes etiquetades de TecnoMarket — mateixes dades, diversos punts més d'accuracy, i millor maneig de negacions i frases llargues ("no diria que sigui dolenta, però...").
- Més enllà: fer servir LLMs via API per a tasques generatives — resumir les 400 ressenyes d'un producte en tres frases per a la fitxa, redactar respostes esborrany per a atenció al client (amb revisió humana: el patró de cua de revisió de 03-04, una vegada més).
MultiHeadAttention en Keras: classificador de ressenyes
Keras porta l'atenció multi-cap com a capa (layers.MultiHeadAttention). Per tocar el mecanisme amb les mans, construïm un mini-classificador de sentiment que substitueix la LSTM de 04-03 per un bloc de self-attention:
from tensorflow import keras
from tensorflow.keras import layers
VOCABULARI = 10000 # tokens diferents, com a 04-03
LONGITUD = 200 # ressenyes truncades/reomplertes a 200 tokens
DIM_EMB = 64
entrades = keras.Input(shape=(LONGITUD,)) # ids de tokens
# 1. Embeddings de tokens (04-03) + embeddings de POSICIO (apresos)
emb_tokens = layers.Embedding(VOCABULARI, DIM_EMB)(entrades)
posicions = keras.ops.arange(LONGITUD) # [0, 1, ..., 199]
emb_pos = layers.Embedding(LONGITUD, DIM_EMB)(posicions)
x = emb_tokens + emb_pos # sense aixo, l'atencio ignoraria l'ORDRE
# 2. Self-attention multi-cap: la frase s'aten A SI MATEIXA
# (query=x, value=x, key=x -> per aixo es "self")
atencio = layers.MultiHeadAttention(
num_heads=4, # 4 focus en paral.lel
key_dim=16, # dimensio de Q/K per cap (4 x 16 = 64)
)(query=x, value=x, key=x)
# 3. Connexio residual + normalitzacio: la recepta del bloc Transformer
# (l'autopista del gradient de 03-03, en versio NLP)
x = layers.LayerNormalization()(x + atencio)
# 4. D'una representacio PER TOKEN a un vector per ressenya, i a classificar
x = layers.GlobalAveragePooling1D()(x) # mitjana dels 200 vectors
x = layers.Dropout(0.3)(x) # regularitzacio (05-04)
sortides = layers.Dense(1, activation="sigmoid")(x) # sentiment +/-
model = keras.Model(entrades, sortides)
model.compile(optimizer="adam", loss="binary_crossentropy",
metrics=["accuracy"])
model.summary()Els punts fins:
query=x, value=x, key=x: els tres papers surten de la mateixa seqüència — això és exactament la self-attention. (En un seq2seq amb atenció creuada, la query vindria del decoder i claus/valors de l'encoder.)- Embeddings de posició sumats: la versió apresa de la codificació posicional. Comenta aquesta línia i veuràs caure l'accuracy: sense posició, "no funciona bé" i "funciona bé, no" serien indistingibles.
- Residual + LayerNormalization (
x + atencio): el mateix patró del bloc residual que vas implementar a 03-03, que permet apilar blocs sense ofegar el gradient. Per a un Transformer "de veritat" hi afegiries la petita xarxa feed-forward i repetiries el bloc N vegades. - Entrenat sobre IMDB (el dataset de 04-03), aquest model assoleix xifres semblants a la LSTM (~86-88 %) entrenant més ràpid per època en GPU. L'avantatge decisiu del Transformer no es veu a aquesta escala de joguina — apareix en escalar a models i corpus enormes, que és just el que els preentrenats ja van fer per tu.
No entrenarem aquí un Transformer complet (ni falta que fa: la lliçó de 05-03 és que aquest preentrenament ja està pagat); l'objectiu era que el mecanisme deixi de ser una caixa negra.
Errors Comuns i Consells
- Oblidar la codificació posicional. L'error conceptual número u: l'atenció per si sola és cega a l'ordre. Si el teu model amb
MultiHeadAttentionrendeix sospitosament malament, comprova que sumes embeddings de posició. - Creure que l'atenció "entén". Els pesos d'atenció són similituds apreses útils per a la tasca, no comprensió humana. Visualitzar-los ajuda a depurar, però sobreinterpretar-los porta a conclusions errònies.
- Descartar les RNN per moda. Per a la sèrie de vendes de 04-04, amb una seqüència univariant i maquinari modest, la LSTM continua sent una elecció excel·lent. El cost quadràtic de l'atenció amb seqüències llargues és real.
- Confondre els papers Q/K/V. Regla mnemotècnica de catàleg: la consulta és el que busques, la clau és l'índex contra el qual es compara, el valor és el que t'emportes. En self-attention els tres surten del mateix lloc, però amb matrius de projecció diferents.
- Entrenar un Transformer des de zero amb poques dades. Amb els ~25 000 exemples d'IMDB, un Transformer gran sobreajusta (aplica el que has après a 05-04). La via correcta amb poques dades és partir d'un model preentrenat — transfer learning, 05-03.
Exercicis
Exercici 1. Explica, fent servir el coll d'ampolla de 04-03 i la taula RNN vs. Transformer, per què una LSTM tendeix a fallar en la ressenya "Al principi vaig pensar que era el millor altaveu que havia tingut, amb un so espectacular i un disseny preciós, però al cap de dues setmanes va deixar de funcionar" i per què la self-attention ho té més fàcil.
Exercici 2. Amb la taula Q/K/V de l'exemple numèric, calcula la nova representació del token "no" (consulta Q = (1, 0)): puntuacions amb les tres claus, softmax (pots aproximar; sense escalat, per simplificar) i barreja de valors. Els valors eren: no → (−1, 0), funciona → (0, 1), bé → (1, 1).
Exercici 3. L'equip de TecnoMarket debat dues propostes: (A) entrenar des de zero un Transformer amb les seves 30 000 ressenyes etiquetades; (B) afinar un BERT en català preentrenat amb aquestes mateixes ressenyes. Argumenta quina és preferible connectant-ho amb dues lliçons concretes d'aquest mòdul.
Solucions
Solució 1.
La ressenya és llarga i la seva primera meitat és intensament positiva ("el millor", "espectacular", "preciós"); el gir decisiu ("va deixar de funcionar") arriba al final, però el matís que el governa ("però al cap de dues setmanes") exigeix relacionar el final amb tot l'anterior. En una LSTM, la informació viatja pas a pas per l'estat ocult: el sentiment positiu del principi arriba diluït al final (biaix de proximitat) i tot ha de cabre en un únic vector (coll d'ampolla), així que la barreja de senyals contradictoris a molta distància és el seu pitjor escenari. A la self-attention, el token "però" i "va deixar de funcionar" poden atendre directament, amb pes alt i en un sol pas, els elogis del principi — la distància no penalitza — i la representació final captura el contrast complet: la clau per classificar-la correctament com a negativa.
Solució 2.
Puntuacions de Q_no = (1, 0) contra cada clau:
- amb K_no = (1, 0): 1·1 + 0·0 = 1
- amb K_funciona = (0, 1): 1·0 + 0·1 = 0
- amb K_bé = (0, 1): 0
Softmax d'(1, 0, 0): e¹ ≈ 2.72 i e⁰ = 1 dues vegades → pesos ≈ (2.72, 1, 1)/4.72 ≈ (0.58, 0.21, 0.21).
Barreja de valors: 0.58·(−1, 0) + 0.21·(0, 1) + 0.21·(1, 1) = (−0.58 + 0.21, 0.21 + 0.21) ≈ (−0.37, 0.42). El token "no" es re-representa atenent sobretot a si mateix, però incorporant una mica de context de "funciona" i "bé" — amb matrius entrenades de veritat, aquests repartiments s'ajusten al que la tasca necessiti.
Solució 3.
És preferible la B, per dues connexions directes amb aquest mòdul:
- 05-03 (transfer learning): preentrenar un model de llenguatge exigeix corpus de milers de milions de paraules i GPU industrial — el "luxe" que algú ja va pagar. Afinar un BERT preentrenat és la mateixa jugada que MobileNetV2 amb les fotos de producte: coneixement genèric gratis, adaptació específica barata. 30 000 ressenyes són excel·lents per afinar, però ridícules per preentrenar.
- 05-04 (regularització): un Transformer amb prou capacitat per aprendre l'idioma des de zero té una variància enorme; amb 30 000 exemples memoritzaria el conjunt d'entrenament (forat train/val gegant) per molta regularització que s'apili. El model preentrenat ja porta els "trets de l'idioma" i només ajusta l'última milla, amb molt menys risc de sobreajust.
(A més, l'opció B arriba abans a producció i amb millors mètriques — l'enginyeria també compta.)
Conclusió
El coll d'ampolla de 04-03 tenia solució: en lloc de comprimir la seqüència en un vector, l'atenció ho conserva tot i pondera què mirar a cada moment — un mecanisme de tres passos (Q·K, softmax, barreja de V) construït amb peces que ja dominaves. El Transformer va portar la idea al límit: només atenció, sense recurrència, amb codificació posicional per no perdre l'ordre i blocs apilats sobre connexions residuals — i el seu paral·lelisme va desfermar l'escala que va produir BERT, GPT i els LLMs, tancant la història que vam començar a explicar a 01-02. Per a TecnoMarket, la lliçó operativa és que l'anàlisi de les seves ressenyes passa per afinar models preentrenats, no per competir-hi.
Amb això acaba el mòdul de tècniques avançades: ja saps generar (GAN), comprimir i detectar anomalies (autoencoders), reutilitzar coneixement (transfer learning), generalitzar (regularització) i atendre (Transformers). Al mòdul 6 baixem al taller: TensorFlow i PyTorch a fons, com triar framework, i com guardar, carregar i desplegar els models que ja saps construir.
Curs de Deep Learning
Mòdul 1: Introducció al Deep Learning
- Què és el Deep Learning?
- Història i evolució del Deep Learning
- Aplicacions del Deep Learning
- Conceptes bàsics de xarxes neuronals
- Preparació de l'entorn de treball
Mòdul 2: Fonaments de Xarxes Neuronals
- Perceptró i Perceptró Multicapa
- Funció d'activació
- Propagació cap endavant i cap enrere
- Optimització i funció de pèrdua
- La teva primera xarxa neuronal completa
Mòdul 3: Xarxes Neuronals Convolucionals (CNN)
- Introducció a les CNN
- Capes convolucionals i de pooling
- Arquitectures populars de CNN
- Aplicacions de CNN en reconeixement d'imatges
Mòdul 4: Xarxes Neuronals Recurrents (RNN)
- Introducció a les RNN
- LSTM i GRU
- Aplicacions de RNN en processament del llenguatge natural
- Seqüències i sèries temporals
Mòdul 5: Tècniques Avançades en Deep Learning
- Xarxes Generatives Adversàries (GAN)
- Autoencoders
- Transfer Learning
- Regularització i tècniques de millora
- Mecanismes d'atenció i Transformers
Mòdul 6: Eines i Frameworks
- Introducció a TensorFlow
- Introducció a PyTorch
- Comparació de frameworks
- Entorns de desenvolupament i recursos addicionals
- Desar, carregar i desplegar models
Mòdul 7: Projectes Pràctics
- Classificació d'imatges amb CNN
- Generació de text amb RNN
- Detecció d'anomalies amb Autoencoders
- Creació d'una GAN per a generació d'imatges
- Fine-tuning d'un model preentrenat
