Per comprendere le modifiche apportate qui, dobbiamo prima discutere della cache dei valori-chiave. All'interno del trasformatore abbiamo 3 vettori fondamentali per il funzionamento dell'attenzione: chiave, valore e query. Da un livello elevato, l'attenzione è il modo in cui trasmettiamo le informazioni critiche sui token precedenti al token corrente in modo che possa prevedere il token successivo. Nell'esempio dell'autoattenzione con una testa, moltiplichiamo il vettore di query sul token corrente con i vettori chiave dei token precedenti e quindi normalizziamo la matrice risultante (la matrice risultante che chiamiamo modello di attenzione). Ora moltiplichiamo i vettori di valore con il modello di attenzione per ottenere gli aggiornamenti su ciascun token. Questi dati vengono quindi aggiunti all'incorporamento corrente dei token in modo che ora abbiano il contesto per determinare cosa verrà dopo.

Equazione 1 da “L'attenzione è tutto ciò di cui hai bisognoâ€

Creiamo il modello di attenzione per ogni singolo nuovo token che creiamo, quindi mentre le query tendono a cambiare, le chiavi e i valori sono costanti. Di conseguenza, le attuali architetture cercano di ridurre il tempo di calcolo memorizzando nella cache i vettori chiave e valore man mano che vengono generati da ogni successivo ciclo di attenzione. Questa cache è chiamata cache dei valori-chiave.

Sebbene architetture come i modelli con trasformatore solo codificatore e decodificatore abbiano avuto successo, gli autori presuppongono che l'autoregressione mostrata sopra e la velocità che consente ai suoi modelli è il motivo per cui i modelli solo decodificatore sono quelli più comunemente utilizzati oggi.

Per comprendere l'architettura di YOCO, dobbiamo iniziare comprendendo come presenta i suoi livelli.

Per metà del modello, utilizziamo un tipo di attenzione per generare i vettori necessari per riempire la KV Cache. Una volta attraversata la seconda metà, utilizzerà la KV Cache esclusivamente rispettivamente per i vettori chiave e valore, generando ora gli incorporamenti di token di output.

figura 2 dalla carta

Questa nuova architettura richiede due tipi di attenzione: auto-attenzione efficiente e attenzione incrociata. Entreremo in ciascuno di essi di seguito.

L'Efficient Self-Attention (ESA) è progettato per ottenere una memoria di inferenza costante. In altre parole, vogliamo che la complessità della cache non dipenda dalla lunghezza dell'input ma dal numero di livelli nel nostro blocco. Nell'equazione seguente, gli autori hanno estratto l'ESA, ma il resto dell'auto-decodifica è coerente come mostrato di seguito.

Equazione 1 dalla carta

Esaminiamo l'equazione passo dopo passo. X^l è il nostro incorporamento di token e Y^l è una variabile intermedia utilizzata per generare il successivo incorporamento di token X^l+1. Nell'equazione, ESA sta per Autoattenzione efficiente, LN è la funzione di normalizzazione dello strato – che qui è sempre stata Root Mean Square Norm (RMSNorm ), e infine SwiGLU. SwiGLU è definito come segue:

Definizione di SwiGLU dalla carta

Qui swish = x*sigmoid (Wg * x)dove Wg è un parametro addestrabile. Troviamo quindi il prodotto per elementi (prodotto Hadamard) tra quel risultato e X*W1 prima di moltiplicare l'intero prodotto per W2. L'obiettivo con SwiGLU è ottenere una funzione di attivazione che passerà condizionatamente diverse quantità di informazioni attraverso il livello al token successivo.

Esempio di prodotto Element-Wise (prodotto Hadamard) da “Prodotto Hadamard (matrici)”.

Ora che abbiamo visto come funziona l'auto-decodifica, esaminiamo i due modi in cui gli autori hanno considerato di implementare l'ESA.

Innanzitutto, hanno considerato quella che viene chiamata Gated Retention. La ritenzione e l'auto-attenzione sono certamente molto simili, con gli autori del documento “Retentive Network: A Successor to Transformer for Large Language Models” che affermano che la differenza fondamentale risiede nella funzione di attivazione: la ritenzione rimuove softmax consentendo una ripetizione formulazione. Usano questa formulazione ricorrente insieme alla parallelizzabilità per aumentare l'efficienza della memoria.

Per immergerci nei dettagli matematici:

Equazione 4 dalla carta

Abbiamo le nostre matrici tipiche di Q, K e V, ciascuna delle quali viene moltiplicata per i pesi apprendibili associati a ciascuna matrice. Troviamo poi il prodotto Hadamard tra le matrici pesate e lo scalare Θ. L'obiettivo nell'utilizzo di Θ è creare un decadimento esponenziale, mentre utilizziamo quindi la matrice D per aiutare con il mascheramento casuale (impedendo ai token futuri di interagire con i token attuali) e l'attivazione.

La ritenzione recintata è distinta dalla ritenzione tramite il valore μ. Qui la matrice Wγ viene utilizzata per consentire al nostro ESA di essere guidato dai dati.

Sliding Window ESA introduce l'idea di limitare il numero di token a cui la finestra di attenzione dovrebbe prestare attenzione. Mentre nella normale autoattenzione tutti i token precedenti vengono presi in considerazione in qualche modo (anche se il loro valore è 0), nella finestra scorrevole ESA, scegliamo un valore costante C che limita la dimensione di queste matrici. Ciò significa che durante il tempo di inferenza la cache KV può essere ridotta a una complessità costante.

Per tuffarci ancora una volta nella matematica:

Equazione 8 dalla carta

Le nostre matrici vengono ridimensionate in base ai pesi corrispondenti. Successivamente, calcoliamo la testa in modo simile a come viene calcolata l'attenzione multi-testa, dove B agisce sia come mappa causale sia anche per assicurarsi che solo i token C dietro siano presi in considerazione.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *