20 votos

¿Por qué utilizamos el enmascaramiento para el relleno en el codificador del Transformer?

Actualmente estoy tratando de implementar una versión PyTorch del Transformador y tenía una pregunta.

He observado que muchas implementaciones aplican una máscara no sólo al descodificador, sino también al codificador. El tutorial oficial de TensorFlow para el Transformador también afirma que el Transformador utiliza algo llamado "MultiHead Attention (with padding masking)".

Estoy confundido, ¿por qué se aplican máscaras al relleno en la secuencia del codificador?

14voto

dot Puntos 157

No me había dado cuenta de que esta pregunta no tenía respuesta. Si intentara responder a mi propia pregunta, aplicamos máscaras a los datos de origen porque después de que los datos pasen por la subcapa Codificador, hay valores para las secuencias de relleno. No necesitamos ni queremos que el modelo preste atención a estas secuencias de relleno, por lo que las enmascaramos.

Es ligeramente diferente del enmascaramiento en el descodificador en el sentido de que el enmascaramiento en el descodificador da un paso adicional al tener un mecanismo de "no mirar" para que nuestro modelo no pueda mirar las fichas futuras.

10voto

Yann Ramin Puntos 25139

La máscara es simplemente para asegurar que el codificador no paga ningún atención a los tokens de relleno. Aquí está la fórmula para la escala enmascarada atención del producto punto: $$ \mathrm{Attention}(Q, K, V, M) = \mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}M\right)V $$ Softmax genera una distribución de probabilidad. Fijando el vector máscara $M$ a un valor cercano al infinito negativo donde tenemos fichas de relleno y 1 en caso contrario, nos aseguramos de que no se presta atención a esos tokens.

5voto

La respuesta es: no queremos que el softmax en atención se vea afectado por las partes acolchadas de las secuencias.

Las secuencias tienen distintas longitudes:

  • si la secuencia es demasiado larga, la recortamos
  • si la secuencia es demasiado larga, rellenamos la parte restante con tokens o valores como 0

Pero estos valores en incrustaciones, más adelante, afectará a la salida de la atención, debido a softmax: Por ejemplo, si tenemos un vector = [2, 0.5, 0.8, 1, 0, 0, 0, 0] (los últimos 4 valores son la parte rellenada), la salida softmax será [0.41, 0.09, 0.12, 0.15, 0.06, 0.06, 0.06, 0.06], sin embargo, sabemos que los últimos cuatro elementos no tienen valor real y no deberían influir en la salida.

Por lo tanto, creamos la máscara y la aplicamos antes de softmax, estableciendo los valores de relleno a -inf o algo así como -1e9. Por ejemplo, el vector anterior después de la sustitución se verá así: [2, 0.5, 0.8, 1, -1e9, -1e9, -1e9, -1e9] y aquí está la salida softmax: [0.53, 0.12, 0.16, 0.19, 0, 0, 0, 0]

0voto

joseml Puntos 1

Creo que puede ser debido a que no queremos computar la pérdida de relleno y el peso de la posición de relleno debe ser $0.$

0voto

Josh Anish Puntos 1

Para un codificador sólo aplicamos máscaras acolchadas, para un decodificador aplicamos tanto la máscara causal como la máscara acolchada, cubriendo sólo la parte del codificador las máscaras acolchadas ayudan al modelo a ignorar esos valores acolchados ficticios. así el modelo se centra sólo en la parte útil de la secuencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X