Quando si parla di intelligenza artificiale generativa, prima o poi ci si imbatte nel termine Transformer. È l'architettura alla base di modelli linguistici come GPT e rappresenta uno dei passaggi tecnologici più importanti nell'evoluzione dell'intelligenza artificiale.

Il Transformer è stato introdotto nel 2017 dai ricercatori di Google nel paper Attention Is All You Need. La sua caratteristica più importante è un meccanismo chiamato Attention, che permette alla rete neurale di elaborare le relazioni tra i diversi elementi di una sequenza.

Per capire perché questa innovazione sia così importante, dobbiamo partire da un problema apparentemente semplice: comprendere una frase. Quando leggiamo "Luca mangia una mela", non ci limitiamo a riconoscere quattro parole. Colleghiamo tra loro le informazioni, riconosciamo chi compie l'azione e identifichiamo l'oggetto coinvolto.

Un modello linguistico deve fare qualcosa di analogo a livello computazionale. Non possiede una comprensione umana del linguaggio, ma impara a elaborare rappresentazioni numeriche dei token e a individuare relazioni statistiche tra di essi. Il meccanismo di Self-Attention serve proprio a questo.

In questa guida vedremo come funziona, concentrandoci soprattutto sui tre elementi fondamentali dell'Attention: Query, Key e Value. Per comprenderli non partiremo dalle formule, ma da un esempio concreto che ci accompagnerà durante tutta la spiegazione.

Che cos'è il Transformer

Il Transformer è un'architettura di rete neurale progettata per elaborare sequenze di dati. Nel caso dei modelli linguistici, queste sequenze sono composte da token, cioè unità di testo che possono corrispondere a parole intere, parti di parole o altri elementi riconosciuti dal tokenizer.

Prima di arrivare all'Attention, il testo viene sottoposto a una serie di trasformazioni. Il tokenizer suddivide la frase in token e assegna a ciascuno un identificativo numerico. Successivamente, attraverso il processo di embedding, ogni token viene trasformato in un vettore numerico, ovvero una rappresentazione che la rete neurale può elaborare.

Consideriamo ancora la frase: “Luca mangia una mela”.

Per semplicità immaginiamo che il tokenizer produca quattro token:

  • Luca
  • mangia
  • una
  • mela

In realtà, la tokenizzazione dipende dal modello e non è detto che ogni parola corrisponda a un singolo token. A questo punto abbiamo una sequenza di rappresentazioni numeriche. Il problema è che conoscere i singoli token non basta: il modello deve anche elaborare le relazioni tra loro. È qui che entra in gioco la Self-Attention.

Che cos'è la Self-Attention

La Self-Attention è un meccanismo in cui ogni token prende in considerazione gli altri token della sequenza per costruire una rappresentazione contestualizzata.

Torniamo alla nostra frase. Immaginiamo che il modello stia elaborando il token "mangia". Per interpretare correttamente il contesto, può essere utile considerare "Luca", perché rappresenta il soggetto dell'azione, ma anche "mela", perché rappresenta l'oggetto coinvolto. Il modello deve quindi stabilire quali informazioni presenti nella sequenza siano più rilevanti per elaborare il token corrente.

Non tutte le parole hanno necessariamente lo stesso peso. Alcune possono essere particolarmente importanti, altre meno. La Self-Attention calcola proprio questi pesi attraverso un'operazione matematica che mette in relazione le rappresentazioni dei token. Per farlo utilizza tre componenti: Query, Key e Value.

Query, Key e Value: i tre protagonisti dell'Attention

Questi tre termini sono spesso presentati attraverso formule matematiche, ma il loro funzionamento diventa molto più intuitivo se utilizziamo una metafora. Immaginiamo che ogni token sia una persona all'interno di una stanza. Ogni persona possiede una scheda identificativa e mette a disposizione alcune informazioni. Ora immaginiamo che il token "mangia" voglia raccogliere informazioni utili dagli altri token.

Query rappresenta ciò che il token sta cercando.

È la richiesta di informazioni che il token corrente utilizza per confrontarsi con gli altri elementi della sequenza. Nel nostro esempio, possiamo immaginare che "mangia" cerchi informazioni utili a contestualizzare l'azione. Potrebbe essere importante individuare chi la compie e quale oggetto è coinvolto.

Key rappresenta ciò che ogni token mette a disposizione per essere confrontato.

Ogni token possiede una propria Key. Il modello confronta la Query del token corrente con le Key degli altri token per stabilire quali siano maggiormente pertinenti. Nel nostro esempio, la Key associata a "Luca" potrebbe risultare particolarmente rilevante per la Query di "mangia". Anche quella di "mela" potrebbe avere un peso significativo.

Value rappresenta l'informazione che ogni token può fornire.

Una volta individuati i token più pertinenti attraverso il confronto tra Query e Key, il modello utilizza i rispettivi Value per costruire una nuova rappresentazione contestualizzata.

Possiamo riassumere i tre concetti in questo modo:

  • Query: cosa sto cercando?
  • Key: quanto sono pertinente rispetto a ciò che stai cercando?
  • Value: quale informazione posso fornirti?

La metafora del motore di ricerca è particolarmente utile. Query è la ricerca che effettuiamo, Key permette di individuare i risultati pertinenti e Value contiene le informazioni recuperate.

