Skip to content

VincenzoManto/transformers-fs

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 

Repository files navigation

Transforers hanno evoluto gli RNN, superando i problemi di vanishing o esplosione dei gradienti che affliggevano gli RNN durante la retropropagazione. Questo problema era causato dalla necessità del modello di calcolare la derivata di molteplici stati attraverso la chain-rule, portando a esplosioni o vanishing dei gradienti. Inoltre, gli RNN soffrivano di corta memoria, con l'ultimo token che aveva una limitata influenza sulla computazione del primo token.

Transformers

I transformers si basano su un approccio di attention derivante da un encoder e un decoder.

Encoder

Embedding

Si prenda una frase e la si divida in token (parole o sottoparole). Ogni parola viene trasformata in un indice (ID) pari all'indice della parola nel vocabolario. L'ID viene poi tradotto in un array double di 512 chiamato embedding. L'embedding è un parametro del modello in quanto il modello altererà il valore degli embedding in funzione della semantica. Questa traduzione da ID a embedding è spesso gestita da un layer di embedding, che è un layer trainable all'interno del modello. Le parole uguali avranno lo stesso embedding. Per fornire informazioni posizionali/spaziali, si aggiunge un position embedding, ovvero un array double di 512 fisso, non-parametrico, che indica la posizione nella frase. I due embedding vengono quindi sommati per creare l'encoder input da 512 per ogni token.

Il position embedding viene calcolato per ogni token utilizzando la funzione sinusoidale e cosinusoidale, assicurando che la posizione influenzi l'embedding in modo continuo e differenziato. Questo è particolarmente importante poiché, sebbene la position embedding sia fissa durante il training, cattura le informazioni spaziali della sequenza.

Multi-Head Attention

Successivamente, si entra nel vero encoder attraverso il Multi-Head Attention, che sfrutta la Self-attention. La Self-attention è un meccanismo che relaziona le parole tra loro, fornendo una rappresentazione delle relazioni semantiche all'interno della frase.

Utilizzando matrici Q, K e V, rappresentanti la sequenza di token, si calcola la Self-attention. La Self-attention rappresenta la relazione tra ogni parola della frase con le altre parole della stessa frase. Questa relazione è calcolata mediante la softmax, generando una matrice di attenzione che riflette le interazioni tra ciascuna coppia di parole nella frase.

Il Multi-Head Attention (MHA) estende questo concetto dividendo l'input embedding in più testine, ognuna delle quali esamina la frase con un focus diverso, consentendo al modello di catturare relazioni semantiche complesse. Le matrici Q, K e V sono moltiplicate per matrici di parametri WQ, WK e WV, e il risultato viene suddiviso verticalmente in testine. Dopo il calcolo dell'attenzione da ciascuna testina, i risultati sono concatenati orizzontalmente e moltiplicati per una matrice parametrica WO, ottenendo il risultato finale del Multi-Head Attention (MH-A). Questo approccio permette al modello di studiare l'attenzione sull'intera frase concentrandosi su aspetti diversi dell'embedding.

Approfondimento

Le matrici Q, K e V rappresentano rispettivamente le query, le chiavi e i valori. La Self-attention è concettualmente simile a un dizionario di chiavi e valori. Ad esempio, se consideriamo il dizionario "genere:films" e vogliamo cercare un film d'amore, la query (Q) sarà "love". Moltiplicando la query per ogni chiave (K), otteniamo una similarità. Questo processo avviene attraverso la formula softmax(Q * K^T / sqrt(512)). La Self-attention permette al modello di pesare in modo appropriato le relazioni tra le parole, consentendo una rappresentazione significativa.

Layer normalization

Un layer normalization è successivamente applicato all'output del Multi-Head Attention, calcolando media e varianza per normalizzare le feature vectors (embedding e attenzione). Questo processo aiuta a stabilizzare l'addestramento, evitando gradienti instabili. La normalizzazione viene applicata separatamente per ogni embedding, consentendo una gestione più precisa delle informazioni.

Feed forward

Il passo finale dell'encoder prevede l'applicazione di un classico hidden layer fully connected, noto anche come feed forward layer.

Decoder

Il decoder elabora potenziali output, procede all'embedding semantico e posizionale, applica un Masked Multi-Head Attention, normalizza e richiede in ingresso l'output dell'encoder. L'output dell'encoder, composto da K e V, viene utilizzato contemporaneamente come input del decoder e sorgente per la Cross-Attention durante la fase di decoding.

Il Masked Multi-Head Attention viene utilizzato quando si vuole che il modello sia causale, ovvero quando l'output ad una certa posizione deve dipendere solo dalle parole che lo precedono. Questo viene ottenuto mascherando le parole future durante il calcolo dell'attenzione.

L'output del Masked Multi-Head Attention viene normalizzato e passato attraverso un feed forward layer. Successivamente, viene nuovamente normalizzato e aggiunto all'output del Masked Multi-Head Attention, formando così l'output finale del decoder.

Inferenza

Durante l'inferenza, l'encoder riceve la frase da tradurre, mentre il decoder inizia con il token speciale SOS (Start of Sentence) e la sequenza di padding. Ad ogni passo di decodifica, il decoder genera un nuovo token basato sull'embedding attuale e sull'output dell'encoder. L'iniezione costante di K e V dal risultato dell'encoder assicura che il contesto della frase originale sia presente in ogni passo di decodifica. Questo processo si ripete fino a quando il token EOS (End of Sentence) viene generato, segnalando la fine della traduzione.

In fase di inferenza, esistono diverse strategie. Una comune è la Greedy Inference, in cui viene selezionato il token con la massima probabilità ad ogni passo. Tuttavia, la Beam Search è spesso preferita: ad ogni passo, vengono generati i top B token, le sequenze vengono concatenate, e la probabilità complessiva di ciascuna sequenza viene calcolata. La sequenza più probabile è quindi selezionata per la continuazione del processo di decodifica.