Jakie jest kodowanie pozycyjne w modelu transformatora?

23

Jestem nowy w ML i to jest moje pierwsze pytanie tutaj, więc przepraszam, jeśli moje pytanie jest głupie.

Staram się przeczytać i zrozumieć artykuł. Uwaga jest wszystkim, czego potrzebujesz, i jest tam zdjęcie:

wprowadź opis zdjęcia tutaj

Nie wiem, co to jest kodowanie pozycyjne . słuchając niektórych filmów z YouTube odkryłem, że jest to osadzenie mające zarówno znaczenie, jak i pozycję słowa i ma coś wspólnego z lubsin(x)cos(x)

ale nie mogłem zrozumieć, co to dokładnie jest i jak to dokładnie robi. więc jestem tu po pomoc. z góry dziękuję.

Peyman
źródło

Odpowiedzi:

31

Na przykład dla słowa w pozycji w sekwencji wejściowej , z osadzeniem 4-wymiarowym i , operacja byłaby wpos[0,L1]w=(w0,,wL1)ewdmodel=4

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

gdzie formuła kodowania pozycyjnego jest następująca z (a więc ) w oryginalnym dokumencie.

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

Ta technika jest używana, ponieważ w proponowanej architekturze nie ma pojęcia o kolejności słów (1. słowo, 2. słowo, ..). Wszystkie słowa sekwencji wejściowej są podawane do sieci bez specjalnego zamówienia lub pozycji (w przeciwieństwie do typowych architektur RNN lub ConvNet), dlatego model nie ma pojęcia, w jaki sposób słowa są uporządkowane. W związku z tym do każdego osadzania słowa dodawany jest sygnał zależny od pozycji, aby pomóc modelowi uwzględnić kolejność słów. Na podstawie eksperymentów ten dodatek nie tylko pozwala uniknąć zniszczenia informacji o osadzaniu, ale także dodaje istotne informacje o pozycji. W przypadku RNN podajemy słowa sekwencyjnie do RNN, tj. słowo podaje się w kroku , co pomaga modelowi uwzględnić kolejność słów.nn

W tym artykule Jay Alammar wyjaśnia artykuł z doskonałymi wizualizacjami. Niestety, jego przykład kodowania pozycyjnego jest w tej chwili niepoprawny (używa w pierwszej połowie osadzania wymiarów i w drugiej połowie, zamiast przypadku parzystych indeksów i przypadku indeksów nieparzystych).sincossincos

E-mail
źródło
1
Masz także ten znakomity artykuł poświęcony osadzaniu pozycyjnemu: kazemnejad.com/blog/…
Yohan Obadia
6

Kodowanie pozycyjne to ponowna reprezentacja wartości słowa i jego pozycji w zdaniu (biorąc pod uwagę, że to nie to samo, co na początku, to na końcu lub w środku).

Ale musisz wziąć pod uwagę, że zdania mogą mieć dowolną długość, więc powiedzenie „słowo X” jest trzecim w zdaniu ”nie ma sensu, jeśli istnieją zdania o różnej długości: 3. zdanie w 3 słowach jest całkowicie inny niż trzeci w zdaniu składającym się z 20 słów.

Enkoder pozycyjny pomaga uzyskać cykliczną naturę funkcji i celu zwrócenia informacji o pozycji słowa w zdaniu.sin(x)cos(x)

Juan Esteban de la Calle
źródło
2
Dziękuję Ci. czy mógłbyś wyjaśnić, w jaki sposób ten enkoder pozycyjny robi to z i ? sincos
Peyman
1

Aby dodać do innych odpowiedzi, implementacja referencyjna OpenAI oblicza to w naturalnej przestrzeni logów (myślę, że w celu poprawy precyzji. Nie jestem pewien, czy mogliby użyć log w bazie 2). Nie wymyślili kodowania. Oto generowanie tabeli odnośników PE przepisanej w C jako pętla 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);
   }
}
Eris
źródło