Transformer Models 101: Guida introduttiva — Parte 1
La complessa matematica dietro i modelli di trasformatore, in parole semplici
Non è un segreto che l'architettura del trasformatore sia stata una svolta nel campo dell'elaborazione del linguaggio naturale (NLP). Ha superato la limitazione dei modelli seq-to-seq come RNN, ecc. per non essere in grado di catturare dipendenze a lungo termine nel testo. L'architettura del trasformatore si è rivelata la pietra miliare di architetture rivoluzionarie come BERT, GPT e T5 e le loro varianti. Come molti dicono, la PNL è nel bel mezzo di un'era d'oro e non sarebbe sbagliato dire che il modello del trasformatore è dove tutto è iniziato.
Necessità dell'architettura del trasformatore
Come detto, la necessità è la madre dell'invenzione. I tradizionali modelli seq-to-seq non andavano bene quando si trattava di lavorare con testi lunghi. Ciò significa che il modello tende a dimenticare gli apprendimenti dalle parti precedenti della sequenza di input mentre si sposta per elaborare l'ultima parte della sequenza di input . Questa perdita di informazioni è indesiderabile.
Sebbene le architetture gated come LSTM e GRU abbiano mostrato alcuni miglioramenti nelle prestazioni per la gestione delle dipendenze a lungo termine scartando le informazioni che erano inutili lungo il percorso per ricordare informazioni importanti, non erano ancora sufficienti. Il mondo aveva bisogno di qualcosa di più potente e nel 2015, i " meccanismi di attenzione" sono stati introdotti da Bahdanau et al .Sono stati usati in combinazione con RNN/LSTM per imitare il comportamento umano per concentrarsi su cose selettive ignorando il resto. Bahdanau ha suggerito di assegnare un'importanza relativa a ogni parola in una frase in modo che il modello si concentri sulle parole importanti e ignori il resto. È emerso come un enorme miglioramento rispetto ai modelli codificatore-decodificatore per le attività di traduzione automatica neurale e ben presto l'applicazione del meccanismo di attenzione è stata implementata anche in altre attività.
L'era dei modelli Transformer
I modelli di trasformatore sono interamente basati su un meccanismo di attenzione noto anche come "auto-attenzione" . Questa architettura è stata presentata al mondo nel documento " Attention is All You Need " nel 2017. Consisteva in un'architettura Encoder-Decoder.
Ad alto livello,
- Il codificatore è responsabile dell'accettazione della frase di input e della sua conversione in una rappresentazione nascosta con tutte le informazioni inutili scartate.
- Il decodificatore accetta questa rappresentazione nascosta e tenta di generare la frase target.
Codificatore del trasformatore
Il blocco encoder del trasformatore è costituito da uno stack di N encoder che lavorano in sequenza. L'uscita di un encoder è l'ingresso per l'encoder successivo e così via. L'output dell'ultimo codificatore è la rappresentazione finale della frase di input che viene inviata al blocco del decodificatore.
Ogni blocco encoder può essere ulteriormente suddiviso in due componenti come mostrato nella figura seguente.
Esaminiamo ciascuno di questi componenti uno per uno in dettaglio per capire come funziona il blocco encoder. Il primo componente nel blocco del codificatore è l'attenzione multi-testa , ma prima di entrare nei dettagli, dobbiamo prima capire un concetto sottostante: l'auto-attenzione .
Meccanismo di auto-attenzione
La prima domanda che potrebbe sorgere nella mente di tutti: l'attenzione e l'auto-attenzione sono concetti diversi? Sì. (Eh!)
Tradizionalmente, i meccanismi di attenzione sono nati per il compito della traduzione automatica neurale, come discusso nella sezione precedente. Quindi essenzialmente il meccanismo dell'attenzione è stato applicato per mappare la frase di origine e di destinazione. Poiché i modelli seq-to-seq eseguono l'attività di traduzione token per token, il meccanismo di attenzione ci aiuta a identificare su quali token della frase di origine concentrarci maggiormente durante la generazione del token x per la frase di destinazione. Per questo, utilizza rappresentazioni di stato nascoste da codificatori e decodificatori per calcolare i punteggi di attenzione e generare vettori di contesto basati su questi punteggi come input per il decodificatore. Se desideri saperne di più sul meccanismo di attenzione, fai un salto a questo articolo (spiegato in modo brillante!).
Tornando all'auto -attenzione , l'idea principale è calcolare i punteggi di attenzione mappando la frase sorgente su se stessa. Se hai una frase come,
“Il ragazzo non ha attraversato la strada perché era troppo larga”.
È facile per noi umani capire che la parola "esso" si riferisce a "strada" nella frase precedente, ma come facciamo a far comprendere anche questa relazione al nostro modello linguistico? È qui che entra in gioco l'auto-attenzione !
Ad alto livello, ogni parola nella frase viene confrontata con ogni altra parola nella frase per quantificare le relazioni e comprendere il contesto. Per scopi rappresentativi, è possibile fare riferimento alla figura seguente.
Vediamo nel dettaglio come viene calcolata (in realtà) questa auto-attenzione.
- Genera incorporamenti per la frase di input
- Trasforma la matrice di input in Q, K e V
Per calcolare queste tre matrici, inizializzeremo in modo casuale tre matrici di peso, vale a dire Wq, Wk e Wv . La matrice di input X verrà moltiplicata con queste matrici di peso Wq, Wk e Wv per ottenere rispettivamente i valori per Q, K e V. I valori ottimali per le matrici di peso verranno appresi durante il processo per ottenere valori più accurati per Q, K e V.
- Calcola il prodotto scalare di Q e K-trasposizione
La prima riga della matrice di output ti dirà in che modo la parola 1 rappresentata da q1 è correlata al resto delle parole nella frase usando il prodotto scalare. Più alto è il valore del prodotto scalare, più le parole sono correlate. Per intuire il motivo per cui è stato calcolato questo prodotto scalare, è possibile comprendere le matrici Q (query) e K (chiave) in termini di recupero delle informazioni. Quindi qui,
- Q o Query = Termine che stai cercando
- K o Key = un insieme di parole chiave nel tuo motore di ricerca con cui Q viene confrontato e abbinato.
- Scala il prodotto scalare
- Normalizza i valori usando softmax
- Calcolare la matrice dell'attenzione Z
Ma aspetta, perché moltiplicare?
Supponiamo che Si = [0.9, 0.07, 0.03] sia il valore della matrice del punteggio per la i-esima parola di una frase. Questo vettore viene moltiplicato con la matrice V per calcolare Zi (matrice di attenzione per la parola i-esima).
Zi = [0,9 * V1 + 0,07 * V2 + 0,03 * V3]
Possiamo dire che per comprendere il contesto della i-esima parola, dovremmo concentrarci solo sulla parola 1 (cioè V1) poiché il 90% del valore del punteggio di attenzione proviene da V1? Potremmo definire chiaramente le parole importanti in cui dovrebbe essere prestata maggiore attenzione per comprendere il contesto della i-esima parola.
Quindi, possiamo concludere che maggiore è il contributo di una parola nella rappresentazione Zi, più critiche e correlate sono le parole tra loro.
Ora che sappiamo come calcolare la matrice dell'auto-attenzione, comprendiamo il concetto di meccanismo di attenzione a più teste .
Meccanismo di attenzione a più teste
Cosa accadrà se la tua matrice di punteggio è distorta verso una rappresentazione di parole specifica? Ingannerà il tuo modello e i risultati non saranno accurati come ci aspettiamo. Vediamo un esempio per capirlo meglio.
S1: “ Va tutto bene ”
Z(bene) = 0.6 * V(tutto) + 0.0 * v(è) + 0.4 * V(bene)
S2: “ Il cane ha mangiato il cibo perché aveva fame ”
Z(it) = 0.0 * V(il) + 1.0 * V(cane) + 0.0 * V(mangiato) + …… + 0.0 * V(affamato)
Nel caso S1, durante il calcolo di Z(bene), viene data maggiore importanza a V(tutto). È anche più di V (beh) stesso. Non vi è alcuna garanzia di quanto accurato sarà.
Nel caso S2, nel calcolo di Z(it), tutta l'importanza è data a V(dog) mentre il punteggio per il resto delle parole è 0.0 includendo anche V(it). Questo sembra accettabile in quanto la parola "it" è ambigua. Ha senso metterlo in relazione più con un'altra parola che con la parola stessa. Questo era l'intero scopo di questo esercizio di calcolo dell'auto-attenzione. Per gestire il contesto delle parole ambigue nelle frasi di input.
In altre parole, possiamo dire che se la parola corrente è ambigua, allora va bene dare più importanza a qualche altra parola durante il calcolo dell'attenzione di sé, ma in altri casi può essere fuorviante per il modello. Quindi, cosa facciamo ora?
Cosa succede se calcoliamo più matrici di attenzione invece di calcolare una matrice di attenzione e deriviamo la matrice di attenzione finale da queste?
Questo è esattamente ciò che riguarda l'attenzione multi-testa ! Calcoliamo versioni multiple delle matrici di attenzione z1, z2, z3, ….., zm e le concateniamo per derivare la matrice di attenzione finale. In questo modo possiamo essere più sicuri della nostra matrice di attenzione.
Passando al prossimo concetto importante,
Codifica posizionale
Nei modelli seq-to-seq, la frase di input viene inviata parola per parola alla rete che consente al modello di tracciare le posizioni delle parole rispetto ad altre parole.
Ma nei modelli di trasformatore, seguiamo un approccio diverso. Invece di fornire input parola per parola, vengono alimentati in parallelo, il che aiuta a ridurre i tempi di formazione e ad apprendere la dipendenza a lungo termine. Ma con questo approccio, l'ordine delle parole si perde. Tuttavia, per comprendere correttamente il significato di una frase, l'ordine delle parole è estremamente importante. Per ovviare a questo problema viene introdotta una nuova matrice chiamata “ codifica posizionale ” (P).
Questa matrice P viene inviata insieme alla matrice di input X per includere le informazioni relative all'ordine delle parole. Per ovvie ragioni, le dimensioni delle matrici X e P sono le stesse.
Per calcolare la codifica posizionale, viene utilizzata la formula indicata di seguito.
Nella formula sopra,
- pos = posizione della parola nella frase
- d = dimensione dell'incorporamento di parole/token
- i = rappresenta ogni dimensione nell'incorporamento
Questo video copre la codifica posizionale in modo approfondito se desideri saperne di più.
Guida visiva alle reti neurali del trasformatore - (Parte 1) Incorporamento della posizione
Sto usando alcune immagini del video sopra per spiegare questo concetto con le mie parole.
La figura sopra mostra un esempio di un vettore di codifica posizionale insieme a diversi valori di variabile.
La figura sopra mostra come i valori di PE(pos, 2i) varieranno se i è costante e solo pos varia . Come sappiamo l' onda sinusoidale è una funzione periodica che tende a ripetersi dopo un determinato intervallo. Possiamo vedere che i vettori di codifica per pos = 0 e pos = 6 sono identici. Ciò non è auspicabile in quanto vorremmo vettori di codifica posizionale diversi per valori diversi di pos .
Ciò può essere ottenuto variando la frequenza dell'onda sinusoidale.
Al variare del valore di i, anche la frequenza delle onde sinusoidali varia risultando in onde diverse e quindi, risultando in valori diversi per ogni vettore di codifica posizionale. Questo è esattamente ciò che volevamo ottenere.
La matrice di codifica posizionale (P) viene aggiunta alla matrice di input (X) e inviata al codificatore.
Il componente successivo del codificatore è la rete feedforward .
Rete di feedforward
Questo sottolivello nel blocco del codificatore è la classica rete neurale con due strati densi e attivazioni ReLU. Accetta input dallo strato di attenzione multi-testa, esegue alcune trasformazioni non lineari sullo stesso e infine genera vettori contestualizzati. Lo strato completamente connesso è responsabile della considerazione di ogni testa di attenzione e dell'apprendimento delle informazioni rilevanti da loro. Poiché i vettori di attenzione sono indipendenti l'uno dall'altro, possono essere passati alla rete del trasformatore in modo parallelizzato.
L'ultimo e ultimo componente del blocco Encoder è Add & Norm component .
Componente Aggiungi e norma
Questo è uno strato residuo seguito dalla normalizzazione dello strato . Lo strato residuo assicura che nessuna informazione importante relativa all'input dei sottostrati venga persa durante l'elaborazione. Mentre il livello di normalizzazione promuove un addestramento del modello più rapido e impedisce che i valori cambino pesantemente.
All'interno del codificatore, ci sono due livelli add e norm:
- collega l'input del sottostrato di attenzione multi-head al suo output
- collega l'input del sottostrato di rete feedforward al suo output
- Genera incorporamenti o rappresentazioni tokenizzate della frase di input. Questa sarà la nostra matrice di input X.
- Genera gli incorporamenti posizionali per preservare le informazioni relative all'ordine delle parole della frase di input e aggiungile alla matrice di input X.
- Inizializza casualmente tre matrici: Wq, Wk e Wv, ovvero pesi di query, chiave e valore. Questi pesi verranno aggiornati durante l'addestramento del modello di trasformatore.
- Moltiplica la matrice di input X con ognuna delle Wq, Wk e Wv per generare le matrici Q (query), K (key) e V (value).
- Calcola il prodotto scalare di Q e K-transpose, ridimensiona il prodotto dividendolo con la radice quadrata di dk o incorporando la dimensione e infine normalizzalo usando la funzione softmax.
- Calcola la matrice di attenzione Z moltiplicando la matrice V o valore per l'output della funzione softmax.
- Passa questa matrice di attenzione alla rete feedforward per eseguire trasformazioni non lineari e generare incorporamenti contestualizzati.
Questo sarebbe tutto per questo articolo. Spero che tu l'abbia trovato utile. Se lo hai fatto, non dimenticare di applaudire e condividerlo con i tuoi amici.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































