BERT, GPT, T5, Mixtral e DeepSeek sono costruiti con lo stesso blocco, il Transformer. Cambiano tre scelte: quali parole può guardare ogni parola, che cosa impara a prevedere e quanta parte della rete lavora per ogni token. Questa guida le separa una alla volta: prima BERT contro GPT, poi le famiglie di architetture, infine i modelli densi contro quelli sparsi a esperti (MoE, Mixture of Experts), con il router smontato pezzo per pezzo.
Un modello linguistico moderno trasforma il testo in token, ogni token in un vettore (l'embedding, vedi la guida sul training), e poi fa passare quei vettori attraverso una pila di blocchi identici. Ogni blocco ha due stadi, sempre nello stesso ordine.
L'attenzione è il momento in cui i token si parlano: ogni token guarda gli altri, decide quali contano per lui e ne mescola le informazioni nel proprio vettore.
La rete feed-forward (FFN, Feed-Forward Network) è il momento in cui ogni token lavora da solo: il suo vettore passa in due o tre moltiplicazioni per matrice, che applicano ciò che il modello ha imparato.
Attorno a entrambi ci sono una normalizzazione e una connessione residua, che somma l'ingresso all'uscita, così ogni blocco aggiunge qualcosa invece di riscrivere tutto.
Il meccanismo completo, con query, key e value, le teste multiple e il conto dei pesi di Llama 2 7B, è nel capitolo sugli strati della guida sul training: qui basta l'idea dei due stadi.
Con un vettore di dimensione d, l'attenzione di un blocco ha quattro matrici quadrate (query, key, value, output). La FFN classica allarga il vettore a 4·d e lo riporta a d: due matrici da d × 4d. Il conto dei parametri:
Calcolo · parametri di un blocco
Quindi circa due terzi dei parametri di un blocco stanno nella FFN. Tenete a mente questo numero: è il motivo per cui i modelli a esperti del capitolo 6 intervengono proprio lì.
Un blocco con d = 4.096, FFN classica
Le varianti moderne (SwiGLU, Swish-Gated Linear Unit; attenzione a gruppi) spostano un po' le proporzioni, non l'ordine di grandezza.
BERT e GPT differiscono nell'attenzione (chi vede chi) e nell'obiettivo; i modelli densi e quelli sparsi differiscono nella FFN (una per tutti, o tante tra cui scegliere).
BERT (Bidirectional Encoder Representations from Transformers) è un modello di Google del 2018 che produce una rappresentazione del testo, non del testo nuovo.
Immaginate un lettore esperto a cui date una frase con una parola cancellata: «il gatto ___ sul divano». Per indovinarla usa quello che viene prima e quello che viene dopo. È esattamente ciò che fa BERT: ogni token guarda tutti gli altri, in entrambe le direzioni. Il nome lo dice: bidirectional encoder, un codificatore che legge in due direzioni.
Il risultato non è una frase ma un vettore per ogni token (768 numeri nella versione base), che ne descrive il significato nel contesto: la parola «pesca» in «vado a pesca» e in «mangio una pesca» esce con due vettori diversi. Su quei vettori si costruisce poi il compito che serve.
Si sceglie a caso il 15% dei token. Di questi, l'80% diventa [MASK], il 10% un token casuale, il 10% resta uguale. Il modello deve ricostruire l'originale.
[MASK] non compare mai: se il modello lo vedesse sempre, imparerebbe a lavorare solo quando c'è.Metà delle volte la frase B segue davvero la A, metà è presa a caso. Il modello risponde sì o no usando il token speciale [CLS] messo all'inizio.
| Versione | Blocchi | Dimensione d | Teste di attenzione | Parametri |
|---|---|---|---|---|
| BERT-base | 12 | 768 | 12 | 110 M |
| BERT-large | 24 | 1.024 | 16 | 340 M |
Addestrato su BooksCorpus (800 milioni di parole) e Wikipedia in inglese (2,5 miliardi), con un vocabolario WordPiece di circa 30.000 token.
BERT pre-addestrato non sa fare nulla di utile da solo: sa rappresentare. Per un compito si aggiunge sopra uno strato piccolo e si fa un breve fine-tuning (addestramento di rifinitura) su esempi etichettati.
| Compito | Che cosa si legge dall'uscita | Esempio |
|---|---|---|
| Classificazione | il vettore di [CLS] → una probabilità per classe | recensione positiva o negativa, email spam |
| Etichette per token (NER, Named Entity Recognition) | ogni vettore → una classe | «Mario» = persona, «Roma» = luogo |
| Domande su un testo | ogni vettore → «inizio risposta?», «fine risposta?» | la risposta è il tratto tra i due |
| Ricerca per significato | media dei vettori → un vettore per frase | embedding per la ricerca nei documenti (RAG, Retrieval-Augmented Generation) |
Dove si trova BERT oggi. Non come chatbot ma dietro le quinte: modelli di embedding per la ricerca, reranker che riordinano i risultati, classificatori veloci ed economici. I discendenti (RoBERTa, DistilBERT, DeBERTa, ModernBERT) mantengono l'idea: encoder bidirezionale, uscita come rappresentazione.
GPT (Generative Pre-trained Transformer) usa lo stesso blocco di BERT. Le differenze sono quattro, e discendono tutte dalla prima.
Scegli il modello e tocca una parola a sinistra: la riga mostra quali token può guardare mentre calcola il proprio vettore. Sotto, che cosa deve prevedere ogni posizione durante l'addestramento.
Che cosa impara ogni posizione
Nella realtà BERT copre il 15% dei token di ogni esempio; qui, con sei parole, ne copriamo una. Le frasi di BERT hanno anche [CLS] e [SEP], omessi per chiarezza.
BERT è stato allenato a riempire buchi avendo il contesto da entrambi i lati. Per scrivere un testo nuovo da sinistra a destra, il contesto di destra non esiste ancora: il modello lavora fuori dalle condizioni in cui ha imparato. Si può forzare (riempire più maschere a turni), ma il risultato è scadente.
GPT, al contrario, è nato per scrivere: l'obiettivo di addestramento e l'uso coincidono, token dopo token. Il prezzo è che, a parità di dimensione, ogni token ha un contesto solo a metà, e per compiti di pura comprensione su frasi brevi un encoder piccolo resta competitivo e molto più economico. Con la scala, però, i modelli decoder hanno imparato anche a capire: basta formulare il compito come testo da continuare.
| BERT (encoder) | GPT (decoder) | |
|---|---|---|
| Chi vede chi | tutti vedono tutti | ogni token vede solo quelli precedenti |
| Obiettivo | token coperti (MLM), 15% | token successivo, ogni posizione |
| Uscita | un vettore per token | probabilità del token successivo |
| Inferenza | una passata | un ciclo per ogni token generato, con cache KV |
| Adattamento a un compito | testa piccola + fine-tuning | istruzioni nel prompt, esempi, oppure fine-tuning |
| Punto forte | rappresentazioni, ricerca, classificazione a basso costo | generazione, conversazione, ragionamento |
Il Transformer originale (Vaswani e colleghi, 2017) era pensato per la traduzione e aveva due pile: una che legge la frase di partenza, una che scrive quella d'arrivo. BERT ha tenuto solo la prima, GPT solo la seconda. Ne escono tre famiglie.
BERT, RoBERTa, DeBERTa, ModernBERT. Embedding, classificazione, reranking.
GPT, Llama, Qwen, Mistral, DeepSeek, gpt-oss. Quasi tutti i modelli conversazionali.
Transformer originale, T5, BART, Whisper. Traduzione, riassunti, trascrizione.
Nell'encoder-decoder il decoder ha un terzo stadio in ogni blocco, l'attenzione incrociata: oltre a guardare i token che ha già scritto, guarda i vettori prodotti dall'encoder sulla frase di partenza. T5 (Google, 2019) lo allena coprendo interi tratti di testo e chiedendo al decoder di riscriverli.
Il decoder del 2026 è ancora il blocco del 2017, con alcuni pezzi sostituiti da versioni più efficienti. Nessuno cambia l'idea di fondo; cambiano costo, stabilità e lunghezza del contesto.
| Pezzo | Originale | Oggi, di solito | Perché |
|---|---|---|---|
| Posizione dei token | vettori di posizione sommati | RoPE (Rotary Position Embedding): ruota query e key in base alla posizione | codifica la distanza relativa, si estende a contesti più lunghi |
| Normalizzazione | LayerNorm dopo ogni stadio | RMSNorm (Root Mean Square Normalization) prima di ogni stadio | più economica e più stabile con molti blocchi |
| FFN | due matrici, attivazione ReLU | SwiGLU (Swish-Gated Linear Unit): tre matrici, una fa da «cancello» | qualità migliore a parità di parametri |
| Teste di attenzione | ogni testa ha le sue key e value | GQA (Grouped-Query Attention): gruppi di teste condividono key e value | cache KV (key-value) molto più piccola, inferenza più veloce |
| FFN, di nuovo | densa | spesso sostituita da esperti (MoE, Mixture of Experts) | più parametri senza più calcolo per token (capitolo 5) |
Esempio concreto: Qwen3-235B usa 64 teste per le query e solo 4 per key e value; gpt-oss-120b usa gruppi da 8 e RoPE.
Esistono anche architetture che sostituiscono in parte l'attenzione, come i modelli a spazio di stati (SSM, State Space Model, per esempio Mamba) e gli ibridi che alternano i due tipi di strato. Riducono il costo sui contesti lunghi; sono fuori dal perimetro di questa guida.
In un modello denso ogni token attraversa tutti i parametri: con 70 miliardi di pesi, ogni parola prodotta passa per 70 miliardi di pesi. Il costo di calcolo per token cresce quindi insieme alla dimensione del modello: circa 2 × parametri operazioni in virgola mobile (FLOPs, floating point operations) per ogni token generato, una moltiplicazione e una somma per peso.
In un modello sparso a esperti (MoE, Mixture of Experts) la FFN (rete feed-forward) di un blocco viene sostituita da tante FFN alternative, e ogni token ne usa solo alcune. Nascono così due numeri diversi: i parametri totali, che devono stare tutti in memoria, e i parametri attivi, quelli che un token usa davvero e che determinano il costo di calcolo.
È come un ospedale con cento specialisti: sono tutti sul libro paga, ma ogni paziente ne vede due.
| Modello | Totali | Attivi per token | Esperti per strato | Scelti per token |
|---|---|---|---|---|
| Mixtral 8x7B (Mistral AI, 2023) | 46,7 B | 12,9 B | 8 | 2 |
| DeepSeek-V3 (2024) | 671 B | 37 B | 256 + 1 condiviso | 8 + 1 |
| Qwen3-235B-A22B (Alibaba, 2025) | 235 B | 22 B | 128 | 8 |
| Llama 4 Maverick (Meta, 2025) | 400 B | 17 B | 128 + 1 condiviso | 1 + 1 |
| gpt-oss-120b (OpenAI, 2025) | 117 B | 5,1 B | 128 | 4 |
«8x7B» non significa 56 miliardi: gli esperti sostituiscono solo le FFN, mentre attenzione ed embedding sono condivisi. Per questo i totali sono 46,7 B.
Calcolo · quanto costa un token in un modello denso
Calcolo · perché «8x7B» non fa 56 miliardi
Parti da un preset e muovi il numero di esperti e quanti ne sceglie ogni token: guarda come si separano parametri totali (memoria) e attivi (calcolo).
Semplificazioni: attenzione standard da 4·d² per blocco (senza GQA, quindi un po' sovrastimata), FFN SwiGLU da 3 matrici per esperto, vocabolario di 128.000 token con embedding d'ingresso e di uscita separati, tutti i blocchi a esperti. I preset si avvicinano ai modelli reali, con scarti dovuti a queste semplificazioni: tipo Qwen3-235B torna entro pochi punti percentuali; tipo Mixtral ha i totali vicini e gli attivi più alti di circa il 10% (attenzione senza GQA, Grouped-Query Attention, e vocabolario più grande di quello vero); il denso arriva a circa 80 B invece dei 70 di Llama 3 70B, perché l'attenzione senza GQA pesa quasi il doppio. bf16 = 2 byte per peso.
L'idea intuitiva è: un modello, un router all'ingresso che smista la domanda all'esperto giusto. Non funziona così. Non c'è un router davanti e non ci sono esperti interi, ciascuno un modello completo.
Il cambio avviene dentro ogni blocco, e riguarda solo la FFN (Feed-Forward Network, la rete feed-forward del capitolo 1).
Uno strato MoE (Mixture of Experts) ridotto all'osso, per un solo token. Tutto il resto del blocco resta come nel modello denso.
def moe_ffn(h, W_router, esperti, k=2, condiviso=None):
punteggi = h @ W_router # un numero per esperto
prob = softmax(punteggi)
scelti = argsort(prob)[-k:] # ← top-k: gli altri esperti non vengono calcolati
pesi = prob[scelti] / prob[scelti].sum() # rinormalizza tra i soli scelti
y = sum(p * esperti[i](h) for p, i in zip(pesi, scelti))
if condiviso is not None:
y = y + condiviso(h) # lavora per ogni token
return y
No. Il router è la parte visibile, ma per averlo bisogna moltiplicare le FFN in ogni blocco, allenare il router insieme al resto tenendolo in equilibrio, e distribuire gli esperti su più GPU. Attenzione ed embedding restano invece quelli di un modello denso.
Il router non legge la domanda e non conosce argomenti. Lavora su un vettore alla volta: il vettore h di un token, così com'è dopo l'attenzione di quel blocco (e la normalizzazione che precede la FFN). I passi sono questi; il quarto, la rinormalizzazione, è usato da Mixtral, Qwen3 e molti altri, ma non da tutti: Switch Transformer, con un solo esperto per token, e DeepSeek-V2 ne fanno a meno.
Come impara a scegliere. Nessuno etichetta i token con «questo va all'esperto 5». La matrice del router si allena come ogni altro peso: l'errore sul token successivo torna indietro anche attraverso i pesi g, e sposta W in modo che gli esperti che hanno aiutato ricevano punteggi più alti in casi simili.
Che cosa finiscono per rappresentare gli esperti. Non «aree» tematiche. Gli autori di Mixtral hanno misurato come vengono assegnati i token di testi di matematica, biologia, filosofia e articoli scientifici: la distribuzione sugli esperti è quasi la stessa per tutti gli argomenti. Le regolarità sono sintattiche: in Python la parola self passa spesso per lo stesso esperto, i token di indentazione finiscono quasi sempre sugli stessi esperti, e token consecutivi tendono a scegliere gli stessi esperti.
Tocca un token per vedere il calcolo del router. Poi premi «Passo di addestramento» più volte, prima senza bilanciamento e poi con: guarda il carico degli esperti.
Token × esperti · colore = probabilità, riquadro = scelto
Carico: quota dei token assegnati a ciascun esperto
Valori illustrativi: vettori dei token e matrice del router sono numeri casuali fissi, e l'«addestramento» è ridotto alla sola dinamica del carico. In un modello vero h dipende dal contesto, per cui lo stesso token può andare a esperti diversi in frasi diverse; qui due token uguali hanno lo stesso vettore.
Lasciato a sé, il router tende al collasso: un esperto che all'inizio riceve qualche token in più viene allenato di più, diventa più utile, riceve ancora più token. Dopo un po' pochi esperti fanno tutto il lavoro e gli altri sono pesi sprecati, e nel frattempo le GPU (Graphics Processing Unit) che ospitano gli esperti più scelti fanno da collo di bottiglia. Le contromisure principali:
| Tecnica | Come funziona | Dove |
|---|---|---|
| Perdita ausiliaria di bilanciamento | si aggiunge all'errore un termine α · N · Σ fᵢ · Pᵢ (fᵢ = quota di token che l'esperto riceve, Pᵢ = probabilità media che il router gli assegna): è minimo quando il carico è uniforme | Switch Transformer (α = 0,01), molti modelli successivi |
| Capacità per esperto | ogni esperto accetta al massimo (token del batch / esperti) × fattore di capacità; i token in eccesso saltano l'esperto e passano avanti solo con la connessione residua | Switch Transformer, GShard |
| Bias senza perdita ausiliaria | a ogni esperto si somma un bias usato solo per scegliere, non per pesare: si abbassa per chi è sovraccarico e si alza per chi è scarico. Non aggiunge termini al gradiente, quindi disturba la qualità molto meno di una perdita ausiliaria | DeepSeek-V3 (con in più una perdita ausiliaria piccolissima, per sequenza), che così non scarta nessun token |
| Rumore sui punteggi | rumore casuale aggiunto ai punteggi durante l'addestramento, per far provare anche gli esperti meno scelti | Shazeer e colleghi, 2017 (top-k con rumore) |
| Scelta da parte dell'esperto | invertire la domanda: ogni esperto sceglie i suoi k token migliori, così il carico è uniforme per costruzione | Expert Choice (Google, 2022) |
| Architettura | Chi vede chi | Obiettivo | FFN | Esempi | Usata per |
|---|---|---|---|---|---|
| Encoder-only | tutti vedono tutti | token coperti (MLM) | densa | BERT, RoBERTa, ModernBERT | embedding, ricerca, classificazione |
| Decoder-only denso | solo i precedenti | token successivo | densa | GPT-3, Llama 3 | generazione, chat, codice |
| Decoder-only MoE | solo i precedenti | token successivo | k esperti su N per token, in ogni blocco MoE | Mixtral, DeepSeek-V3, Qwen3-235B, gpt-oss | come il denso, con più parametri allo stesso costo per token |
| Encoder-decoder | encoder: tutti; decoder: precedenti + attenzione incrociata | ricostruire o tradurre un testo | densa (o MoE) | T5, BART, Whisper | traduzione, riassunti, trascrizione |