06 · Xarxes neuronals i backpropagation
Idea central: una xarxa neuronal és una composició de funcions diferenciables amb paràmetres. L'única màgia és que, amb prou capes i dades, la composició troba representacions útils sense que ningú les dissenyi.
1. De la neurona a l'MLP# sense fórmules
Una neurona: — una projecció lineal seguida d'una no-linealitat.
Una capa: amb .
Un MLP (perceptró multicapa) apila capes:
Camp de proves d'MLP
Quantes capes i quanta amplada calen per doblegar la frontera? I què queda si li treus la no-linealitat?
El mapa és la probabilitat de la classe taronja; la línia gruixuda és p = 0,5 i les fines, 0,25 i 0,75. Els punts plens són d'entrenament i els buits, de test.
El conjunt no lineal de manual: dues mitges circumferències encaixades.
La mateixa llavor dona sempre el mateix resultat.
114 paràmetres en total
Substitueix l’activació per la identitat. Mira què li passa a la frontera.
- pas
- 0
- pèrdua del lot
- 0,6931
- encerts train
- 50,6 %
- encerts test
- 48,5 %
- paràmetres
- 114
- neurones mortes
- 0 %
Es mesura el jacobià de la diferència de logits per diferències centrades en dos punts allunyats del pla. Si la xarxa fos afí, hauria de ser exactament el mateix als dos.
| a (−1,2, −1,2) | [1,8211, 0,6741] |
| a (1,2, 1,2) | [-1,9343, 0,1072] |
| diferència relativa | 1,956 |
Els dos jacobians difereixen en 1,956. Cada regió del pla té el seu propi model lineal, i és la costura entre regions el que doblega la frontera. Amb ReLU, una xarxa d'aquesta mida parteix el pla en desenes de trossos.
Teorema d'aproximació universal: una xarxa amb una capa oculta prou ampla pot aproximar qualsevol funció contínua sobre un compacte. És un resultat d'existència, no de practicitat: no diu res sobre quantes neurones calen (poden ser exponencials) ni si l'optimització les trobarà. La profunditat és eficient allà on l'amplada és exponencialment cara — per això fem deep learning.
2. Funcions d'activació# sense fórmules
| Funció | Fórmula | Notes |
|---|---|---|
| Sigmoid | satura, gradients minúsculs, gairebé abandonada excepte com a porta | |
| Tanh | centrada en 0, encara satura; usada en LSTM | |
| ReLU | simple, ràpida, gradient 1 o 0; pot "morir" | |
| Leaky/PReLU | evita neurones mortes | |
| GELU | suau; estàndard a BERT/GPT-2/3 | |
| SiLU/Swish | suau; base de SwiGLU | |
| SwiGLU | l'estàndard actual als LLMs |
Galeria d'activacions
On s'apaga la derivada de cada activació, i quantes neurones et deixa mortes pel camí?
- f(x)
- f′(x)
- zona apagada (f′ < 0.01)
Puja-la i mira com creix la fracció de preactivacions en zona saturada.
Un biaix negatiu empeny les preactivacions cap al costat mort de ReLU.
La mateixa llavor dona sempre el mateix resultat.
- derivada màxima
- 1,000
- f′(0)
- 0,000
- saturació
- per l’esquerra
- preactivacions apagades
- 50,2 %
- neurones mortes
- 1 %
La corba taronja no és una aproximació: és la fórmula tancada de f′. Contrastada contra la diferència centrada (h = 10⁻⁶) en 400 punts de l'interval, la diferència màxima és 1,40·10⁻¹⁰ (saltant el punt de ruptura, on la derivada no existeix).
Amb ReLU, una capa pot multiplicar el gradient per 1,000 com a màxim. Per això les activacions modernes tenen derivada màxima 1: cada capa deixa passar el gradient sencer en la seva millor zona.
Per què SwiGLU? És una gated linear unit: una branca produeix el senyal i l'altra una porta multiplicativa que decideix quant en passa. Empíricament millora la pèrdua a igualtat de paràmetres. Com que afegeix una tercera matriu, es compensa reduint la dimensió oculta a (per això veus dimensions estranyes com 11008 per a ). Noah Shazeer ho va resumir memorablement dient que la seva efectivitat s'explica per la providència divina — és a dir: funciona i no sabem ben bé per què.
3. Backpropagation derivat# sense fórmules
Considera una xarxa de dues capes amb pèrdua :
Enrere:
Patró general: el gradient d'una matriu de pesos = (senyal d'error que arriba) × (activació d'entrada)ᵀ. Ho reconeixeràs a totes les derivacions del camp.
# Backprop a mà, sense frameworks (NumPy)
z1 = X @ W1 + b1; a1 = np.maximum(0, z1)
z2 = a1 @ W2 + b2; p = softmax(z2)
loss = -np.log(p[range(n), y]).mean()
d2 = (p - onehot) / n # (n, out)
dW2 = a1.T @ d2; db2 = d2.sum(0)
d1 = (d2 @ W2.T) * (z1 > 0) # derivada de ReLU
dW1 = X.T @ d1; db1 = d1.sum(0)
Backprop matricial
Quina forma té cada tensor i d'on surt cada gradient quan les derivades són matrius?
Enrere · Gradient de W₁
Formes: (4×1)·(1×3) → (4×3)
El mateix producte exterior d’abans. L’entrada fa d’activació de la capa zero.
Llavor dels pesos inicials.
- pèrdua L
- 0,6259
- p
- [0,535, 0,465]
- ‖∂L/∂W₁‖
- 0,2173
- ‖∂L/∂W₂‖
- 0,6136
- paràmetres
- 26
Cada entrada de i de s'ha pertorbat per separat (h = 10⁻⁵) i s'ha mesurat com canvia la pèrdua. La diferència màxima entre les 20 derivades analítiques i les numèriques és 8,25·10⁻¹², i l'error relatiu conjunt 1,04·10⁻¹¹.
Els productes exteriors δ₂a₁ᵀ i δ₁xᵀ no són una regla mnemotècnica: donen exactament el mateix que mesurar el canvi de la pèrdua entrada per entrada. La diferència que veus és l'error del mètode numèric, d'ordre h².
Autodiferenciació
Els frameworks construeixen un graf computacional i recorren les operacions cap enrere aplicant les regles locals. Tres detalls que has de saber:
detach()/stop_gradienttalla el flux (ho usaràs en RLHF, destil·lació, EMA).- Gradient checkpointing: no guardes activacions, les recalcules → ~30% més de temps, molta menys memòria.
- VJP (vector-Jacobian product): els frameworks mai materialitzen jacobians; calculen directament.
4. El problema dels gradients (i les tres solucions)# sense fórmules
En xarxes profundes, el gradient es multiplica per molts jacobians. Si els valors propis són <1, s'esvaeix; si són >1, explota.
Les tres invencions que van fer possible el deep learning profund:
- Connexions residuals (He et al., 2015): . El gradient té una "autopista" () que arriba intacte a les capes inicials. Sense residuals no hi hauria Transformers de 100 capes.
- Normalització (Batch/Layer/RMSNorm): manté les activacions en un rang estable.
- Inicialització adequada + activacions no saturants.
Propagació de gradients en profunditat
Què li queda al gradient quan arriba a la primera capa de 24? I si hi poses una autopista?
- ‖δ‖ per capa (escala logarítmica)
24 neurones per capa
y = x + F(x). Mira què li passa al pendent de la recta.
La mateixa llavor dona sempre el mateix resultat.
- capes
- 24
- ‖δ‖ a la primera capa
- 5,20·10⁻¹⁷
- ‖δ‖ a l’última
- 0,038
- ràtio primera/última
- 1,35·10⁻¹⁵
- factor per capa
- 0,2257
- diagnòstic
- esvaït
S'agafa un sol bloc amb aquesta mateixa configuració, es pertorba la seva entrada en una direcció unitària i es mira com es mou la sortida. Si , la resposta ha de ser : la hi arriba intacta.
| ‖resposta‖ | 0,19115 |
| ‖resposta − v‖ (la part de F) | 0,98386 |
| cos(resposta, v) | 0,1793 |
Sense residual, la resposta té norma 0,1911: no hi ha cap 1 garantit, només el que deixi passar el jacobià del bloc. Multiplicat per 24 capes, dona la ràtio de 1,35·10⁻¹⁵ que veus a dalt. Activa les residuals i torna a mirar aquesta taula.
A més: gradient clipping () és pràctica estàndard en LLMs, típicament amb .
5. Inicialització# sense fórmules
L'objectiu és mantenir la variància de les activacions i dels gradients constant al llarg de les capes.
- Xavier/Glorot (per a tanh/sigmoid): .
- He/Kaiming (per a ReLU): — compensa que ReLU mata la meitat del senyal.
- En LLMs: normal amb (herència de GPT-2) i sovint escalat de les capes de sortida dels blocs residuals per , perquè el flux residual no creixi sense control amb la profunditat.
Inicialització i variància
Com han de començar els pesos perquè el senyal ni s'apagui ni exploti en deu capes?
- variància de les activacions
- norma del gradient
Compensa que ReLU anul·la la meitat del senyal: per això el 2 al numerador i no l’1.
σ dels pesos: 0,177
La mateixa llavor dona sempre el mateix resultat.
- σ dels pesos
- 0,177
- Var(a) a la capa 1
- 2,546
- Var(a) a la capa 10
- 4,875
- factor per capa
- 1,0748
- trencament de simetria
- 0,308
Amb ReLU, cada capa multiplica la variància per : el de la suma de 64 termes independents, dividit per dos perquè ReLU n'anul·la la meitat.
| factor previst | 1,0000 |
| factor mesurat | 1,0748 |
| desviació relativa | 0,075 |
El factor és 1: això és exactament el que He / Kaiming busca. Amb 10 capes, la variància del final és la mateixa que la del principi, i per això el gradient hi pot tornar sense apagar-se.
6. Per què funciona el deep learning? (l'honesta)# sense fórmules
No tenim una teoria completa. El que sí que sabem:
- Representacions jeràrquiques: les capes inicials aprenen característiques generals, les finals específiques. Verificable en visió; més difús però real en llenguatge.
- Biaix implícit de SGD: entre totes les solucions que ajusten l'entrenament, SGD tendeix a trobar-ne de "simples" (norma baixa, marge gran), cosa que generalitza.
- Sobreparametrització ajuda: contra la intuïció clàssica, més paràmetres faciliten l'optimització (el paisatge es torna més benigne) i sovint milloren el test (double descent).
- La lottery ticket hypothesis: dins d'una xarxa gran hi ha subxarxes petites que, amb la seva inicialització original, entrenen igual de bé.
Bitllet de loteria
Si podes el 80 % dels pesos, la subxarxa que queda torna a entrenar igual de bé? I depèn de la inicialització que li donis?
- Densa (192 pesos)
- Podada, init original
- Podada, init nova
En queden 38 de 192.
La mateixa llavor dona sempre el mateix resultat.
Cada repetició són tres entrenaments més. Puja-ho si la diferència et sembla petita.
- densa · test
- 99,1 %
- init original · test
- 99,1 %
- init nova · test
- 96,3 %
- avantatge del bitllet
- +2,8 ± 2,8 punts
- pesos vius
- 38 / 192
- entrenaments fets
- 9
| Condició | Pèrdua final | Train | Test | Rang entre llavors |
|---|---|---|---|---|
| Densa (192 pesos) | 0,0001 | 100,0 % | 99,1 % | 2,8 |
| Podada, init original | 0,0055 | 100,0 % | 99,1 % | 2,8 |
| Podada, init nova | 0,0898 | 96,8 % | 96,3 % | 8,3 |
La comparació que compta és aparellada: les dues condicions comparteixen llavor, conjunt i màscara, de manera que la diferència es mesura llavor a llavor (+8,3, +0,0, +0,0 punts). És el mateix argument del test aparellat del fitxer 03.
La diferència mitjana és de 2,8 punts i l’error estàndard, de 2,8: no arriba a dues desviacions. A aquesta escala, l’experiment no distingeix les dues inicialitzacions. Això no refuta la hipòtesi del bitllet de loteria: diu que aquest experiment no té prou potència per decidir-la, que és exactament el que passa amb bona part del que s’ha publicat sobre poda.
7. Comprova que ho has entès#
0 de 6 resoltes
- Per què un MLP sense activacions és equivalent a una capa lineal?
- Deriva per a una xarxa de dues capes. Quina de les quatre expressions és la correcta?
- Quina és la propietat matemàtica exacta de les connexions residuals que salva els gradients?
- Per què la inicialització He usa i no ? Amb ReLU i , per quin factor es multiplica la variància de les activacions a cada capa si fas servir ?Marge acceptat: ± 0,020
- Què és el gradient checkpointing i quin compromís fa?
- Fes esvair un gradient i després arregla-ho. Configura el widget de propagació en profunditat perquè la primera capa gairebé no rebi res, i activa-hi les connexions residuals.
Objectiu:Puja les capes a 32 o més amb l'activació sigmoid i mira la ràtio entre la primera i l'última. Després activa les connexions residuals i torna a mirar-la.
Vés al widget ↑capes = per defecte · residual = per defecte
8. Recursos#
Karpathy, Neural Networks: Zero to Hero (sèrie completa de vídeos + notebooks).
Nielsen, Neural Networks and Deep Learning (gratuït, molt clar).
He et al. (2015), Deep Residual Learning; He et al. (2015), Delving Deep into Rectifiers (init).
Shazeer (2020), GLU Variants Improve Transformer.