Salta al contingut
Entendre els LLMs
Bloc 2fonaments4 h
IntuïtiuMatemàtic

Abans d'això: Càlcul i optimització, Fonaments de machine learning

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: a=σ(w⊤x+b)a = \sigma(\mathbf{w}^\top\mathbf{x}+b) — una projecció lineal seguida d'una no-linealitat.

Una capa: h=σ(Wx+b)\mathbf{h} = \sigma(\mathbf{W}\mathbf{x}+\mathbf{b}) amb W∈Rm×n\mathbf{W}\in\mathbb{R}^{m\times n}.

Un MLP (perceptró multicapa) apila capes:

h(1)=σ(W(1)x+b(1)),…,y^=W(L)h(L−1)+b(L)\mathbf{h}^{(1)} = \sigma(\mathbf{W}^{(1)}\mathbf{x}+\mathbf{b}^{(1)}),\quad \dots,\quad \hat{\mathbf{y}} = \mathbf{W}^{(L)}\mathbf{h}^{(L-1)}+\mathbf{b}^{(L)}

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.

0,12

La mateixa llavor dona sempre el mateix resultat.

2
8

114 paràmetres en total

0,050
Optimitzador

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 %
La no-linealitat fa que el model no sigui el mateix a tot arreu

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 relativa1,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.

El teorema d'aproximació universal diu que amb una sola capa oculta prou ampla n'hi ha prou. Prova-ho: posa una capa i puja l'amplada fins a separar les espirals, i després compara-ho amb dues capes estretes. El teorema és cert i alhora enganyós — diu que la solució existeix, no que l'optimització la trobi ni que hi càpiga a la memòria.

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órmulaNotes
Sigmoid1/(1+e−x)1/(1+e^{-x})satura, gradients minúsculs, gairebé abandonada excepte com a porta
Tanhtanh⁡(x)\tanh(x)centrada en 0, encara satura; usada en LSTM
ReLUmax⁡(0,x)\max(0,x)simple, ràpida, gradient 1 o 0; pot "morir"
Leaky/PReLUmax⁡(αx,x)\max(\alpha x, x)evita neurones mortes
GELUx Φ(x)x\,\Phi(x)suau; estàndard a BERT/GPT-2/3
SiLU/Swishx σ(x)x\,\sigma(x)suau; base de SwiGLU
SwiGLU(W1x⊙σ(Wgx))W2(\mathbf{W}_1\mathbf{x}\odot\sigma(\mathbf{W}_g\mathbf{x}))\mathbf{W}_2l'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)

f(x)=max⁡(0,x)f(x) = \max(0, x)

Funció
1,50

Puja-la i mira com creix la fracció de preactivacions en zona saturada.

0,00

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 derivada dibuixada és la derivada

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.

Gradient exactament 1 o exactament 0. Barata i sense saturació per la dreta, però una neurona que cau al costat negatiu per a tot el conjunt ja no en surt mai.

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 23⋅4d\tfrac{2}{3}\cdot 4d (per això veus dimensions estranyes com 11008 per a d=4096d=4096). 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 LL:

z1=W1x+b1,a1=σ(z1),z2=W2a1+b2,L=ℓ(z2,y)\mathbf{z}_1 = \mathbf{W}_1\mathbf{x}+\mathbf{b}_1,\quad \mathbf{a}_1=\sigma(\mathbf{z}_1),\quad \mathbf{z}_2=\mathbf{W}_2\mathbf{a}_1+\mathbf{b}_2,\quad L=\ell(\mathbf{z}_2,y)

Enrere:

δ2=∂L/∂z2(=p−y  per a softmax+CE)∂L/∂W2=δ2a1⊤,∂L/∂b2=δ2δ1=(W2⊤δ2)⊙σ′(z1)∂L/∂W1=δ1x⊤\begin{aligned} \boldsymbol{\delta}_2 &= \partial L/\partial \mathbf{z}_2 \quad (= \mathbf{p}-\mathbf{y}\;\text{per a softmax+CE}) \\ \partial L/\partial\mathbf{W}_2 &= \boldsymbol{\delta}_2\mathbf{a}_1^\top, \qquad \partial L/\partial\mathbf{b}_2 = \boldsymbol{\delta}_2 \\ \boldsymbol{\delta}_1 &= (\mathbf{W}_2^\top\boldsymbol{\delta}_2)\odot\sigma'(\mathbf{z}_1) \\ \partial L/\partial\mathbf{W}_1 &= \boldsymbol{\delta}_1\mathbf{x}^\top \end{aligned}

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₁

∂L/∂W1=δ1x⊤\partial L/\partial\mathbf{W}_1 = \boldsymbol{\delta}_1\mathbf{x}^\top

Formes: (4×1)·(1×3) → (4×3)

El mateix producte exterior d’abans. L’entrada fa d’activació de la capa zero.

x\mathbf{x}3×1
0,80
-0,50
1,20
W1\mathbf{W}_14×3
-0,11
0,81
-0,91
1,19
-0,19
-0,26
0,30
-0,03
-0,70
0,38
-0,11
0,18
z1\mathbf{z}_14×1
-1,58
0,73
-0,59
0,58
a1\mathbf{a}_14×1
0,00
0,73
0,00
0,58
W2\mathbf{W}_22×4
0,01
-0,36
0,72
-0,67
0,35
-0,31
-0,82
-0,97
z2\mathbf{z}_22×1
-0,65
-0,79
p\mathbf{p}2×1
0,53
0,47
δ2\boldsymbol{\delta}_22×1
-0,47
0,47
∂L/∂W2\partial L/\partial\mathbf{W}_22×4
0,00
-0,34
0,00
-0,27
0,00
0,34
0,00
0,27
δ1\boldsymbol{\delta}_14×1
0,00
0,02
-0,00
-0,14
∂L/∂W1\partial L/\partial\mathbf{W}_14×3
0,00
0,00
0,00
0,02
-0,01
0,03
0,00
0,00
0,00
-0,11
0,07
-0,17
Entrada x
Classe correcta

