Na przykład dla słowa w pozycji w sekwencji wejściowej , z osadzeniem 4-wymiarowym i , operacja byłaby
wpos∈[0,L−1]w=(w0,⋯,wL−1)ewdmodel=4e′w=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
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)
źródło
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:
źródło