Saltar al contenido

Una introducción suave a la codificación posicional en modelos de transformadores, parte 1

6 de marzo de 2022

Última actualización el 2 de marzo de 2022

En los idiomas, el orden de las palabras y su posición en una oración realmente importa. El significado de la oración completa puede cambiar si se reordenan las palabras. Al implementar soluciones NLP, las redes neuronales recurrentes tienen un mecanismo incorporado que se ocupa del orden de las secuencias. El modelo de transformador, sin embargo, no usa recurrencia o convolución y trata cada punto de datos como independiente del otro. Por lo tanto, la información posicional se agrega al modelo explícitamente para retener la información sobre el orden de las palabras en una oración. La codificación posicional es el esquema a través del cual se mantiene el conocimiento del orden de los objetos en una secuencia.

Para este tutorial, simplificaremos las notaciones utilizadas en este increíble artículo. Todo lo que necesitas es atención, de Vaswani et al. Después de completar este tutorial, sabrás:

  • ¿Qué es la codificación posicional y por qué es importante?
  • Codificación posicional en transformadores
  • Codifique y visualice una matriz de codificación posicional en Python usando NumPy

Empecemos.

Una introducción suave a la codificación posicional en modelos de transformadores
Foto de Muhammad Murtaza Ghani en Unsplash, algunos derechos reservados

Descripción general del tutorial

Este tutorial se divide en cuatro partes; ellos son:

  1. ¿Qué es la codificación posicional?
  2. Matemáticas detrás de la codificación posicional en transformadores
  3. Implementando la matriz de codificación posicional usando NumPy
  4. Comprender y visualizar la matriz de codificación posicional

¿Qué es la codificación posicional?

La codificación posicional describe la ubicación o posición de una entidad en una secuencia para que a cada posición se le asigne una representación única. Hay muchas razones por las que un solo número, como el valor del índice, no se utiliza para representar la posición de un elemento en los modelos de transformadores. Para secuencias largas, los índices pueden crecer en magnitud. Si normaliza el valor del índice para que se encuentre entre 0 y 1, puede crear problemas para las secuencias de longitud variable, ya que se normalizarían de manera diferente.

Recomendado:  El aprendizaje automático es una gran herramienta para la ciberseguridad, pero tenga cuidado, dice un experto

Los transformadores utilizan un esquema de codificación posicional inteligente, donde cada posición/índice se asigna a un vector. Por lo tanto, la salida de la capa de codificación posicional es una matriz, donde cada fila de la matriz representa un objeto codificado de la secuencia sumada con su información posicional. En la siguiente figura se muestra un ejemplo de la matriz que codifica solo la información posicional.

Una función de seno trigonométrica de ejecución rápida

Esta es una recapitulación rápida de funciones de seno y puede trabajar de manera equivalente con funciones de coseno. El rango de la función es [-1,+1]. La frecuencia de esta forma de onda es el número de ciclos completados en un segundo. La longitud de onda es la distancia sobre la cual la forma de onda se repite. La longitud de onda y la frecuencia para diferentes formas de onda se muestran a continuación:

Capa de codificación posicional en transformadores

Vamos a sumergirnos directamente en esto. Supongamos que tenemos una secuencia de entrada de longitud $L$ y requerimos la posición del objeto $k^{th}$ dentro de esta secuencia. La codificación posicional viene dada por funciones seno y coseno de frecuencias variables:

begin{eqnarray}
P(k, 2i) &=& sinGrande(frac{k}{n^{2i/d}}Grande)
P(k, 2i+1) &=& cosGrande(frac{k}{n^{2i/d}}Grande)
end{eqnarray}

Aquí:

$k$: Posición de un objeto en la secuencia de entrada, $0 leq k < L/2$

$d$: Dimensión del espacio de incrustación de salida

$P(k, j)$: función de posición para asignar una posición $k$ en la secuencia de entrada al índice $(k,j)$ de la matriz posicional

$n$: escalar definido por el usuario. Establecido en 10.000 por los autores de Attention is all You Need.

$i$: se usa para mapear índices de columna $0 leq i < d/2$. Un solo valor de $i$ se asigna a funciones de seno y coseno

En la expresión anterior podemos ver que las posiciones pares corresponden a la función seno y las posiciones impares corresponden a las posiciones pares.

Ejemplo

