Qual è la codifica posizionale nel modello del trasformatore?


23

Sono nuovo di ML e questa è la mia prima domanda qui, quindi scusate se la mia domanda è sciocca.

Sto cercando di leggere e comprendere il documento. L'attenzione è tutto ciò di cui hai bisogno e in essa c'è un'immagine:

inserisci qui la descrizione dell'immagine

Non so cos'è la codifica posizionale . ascoltando alcuni video di YouTube ho scoperto che si tratta di un incorporamento che ha sia il significato che la posizione di una parola in esso e ha qualcosa a che fare con oSion(X)coS(X)

ma non riuscivo a capire cosa fosse esattamente e come lo stesse facendo esattamente. quindi sono qui per un aiuto. Grazie in anticipo.

Risposte:


31

Ad esempio, per la parola nella posizione nella sequenza di input , con incorporamento tridimensionale e , l'operazione sarebbe wpoS[0,L-1]w=(w0,,wL-1)ewdmodel=4

ew=ew+[sin(pos100000),cos(pos100000),sin(pos100002/4),cos(pos100002/4)]=ew+[sin(pos),cos(pos),sin(pos100),cos(pos100)]

dove la formula per la codifica posizionale è la seguente con (quindi ) nel documento originale.

PE(pos,2i)=sin(pos100002i/dmodel),
PE(pos,2i+1)=cos(pos100002i/dmodel).
dmodel=512i[0,255]

Questa tecnica viene utilizzata perché non esiste una nozione di ordine delle parole (1a parola, 2a parola, ..) nell'architettura proposta. Tutte le parole della sequenza di input vengono inviate alla rete senza ordine o posizione speciali (diversamente dalle architetture RNN o ConvNet comuni), quindi il modello non ha idea di come le parole vengano ordinate. Di conseguenza, un segnale dipendente dalla posizione viene aggiunto a ogni incorporamento di parole per aiutare il modello a incorporare l'ordine delle parole. Sulla base di esperimenti, questa aggiunta non solo evita di distruggere le informazioni di incorporamento, ma aggiunge anche le informazioni vitali sulla posizione. Nel caso di RNN, forniamo le parole in sequenza a RNN, ovvero -esima parola viene fornita al passaggio , che aiuta il modello a incorporare l'ordine delle parole.nn

Questo articolo di Jay Alammar spiega l'articolo con visualizzazioni eccellenti. Sfortunatamente, il suo esempio per la codifica posizionale non è corretto al momento (usa per la prima metà delle dimensioni di incorporamento e per la seconda metà, invece di usare per gli indici pari e per gli indici dispari).sincossincos


1
Hai anche questo eccellente articolo puramente incentrato sull'incorporamento posizionale: kazemnejad.com/blog/…
Yohan Obadia

6

La codifica posizionale è una ri-rappresentazione dei valori di una parola e della sua posizione in una frase (dato che non è lo stesso essere all'inizio che alla fine o al centro).

Ma devi tener conto del fatto che le frasi potrebbero essere di qualsiasi lunghezza, quindi dire "X" è il terzo della frase "non ha senso se ci sono frasi di diversa lunghezza: 3 ° in una frase di 3 parole è completamente diverso dal 3 ° in una frase di 20 parole.

Quello che fa un codificatore di posizione è ottenere aiuto dalla natura ciclica delle funzioni e per restituire informazioni sulla posizione di una parola in una frase.sin(x)cos(x)


2
grazie. potresti approfondire come questo codificatore di posizione fa questo con e ? sincos
Peyman,

1

Per aggiungere ad altre risposte, l'implementazione ref di OpenAI lo calcola nello spazio log-log naturale (per migliorare la precisione, credo. Non sono sicuro che avrebbero potuto usare il log in base 2). Non hanno inventato la codifica. Ecco la generazione della tabella di ricerca PE riscritta in C come un ciclo for-for:

int d_model = 512, max_len = 5000;
double pe[max_len][d_model];

for (int i = 0; i < max_len; i++) {
   for (int k = 0; k < d_model; k = k + 2) {
      double div_term = exp(k * -log(10000.0) / d_model);
      pe[i][k] = sin(i * div_term);
      pe[i][k + 1] = cos(i * div_term);
   }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.