I Transformers spiegati visivamente: non solo come, ma anche perché funzionano così bene

Una guida delicata su come i calcoli dell'Attention Score catturano le relazioni tra le parole di una sequenza, in un linguaggio semplice.

Photo by Olav Ahrens Røtne on Unsplash

Negli ultimi anni i trasformatori hanno conquistato il mondo della PNL. Ora vengono utilizzati con successo anche in applicazioni che vanno oltre la PNL.

Il Transformer ottiene i suoi poteri grazie al modulo di attenzione. Questo avviene perché cattura le relazioni tra ogni parola di una sequenza e ogni altra parola.

.

Ma la domanda fondamentale è: come fa esattamente a farlo?

In questo articolo cercheremo di rispondere a questa domanda e di capire perché esegue i calcoli che esegue.

Ho altri articoli nella mia serie sui trasformatori. In questi articoli abbiamo imparato a conoscere l’architettura dei trasformatori e ne abbiamo analizzato il funzionamento durante l’addestramento e l’inferenza, passo dopo passo. Abbiamo anche esplorato il loro interno e capito esattamente come funzionano in dettaglio.

Il nostro obiettivo è capire non solo come funziona qualcosa, ma anche perché funziona in quel modo.

  1. Panoramica delle funzionalità (come vengono utilizzati i trasformatori e perché sono migliori delle RNN. Componenti dell’architettura e comportamento durante l’addestramento e l’inferenza).
  2. Come funziona (Funzionamento interno end-to-end. Come fluiscono i dati e quali calcoli vengono eseguiti, comprese le rappresentazioni matriciali).
  3. Attenzione a più teste (Funzionamento interno del modulo di attenzione in tutto il trasformatore).

Se siete interessati alle applicazioni della PNL in generale, ho altri articoli che potrebbero interessarvi.

  1. Beam Search (Algoritmo comunemente usato dalle applicazioni Speech-to-Text e NLP per migliorare le predizioni)
  2. Bleu Score (Bleu Score e Word Error Rate sono due metriche essenziali per i modelli NLP).

Per capire cosa fa funzionare il Transformer, dobbiamo concentrarci su Attenzione.

Cominciamo con l’input che gli arriva e poi guardiamo come lo elabora.

 

Come la sequenza di input raggiunge il modulo di attenzione

Il modulo Attention è presente in ogni Encoder dello stack Encoder e in ogni Decoder dello stack Decoder. Per prima cosa ci concentreremo sull’attenzione dell’Encoder.

Attention in the Encoder (Image by Author)

A titolo di esempio, diciamo che stiamo lavorando a un problema di traduzione dall’inglese allo spagnolo, in cui una sequenza campione di partenza è “The ball is blue”. La sequenza di destinazione è “La bola es azul”.

La sequenza di partenza viene prima passata attraverso il livello Embedding and Position Encoding, che genera vettori di incorporamento per ogni parola della sequenza. L’embedding viene passato all’Encoder, dove raggiunge il modulo Attention.

All’interno di Attention, la sequenza incorporata passa attraverso tre livelli Linear che producono tre matrici separate, note come Query, Key e Value. Queste sono le tre matrici utilizzate per calcolare il punteggio di attenzione.

La cosa importante da tenere a mente è che ogni “riga” di queste matrici corrisponde a una parola della sequenza di partenza.

The flow of the source sequence (Image by Author)

 

 

Ogni riga di input è una parola della sequenza

Per capire cosa succede con l’attenzione, si parte dalle singole parole della sequenza di partenza e si segue il loro percorso attraverso il trasformatore. In particolare, vogliamo concentrarci su ciò che accade all’interno del modulo di attenzione.

Questo ci aiuterà a vedere chiaramente come ogni parola della sequenza di partenza e di arrivo interagisce con le altre parole della sequenza di partenza e di arrivo.

Quindi, nel corso di questa spiegazione, concentriamoci sulle operazioni che vengono eseguite su ogni parola e sul modo in cui ogni vettore si rapporta alla parola originale in ingresso. Non è necessario preoccuparsi di molti altri dettagli, come le forme delle matrici, le specifiche dei calcoli aritmetici, le teste di attenzione multiple e così via, se non sono direttamente rilevanti per la destinazione di ogni parola.

Per semplificare la spiegazione e la visualizzazione, ignoriamo la dimensione di incorporazione e teniamo traccia solo delle righe per ogni parola.

The flow of each word in the source sequence (Image by Author)

Ogni parola passa attraverso una serie di trasformazioni apprendibili.

Ogni riga è stata generata dalla corrispondente parola di partenza attraverso una serie di trasformazioni: incorporazione, codifica della posizione e strato lineare.

Tutte queste trasformazioni sono operazioni addestrabili.