Para entender la expresión anterior, tomemos un ejemplo de la frase ‘Soy un robot’, con n=100 y d=4. La siguiente tabla muestra la matriz de codificación posicional para esta frase. De hecho, la matriz de codificación posicional sería la misma para cualquier frase de 4 letras con n=100 y d=4.

Recomendado:  Weaviate es un motor de búsqueda de código abierto impulsado por ML, vectores, gráficos y GraphQL

Codificación de la matriz de codificación posicional desde cero

Aquí hay un breve código de Python para implementar la codificación posicional usando NumPy. El código se simplifica para facilitar la comprensión de la codificación posicional.

importar entumecido como notario público

importar matplotlib.pyplot como por favor

definitivamente getPositionEncoding(seq_len, D, norte=10000):

PAGS = notario público.ceros((seq_len, D))

por k en rango(seq_len):

por I en notario público.naranja(En t(D/2)):

denominador = notario público.energía(norte, 2*I/D)

PAGS[k, 2*i] = notario público.pecado(k/denominador)

PAGS[k, 2*i+1] = notario público.porque(k/denominador)

regreso PAGS

PAGS = getPositionEncoding(seq_len=4, D=4, norte=100)

imprimir(PAGS)

[[ 0.          1.          0.          1.        ]

[ 0.84147098  0.54030231  0.09983342  0.99500417]

[ 0.90929743 -0.41614684  0.19866933  0.98006658]

[ 0.14112001 -0.9899925   0.29552021  0.95533649]]

Comprender la matriz de codificación posicional

Para entender la codificación posicional, comencemos mirando la onda sinusoidal para diferentes posiciones con n=10,000 y d=512.

definitivamente plotSinusoide(k, D=512, norte=10000):

X = notario público.naranja(0, 100, 1)

denominador = notario público.energía(norte, 2*X/D)

y = notario público.pecado(k/denominador)

por favor.trama(X, y)

por favor.título(‘k = ‘ + calle(k))

higo = por favor.figura(tamaño de higo=(15, 4))

por I en rango(4):

por favor.subtrama(141 + I)

plotSinusoide(I*4)

La siguiente figura es el resultado del código anterior:

Onda sinusoidal para diferentes índices de posición

Podemos ver que cada posición $k$ corresponde a una sinusoide diferente, que codifica una sola posición en un vector. Si observamos de cerca la función de codificación posicional, podemos ver que la longitud de onda para un $i$ fijo viene dada por:

$$
lambda_{i} = 2 pi n^{2i/d}
$$

Por lo tanto, las longitudes de onda de las sinusoides forman una progresión geométrica y varían de $2pi$ a $2pi n$. El esquema para la codificación posicional tiene una serie de ventajas.

  1. Las funciones seno y coseno tienen valores en [-1, 1]que mantiene los valores de la matriz de codificación posicional en un rango normalizado.
  2. Como la sinusoide de cada posición es diferente, tenemos una forma única de codificar cada posición.
  3. Tenemos una forma de medir o cuantificar la similitud entre diferentes posiciones, lo que nos permite codificar posiciones relativas de palabras.

Visualizando la Matriz Posicional

Visualicemos la matriz posicional en valores más grandes. Usaremos Python matshow() método de la matplotlib Biblioteca. Al establecer n = 10,000 como se hizo en el documento original, obtenemos lo siguiente:

PAGS = getPositionEncoding(seq_len=100, D=512, norte=10000)

cax = por favor.matshow(PAGS)

por favor.mcd().barra de color(cax)

La matriz de codificación posicional para n=10,000, d=512, longitud de secuencia=100

¿Cuál es el resultado final de la capa de codificación posicional?

La capa de codificación posicional suma el vector posicional con la codificación de palabras y genera esta matriz para las siguientes capas. Todo el proceso se muestra a continuación.

La capa de codificación posicional en el transformador.

Otras lecturas

Esta sección proporciona más recursos sobre el tema si desea profundizar más.

Libros

Documentos

Artículos

Resumen

En este tutorial, descubrió la codificación posicional en transformadores.

Específicamente, aprendiste:

  • Qué es la codificación posicional y por qué es necesaria.
  • Cómo implementar la codificación posicional en Python usando NumPy
  • Cómo visualizar la matriz de codificación posicional

¿Tiene alguna pregunta sobre la codificación posicional discutida en esta publicación? Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responder.