Introduzione
Questo articolo rappresenta un ulteriore passo nel nostro percorso volto a esplorare e mettere in luce il funzionamento interno e le caratteristiche dei Large Language Models (LLM). Nel precedente articolo abbiamo discusso di come i modelli linguistici rappresentino parole come vettori n-dimensionali, noti come embedding. Questi vettori catturano le relazioni semantiche tra le parole, permettendo ai computer di elaborare e analizzare il linguaggio in forma numerica. Apposite funzioni matematiche trasformano il testo in questi vettori numerici consentendo ai modelli LLM di comprendere e “ragionare” meglio sul linguaggio umano.
In questo articolo ci concentriamo sull’architettura Transformer (TA), ideata presso Google e descritta nell’influente articolo Attention Is All You Need [Vaswani et al., 2023] pubblicato per la prima volta nel 2017.
Il Transformer è un’architettura di rete neurale che si basa interamente sui meccanismi di attenzione per identificare le relazioni tra le diverse parti di una sequenza in ingresso. Originariamente progettato per compiti di sequence-to-sequence (Seq2Seq), come la traduzione automatica, la TA si è dimostrata efficace in un’ampia gamma di attività di elaborazione del linguaggio naturale (NLP). Sostituendo i tradizionali strati ricorrenti (come le reti Long Short-Term Memory) con meccanismi di attenzione, il Transformer ottiene una migliore parallelizzazione e quindi prestazioni superiori.
La TA ha rivoluzionato la progettazione dei grandi modelli linguistici, al punto che praticamente tutti i moderni LLM implementano una qualche variazione di questa architettura. In questo articolo focalizziamo l’attenzione sui requisiti di base che hanno dato luogo alla progettazione della TA. Nel prossimo articolo presenteremo la TA sia di alto livello, sia nei suoi dettagli.
Requisiti fondamentali
Prima di addentrarci nei dettagli dell’architettura Transformer (TA), comprendiamo anzitutto i principali requisiti che stanno alla base del suo design.
1. Elaborazione dell’input consapevolmente al contesto
Requisito: Il modello deve essere in grado di focalizzarsi su diverse parti della sequenza di input quando elabora token (input), andando oltre un approccio di elaborazione strettamente sequenziale. Questa capacità è essenziale per comprendere le relazioni tra le parole, anche quando sono lontane nella sequenza.
Motivazione: Questa caratteristica consente al modello di catturare in modo efficace le dipendenze e le relazioni a lungo raggio all’interno dei dati, il che è fondamentale per compiti come traduzione, sintesi di testi e risposta a domande. Aiuta il modello a comprendere il contesto e le relazioni tra le parole, anche se sono separate da altre parole nella sequenza. Questo meccanismo risolve un limite di diversi modelli tradizionali che spesso faticano a mantenere l’accuratezza durante l’elaborazione di testi lunghi e/o complessi.
Soluzione: Il meccanismo di auto-attenzione è un’innovazione fondamentale della TA, che affronta direttamente questo requisito consentendo al modello di pesare dinamicamente l’importanza di diverse parti della sequenza di input.
Ad esempio, considerando la frase:
“The dog sat on the mat because it was comfortable”
il modello deve comprendere le relazioni tra le parole, anche se sono distanti nella frase. In particolare, il modello può apprendere che “cane” e “tappeto” sono correlati, nonostante siano separati da altre parole.
2. Elaborazione parallela della sequenza di Input
Requisito: Il modello deve essere in grado di analizzare le sequenze di input da più prospettive simultaneamente, catturando relazioni e schemi diversi tra i token per migliorare la propria comprensione di sequenze complesse (o più in generale di dati complessi). Questo requisito si basa sul precedente: anziché calcolare un unico set di punteggi di attenzione (attention scores), il modello deve calcolare più set (o “heads”) di punteggi in parallelo. Ogni head è progettata per concentrarsi su diversi aspetti della sequenza di input.
Motivazione: Implementare questo requisito consente al modello di focalizzarsi su varie parti della sequenza di input contemporaneamente, apprendendo diversi aspetti delle relazioni tra i token.
Ad esempio:
- un head potrebbe focalizzarsi sulle dipendenze a breve raggio, come le relazioni tra parole adiacenti;
- un’altra head potrebbe focalizzarsi sulle dipendenze a lungo raggio, come le connessioni tra parole lontane nella sequenza;
- altre head potrebbero catturare diverse caratteristiche linguistiche, come sintassi, semantica o relazioni posizionali.
Ad esempio, considerando la succitata frase:
“The dog sat on the mat because it was comfortable”.
- La head 1 potrebbe concentrarsi sulle dipendenze a breve raggio, ad esempio la relazione tra “the” e “dog” o “sat” e “on”. Questo aiuta il modello a comprendere la struttura di base della frase (p.e., soggetto – verbo – oggetto).
- La head 2 potrebbe concentrarsi sulle dipendenze a lungo raggio, come la relazione tra “it” e “mat”, aiutando il modello a capire che “esso” si riferisce al “tappeto” e non al “cane.”
- La head 3 potrebbe concentrarsi su relazioni causali, come la connessione tra “perché” e “comodo.”
Combinando queste diverse prospettive, l’attenzione multi-head consente al modello di comprendere appieno il significato della frase, inclusa la sua struttura, il contesto e le relazioni tra le parole, anche quando sono distanti. Questo approccio è significativamente più efficace rispetto a un singolo meccanismo di attenzione, che potrebbe trascurare alcune di queste sfumature. Questa elaborazione parallela consente al modello di costruire una comprensione più ricca e sfumata dell’input, particolarmente critica per compiti come traduzione, sintesi e risposta a domande, dove il contesto e i molteplici livelli di significato sono essenziali.
Soluzione: l’attenzione multi-head è un componente chiave della TA che consente al modello di processare sequenze di input in parallelo applicando simultaneamente diversi i meccanismi di attenzione multipli.
3. Position encoding / Codifiche posizionali
Requisito: Il modello deve essere in grado di codificare e mantenere l’ordine dei token in una sequenza. Questo è conseguenza logica dei requisiti precedenti, che indicano che il modello debba elaborare le sequenze di input in parallelo (a differenza delle RNN, che elaborano le sequenze in modo sequenziale).
Motivazione: Il modello deve comprendere l’ordine delle parole, poiché questo è essenziale per catturare il significato delle frasi e le relazioni tra i token. Senza questa capacità, il modello avrebbe difficoltà a interpretare il contesto e la struttura dell’input.
Soluzione: Positional Encoding (codifiche posizionali). Le codifiche posizionali sono vettori numerici (non semplici indici) aggiunti a ciascun embedding di token per fornire informazioni sulla posizione di ciascun token in una sequenza. Poiché i trasformatori elaborano le sequenze di input in parallelo, vengono a mancare di un “senso” dell’ordine. Le codifiche posizionali affrontano questa limitazione codificando le informazioni posizionali nell’input. Queste codifiche sono tipicamente generate utilizzando funzioni sinusoidali (seno e coseno). Le funzioni sinusoidali aiutano il modello a imparare e rappresentare le posizioni relative (relazioni lineari) senza aumentare la complessità dei calcoli. Sono fondamentali per consentire ai trasformatori di comprendere l’ordine e le relazioni tra i token in una sequenza.
4. Capacità di identificare pattern complessi
Requisito: Il modello deve essere in grado di identificare modelli complessi nei dati. Mentre il meccanismo di attenzione elabora l’input e identifica le relazioni tra i token, sono necessarie ulteriori trasformazioni dei dati per catturare modelli e caratteristiche più intricate.
Motivazione: Per migliorare la capacità del modello di apprendere e rappresentare relazioni complesse nei dati, è essenziale trasformare ulteriormente le rappresentazioni di input prodotte dal meccanismo di attenzione in caratteristiche più ricche e astratte.
Soluzione: Strati Feed-Forward. Sono strati di rete neurale completamente connessi applicati indipendentemente a ciascuna posizione nella sequenza. Funzionano come strati di trasformazione posizionale che migliorano le caratteristiche di ciascun token in modo indipendente. Gli strati sono costituiti da due trasformazioni lineari con una funzione di attivazione non lineare (tipicamente ReLU) nel mezzo. Gli strati feed-forward trasformano le rappresentazioni di input del meccanismo di attenzione in caratteristiche più astratte ed espressive. Poiché operano su ciascuna posizione del token in modo indipendente, sono computazionalmente efficienti e possono essere eseguiti in parallelo. Questi strati sono fondamentali per identificare pattern complessi e, in generale, relazioni presenti nei dati, lavorando in sinergia con il meccanismo di auto-attenzione per migliorare le prestazioni complessive del modello.
Meccanismo di Self-Attention (auto-attenzione)
Prima di procedere oltre, cerchiamo di comprendere nel dettaglio come funziona il meccanismo di self-attention. Sebbene sia sufficiente una comprensione ad alto livello, questo paragrafo offre una spiegazione più approfondita per fornire una maggiore chiarezza.
Embeddings / Rappresentazione dei token
Ogni parola della frase è rappresentata o associata ad un vettore (il suo embedding).
Calcolo di Q, K e V
Per ogni embedding, il modello calcola tre vettori:
- Query (Q): ciò che questa posizione vuole recuperare.
- Key (K): ciò che questa posizione offre alle altre.
- Value (V): l’informazione da aggregare da questa posizione.
Punteggio di attenzione / Attention Scores
Il punteggio di attenzione di un token viene calcolato confrontando il suo vettore Query con i vettori Key di tutti gli altri token della sequenza. Questo punteggio determina quanta attenzione ogni token deve dedicare agli altri.
Valori pesati
I punteggi di attenzione vengono poi usati per pesare i vettori Value (tramite la funzione SoftMax), producendo una rappresentazione contestuale di ogni token.
Analogia: una squadra di calcio
Per comprendere meglio il self–attention e i ruoli di Q, K e V, immaginiamo una squadra di calcio in cui ogni giocatore rappresenta una parola in una frase.
1. Query (Q): cosa sto cercando di fare?
Il Query può essere visto come l’obiettivo o l’intenzione di un giocatore in campo. Ad esempio:
- Il Query dell’attaccante è: “Chi può aiutarmi a segnare?”
- Il Query del centrocampista è: “Chi è nella posizione migliore per ricevere un passaggio?”
- Il Query del difensore è: “Quale avversario devo bloccare?”
Ogni giocatore (token) ha il proprio Query, che definisce ciò che cerca nel gioco.
2. Key (K): cosa posso offrire alla squadra?
Il Key rappresenta le abilità di ciascun giocatore: ciò in cui è bravo e cosa può mettere a disposizione della squadra. Ad esempio:
- Il Key dell’attaccante potrebbe essere: “Sono bravo a segnare.”
- Il Key del centrocampista potrebbe essere: “Sono bravo nei passaggi e nella creazione di occasioni.”
- Il Key del difensore potrebbe essere: “Sono bravo a bloccare e intercettare.”
Ogni giocatore (token) ha il proprio Key, che indica agli altri cosa può offrire.
3. Value (V): quale informazione fornisco?
Il Value corrisponde all’azione o al contributo effettivo del giocatore durante il gioco: il vero output del suo ruolo. Ad esempio:
- Il Value dell’attaccante potrebbe essere: “Sono in una buona posizione per segnare: passatemi la palla!”
- Il Value del centrocampista potrebbe essere: “Vedo spazio sulla fascia: lancio la palla verso l’esterno.”
- Il Value del difensore potrebbe essere: “Sto marcando questo avversario: non preoccuparti di lui.”
Ogni giocatore (parola) ha il proprio Value, cioè l’informazione che realmente viene data alla squadra.
Come si integra tutto insieme
Supponiamo ora che l’attaccante (che rappresenta una parola nella frase) stia decidendo a chi passare la palla. Il meccanismo di self-attention funziona così.
- L’attaccante (Query) osserva i Key degli altri giocatori per capire chi è nella posizione migliore per aiutarlo a fare gol.
- Confronta il suo Query con il Key del centrocampista e nota che è ben posizionato per far avanzare l’azione.
- Confronta il suo Query con il Key del difensore e capisce che non gli è utile a segnare.
- L’attaccante assegna punteggi di attenzione in base a quanto ciascun Key corrisponde al suo Query.
- Il centrocampista riceve un punteggio alto perché il suo Key (abilità nei passaggi) si allinea con il Query dell’attaccante.
- Il difensore riceve un punteggio basso perché il suo Key non è rilevante per segnare.
- L’attaccante usa i Value degli altri giocatori per decidere cosa fare.
- Il Value del centrocampista potrebbe essere: “Sono in una buona posizione per passare all’ala.”
- Il Value dell’ala potrebbe essere: “Sono libero e pronto a ricevere.”
- L’attaccante combina questi Value (pesati dagli attention scores) per scegliere la migliore azione possibile.
Esempio numerico
Vediamo di seguito di trasformare in un esempio numerico quanto detto fin qui.
1. Rappresentazione dell’input: embeddings
ll primo passo consiste nel rappresentare ogni parola della frase come il corrispondente vettore. Supponiamo i seguenti (ipotetici) embeddings per ogni parola:
- “The” → [1, 0, 0]
- “dog” → [0, 1, 0]
- “sat” → [0, 0, 1]
- “on” → [1, 1, 0]
- “the” → [0, 1, 1]
- “mat” → [1, 0, 1]
Questi embeddings vengono appresi dal modello durante l’addestramento e rappresentano il significato semantico di ciascuna parola.
2. Calcolo dei vettori Query, Key, and Value:
Questi vettori vengono calcolati moltiplicando gli embeddings delle parole per matrici di pesi appresi.
Per semplicità, supponiamo i seguenti (ipotetici) vettori per la parola “dog”:
- Query (Q): [0.2, 0.8, 0.1]
- Key (K): [0.5, 0.3, 0.7]
- Value (V): [0.6, 0.9, 0.4]
Ogni parola della frase avrà i propri vettori Q, K e V.
3. Calcolo dei punteggi di attenzione (Attention Scores)
Per determinare quanto la parola “dog” debba “prestare attenzione” a ciascuna delle altre parole, si calcola il prodotto scalare (presentato nell’articolo precedente) tra:
- Q(dog) * K(altra parola)
Ad esempio:
- Score(“dog”, “The”) = Q(dog) * K(The)
- Score(“dog”, “dog”) = Q(dog) * K(dog)
- Score(“dog”, “sat”) = Q(dog) * K(sat)
- Score(“dog”, “on”) = Q(dog) * K(on)
- Score(“dog”, “the”) = Q(dog) * K(the)
- Score(“dog”, “mat”) = Q(dog) * K(mat)
Più alto è il punteggio, più quella parola è rilevante per “dog”.
Il prodotto scalare fornisce un valore scalare per ogni coppia di parole, che rappresenta quanto “dog” dovrebbe concentrarsi su quella parola.
4. Normalizzazione Softmax
I punteggi grezzi di attenzione vengono passati attraverso una funzione Softmax per convertirli in probabilità (pesi) che sommano a 1. In altre parole, la funzione Softmax prende come input il prodotto scalare scalato delle matrici Query (Q) e Key (K).
Questi pesi rappresentano quanto “dog” dovrebbe prestare attenzione a ciascuna parola nella frase. La funzione Softmax genera una matrice di pesi di attenzione, dove ogni riga è una distribuzione di probabilità sui token della sequenza, indicando quanto ogni token dovrebbe prestare attenzione agli altri. Questi pesi di attenzione vengono quindi utilizzati per calcolare una somma ponderata dei vettori Value (V), che costituisce l’output finale del meccanismo di self-attention.
Esempio (ipotetico) di Softmax:
- Weight(“dog”, “The”) = 0.1
- Weight(“dog”, “dog”) = 0.5
- Weight(“dog”, “sat”) = 0.2
- Weight(“dog”, “on”) = 0.1
- Weight(“dog”, “the”) = 0.05
- Weight(“dog”, “mat”) = 0.05
Questo significa che “dog” si concentra principalmente su se stesso (0.5) e in parte su “sat” (0.2), mentre le altre parole ricevono meno attenzione.
5. Somma ponderata dei vettori Value:
Il modello utilizza questi pesi per calcolare una somma ponderata dei vettori Value (V) di tutte le parole. Questo fornisce la rappresentazione finale di “dog” nel contesto dell’intera frase.
Ad esempio,
- La rappresentazione finale di “dog” = (0.1 × V(The)) + (0.5 × V(dog)) + (0.2 × V(sat)) + (0.1 × V(on)) + (0.05 × V(the)) + (0.05 × V(mat))
Questo nuovo vettore per la parola “dog” contiene ora informazioni su come essa si relaziona alle altre parole della frase.
6. Iterazione per tutte le parole
Lo stesso processo viene ripetuto per ogni parola della frase. Ad esempio, quando si elabora “sat”, il modello calcolerà quanta attenzione “sat” dovrebbe dare a “The”, “dog”, “on”, “the” e “mat”. Questo garantisce che la rappresentazione finale di ciascuna parola sia consapevole del contesto e catturi le relazioni con le altre parole della frase.
Tirando le somme
Nella frase “The dog sat on the mat”, il meccanismo di self-attention aiuta il modello a comprendere relazioni come:
- “dog” è il soggetto che compie l’azione “sat”;
- “mat” è l’oggetto/luogo dell’azione;
- le due occorrenze di “the” si riferiscono a nomi diversi e quindi hanno ruoli contestuali differenti.
Usando la self-attention, il modello può concentrarsi selettivamente sulle parti più rilevanti della frase, permettendogli di catturare significato e relazioni in modo più efficace.
Conclusioni
La Transformer Architecture è una rete neurale progettata specificamente per compiti di NLP (Natural Language Processing). A differenza di modelli meno recenti come le RNN (Recurrent Neural Networks) e le LSTM (Long Short-Term Memory networks), l’architettura Transformer elabora i dati sequenziali, come il testo, in parallelo anziché parola per parola, rendendol tale processo significativamente più efficiente.
I servizi chiave che una TA deve implementare includono:
- Catturare le relazioni tra i token. Ciò è possibile grazie al Self-Attention Mechanism, che permette al modello di comprendere le dipendenze tra le parole.
- Concentrarsi su molteplici aspetti dell’input. Ciò è ottenuto grazie alla Multi-Head Attention, che elabora diverse relazioni in parallelo.
- Fornire informazioni sull’ordine dei token. Ciò è gestito dal Positional Encoding, che codifica l’ordine sequenziale dei token.
- Apprendere pattern complessi. Ciò è realizzato attraverso i Feed-Forward Layers, che trasformano le rappresentazioni dei token.
- Stabilizzare e accelerare l’addestramento. Ciò è gestito dalla Layer Normalization, che assicura distribuzioni di input consistenti per ogni livello.
- Mantenere le informazioni e migliorare il flusso del gradiente. Ciò è possibile grazie alle varie Residual Connections, che aiutano a preservare le informazioni dai livelli precedenti.
- Facilitare i compiti sequence-to-sequence:. La struttura Encoder-Decoder si occupa di ciò, essenziale per compiti come la traduzione automatica.
- Elaborare efficientemente grandi dataset. Questo servizio è ottenuto tramite alla scalabilità e parallelismo dell’architettura, che permettono al modello di elaborare i token simultaneamente.
- Convertire il testo in rappresentazioni numeriche. La conversione del test avviene attraverso la Tokenization e successiva trasformazione nei vettori Embedding, che trasformano il testo in un formato numerico elaborabile dal modello.
- Generare predizioni o output. Questi servizi sono implementati dall’Output Layer, che produce i risultati finali.
Tutti questi componenti lavorano insieme per rendere la Transformer Architecture uno strumento potente e versatile per una vasta gamma di compiti, dalla traduzione automatica alla generazione di testo e oltre. La TA è particolarmente adatta per gli LLM (Large Language Models) per diverse ragioni:
- Parallelizzazione: a differenza di altre architetture come le RNN, i Transformer elaborano i token simultaneamente, consentendo un addestramento efficiente su larga scala.
- Comprensione contestuale: il meccanismo di self-attention cattura le relazioni tra le parole, indipendentemente dalla loro distanza nella sequenza. Superando un limite dei modelli precedenti che spesso presentavano problemi di accuratezza nel processamento di lunghi testi.
- Scalabilità: le prestazioni dei Transformer migliorano in modo prevedibile all’aumentare della dimensione del modello e della quantità di dati di addestramento, seguendo “leggi di scala” (scaling laws) ben progettate.
- Transfer Learning: i Transformer pre-addestrati possono essere perfezionati (fine-tuned) per un’ampia varietà di compiti a valle (downstream tasks), rendendoli altamente adattabili e riutilizzabili.
In sintesi, la TA ha di fatto rivoluzionato l’NLP fornendo un framework robusto, scalabile ed efficiente per la comprensione e la generazione del linguaggio umano. La sua capacità di elaborare grandi dataset, catturare relazioni complesse e adattarsi a diversi compiti la rende la spina dorsale dei moderni Large Language Models.
Riferimenti
[Vaswani et al., 2023] Ashish Vaswani – Noam Shazeer – Niki Parmar – Jakob Uszkoreit – Llion Jones – Aidan N. Gomez – Łukasz Kaiser – Illia Polosukhin, Attention is all you need. 2 August 2023,
https://arxiv.org/pdf/1706.03762.pdf
[Devlin, J., et al., 2018] Jacob Devlin – Ming-Wei Chang – Kenton Lee – Kristina Toutanova, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.
https://arxiv.org/abs/1810.04805
[Google Gemini Team, 2023] Google Gemini Team, Gemini: A Family of Highly Capable Multimodal Models.
https://arxiv.org/abs/2312.11805
[Radford, A. et al., 2018] Alec Radford – Jeffrey Wu – Rewon Child – David Luan – Dario Amodei – Ilya Sutskever, Language Models are Unsupervised Multitask Learners”.
https://t.ly/4RI02
[Touvron, H., et al., 2023] Hugo Touvron – Thibaut Lavril – Gautier Izacard – Xavier Martinet – Marie-Anne Lachaux – Timothée Lacroix – Baptiste Rozière – Naman Goyal, – Eric Hambro – Faisal Azhar – Aurelien Rodriguez – Armand Joulin – Edouard Grave – Guillaume Lample, LLaMA: Open and Efficient Foundation Language Models.
https://arxiv.org/abs/2302.13971
[Belcic, Stryker, 2024] Ivan Belcic — Cole Stryker, What is Claude AI?. IBM, September 2024.
https://t.ly/K5LV1
