Capire i vettori Q, K, V nei modelli Transformer
Nell'intelligenza artificiale moderna, in particolare nell'elaborazione del linguaggio naturale, l'architettura Transformer è diventata la spina dorsale di modelli come GPT, BERT e molti altri. Al centro di questa architettura si trova il meccanismo di attenzione, che si basa su tre vettori chiave: Query (Q), Key (K) e Value (V). Questo articolo spiegherà come questi vettori vengono derivati dai token, come vengono utilizzati durante l'elaborazione del prompt e come funzionano l'attenzione multi-testa e le operazioni all-reduce per produrre l'output finale.
Dalle parole ai token e agli embedding
Il primo passo nell'elaborazione del testo è convertire ogni parola (o sottoparola) in un token. Il vocabolario del modello contiene un insieme fisso di token, ciascuno con un ID intero univoco. Una volta che la frase di input è suddivisa in token, ogni token viene mappato a un vettore denso chiamato embedding. Questo embedding è una rappresentazione ad alta dimensionalità (ad esempio, 512 o 768 dimensioni) che cattura il significato semantico del token. Questi embedding vengono appresi durante l'addestramento e sono memorizzati in una matrice di embedding.
Derivazione dei vettori Query, Key e Value
Per abilitare il meccanismo di attenzione, l'embedding di ogni token viene trasformato in tre vettori diversi: Query, Key e Value. Questo viene fatto moltiplicando il vettore di embedding per tre matrici di pesi apprese: Wq, Wk e Wv. Queste matrici sono parametri del modello, aggiornati durante l'addestramento. I vettori risultanti hanno una dimensione più piccola (spesso chiamata d_k) rispetto alla dimensione originale dell'embedding, il che aiuta a un calcolo efficiente.
Il vettore Query (Q) rappresenta ciò che il token sta 'cercando' nel contesto. Il vettore Key (K) rappresenta ciò che il token 'offre' come etichetta. Il vettore Value (V) contiene le informazioni effettive che verranno aggregate. Il meccanismo di attenzione determina quanto ogni token deve prestare attenzione agli altri confrontando le query con le chiavi.
| Simbolo | Dimensioni | Descrizione |
|---|---|---|
| Embedding | d_model | Rappresentazione del token di input |
| Wq | d_model x d_k | Matrice dei pesi Query |
| Wk | d_model x d_k | Matrice dei pesi Key |
| Wv | d_model x d_v | Matrice dei pesi Value |
| Q | d_k | Vettore Query per un token |
| K | d_k | Vettore Key per un token |
| V | d_v | Vettore Value per un token |
Il meccanismo di self-attention
Una volta che abbiamo Q, K e V per ogni token nella sequenza, il meccanismo di self-attention calcola i punteggi di attenzione. Per un dato token, la sua query viene moltiplicata (prodotto scalare) con le key di tutti i token nella sequenza. I punteggi risultanti indicano la rilevanza di ciascun token per quello corrente. Questi punteggi vengono quindi scalati dividendo per la radice quadrata della dimensione delle key (d_k) per stabilizzare i gradienti. Successivamente, viene applicata una funzione softmax per convertire i punteggi in probabilità che sommano a 1. Infine, le probabilità vengono utilizzate per calcolare una somma ponderata dei vettori value, producendo un nuovo vettore contestuale per il token.
Questo processo viene eseguito in parallelo per tutti i token nella sequenza, rendendolo estremamente efficiente. I nuovi vettori vengono poi passati attraverso una rete neurale feed-forward e ulteriori livelli, costruendo gradualmente una ricca rappresentazione dell'input.
| Passo | Operazione | Risultato |
|---|---|---|
| 1 | Calcolare Q, K, V dagli embedding | Vettori per ogni token |
| 2 | Prodotto scalare di Q con tutte le K | Punteggi di attenzione (grezzi) |
| 3 | Scalare i punteggi per sqrt(d_k) | Punteggi scalati |
| 4 | Applicare softmax | Pesi di attenzione (probabilità) |
| 5 | Somma ponderata dei vettori V | Nuovo vettore di contesto |
Elaborazione del prompt e calcolo strato per strato
Durante l'elaborazione del prompt (la codifica iniziale dell'input), l'intera sequenza di token viene elaborata simultaneamente. Gli embedding vengono trasformati in Q, K, V e la self-attention viene calcolata per ogni token. Questo viene ripetuto attraverso tutti gli strati (tipicamente 12, 24 o più) del Transformer. Ogni strato affina le rappresentazioni, consentendo al modello di catturare dipendenze complesse come relazioni a lungo raggio, sintassi e semantica. L'output dell'ultimo strato fornisce un embedding contestualizzato per ogni token.
Inferenza: aggiungere un nuovo token
Quando si genera testo (inferenza), il modello produce un token alla volta. Per il nuovo token, viene calcolato solo il suo embedding. Quindi, viene derivata la sua Query. Per calcolare l'attenzione, il modello ha bisogno delle Key e dei Value di tutti i token precedenti. Questi sono memorizzati in una struttura chiamata cache KV, che evita di ricalcolarli. La Query del nuovo token viene moltiplicata per tutte le Key memorizzate, viene applicata la softmax e viene calcolata la somma ponderata dei Value memorizzati. Questo produce un nuovo vettore di contesto per il nuovo token, che viene poi passato attraverso gli strati rimanenti e infine uno strato di classificazione (softmax sul vocabolario) per selezionare la parola successiva.
Questo approccio incrementale è efficiente perché i calcoli pesanti per i token precedenti vengono riutilizzati. La cache KV viene aggiornata con la Key e il Value del nuovo token dopo ogni passo di generazione.
Attenzione multi-testa e All-Reduce
Per catturare diversi tipi di relazioni (ad esempio, sintattiche, semantiche, referenziali) simultaneamente, i Transformer utilizzano l'attenzione multi-testa. Invece di eseguire una singola operazione di attenzione, il modello divide i vettori Q, K e V in più teste più piccole (comunemente 8, 12 o 16). Ogni testa impara a concentrarsi su diversi aspetti dell'input. Le teste lavorano in parallelo, ciascuna calcolando il proprio meccanismo di attenzione su un sottospazio dei vettori.
Dopo che ogni testa ha prodotto il suo output, gli output vengono concatenati insieme in un unico vettore della dimensione originale. Questo vettore concatenato viene poi moltiplicato per una matrice di proiezione di output (spesso chiamata Wo) per combinare le informazioni da tutte le teste. Questo passo finale è equivalente a un'operazione all-reduce: fonde i calcoli paralleli in una rappresentazione unificata. L'all-reduce assicura che il modello benefici dell'apprendimento distribuito attraverso le teste mantenendo al contempo un unico output coerente per lo strato successivo.
| Aspetto | Testa singola | Multi-testa |
|---|---|---|
| Numero di calcoli di attenzione | 1 | H (numero di teste) |
| Relazioni catturate | Un tipo per strato | Più tipi simultaneamente |
| Dimensione output | d_v | H * d_v (poi proiettato a d_model) |
| Costo computazionale | Inferiore | Superiore ma parallelizzabile |
| Espressività | Limitata | Rappresentazioni più ricche |
Conclusione
I vettori Query, Key e Value sono fondamentali per il meccanismo di attenzione nei Transformer. Consentono al modello di pesare dinamicamente l'importanza di ogni token nel contesto, abilitando una potente comprensione e generazione del linguaggio. Il processo di derivazione di questi vettori, calcolo dell'attenzione e utilizzo della parallelizzazione multi-testa con all-reduce è ciò che rende i modelli di IA moderni così efficaci. Comprendere questi concetti è essenziale per chiunque lavori o studi i grandi modelli linguistici.
Lavoriamo insieme
Hai bisogno di maggiori informazioni, aiuto con il tuo progetto o di sviluppare un'idea?
Che si tratti di una domanda semplice, un dubbio rapido o una chat di 5 minuti, mandami un messaggio—non costa nulla e sono sempre pronto ad aiutare. Mi piace ascoltare per capire il problema, essere creativo nelle soluzioni e puntare a idee semplici, affidabili e non complicate da realizzare rapidamente.
Contattami →