Ciò significa che i pesi utilizzati in queste operazioni non sono predeterminati, ma vengono appresi dal modello in modo da produrre le previsioni di uscita desiderate.

Linear and Embedding weights are learned (Image by Author)

La domanda chiave è: come fa il Transformer a capire quale serie di pesi gli darà i migliori risultati? Tenete a mente questo punto, perché ci torneremo più avanti.

Punteggio di attenzione - Prodotto di punti tra query e parole chiave

Attention esegue diverse operazioni, ma qui ci concentreremo solo sul livello lineare e sul punteggio di attenzione.

Multi-head attention (Image by Author)
Attention Score calculation (Image by Author)

Come si può vedere dalla formula, il primo passo di Attention consiste nell’eseguire una moltiplicazione matriciale (cioè il prodotto di punti) tra la matrice Query (Q) e la trasposizione della matrice Key (K). Osservate cosa succede a ogni parola.

Si ottiene una matrice intermedia (chiamiamola matrice ‘fattore’) in cui ogni cella è una moltiplicazione matriciale tra due parole.

Dot Product between Query and Key matrices (Image by Author)

Ad esempio, ogni colonna della quarta riga corrisponde al prodotto di punti tra la quarta parola della query e ogni parola della chiave.

Dot Product between Query and Key matrices (Image by Author)

 

 

Punteggio di attenzione - Prodotto puntuale tra le parole chiave della domanda e le parole valore

Il passo successivo è una moltiplicazione matriciale tra questa matrice intermedia ‘fattore’ e la matrice Valore (V), per produrre il punteggio di attenzione che viene emesso dal modulo di attenzione. Qui possiamo vedere che la quarta riga corrisponde alla matrice della quarta parola Query moltiplicata per tutte le altre parole Key e Value.

Dot Product between Query-Key and Value matrices (Image by Author)

Questo produce il vettore del punteggio di attenzione (Z) che viene emesso dal modulo di attenzione.

Il modo in cui pensare al punteggio in uscita è che, per ogni parola, è il valore codificato di ogni parola dalla matrice “Valore”, ponderato per la matrice “fattore”. La matrice dei fattori è il prodotto puntuale del valore Query di quella specifica parola con il valore Key di tutte le parole.

Attention Score is a weighted sum of the Value words (Image by Author)

Qual è il ruolo delle parole Query, Key e Value?

La parola Query può essere interpretata come la parola per la quale stiamo calcolando l’attenzione. Le parole Chiave e Valore sono le parole a cui stiamo prestando attenzione, cioè quanto è rilevante quella parola per la parola Domanda, quanto è rilevante quella parola rispetto alla parola Query.

Attention Score for the word “blue” pays attention to every other word (Image by Author)

Ad esempio, per la frase “La palla è blu”, la riga relativa alla parola “blu” conterrà i punteggi di attenzione per “blu” con ogni altra parola. In questo caso, “blu” è la parola query e le altre parole sono le “chiavi/valori”.

Vengono eseguite altre operazioni, come una divisione e una softmax, ma possiamo ignorarle in questo articolo. Esse modificano solo i valori numerici delle matrici, ma non influiscono sulla posizione di ciascuna riga di parola nella matrice. Inoltre, non comportano alcuna interazione tra le parole.

Il prodotto di punti ci dice la somiglianza tra le parole

Abbiamo quindi visto che il punteggio di attenzione coglie un’interazione tra una particolare parola e ogni altra parola della frase, facendo un prodotto di punti e poi sommandoli. Ma in che modo la matrice moltiplicata aiuta il Trasformatore a determinare la rilevanza tra due parole?

Per capirlo, ricordiamo che le righe Query, Key e Value sono in realtà vettori con una dimensione Embedding. Vediamo come viene calcolata la moltiplicazione della matrice tra questi vettori.

Each cell is a dot product between two word vectors (Image by Author)

Quando si esegue un prodotto di punti tra due vettori, si moltiplicano coppie di numeri e poi si sommano.

– Se i due numeri accoppiati (ad esempio “a” e “d”) sono entrambi positivi o entrambi negativi, il prodotto sarà positivo. Il prodotto aumenterà la somma finale.

– Se un numero è positivo e l’altro negativo, il prodotto sarà negativo. Il prodotto ridurrà la somma finale.

– Se il prodotto è positivo, più i due numeri sono grandi, più contribuiscono alla somma finale.

Ciò significa che se i segni dei numeri corrispondenti nei due vettori sono allineati, la somma finale sarà maggiore.

Come fa il Transformer a imparare la rilevanza tra le parole?

Questa nozione di prodotto di punti si applica anche al punteggio di attenzione. Se i vettori di due parole sono più allineati, il punteggio di attenzione sarà più alto.

Qual è quindi il comportamento che vogliamo per il Trasformatore?

