SLM · Diario di Training
d_model 512 · 12 layer · 8 teste · 45.9 M parametri · BPE-SPM 16k · RTX 4090
| Step | Train | Val | Campione generato |
|---|---|---|---|
| 0 | 9.7673 | 9.7717 | — (nessun campione a step 0) |
| 500 | 5.8117 | 5.9526 | "al nome, il primo posto e il titolo, a una certa, nel corso del mondo, la prima guerra mondiale a lui..." |
| 1 000 | 5.1950 | 5.3888 | "al primo posto a causa della sua morte, in cui il figlio, il suo posto, l'ultimo posto a causa dell'invio..." |
| 1 500 | 4.8469 | 5.0800 | "di un castello che porta a una strada verso l'Ambrogio. Nel 1132, sotto il controllo di Napoleone..." |
| 2 000 | 4.6127 | 4.8711 | "in quanto il suo 'Canto di Ebrem', l'altro che lo fa di essere troppo abile..." |
| 2 500 | 4.4418 | 4.7320 | "In questi anni il comune è entrato a far parte del primo governo di cui è stata parte di un'altra città..." |
| 3 000 | 4.2913 | 4.5827 | [#[novoi] = \set;</score>…] — collasso markup HTML Wikipedia |
| 3 500 | 4.1640 | 4.4511 | __ل ⁇ орореиה ⁇ ррссикк… — collasso caratteri non-latini (arabo/cirillico) |
| 4 000 | 4.0487 | 4.3523 | "la cui esistenza si attesta intorno all'XI secolo in epoca remota. A partire dal secolo XI, la città è d..." |
| 4 500 | 4.0002 | 4.2759 | H2O2O2O2O2O2O2O2… — collasso formula chimica ripetuta |
| 5 000 | 3.9127 | 4.2193 | "a a a a. In seguito l'elenco dei sindaci e il progetto dei sindaci di Milano Soncino..." |
| 5 500 | 3.8583 | 4.1589 | "a livello nazionale. Il suo successo è quello per la produzione del vino bianco con un'attività molto ampia..." |
| 6 000 | 3.8277 | 4.1434 | "La presenza di un'officina, in parte slanciata, fu di circa 500 anni fa, con un incremento di popolazione..." |
| 6 500 | 3.7744 | 4.0827 | "Comitato nel caso di τές, Pesolento nel caso di κτιος…" — ancora mix greco/italiano |
| 7 000 | 3.7360 | 4.0638 | "omaomaoma, con la sua forma allungata e allungata. Il paesaggio circostante di Barcagna è caratt..." |
| 7 500 | 3.7118 | 4.0143 | "a partire dal secondo tipo di unità, come ad esempio i 'like' (ad esempio quelli 'like', cioè quelli 'like')..." |
| 8 000 | 3.6843 | 3.9994 | "nel 1987, che aveva partecipato al Campionato nazionale di Formula 1, insieme al suo compagno Mario De Cesari..." |
| 8 500 | 3.6490 | 3.9705 | "con un punteggio di 6-6, 6-6, 6-9, 7-1, 7-3…" — collasso punteggi sportivi |
| 9 000 | 3.6142 | 3.9460 | "le stesse del loro potere erano state limitate e le loro caratteristiche erano state prese in considerazione..." |
| 9 500 | 3.5854 | 3.9422 | "in cui si trova una delle caratteristiche della città. Storia. I primi contatti con il paese risalgono al periodo..." |
| 10 000 | 3.5468 | 3.9269 | "il cui nome deriva dal latino 'Constanus', termine che si traduce nell'espressione 'ponstanus', ma il ri..." |
| 10 500 | 3.5294 | 3.8894 | "Nel 1908, il Comune di Lavare e il Comune di Lavare e il suo territorio, venne annesso alla provincia di Como..." |
| 11 000 | 3.5225 | 3.8900 | "to in un altro film di fine anni cinquanta: 'La terra del mare', diretto da Robert W. Bush e interpretato da Christopher..." |
| 11 500 | 3.5037 | 3.8620 | "L'embrio era il primo esempio di 'carica marea', con un'altezza di 650 metri. In tale caso, il nome di 'conte di mar..." |
| 12 000 | 3.4910 | 3.8664 | "toria in senso più ampio rispetto alle posizioni più avanzate. Anche per la sua vicinanza alla sfera di comando..." |
| 12 500 | 3.4583 | 3.8478 | "si dice che i tre principali nomi della famiglia, Uda, Arna, Arnà, Valeri, Arda, Arna, Arna, Arna…" — ripetizione residua |
| 13 000 | 3.4458 | 3.8291 | — |
| 13 500 | 3.4271 | 3.8146 | — |
| 14 000 | 3.4112 | 3.8086 | — |
| 14 500 | 3.3968 | 3.7885 | — |
| 15 000 | 3.3802 | 3.7730 | — |
| 15 500 | 3.3593 | 3.7665 | — |
| 16 000 | 3.3449 | 3.7649 | — |
| 16 500 | 3.3244 | 3.7442 | — |
| 17 000 | 3.3074 | 3.7337 | — |
| 17 500 | 3.2831 | 3.7374 | — (+0.0037 oscillazione normale) |
| 18 000 | 3.2915 | 3.7192 | — |
| 18 500 | 3.2846 | 3.7098 | — nuovo best val loss |
| 19 000 | 3.2707 | 3.7146 | — |
| 19 500 | 3.2713 | 3.6877 | — |
| 20 000 | 3.2558 | 3.7096 | — (oscillazione +0.022) |
| 20 500 | 3.2440 | 3.6851 | — |
| 21 000 | 3.2246 | 3.6688 | — |
| 21 500 | 3.2096 | 3.6650 | — |
| 22 000 | 3.2174 | 3.6545 | — |
| 22 500 | 3.1882 | 3.6597 | — (oscillazione) |
| 23 000 | 3.1893 | 3.6360 | — |
| 23 500 | 3.1732 | 3.6421 | — (oscillazione) |
| 24 000 | 3.1632 | 3.6353 | — |
| 24 500 | 3.1711 | 3.6343 | — |
| 25 000 | 3.1521 | 3.6253 | — |
| 25 500 | 3.1452 | 3.5981 | — |
| 26 000 | 3.1187 | 3.6209 | — |
| 26 500 | 3.1395 | 3.6156 | — |
| 27 000 | 3.1346 | 3.6225 | — (oscillazione) |
| 27 500 | 3.1058 | 3.5861 ★ | — BEST FINALE · ppl 36.1 |
| 28 000 | 3.1128 | 3.6135 | — (leggero overfitting, corpus esaurito) |
| 28 500 | 3.1003 | 3.6057 | — |
| 29 000 | 3.1088 | 3.5974 | — |
| 29 500 | 3.1041 | 3.5950 | — |
| 30 000 | 3.1028 | 3.6040 | — finale · training completato in 76 min 5 s |
La Rotary Position Embedding (Su et al., 2023) codifica la posizione direttamente nella rotazione di Query e Key, invece di sommare un vettore fisso all'embedding del token.
Per ogni coppia di dimensioni (2i, 2i+1) e posizione m, la rotazione applicata è:
Il risultato è che il prodotto scalare Q·Kᵀ dipende solo dalla distanza relativa tra le posizioni, non dalle posizioni assolute — proprietà che manca al PE sinusoidale. RoPE è oggi l'encoding posizionale di riferimento in LLaMA, Mistral e GPT-NeoX.
Cosa ci aspettiamo da Run #4 rispetto a Run #3.
Con corpus e iperparametri identici, la differenza di val_loss dovrebbe essere piccola (entro 0.05–0.10) ma misurabile su task sensibili alla posizione relativa: sequenze con struttura ripetuta, retrieval di informazioni a lunga distanza, generalizzazione oltre seq_len=512.
Perché Run #4 converge più veloce — e cosa non è isolabile.
La convergenza rapida non è attribuibile solo a RoPE. Run #4 usa il preset medium con seq_len=512, mentre Run #3 girava con --seq 256. Con batch=16 e seq=512 ogni step elabora 8 192 token contro i 4 096 di Run #3. Il modello vede il doppio del corpus per step, quindi le stesse 47.8 M occorrenze in metà degli step effettivi.
Tradotto: Run #4 al passo 15 000 ha visto circa 123 M token — equivalenti a ~30 000 step di Run #3. Il confronto preciso tra le architetture (RoPE vs sinPE a parità di token visti) richiederà un terzo run. Quello che possiamo già affermare è che la qualità assoluta di Run #4 supera il massimo storico di Run #3 già al passo 8 000.
Milestone qualitativi osservati nella progressione dei campioni: step 0–3 500 — markup/caratteri non-latini, collasso repetitivo; step 4 000–6 000 — morfologia italiana stabile, lessico enciclopedico; step 8 000+ — nomi propri, date, titoli cinematografici, struttura da voce Wikipedia; step 10 000+ — periodi multi-clausola con topici coerenti su 2–3 frasi.
Dati reali completi Run #4 (30 000 step). Best: val 3.5861 al passo 27 500 · ppl 36.1 · durata 76 min. Run #4 supera il best di Run #3 (val 4.0768) già al passo 8 000, dopo appena il 27% del budget di training. Il lieve rialzo finale (step 28 000–30 000) segnala esaurimento del corpus dopo 5+ epoche.
| Metrica | Run #3 (sin PE) | Run #4 (RoPE) | Δ |
|---|---|---|---|
| Best val loss | 4.0768 | 3.5861 ★ (step 27 500) | −0.491 (−12%) |
| Perplexità best | ~59 | ~36.1 | −22.9 (−39%) |
| Val loss finale (step 30k) | 4.0825 | 3.6040 | −0.479 |
| Step al best | ~28 500 | 27 500 | −1 000 |
| Step per battere R3 best | — | 8 000 (27% del budget) | — |
| seq_len | 256 | 512 | 2× token/step |
| Durata training | 59m 22s | 76m 05s | +16m 43s |
| Coerenza struttura ripetuta | qualitativa | da valutare | — |
| GGUF Q4_K_M (llama.cpp) | incompatibile (PE fissa) | compatibile ✓ | + |
attention.py, transformer.py, model.py, train.py--ropecorpus_bpe.txt + tokenizer.modelpython3 train.py --tokenizer bpe-spm --data data/corpus_bpe.txt --preset medium --steps 30000 --batch 16 --ropeslm-run4.gguf (fp16) + slm-run4-q8_0.gguf (Q8_0)Run #4 è data-starved secondo Chinchilla. Hoffmann et al. (2022) dimostrano che per un training compute-optimal il numero di token unici deve essere circa 20× i parametri:
Il corpus attuale ha 47.8 M token unici, visti ~5 volte in 30 000 step. Siamo 19× sotto il Chinchilla-optimal in dati unici. Il flattening della curva dopo step 20 000 è il segnale diretto: il modello ha già estratto il segnale ad alta frequenza dal corpus ripetuto.
Run #5: continued pre-training da Run #4. È tecnicamente possibile ripartire dal checkpoint best.pt di Run #4 con un corpus più grande senza ri-addestrare il tokenizer:
Il tokenizer rimane invariato (nessun cambio di vocabolario). Al resume va reimpostato il LR schedule: la cosine decay di Run #4 è già a zero a step 30 000, addestrare con LR ≈ 0 non farebbe nulla. Un warm restart a LR ridotto (3e-5 invece di 1e-4) è lo standard per continued pre-training.
Loss spike iniziale: i primi 500–1 000 step con MC4-it (web-crawl) faranno risalire la val loss perché la distribuzione è diversa da Wikipedia. Si recupera entro 2 000–3 000 step — non interrompere il training.
Val loss stimata a completamento Run #5: intorno a 2.8–3.0 · perplexity ~16–22 · una categoria qualitativamente diversa dall'attuale.
Ceiling non Chinchilla: dimensione del modello. A parità di compute, Chinchilla dice che conviene scalare parametri e dati insieme. Con 4× i parametri (180 M) e 4× i dati (3.5 B token) si userebbe lo stesso budget con risultati sensibilmente migliori. Il percorso verso ppl <10 passa necessariamente dal salto a 100–200 M parametri.