Salta al contenuto principale

Dentro la Testa di un Modello di Intelligenza Artificiale: Come Funziona un Transformer

Profile picture for user luca77king

Immagina di voler insegnare a una macchina a capire il linguaggio umano. Non puoi semplicemente scriverle “ciao, come va?” e aspettarti che capisca come un essere umano. Le parole, per lei, non esistono. Quello che esiste sono solo numeri. Tutto parte da lì. Un modello non sa niente di semantica o grammatica. Ma se gli dai i numeri giusti, quelli che hanno senso per lui, inizia a tirare fuori cose assurde: risposte, riepiloghi, traduzioni, battute pessime. Ecco perché dobbiamo iniziare dagli embedding.

Embedding

Gli embedding sono il modo con cui una parola, un pezzo di parola o una sillaba viene trasformata in un insieme di numeri. Pensa di avere la parola “cane”. Un modello non sa cosa vuol dire, ma la può rappresentare con 768 numeri. Tipo una lista lunghissima del tipo [0.23, -0.45, 0.12, ...]. Ogni parola ha il suo vettore. E la cosa figa è che parole simili stanno vicine nello spazio. “Cane” sarà vicino a “gatto”, ma lontano da “frigorifero”. Se disegnassimo tutto su una mappa, sembrerebbe una città fatta di parole, con quartieri semantici: animali da una parte, frutta da un'altra, parolacce tutte in periferia.

Positional Encoding

Ma attenzione: questi numeri non dicono niente sull’ordine delle parole. E quindi, per un modello, “mangia il cane” e “il cane mangia” sono la stessa cosa. E qui arriva il positional encoding, il trucco per dare un senso temporale. Ogni parola riceve un’indicazione sulla sua posizione nella frase. Non è tipo “prima”, “seconda”, “terza”, ma sono altri numeri, con funzioni sinusoidali o valori imparati, che vengono sommati all’embedding. Così “cane” in posizione 2 è diverso da “cane” in posizione 4. È come dire che non solo ti dico chi sei, ma anche dove sei e cosa stavi facendo.

Encoder

A questo punto hai una sequenza di vettori che rappresentano le parole, ognuna con il suo significato e la sua posizione. Ma tutto questo non basta. Serve un cervello. Qualcosa che guardi la frase e capisca cosa sta succedendo. Questo è l’encoder.

L’encoder è come un interprete che prende tutta la frase in input e cerca di capire come ogni parola si relaziona alle altre. Lo fa usando un meccanismo chiamato self-attention. In pratica, ogni parola guarda tutte le altre e chiede: “quanto sei importante per me?”. Se leggi “il cane mangia l’osso”, la parola “mangia” si concentra su “cane” e “osso” perché sono le più rilevanti. Il modello calcola pesi, fa moltiplicazioni, aggiustamenti, normalizzazioni, e sputa fuori un nuovo set di vettori, ma stavolta contestualizzati. La parola “cane” non è più solo “animale quadrupede”, è “il soggetto che compie l’azione di mangiare”.

Encoder Layer

Questo processo viene ripetuto in più strati. Ogni strato è un encoder layer, una scatola nera che rifà lo stesso procedimento ma con input sempre più raffinati. Più strati hai, più il modello diventa profondo, e più è capace di cogliere sfumature. È come leggere una frase dieci volte: la prima capisci il senso generale, la decima cogli ironia, tono e contesto.

Quando hai finito con l’encoder, se il tuo obiettivo è classificare o rispondere sì o no, ti fermi. Ma se vuoi generare qualcosa, tipo tradurre, continuare una frase o scrivere un post su Facebook, ti serve un altro pezzo: il decoder.

Decoder

Il decoder è come uno scrittore che parte da un’idea e comincia a costruire una frase. Però ha bisogno di sapere due cose: cosa ha scritto finora e cosa gli ha detto l’encoder. Prende i token già generati e li guarda con la masked self-attention, che gli impedisce di sbirciare nel futuro. Non puoi scrivere una parola basandoti su una che ancora non esiste, altrimenti il modello barerebbe.

Poi usa la cross-attention per guardare cosa ha prodotto l’encoder. È come se dicesse: “ok, io sto scrivendo una frase, ma fammi vedere cosa c’era nell’input, così posso essere coerente”. E da lì in poi, un token alla volta, genera la risposta. Ogni parola generata viene data in pasto al decoder per generare quella dopo. Questo è il motivo per cui a volte i modelli sembrano pensare piano: generano una parola alla volta, in sequenza, con ogni passaggio che dipende dai precedenti.

Differenze tra varie architetture di modelli

Non tutti i modelli hanno encoder e decoder. BERT, per esempio, ha solo encoder. Viene usato per capire e analizzare, non per generare. GPT ha solo decoder: prende un prompt e scrive. T5 ha entrambi: legge e genera, come un traduttore universale. LSTM invece, i vecchi modelli, funzionano in modo sequenziale, parola per parola, senza positional encoding, ma con memoria temporale incorporata. Sono più lenti e meno potenti, ma ancora usati in contesti più semplici o leggeri.

Tutti questi componenti – embedding, positional encoding, encoder, decoder – sono come pezzi di una macchina da scrivere aliena. Ognuno fa una cosa precisa, ognuno trasforma l’informazione in modo diverso. E messi insieme fanno magie. Non perché capiscano davvero, ma perché statisticamente sanno quali parole vanno con quali altre, in quale ordine, con quale peso. Alla fine il risultato sembra intelligenza ma sotto c'è solo matematica.