Prendi la frase “il cane morde il postino” e trasformala in “il postino morde il cane”. Le parole sono identiche, l’ordine no, il significato nemmeno. Per un Transformer questo è un problema serio: il meccanismo di self-attention guarda tutti i token insieme, come se fossero gettati sul tavolo. Sa cosa c’è, non sa dove sta.
Nella lezione 32 ho spiegato il principio, cioè perché ai token serve un’informazione in più sulla posizione. Qui faccio il passo successivo, quello che di solito resta chiuso nei paper: come è cambiato nel tempo il modo di dare questa informazione e perché quasi tutti i modelli di oggi usano la stessa tecnica, la rotary position embedding.
Di cosa parleremo..
Perché l’ordine va ricostruito a mano
L’attenzione funziona a prodotti scalari. Ogni token emette una query e una chiave, il punteggio è quanto si somigliano, poi si pesano i value. Se permuti i token in ingresso, i punteggi si permutano allo stesso modo: il risultato non cambia di una virgola. È una proprietà elegante e comodissima per il calcolo parallelo, ma equivale a dire che l’ordine è invisibile.
Nelle reti ricorrenti il problema non esisteva. La frase entrava una parola alla volta, quindi la posizione era implicita nel tempo di calcolo. Il Transformer ha buttato via quella sequenza per guadagnare velocità. Adesso deve ricostruire l’informazione con un trucco numerico. Il trucco si chiama positional encoding.
Attenzione a una distinzione che torna utile più avanti. Possiamo dire al modello “questo token è il numero 7” oppure “questi due token distano 3 posizioni”. Sembra la stessa cosa, non lo è. La prima informazione è assoluta, la seconda è relativa. E quasi tutta l’evoluzione di cui parlo in questo articolo è il passaggio dalla prima alla seconda.
Tre famiglie di soluzioni
Prima di entrare nei dettagli, conviene avere la mappa. I metodi usati finora si dividono in tre gruppi, con filosofie diverse e compromessi diversi.
| Metodo | Come funziona | Punto forte | Limite |
|---|---|---|---|
| Assoluto appreso | Un vettore per ogni posizione, imparato come i pesi | Semplicità, nessun calcolo extra | Vale solo fino alla lunghezza vista in training |
| Sinusoidale | Seni e coseni a frequenze diverse, sommati all’embedding | Nessun parametro, formula fissa | Estrapola male, si mescola al contenuto |
| Relativo | Si modella la distanza tra token, non la posizione | Generalizza meglio su testi lunghi | Costo di memoria, implementazione più complessa |
| Rotativo (RoPE) | Rotazione di coppie di dimensioni in base alla posizione | Relativo negli effetti, assoluto nella forma | Va esteso con tecniche apposite oltre il training |