Llavor dels pesos inicials.

Pas 7 de 7
pèrdua L
0,6259
p
[0,535, 0,465]
‖∂L/∂W₁‖
0,2173
‖∂L/∂W₂‖
0,6136
paràmetres
26
Les 20 derivades contra diferències finites

Cada entrada de W1\mathbf{W}_1 i de W2\mathbf{W}_2 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².

El patró és sempre el mateix: el gradient d'una matriu de pesos és el senyal d'error que hi arriba multiplicat per l'activació que hi entrava, transposada. Amb un lot de n exemples, aquest producte exterior passa a ser un producte de matrius i els gradients se sumen: δᵀA en comptes de δaᵀ.

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_gradient talla 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 J⊤v\mathbf{J}^\top\mathbf{v} 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:

  1. Connexions residuals (He et al., 2015): y=x+F(x)\mathbf{y}=\mathbf{x}+F(\mathbf{x}). El gradient té una "autopista" (∂y/∂x=I+∂F/∂x\partial\mathbf{y}/\partial\mathbf{x} = \mathbf{I} + \partial F/\partial\mathbf{x}) que arriba intacte a les capes inicials. Sense residuals no hi hauria Transformers de 100 capes.
  2. Normalització (Batch/Layer/RMSNorm): manté les activacions en un rang estable.
  3. 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

24 neurones per capa

Activació

y = x + F(x). Mira què li passa al pendent de la recta.

Normalització

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
La propietat exacta de les connexions residuals, mesurada

S'agafa un sol bloc amb aquesta mateixa configuració, es pertorba la seva entrada en una direcció unitària v\mathbf{v} i es mira com es mou la sortida. Si y=x+F(x)\mathbf{y}=\mathbf{x}+F(\mathbf{x}), la resposta ha de ser v+JFv\mathbf{v} + \mathbf{J}_F\mathbf{v}: la v\mathbf{v} 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.

Amb sigmoid i 24 capes, el gradient que arriba a la primera capa és desenes d'ordres de magnitud més petit que el de l'última: aquella capa no aprèn res, i cap learning rate no ho arregla. Les residuals no fan el gradient més gran, fan que no es multipliqui per res: aquesta és tota la diferència entre poder apilar sis capes i poder-ne apilar cent.

A més: gradient clipping (g←g⋅min⁡(1,c/∥g∥)\mathbf{g}\leftarrow \mathbf{g}\cdot\min(1, c/\|\mathbf{g}\|)) és pràctica estàndard en LLMs, típicament amb c=1.0c=1.0.


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): Var(W)=2nin+nout\text{Var}(W)=\frac{2}{n_{in}+n_{out}}.
  • He/Kaiming (per a ReLU): Var(W)=2nin\text{Var}(W)=\frac{2}{n_{in}} — compensa que ReLU mata la meitat del senyal.
  • En LLMs: normal amb σ=0.02\sigma=0.02 (herència de GPT-2) i sovint escalat de les capes de sortida dels blocs residuals per 1/2Ncapes1/\sqrt{2N_{capes}}, 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.

10
64

σ dels pesos: 0,177

Activació

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
La fórmula contra la mesura

Amb ReLU, cada capa multiplica la variància per ninσ2/2n_{in}\sigma^2/2: el ninσ2n_{in}\sigma^2 de la suma de 64 termes independents, dividit per dos perquè ReLU n'anul·la la meitat.

factor previst1,0000
factor mesurat1,0748
desviació relativa0,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.

Prova σ = 0,02 amb amplada 64 i amb amplada 8. Amb 64, √(2/64) = 0,177 i el 0,02 de GPT-2 hi queda nou vegades curt; a les amplades reals d'un LLM (768 en amunt) el 0,02 està molt més a prop del que toca. Una constant que funciona a una escala pot ser una mala idea a una altra.

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
80 %

En queden 38 de 192.

La mateixa llavor dona sempre el mateix resultat.

3

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
La diferència no es distingeix del soroll entre llavors
CondicióPèrdua finalTrainTestRang entre llavors
Densa (192 pesos)0,0001100,0 %99,1 %2,8
Podada, init original0,0055100,0 %99,1 %2,8
Podada, init nova0,089896,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.

La hipòtesi original diu que dins d'una xarxa gran hi ha subxarxes que, amb la seva inicialització original, entrenen igual de bé que la xarxa sencera. El resultat es replica bé en xarxes petites i es complica en grans, on cal 'rebobinar' a un pas primerenc en comptes de tornar a la inicialització. És la mena de resultat que sobreviu amb matisos, i el matís és la part interessant.

7. Comprova que ho has entès#

0 de 6 resoltes

  1. Per què un MLP sense activacions és equivalent a una capa lineal?
  2. Deriva ∂L/∂W1\partial L/\partial \mathbf{W}_1 per a una xarxa de dues capes. Quina de les quatre expressions és la correcta?
  3. Quina és la propietat matemàtica exacta de les connexions residuals que salva els gradients?
  4. Per què la inicialització He usa 2/nin2/n_{in} i no 1/nin1/n_{in}? Amb ReLU i nin=256n_{in}=256, per quin factor es multiplica la variància de les activacions a cada capa si fas servir σ2=1/nin\sigma^2 = 1/n_{in}?
    Marge acceptat: ± 0,020
  5. Què és el gradient checkpointing i quin compromís fa?
  6. 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#

Marca els que hagis llegit
  • 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.