Qual é a codificação posicional no modelo do transformador?

23

Eu sou novo no ML e esta é minha primeira pergunta aqui, desculpe se minha pergunta é boba.

Estou tentando ler e entender o artigo Atenção é tudo o que você precisa e, nele, há uma figura:

insira a descrição da imagem aqui

Não sei o que é codificação posicional . ouvindo alguns vídeos do youtube, descobri que é uma incorporação que possui significado e posição de uma palavra e tem algo a ver com ousEun(x)cos(x)

mas eu não conseguia entender o que exatamente é e como exatamente está fazendo isso. então eu estou aqui para alguma ajuda. desde já, obrigado.

Peyman
fonte

Respostas:

30

Por exemplo, para a palavra na posição na sequência de entrada , com incorporação 4-dimensional e , a operação seria Wpos[0 0,eu-1 1]W=(W0 0,,Weu-1 1)eWdmodeeu=4

ew=eW+[sEun(pos100000 0),cos(pos100000 0),sEun(pos100002/4),cos(pos100002/4)]=eW+[sEun(pos),cos(pos),sEun(pos100),cos(pos100)]

onde a fórmula para codificação posicional é a seguinte: com (portanto ) no artigo original.

EDUCAÇAO FISICA(pos,2Eu)=sEun(pos100002Eu/dmodeeu),
EDUCAÇAO FISICA(pos,2Eu+1 1)=cos(pos100002Eu/dmodeeu).
dmodeeu=512Eu[0 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).sEuncossEuncos

Esmailiano
fonte
11
Você também tem este excelente artigo puramente focado na incorporação posicional: kazemnejad.com/blog/…
Yohan Obadia
6

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.sEun(x)cos(x)

Juan Esteban da Calle
fonte
2
obrigado. você poderia explicar como esse codificador posicional faz isso com e ? sEuncos
Peyman
1

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:

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
fonte