somosnlp / the-annotated-transformer

Traducción al español del notebook "The Annotated Transformer" de Harvard NLP donde se explica e implementa el paper "Attention Is All You Need".
5 stars 3 forks source link

Positional Encoding #2

Open mariagrandury opened 3 years ago

mariagrandury commented 3 years ago

Entender, explicar e implementar la pieza "Positional Encoding" de la arquitectura Transformer.

mariagrandury commented 3 years ago

Ya que empezamos el proyecto en otro repositorio, voy a copiar a continuación los mensajes relevantes para continuar.

mariagrandury commented 3 years ago

Comentario de @IsaacRodgz

Artículos de referencia:

  1. Language Modeling with Deep Transformers (Irie et al., 2019)
  2. What Do Position Embeddings Learn? An Empirical Study of Pre-Trained Language Model Positional Encoding (Wang et al., 2020)
  3. DeBERTa: Decoding-enhanced BERT with Disentangled Attention (He et al., 2020)
  4. Transformer Architecture: The Positional Encoding (Blog, 2019)
  5. What is the positional encoding in the transformer model? (datascience.stackexchange, 2019)
  6. Why add positional embedding instead of concatenate? (tensor2tensor GitHub, 2019)
mariagrandury commented 3 years ago

Comentario de @IsaacRodgz

Dado que todavía parece no haber un consenso o una prueba contundente sobre si los positional encodings son necesarios o no, creo lo mejor sería hacer que sea un parámetro opcional en el modelo, es decir que por argumentos se pueda decidir si incluirlos o no en el modelo. En cuanto a la implementación, yo propondría dejar la versión orginal, con señales seno y coseno y a lo mejor una opción donde estos sean una matriz Embedding aprendible. ¿Qué opinan?

mariagrandury commented 3 years ago

Comentario de @garbanciton

Totalmente de acuerdo contigo deberíamos poner esa función de positional encoding con opción de ponerla o quitarla. Al final resumiendo mucho ese positional encoding que se suma al embedding, lo que va a hacer es que cuando se haga el coseno similaridad en multi-head attention o el dot product ( que es lo mismo ) van a dar resultados distintos depende de donde estén ubicadas las palabras. Pongo un ejemplo que se ve más claro.

digamos que "gato" y "saltó" tiene vectores [1,2,3] y [2,3,4] su dot product es:

>> import numpy as np
>> np.dot([1,2,3],[2,3,4])
>> 20

si ahora a estos embeddings sumamos el vector de positional encoding de la oración 1 su dot product será totalmente distinto del de la oración 2, y así es como supuestamente tenemos en cuenta la posición de las palabras.

Personalmente creo que no tiene sentido sumar la información de los embeddings ,si los embeddings son pre-entrenados como puede ser word2vec o glove ,porque son cosas totalmente distintas.

Ahora bien tal y como dicen en el paper:

we use learned embeddings to convert the input tokens and output tokens to vectors of dimension dmodel.

puede tener más sentido sumar aquí, ya que esos embeddings están creándose durante el entrenamiento con la suma del postional encoding. Tengo la intuición de que estos postional encoding al ser senos y cosenos tienen en cuenta la posición relativa entre palabras, es decir, las palabras que aparezcan en la posición 2 y 3, y que esas mismas aparezcan en otro contexto pero en las posiciones 7 y 8 su dot product debería ser el mismo.

Sería interesante ver esta hipótesis una vez hallamos entrenado los embeddings:

mariagrandury commented 3 years ago

Un par de vídeos de ~10mins muy útiles para entender positional encoding: