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]