Naturalmente, dobbiamo ricordare che si tratta di una semplificazione. Nel Transformer non esistono domande scritte in linguaggio naturale, schede identificative o informazioni organizzate come in un database. Si tratta di vettori numerici prodotti attraverso trasformazioni matematiche apprese durante l'addestramento.

Come funziona concretamente il confronto

Vediamo cosa succede quando il modello elabora "Luca mangia una mela". Ogni token viene trasformato in tre vettori: Query, Key e Value. Queste rappresentazioni vengono calcolate attraverso tre trasformazioni lineari, basate su matrici di pesi apprese durante l'addestramento.

Per il token "mangia" abbiamo quindi una Query. Per tutti i token della sequenza abbiamo invece le rispettive Key e Value. Il modello confronta la Query di "mangia" con le Key degli altri token. Questo confronto avviene attraverso un prodotto scalare tra vettori. Il risultato è un punteggio, chiamato attention score, che misura quanto una determinata Key sia compatibile con la Query considerata.

Più alto è il punteggio, maggiore sarà il peso assegnato a quel token nel calcolo successivo. I punteggi vengono normalmente trasformati in pesi attraverso una funzione chiamata Softmax, che produce valori positivi la cui somma è pari a uno.

Immaginiamo di ottenere questi risultati puramente illustrativi:

TokenPeso di attenzione
Luca0,40
mangia0,15
una0,10
mela0,35

In questo esempio, il modello assegna maggiore attenzione a "Luca" e "mela". Attenzione: questi numeri non sono probabilità che una parola sia il soggetto o l'oggetto della frase. Sono pesi utilizzati per combinare le informazioni contenute nei Value.

A questo punto avviene il passaggio fondamentale: il modello moltiplica ciascun Value per il relativo peso di attenzione e combina i risultati. Il risultato è una nuova rappresentazione numerica del token "mangia", arricchita dalle informazioni provenienti dagli altri token. In altre parole, il modello non sta più considerando soltanto la rappresentazione iniziale di "mangia", ma una rappresentazione che tiene conto anche del contesto.

La formula dell'Attention

Ora che abbiamo compreso il funzionamento concettuale, possiamo introdurre la formula matematica che descrive il meccanismo.

La Scaled Dot-Product Attention è espressa così:

Attention(Q, K, V) = softmax((Q × Kᵀ) / √dₖ) × V

Non dobbiamo spaventarci davanti alla formula. Ogni elemento corrisponde a qualcosa che abbiamo appena visto.

Q rappresenta le Query, K le Key e V i Value.

Il prodotto tra Q e la trasposta di K permette di calcolare i punteggi di attenzione tra i token. La divisione per la radice quadrata della dimensione delle Key serve a mantenere sotto controllo la scala dei punteggi, evitando che diventino eccessivamente grandi. Successivamente interviene Softmax, che trasforma i punteggi in pesi normalizzati. Infine, questi pesi vengono applicati ai Value per ottenere le nuove rappresentazioni contestualizzate.

La formula descrive quindi esattamente il processo che abbiamo raccontato attraverso il nostro esempio.

Multi-Head Attention: perché utilizzare più attenzioni?

Finora abbiamo immaginato un solo meccanismo di attenzione, ma il Transformer utilizza una tecnica chiamata Multi-Head Attention. L'idea è semplice: invece di effettuare un unico confronto tra Query, Key e Value, il modello utilizza più attention head in parallelo.

Ogni head possiede le proprie matrici di trasformazione e può imparare a elaborare relazioni differenti tra i token. Nel nostro esempio, una head potrebbe attribuire particolare rilevanza alla relazione tra "Luca" e "mangia", mentre un'altra potrebbe concentrarsi maggiormente sulla relazione tra "mangia" e "mela".

Non dobbiamo però immaginare che ogni head abbia necessariamente un compito linguistico preciso. Le specializzazioni emergono durante l'addestramento e possono essere molto più articolate. I risultati delle diverse head vengono combinati attraverso ulteriori trasformazioni matematiche.

Il vantaggio è che il modello può considerare contemporaneamente diversi aspetti delle relazioni presenti nella sequenza.

Dal risultato dell'Attention alla previsione del prossimo token

A questo punto abbiamo capito come il Transformer elabora il contesto, ma dobbiamo ancora collegare tutto al funzionamento di GPT.

GPT utilizza un'architettura di tipo Decoder-only. Questo significa che elabora le sequenze attraverso un meccanismo di attenzione causale: durante la generazione può utilizzare i token precedenti, ma non può guardare quelli successivi che ancora non sono stati generati.

Le rappresentazioni prodotte dall'Attention attraversano ulteriori componenti della rete, tra cui le Feed Forward Network, che elaborano le informazioni attraverso trasformazioni non lineari.

Questi blocchi vengono ripetuti numerose volte, permettendo al modello di costruire rappresentazioni progressivamente più elaborate.

Alla fine, una trasformazione finale produce i logits, ovvero i punteggi associati ai possibili token successivi del vocabolario.

Attraverso Softmax possiamo ottenere una distribuzione di probabilità. Il sistema di generazione utilizza questa distribuzione per selezionare il token successivo, secondo la strategia di decoding adottata.

Il token selezionato viene aggiunto al contesto e il processo continua.

È proprio così che GPT riesce a generare una frase, una risposta articolata o persino un programma software.