Por exemplo, para a palavra na posição na sequência de entrada , com incorporação 4-dimensional e , a operação seria
Wp o s ∈ [ 0 , L - 1 ]w = ( w0 0, ⋯ , wL - 1)eWdm o de l= 4e′W= eW+ [ s i n ( p o s100000 0) ,cos ( p o s100000 0) ,sin ( p o s100002 / 4) ,cos ( p o s100002 / 4) ]= eW+ [ s i n ( p o s ) , c o s ( p o s ) , s i n(pos100) ,Cos (pos100) ]
onde a fórmula para codificação posicional é a seguinte:
com (portanto ) no artigo original.PE ( p o s , 2 i ) = s i n ( p o s100002 i / dm o de l) ,
PE ( p o s , 2 i + 1 ) = c o s ( p o s100002 i / dm o de l) .
dm o de l= 512i ∈ [ 0 , 255 ]
Esta técnica é utilizada porque não há noção de ordem das palavras (1ª palavra, 2ª palavra, ..) na arquitetura proposta. Todas as palavras da sequência de entrada são alimentadas na rede sem ordem ou posição especial (ao contrário das arquiteturas comuns RNN ou ConvNet), portanto, o modelo não tem idéia de como as palavras são ordenadas. Consequentemente, um sinal dependente da posição é adicionado a cada incorporação de palavras para ajudar o modelo a incorporar a ordem das palavras. Com base em experimentos, essa adição não apenas evita a destruição das informações incorporadas, mas também adiciona as informações vitais da posição. No caso de RNNs, alimentamos as palavras sequencialmente para RNN, ou seja, a ésima palavra é alimentada na etapa , o que ajuda o modelo a incorporar a ordem das palavras.nn
Este artigo de Jay Alammar explica o artigo com excelentes visualizações. Infelizmente, seu exemplo de codificação posicional está incorreto no momento (ele usa para a primeira metade das dimensões de incorporação e para a segunda metade, em vez de usar para índices pares e para índices ímpares).s i nc o ss i nc o s
A codificação posicional é uma re-representação dos valores de uma palavra e sua posição em uma sentença (dado que não é o mesmo no início que no final ou no meio).
Mas você deve levar em conta que as sentenças podem ter qualquer tamanho, portanto, dizer 'palavra X' é a terceira da sentença 'não faz sentido se houver sentenças de comprimento diferente: a terceira em uma sentença de três palavras é completamente diferente de 3 em uma sentença de 20 palavras.
O que um codificador posicional faz é obter ajuda da natureza cíclica das funções e para retornar informações da posição de uma palavra em uma frase.s i n ( x ) c o s ( x )
fonte
Para adicionar a outras respostas, a implementação ref do OpenAI o calcula no espaço de log natural (para melhorar a precisão, eu acho. Não tenho certeza se eles poderiam ter usado o log na base 2). Eles não criaram a codificação. Aqui está a geração da tabela de pesquisa do PE reescrita em C como um loop for-for:
fonte