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)]
donde la fórmula para la codificación posicional es la siguiente
con (por lo tanto, ) en el documento original.PE(pos,2i)=sin(pos100002i/dmodel),
PE(pos,2i+1)=cos(pos100002i/dmodel).
dmodel=512i∈[0,255]
Esta técnica se utiliza porque no hay una noción de orden de las palabras (primera palabra, segunda palabra, ..) en la arquitectura propuesta. Todas las palabras de secuencia de entrada se alimentan a la red sin un orden o posición especial (a diferencia de las arquitecturas comunes RNN o ConvNet), por lo tanto, el modelo no tiene idea de cómo se ordenan las palabras. En consecuencia, se agrega una señal dependiente de la posición a cada incrustación de palabras para ayudar al modelo a incorporar el orden de las palabras. Basado en experimentos, esta adición no solo evita destruir la información de incrustación sino que también agrega la información de posición vital. En el caso de RNNs, alimentamos las palabras secuencialmente a RNN, es decir, palabra-ésimo se alimenta en la etapa , que ayuda al modelo de incorporar el orden de las palabras.nn
Este artículo de Jay Alammar explica el artículo con excelentes visualizaciones. Desafortunadamente, su ejemplo para la codificación posicional es incorrecto en este momento (usa para la primera mitad de las dimensiones de incrustación y para la segunda mitad, en lugar de usar para índices pares y para índices impares).sincossincos
La codificación posicional es una nueva representación de los valores de una palabra y su posición en una oración (dado que no es lo mismo estar al principio que al final o en el medio).
Pero hay que tener en cuenta que las oraciones pueden tener cualquier longitud, por lo que decir '' X '' es la tercera palabra de la oración 'no tiene sentido si hay oraciones de diferente longitud: la tercera en una oración de 3 palabras es completamente diferente al 3er en una oración de 20 palabras.
Lo que hace un codificador posicional es obtener ayuda de la naturaleza cíclica de las funciones y para devolver información de la posición de una palabra en una oración.sin(x) cos(x)
fuente
Para agregar a otras respuestas, la implementación de referencia de OpenAI lo calcula en un espacio de registro natural (para mejorar la precisión, creo. No estoy seguro si podrían haber usado el inicio de sesión en la base 2). No se les ocurrió la codificación. Aquí está la generación de la tabla de búsqueda PE reescrita en C como un ciclo for-for:
fuente