Posizioni assolute apprese: comode e un po’ rigide
La prima strada è la più banale: una tabella con una riga per posizione. Se il modello accetta 512 token, la tabella ha 512 righe da 768 numeri ciascuna. Quei numeri si allenano come tutto il resto. È la scelta di BERT e dei primi GPT.
Funziona bene, ha un solo difetto ma grosso. La tabella finisce. Alla riga 513 non c’è niente, perché durante l’addestramento quella riga non è mai stata toccata. Un modello del genere non può gestire un testo più lungo di quello per cui è nato. Non può nemmeno ragionevolmente stimare cosa ci sarebbe oltre.
C’è anche un problema più sottile. La posizione viene somma all’embedding del token, quindi i due segnali si confondono in un unico vettore. Il modello deve imparare a separarli. In parte ci riesce, ma è lavoro sprecato.
La sinusoide di Vaswani: elegante, non risolutiva
Il paper originale del 2017 proponeva una soluzione senza parametri: a ogni posizione si associa un vettore fatto di seni e coseni a frequenze geometricamente decrescenti. Le prime dimensioni oscillano in fretta, le ultime lentissime, con lunghezze d’onda che arrivano a 10.000 volte il giro completo.
L’idea era furba. Se le frequenze formano una progressione geometrica, il modello può imparare a leggere l’offset tra due posizioni come una trasformazione lineare, senza dover memorizzare nulla. In teoria un meccanismo del genere dovrebbe reggere lunghezze mai viste.
In pratica l’estrapolazione è deludente. La sinusoide resta un segnale assoluto e continua a essere sommata al contenuto. Quando il modello incontra posizioni fuori scala, gli angoli diventano difficili da interpretare e le prestazioni calano. Per anni si è convissuto con questo limite, accorciando i testi o accettando un degrado.
Le posizioni relative: conta la distanza
La svolta concettuale arriva nel 2018, con le rappresentazioni relative di Shaw e colleghi. L’idea: al modello non interessa che una parola sia la numero 37, gli interessa che sia tre posti prima di un’altra. La posizione diventa quindi una funzione della distanza. Le distanze oltre una certa soglia vengono accorpate per non esplodere in memoria.
T5 ha poi semplificato il tutto con un bias scalare aggiunto ai punteggi di attenzione, diviso in secchi: 32 bucket, con una distanza massima di 128 posizioni. Nessun vettore extra, solo un numero da sommare prima del softmax. È leggero e funziona, tant’è che il modello resta uno dei più usati per compiti di traduzione e riassunto.
Il vantaggio pratico è che la distanza si generalizza: se il modello ha imparato che due token vicini si influenzano molto, quella regola vale anche in un testo più lungo. Il limite è che quel bias va comunque imparato. Più il contesto cresce, più diventa difficile distribuirlo in modo sensato.
RoPE: la posizione diventa una rotazione
Nel 2021 un gruppo di ricerca cinese propone RoFormer, con un’idea diversa da tutte le precedenti. Invece di aggiungere un vettore alla posizione, si ruotano le query e le chiavi di un angolo proporzionale alla posizione del token. Le dimensioni vengono prese a coppie. Ogni coppia ruota a una velocità diversa.
Perché funziona? Perché il prodotto scalare tra due vettori ruotati dipende solo dalla differenza degli angoli, cioè dalla distanza tra i due token. La posizione è assoluta nella forma, ma l’effetto sul punteggio di attenzione è relativo. Detta in modo brutale: il modello crede di usare numeri di casa mentre sta misurando distanze.
Ci sono due dettagli che rendono RoPE molto pratico. Primo, si applica solo a query e chiavi, mai ai value: il contenuto viaggia pulito. Secondo, la rotazione conserva la norma dei vettori, quindi non altera l’ampiezza dei segnali e non introduce instabilità numerica.
Il paper descrive anche una proprietà di decadimento a lungo raggio: all’aumentare della distanza, l’aspettativa del prodotto scalare tende a calare. In parole povere, il modello è naturalmente portato a dare più peso a ciò che è vicino, senza che nessuno glielo imponga.
TIP: per capire RoPE non serve la trigonometria completa. Immagina un orologio: due lancette che segnano le 3 e le 5 sono distanti due ore, sempre, indipendentemente da che ora sia. RoPE fa la stessa cosa con i token. La distanza resta la stessa anche se il testo è lungo mille parole.
Con più teste di attenzione il gioco si moltiplica. Ogni testa può specializzarsi su frequenze diverse, quindi su scale di distanza diverse: c’è chi guarda le due parole vicine e chi collega punti lontani del discorso. Ne ho parlato in dettaglio nella lezione su multi-head attention.
ALiBi: il bias lineare che osa di più
Sempre nel 2021 arriva una proposta ancora più radicale, firmata da Press, Smith e Lewis. ALiBi non aggiunge nessun embedding. Prende i punteggi di attenzione e ci sottrae una penalità proporzionale alla distanza: più un token è lontano, più il suo punteggio scende, in modo lineare.
Ogni testa ha una pendenza diversa, scelta con una progressione geometrica. Alcune teste penalizzano poco la distanza e vedono lontano, altre sono quasi cieche oltre pochi token. Il risultato è una sorta di priorità per la memoria recente, che il modello non deve imparare: gliela metti nel meccanismo.
I numeri del paper sono il motivo per cui se ne parla ancora. Un modello da 1,3 miliardi di parametri, addestrato su sequenze da 1024 token, estrapolava a 2048 con la stessa perplessità di un modello sinusoidale addestrato direttamente a 2048, usando l’11% in meno di memoria e allenandosi l’11% più in fretta. BLOOM e MPT sono tra i modelli che hanno scelto questa strada.
Il rovescio della medaglia è proprio la sua qualità principale. Se il modello è addestrato a fidarsi di ciò che è vicino, su compiti che richiedono di recuperare un dettaglio sepolto all’inizio di un documento lungo può essere meno brillante di un modello con RoPE ben addestrato.
Estendere il contesto: la parte che nessuno racconta
RoPE è diventato lo standard, ma ha un limite noto: oltre la lunghezza vista in addestramento, le prestazioni crollano. Il motivo è matematico, perché le frequenze più alte iniziano a ruotare di angoli mai visti durante il training. Il modello non sa più interpretarle.
Da qui nascono le tecniche di scaling. Le versioni NTK-aware riscalano le frequenze in modo non uniforme, lasciando quasi intatte quelle basse e comprimendo le alte. YaRN, del 2023, aggiunge una correzione della temperatura e un’attenzione particolare alle posizioni intermedie: secondo il paper serve il 90% in meno di token e 2,5 volte meno passi di addestramento rispetto ai metodi precedenti.
È il motivo per cui nei modelli open si trovano parametri come rope_theta e rope_scaling. Alcuni alzano la base delle frequenze da 10.000 a 500.000, altri dichiarano un fattore di scala per raddoppiare o quadruplicare il contesto. Se vuoi capire quanto un modello regge davvero, il numero scritto nella scheda vale meno di questi parametri e dei dati usati per il fine-tuning. Ne ho parlato anche nella lezione su context window.
Cosa cambia per chi usa i modelli
La prima conseguenza è che la posizione conta più di quanto sembri. Diversi studi mostrano che le informazioni messe al centro di un contesto molto lungo vengono recuperate peggio di quelle all’inizio o alla fine. Non è un caso: il decadimento a lungo raggio di RoPE e il bias di ALiBi spingono entrambi verso le estremità vicine.
In pratica, se devi dare istruzioni importanti a un modello con contesto ampio, mettile all’inizio del messaggio e ripetile alla fine. Non è superstizione, è coerenza con come il meccanismo è costruito.
La seconda conseguenza riguarda i documenti lunghi. Un modello con contesto dichiarato da 200.000 token non tratta ogni posizione allo stesso modo: le prime migliaia sono state viste miliardi di volte in addestramento, le ultime spesso solo in una fase di fine-tuning. La qualità non è uniforme lungo la finestra.
Come riconoscere il metodo in un modello open source
Se scarichi un modello da Hugging Face, il file config.json dice quasi tutto. La presenza di rope_theta o rope_scaling indica RoPE. Un campo alibi attivo indica il bias lineare. Un oggetto position_embeddings con dimensione 512 per 768 è la tabella assoluta di BERT. Ti dice subito che il tetto è 512 token.
Vale la pena guardarci, perché chiarisce i limiti reali meglio di qualsiasi annuncio. Un modello con RoPE e rope_theta alto è pensato per contesti lunghi, uno con tabella assoluta probabilmente no. E un modello che dichiara un contesto enorme senza scaling coerente ti sta raccontando una parte della storia, non tutta.
La posizione dei token è uno di quei dettagli che sembrano marginali e invece decidono se un modello funziona o no. Se hai letto la lezione base su positional encoding e questa, hai in mano il quadro completo: perché serve, come è nata e dove sta andando. Per il resto, il punto di partenza resta sempre lo stesso, cioè capire come un testo diventa un vettore: se ti manca quel pezzo, parti da cosa sono gli embedding.
Domande frequenti
RoPE si applica anche ai value?
No. Si applica a query e chiavi, mentre i value restano invariati. È una scelta precisa: il punteggio di attenzione deve dipendere dalla distanza tra i token, ma il contenuto che viene trasferito non ha motivo di essere ruotato. Applicarlo anche ai value confonderebbe informazione posizionale e contenuto semantico, peggiorando i risultati.
Qual è la differenza tra RoPE e positional encoding sinusoidale?
La sinusoidale somma un vettore all’embedding, quindi posizione e contenuto finiscono nello stesso vettore. RoPE non somma nulla: ruota le componenti di query e chiavi, lasciando intatto il contenuto e facendo dipendere il prodotto scalare solo dalla distanza relativa. Il primo metodo è assoluto, il secondo è relativo negli effetti.
Perché un modello perde qualità oltre il contesto di addestramento?
Perché le frequenze di rotazione producono angoli che il modello non ha mai visto. Le coppie di dimensioni che ruotano più velocemente compiono giri completi in poche posizioni. Oltre una certa soglia il pattern diventa ambiguo. Le tecniche di scaling come NTK-aware o YaRN servono proprio a rimappare quelle frequenze su un intervallo noto.
ALiBi è meglio di RoPE?
Dipende dal compito. ALiBi estrapola meglio senza fine-tuning e costa meno in memoria, ma privilegia le posizioni vicine, il che può penalizzare il recupero di informazioni lontane. RoPE è più flessibile e si presta meglio alle estensioni del contesto, motivo per cui è diventato lo standard nei modelli open di grandi dimensioni.
Posso cambiare il positional encoding di un modello già addestrato?
Non senza riaddestrare. I pesi hanno imparato a interpretare un certo schema di posizioni. Sostituirlo con un altro rompe quell’accordo. Quello che si può fare è agire sui parametri di scaling, come aumentare rope_theta o applicare un fattore di scala, seguiti da una fase di fine-tuning su testi lunghi.
Il positional encoding influisce sulla velocità di inferenza?
Poco, ma non zero. La tabella assoluta è una semplice somma, la sinusoide si calcola una volta sola, RoPE richiede una rotazione per token e per coppia di dimensioni, ALiBi solo una somma di bias. La differenza sui tempi si sente più nei costi di memoria che nel calcolo puro, soprattutto quando il contesto si allunga.


