SLM · Diario di Training

Run #4 — RoPE

d_model 512 · 12 layer · 8 teste · 45.9 M parametri · BPE-SPM 16k · RTX 4090

completato ✓
avvio 2026-09-27 step 30 000 / 30 000 ✓ best val loss 3.5861 (step 27 500) val loss finale 3.6040 (step 30 000) perplexità best ~36.1 durata 76 min 5 s hardware RTX 4090 · Vast.ai #52950616

Log validation loss

Step Train Val Campione generato
09.76739.7717— (nessun campione a step 0)
5005.81175.9526"al nome, il primo posto e il titolo, a una certa, nel corso del mondo, la prima guerra mondiale a lui..."
1 0005.19505.3888"al primo posto a causa della sua morte, in cui il figlio, il suo posto, l'ultimo posto a causa dell'invio..."
1 5004.84695.0800"di un castello che porta a una strada verso l'Ambrogio. Nel 1132, sotto il controllo di Napoleone..."
2 0004.61274.8711"in quanto il suo 'Canto di Ebrem', l'altro che lo fa di essere troppo abile..."
2 5004.44184.7320"In questi anni il comune è entrato a far parte del primo governo di cui è stata parte di un'altra città..."
3 0004.29134.5827[#[novoi] = \set;</score>…] — collasso markup HTML Wikipedia
3 5004.16404.4511__ل ⁇ орореиה ⁇ ррссикк… — collasso caratteri non-latini (arabo/cirillico)
4 0004.04874.3523"la cui esistenza si attesta intorno all'XI secolo in epoca remota. A partire dal secolo XI, la città è d..."
4 5004.00024.2759H2O2O2O2O2O2O2O2… — collasso formula chimica ripetuta
5 0003.91274.2193"a a a a. In seguito l'elenco dei sindaci e il progetto dei sindaci di Milano Soncino..."
5 5003.85834.1589"a livello nazionale. Il suo successo è quello per la produzione del vino bianco con un'attività molto ampia..."
6 0003.82774.1434"La presenza di un'officina, in parte slanciata, fu di circa 500 anni fa, con un incremento di popolazione..."
6 5003.77444.0827"Comitato nel caso di τές, Pesolento nel caso di κτιος…" — ancora mix greco/italiano
7 0003.73604.0638"omaomaoma, con la sua forma allungata e allungata. Il paesaggio circostante di Barcagna è caratt..."
7 5003.71184.0143"a partire dal secondo tipo di unità, come ad esempio i 'like' (ad esempio quelli 'like', cioè quelli 'like')..."
8 0003.68433.9994"nel 1987, che aveva partecipato al Campionato nazionale di Formula 1, insieme al suo compagno Mario De Cesari..."
8 5003.64903.9705"con un punteggio di 6-6, 6-6, 6-9, 7-1, 7-3…" — collasso punteggi sportivi
9 0003.61423.9460"le stesse del loro potere erano state limitate e le loro caratteristiche erano state prese in considerazione..."
9 5003.58543.9422"in cui si trova una delle caratteristiche della città. Storia. I primi contatti con il paese risalgono al periodo..."
10 0003.54683.9269"il cui nome deriva dal latino 'Constanus', termine che si traduce nell'espressione 'ponstanus', ma il ri..."
10 5003.52943.8894"Nel 1908, il Comune di Lavare e il Comune di Lavare e il suo territorio, venne annesso alla provincia di Como..."
11 0003.52253.8900"to in un altro film di fine anni cinquanta: 'La terra del mare', diretto da Robert W. Bush e interpretato da Christopher..."
11 5003.50373.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 0003.49103.8664"toria in senso più ampio rispetto alle posizioni più avanzate. Anche per la sua vicinanza alla sfera di comando..."
12 5003.45833.8478"si dice che i tre principali nomi della famiglia, Uda, Arna, Arnà, Valeri, Arda, Arna, Arna, Arna…" — ripetizione residua
13 0003.44583.8291—
13 5003.42713.8146—
14 0003.41123.8086—
14 5003.39683.7885—
15 0003.38023.7730—
15 5003.35933.7665—
16 0003.34493.7649—
16 5003.32443.7442—
17 0003.30743.7337—
17 5003.28313.7374— (+0.0037 oscillazione normale)
18 0003.29153.7192—
18 5003.28463.7098— nuovo best val loss
19 0003.27073.7146—
19 5003.27133.6877—
20 0003.25583.7096— (oscillazione +0.022)
20 5003.24403.6851—
21 0003.22463.6688—
21 5003.20963.6650—
22 0003.21743.6545—
22 5003.18823.6597— (oscillazione)
23 0003.18933.6360—
23 5003.17323.6421— (oscillazione)
24 0003.16323.6353—
24 5003.17113.6343—
25 0003.15213.6253—
25 5003.14523.5981—
26 0003.11873.6209—
26 5003.13953.6156—
27 0003.13463.6225— (oscillazione)
27 5003.10583.5861 ★— BEST FINALE · ppl 36.1
28 0003.11283.6135— (leggero overfitting, corpus esaurito)
28 5003.10033.6057—
29 0003.10883.5974—
29 5003.10413.5950—
30 0003.10283.6040— finale · training completato in 76 min 5 s

Diff architetturale

Run #3 — PE sinusoidale
Run #4 — RoPE
PositionalEncoding()
rimossa
x = x + pe[:seq]
nessuna somma all'embedding
Q, K invariati
Q = Q·cos + rot(Q)·sin
—
K = K·cos + rot(K)·sin
buffer sinusoidale globale
cos/sin per testa (buffer)
~0 parametri extra
~0 parametri extra
45.9 M param
45.9 M param
extrapolazione fissa a max_seq
extrapolazione oltre max_seq nativa

Perché RoPE

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 è:

Q[2i] = Q[2i]·cos(m·θᵢ) − Q[2i+1]·sin(m·θᵢ) Q[2i+1] = Q[2i]·sin(m·θᵢ) + Q[2i+1]·cos(m·θᵢ) θᵢ = 1 / 10000^(2i / d_k) — frequenze decrescenti per dim basse

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.

Curva di loss

10 8.0 6.0 4.0 0 5k 10k 20k 30k R3 best = 4.0768 step 27 500 ★ val 3.5861 Run #3 (sin PE, stima) Run #4 (RoPE, dati reali)

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.

Comparazione A/B — Run #3 vs Run #4

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 ✓ +

Timeline operativa

RoPE implementato — attention.py, transformer.py, model.py, train.py
2026-09-27 · ~50 righe di diff · flag --rope
Istanza Vast.ai creata — RTX 4090 · California US · $0.4228/h
2026-09-27 · instance #52945249
Trasferimento corpus e codice — 201 MB corpus_bpe.txt + tokenizer.model
2026-09-27
Training completato — python3 train.py --tokenizer bpe-spm --data data/corpus_bpe.txt --preset medium --steps 30000 --batch 16 --rope
2026-09-27 · 76 min 5 s · best val 3.5861 a step 27 500
Raccolta risultati — checkpoint scaricato, log val loss documentato
2026-09-27
Comparazione A/B — Run #3 vs Run #4: val loss −12%, ppl −39%, supera R3 a step 8 000
2026-09-27 · dettaglio nella tabella sopra
Export GGUF — slm-run4.gguf (fp16) + slm-run4-q8_0.gguf (Q8_0)
2026-10-01 · modello in uso

Verso Run #5 — Legge di Chinchilla e corpus

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:

D_opt = N_params × 20 = 45.9 M × 20 = ~918 M token unici

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:

corpus_bpe_v2.txt = wiki_it_full (~500 M) + mc4_it_sample (~400 M) ≈ 900 M token unici python3 train.py \ --resume checkpoints/best.pt \ --data data/corpus_bpe_v2.txt \ --steps 60000 \ --lr 3e-5 # ~30% del peak originale (warm restart) --warmup 1000 \ --rope

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.