Vogliamo che il punteggio di attenzione sia alto per due parole che sono rilevanti l’una per l’altra nella frase. E vogliamo che il punteggio sia basso per due parole non correlate tra loro.

Ad esempio, nella frase “Il gatto nero bevve il latte”, la parola “latte” è molto rilevante per “bevve”, forse un po’ meno per “gatto” e irrilevante per “nero”. Vogliamo che “latte” e “bevuto” producano un punteggio di attenzione elevato, che “latte” e “gatto” producano un punteggio leggermente inferiore e che “latte” e “nero” producano un punteggio trascurabile.

Questo è l’output che vogliamo che il modello impari a produrre.

Affinché ciò avvenga, i vettori delle parole “latte” e “bevuto” devono essere allineati. I vettori per “latte” e “gatto” divergeranno un po’. E saranno molto diversi per “latte” e “nero”.

Torniamo al punto che avevamo tenuto in mente: come fa il Transformer a capire quale insieme di pesi gli darà i risultati migliori?

I vettori di parole sono generati in base agli embeddings delle parole e ai pesi degli strati lineari. Pertanto, il Trasformatore può apprendere tali incorporazioni, i pesi lineari e così via per produrre i vettori di parole come richiesto sopra.

In altre parole, apprenderà tali incorporazioni e pesi in modo tale che se due parole in una frase sono rilevanti l’una per l’altra, i loro vettori di parole saranno allineati. E quindi produrranno un punteggio di attenzione più alto. Per le parole che non sono rilevanti l’una per l’altra, i vettori delle parole non saranno allineati e produrranno un punteggio di attenzione più basso.

Pertanto, le incorporazioni per “latte” e “bevuto” saranno molto allineate e produrranno un punteggio di attenzione elevato. Per “latte” e “gatto” divergeranno un po’, producendo un punteggio leggermente inferiore, mentre per “latte” e “nero” saranno molto diversi, producendo un punteggio basso.

Questo è il principio alla base del modulo Attenzione.

Riassumendo - Cosa fa funzionare il trasformatore?

Il prodotto di punti tra la Query e la Chiave calcola la rilevanza tra ogni coppia di parole. Questa rilevanza viene poi utilizzata come “fattore” per calcolare una somma ponderata di tutte le parole del valore. Questa somma ponderata viene prodotta come punteggio di attenzione.

Il Trasformatore apprende le incorporazioni e così via, in modo tale che le parole che sono rilevanti l’una per l’altra siano più allineate.

Questo è uno dei motivi per cui sono stati introdotti i tre livelli lineari e sono state create tre versioni della sequenza di input, per Query, Key e Value. In questo modo, il modulo di attenzione ha a disposizione altri parametri che è in grado di apprendere per regolare la creazione dei vettori di parole.

L'autoattenzione dell'encoder nel trasformatore

L’attenzione viene utilizzata nel Trasformatore in tre punti:

– Autoattenzione nell’Encoder: la sequenza sorgente presta attenzione a se stessa.

– Autoattenzione nel decodificatore: la sequenza di destinazione presta attenzione a se stessa.

– Attenzione nel Decodificatore – la sequenza di destinazione presta attenzione alla sequenza di origine.

Attention in the Transformer (Image by Author)

Nell’Encoder Self Attention, calcoliamo la rilevanza di ogni parola della frase di partenza rispetto a ogni altra parola della frase di partenza. Questo avviene in tutti i codificatori dello stack.

 

Autoattenzione del decodificatore nel trasformatore

La maggior parte di ciò che abbiamo appena visto nell’autoattenzione del codificatore si applica anche all’attenzione del decodificatore, con alcune piccole ma significative differenze.

Attention in the Decoder (Image by Author)

Nell’autoattenzione del decodificatore, calcoliamo la rilevanza di ogni parola della frase target rispetto a ogni altra parola della frase target.

Decoder Self Attention (Image by Author)

 

Attenzione codificatore-decodificatore nel trasformatore

Nell’Encoder-Decoder Attention, la Query è ottenuta dalla frase di arrivo e la Chiave/Valore dalla frase di partenza. In questo modo si calcola la rilevanza di ogni parola della frase di arrivo rispetto a ogni parola della frase di partenza.

Encoder-Decoder Attention (Image by Author)

 

Conclusione

Spero che questo vi dia un’idea dell’eleganza del design di Transformer. Leggete anche gli altri articoli su Transformer della mia serie per capire meglio perché Transformer è diventato l’architettura preferita per molte applicazioni di deep learning.

Infine, se vi è piaciuto questo articolo, potreste apprezzare anche le mie altre serie sull’Audio Deep Learning, sul Geolocation Machine Learning e sulla Batch Norm.

 

Share:

Contenuti
Torna in alto