Two Problems at Either End of Training [BLOCK_TYPE SECTION/STEP]
Early-Step Problem: Fresh Weights Cannot Take Big Steps
[BLOCK_TYPE SECTION/STEP]At step 0, every weight starts as a small random number sampled from a near-zero distribution. Activations stay near zero. Gradients carry almost no information about a final solution. Apply a peak learning rate to those gradients & a model jumps far away from initialization in directions that do not encode meaningful structure. [BLOCK_TYPE SECTION/STEP]
[BLOCK_TYPE SECTION/STEP]
ANDREA-120M v1 made this mistake. No warmup. Step 1 used lr = 0.0003 on freshly initialized weights. Result: model landed in a bad parameter basin within a few hundred steps. Loss numbers looked reasonable; samples produced repetition loops by step 80K & never recovered.
Problema in fase avanzata: grandi passi non affinano una soluzione
Entro lo step 100K, il modello ha appreso la struttura grossolana. I gradienti ora trasportano un segnale fine: quale peso del token necessita di una piccola correzione, quale testa di attenzione richiede un leggero riequilibrio. Applicare un learning rate massimo in questa fase fa superare ogni regolazione fine, oscillando attorno a un ottimo senza stabilizzarsi.
Due problemi, estremi opposti dell’addestramento. Una sola schedule, due regioni: salita graduale, discesa fluida.
Warmup lineare: primi 2000 step
La formula
ANDREA-120M v2 utilizza un warmup lineare su 2000 step:
lr(t) = lr_scheduled(t) * min(1, (t + 1) / warmup_steps)
dove t è il numero dello step (0-indexed), warmup_steps = 2000, e lr_scheduled(t) è ciò che la pianificazione coseno prescriverebbe ignorando il warmup.
Lettura della formula:
- A t = 0: lr = lr_scheduled(0) min(1, 1/2000) = lr_scheduled(0) 0.0005. Piccolo primo step.
- A t = 1000: lr = lr_scheduled(1000) min(1, 1001/2000) = lr_scheduled(1000) 0.5. Metà intensità.
- A t = 2000: lr = lr_scheduled(2000) min(1, 2001/2000) = lr_scheduled(2000) 1.0. Intensità piena.
- Per t > 2000: il clamp mantiene il moltiplicatore a 1, il warmup non ha più effetto e il decadimento coseno agisce da solo.
La rampa lineare da zero dà al modello 2000 passi per formare rappresentazioni grossolane prima che AdamW e il gradient clipping vedano aggiornamenti a piena intensità. Entro il passo 2000 i pesi si sono spostati abbastanza da evitare che il lr di picco li spinga in un bacino cattivo.
Calcolo del LR durante il Warmup
Cosine Decay Dopo il Warmup
La Curva
Dopo che il warmup termina al passo 2000, il learning rate segue una curva coseno dal picco fino a zero nei passi rimanenti:
lr(t) = lr_min + (lr_peak - lr_min) 0.5 (1 + cos(pi * progress))
dove progress = (t - warmup_steps) / (total_steps - warmup_steps). Quando progress = 0 (appena dopo il warmup), cos(0) = 1, lr = valore di picco. Quando progress = 1 (ultimo step), cos(pi) = -1, lr = lr_min (tipicamente 0 o un valore minimo molto piccolo).
Perché Cosine, Non Lineare o Esponenziale?
La cosine decay inizia lentamente (la curva è quasi piatta vicino al picco), accelera nella parte centrale, poi rallenta di nuovo vicino a zero. Tre vantaggi:
1. Plateau vicino al picco. I primi step dopo il warmup ricevono ancora quasi il valore massimo di lr, permettendo al modello di utilizzare un lungo periodo di learning rate elevato per costruire le rappresentazioni.
2. Transizione fluida nella fase centrale. Nessun salto improvviso che AdamW deve assorbire.
3. Plateau vicino allo zero. Negli ultimi passi l'lr diventa minuscolo per la rifinitura finale, simile al simulated annealing.
ANDREA-120M viene addestrato per un totale di 200K passi; 198K di questi si trovano nella regione di cosine decay dopo i 2000 passi di warmup.
Warm Restart di ANDREA-12M al passo 25K
Il Plateau
ANDREA-12M è stato addestrato per 60K passi con cosine decay da un picco di lr = 0.0004. Intorno al passo 22K, la loss si è stabilizzata su un valore EMA ~2.4. Il cosine decay aveva ridotto lr a circa 0.00015. Il bandit continuava a fornire dati diversi; il modello aveva smesso di migliorare.
Diagnosi: lr era decaduto troppo per permettere al modello di uscire dal bacino attuale. I dati Hermes stavano per entrare nel curriculum (step 25K), portando 590K nuove conversazioni. Il modello aveva bisogno di energia per assorbire questo shock di dati.
Il Riavvio
Allo step 25K, la pianificazione ha eseguito un warm restart: ha fatto salire lr da 0.00015 (decaduto) fino a 0.0004 (picco originale), per poi riprendere la decadenza coseno sui passi rimanenti.
Loshchilov & Hutter (2017) hanno chiamato questa tecnica "SGDR" (stochastic gradient descent with warm restarts). L'intuizione: un lr alto aggiunge abbastanza energia cinetica per uscire da un bacino locale ed esplorare quelli vicini; la successiva decadenza coseno ri-ricottura verso un bacino migliore.
Outcome. La Loss EMA è scesa da 2.40 a 2.10 nei successivi 10K step dopo il restart. Il modello è stato rilasciato allo step 43.6K con una loss SMMA di 2.0, dimostrando una struttura coerente di turni Q&A.
ANDREA-120M v2 ha scelto di NON usare i warm restart: con 200K step disponibili e un numero di parametri molto maggiore, un decadimento monotono e graduale ha prodotto una convergenza più stabile. Il restart funziona meglio quando l’addestramento è breve e un plateau coincide con un noto shift dei dati.
Diagnosi del fallimento di v1
Scelte di Programmazione nella Pratica
Attività Adiacenti
Tre fratelli collegati alla programmazione del LR:
- Attività 10: AdamW. Il warmup dà al bias correction di AdamW il tempo di stabilizzarsi. Senza warmup, l'amplificazione 10x al passo 1 moltiplica qualsiasi rumore presente nei gradienti; con il warmup, il moltiplicatore agisce su un segnale reale.
- Attività 12: Gradient clipping. Il clipping limita la norma L2 del gradiente a 1.0 PRIMA di AdamW. Il warmup smorza lr; il clipping smorza g. Insieme mantengono sicuri i primi passi anche su curricula soggetti a shock.
- Attività 22: Checkpointing. Un warm restart richiede il caricamento dello stato dell'ottimizzatore (m, v, contatore dei passi) da un checkpoint, quindi la modifica della schedule durante l'esecuzione. Il restart di ANDREA-12M al passo 25K lo dimostra; ci sono voluti due tentativi per far funzionare correttamente la logica di caricamento dello stato.
Schedule, ottimizzatore e clipping formano un triangolo di stabilità. Se si elimina un vertice, ANDREA ripete il collasso della v1.