Adiós a la recurrencia
22 min read
El bloque anterior terminó dejando la atención en los huesos: tres listas de vectores, una función que compara y una suma ponderada, sin una sola recurrencia por dentro. Lo que no tocó fue la máquina que la rodea, y esa sigue siendo recurrente de arriba abajo: quien llena las listas es un decoder que produce un estado por paso y no sabe producir el siguiente antes que el anterior. La operación ya no espera a nada; espera a quien se la pide.
Esta lección quita esa máquina entera y se queda mirando lo que sobrevive. Y la pregunta no es estética, porque la recurrencia cobra un precio que se puede contar. Toma una noticia de tokens y una red recurrente cualquiera: leerla son pasos que ocurren uno después de otro, y comprar una máquina con procesadores no cambia nada, porque el paso necesita un número que el paso todavía no ha terminado de calcular. Esa es la primera factura. La segunda la pagó el bloque 3 entero: lo que la posición tenga que decirle a la posición viaja por multiplicaciones por la misma matriz, y para cuando llega no queda casi nada. Las dos facturas tienen el mismo origen, y quitarlo se lleva las dos por delante.
El diagrama de abajo es dónde acaba todo esto: la arquitectura completa que el bloque construye, la figura 1 del artículo Attention is All You Need, caja por caja. A estas alturas la mitad de los nombres no te dicen nada, y no pasa nada —cada caja lleva escrita la lección que la construye—. Lo que sí se lee hoy es lo único que esta lección afirma: enciende el marcador y, de las quince cajas, se iluminan tres. Las otras doce trabajan sobre una fila cada vez y no tienen forma de saber qué hay en la de al lado.
La cadena de esperas que ningún ordenador acorta
La recurrencia del bloque anterior se escribe en una línea, y esa línea lo dice todo:
con y . De los dos sumandos, el segundo no espera a nadie: sólo mira el token de su posición, así que los productos se pueden calcular a la vez en cuanto el texto está tokenizado. El primero sí espera. es el resultado del paso anterior, y no hay manera de adelantarlo sin calcularlo. Una de las dos mitades se reparte entre procesadores y la otra no, y la que no se reparte es la que fija el resultado: la profundidad de la cadena —cuántas operaciones tienen que ocurrir en fila, una detrás de otra— es .
Ponlo frente a la llamada de atención tal como quedó escrita. La puntuación de la pareja es
y ahí no aparece ningún de ninguna otra pareja. Cada una de las puntuaciones se calcula con dos vectores que ya existen, de modo que las se pueden calcular simultáneamente —que es lo que significa que quepan en un solo producto de matrices, —. El softmax normaliza cada fila con la suya y ninguna fila mira a otra; la mezcla es un segundo producto. Tres operaciones en fila, y ese tres no se mueve cuando el texto se alarga.
La otra distancia, la que el bloque 3 no pudo acortar
La profundidad de la cadena decide cuánto se tarda. Hay una segunda distancia, y decide algo peor.
Pregúntate por dónde viaja lo que la posición le aporta a la posición . En la recurrencia viaja por dentro del estado, y el estado se reescribe en cada paso, así que ese aporte pasa por productos por antes de llegar. Es exactamente la cuenta de la lección sobre el gradiente que se desvanece: multiplicar veces por la misma matriz apaga la señal si su radio espectral es menor que y la dispara si es mayor, y la LSTM (long short-term memory) y la GRU (gated recurrent unit) no acortaron ese camino, le abrieron una vía aditiva al lado para que sobreviviera el viaje.
En la atención el camino entre esas dos posiciones es un peso:
Lo que aporta la posición es su sumando, y delante lleva un solo factor: . Uno, no . Y como el camino de vuelta es el de ida recorrido al revés, el gradiente que llega a la posición desde la pérdida del paso tampoco atraviesa nada intermedio. La distancia entre dos posiciones cualesquiera deja de depender de cuántas haya en medio, que es más de lo que el bloque 3 consiguió: la compuerta hizo el viaje sobrevivible, no corto.
Lo que cuesta cambiar los pasos por una rejilla
Nada de esto es gratis, y el precio se cuenta en multiplicaciones. Empieza por la recurrencia. Un paso multiplica por un vector y por otro, y multiplicar una matriz por un vector cuesta una multiplicación por casilla, así que el paso cuesta un producto por cada peso que tiene. Esa es la cuenta de la lección sobre la RNN (recurrent neural network) vanilla, leída como coste en lugar de como memoria. Sobre la frase entera:
Ahora la rejilla. multiplica una matriz por una : cada una de las casillas del resultado es un producto escalar de términos, y son multiplicaciones. La mezcla tiene casillas y cada una suma términos, otras . En total:
Las dos cuentas se comparan mejor con las cuatro anchuras iguales. Supongámoslas iguales y llamémoslas : quedan frente a , y la razón entre las dos es . La rejilla cuesta menos que la recurrencia mientras la frase mida menos que el modelo, y más en cuanto lo pasa; se cruzan cuando , y no antes. En el artículo estas dos cuentas aparecen escritas como frente a , que es la misma comparación con las constantes borradas; te la vas a encontrar así en su tabla 1.
Lo que se ha comprado con eso conviene decirlo entero, porque no es «más rápido». Es un cambio de eje: el trabajo total crece —con al cuadrado, en textos largos—, y a cambio ese trabajo se puede repartir, mientras que los pasos de la recurrencia no se pueden repartir de ninguna manera. Una cuenta grande que cabe en un solo producto de matrices se resuelve antes que una cuenta pequeña partida en esperas.
El precio que no se paga en multiplicaciones
Vuelve a mirar la puntuación, y esta vez fíjate en los índices. En los subíndices sólo señalan qué dos vectores entran; dentro de la cuenta no aparece ni ni . Lo mismo vale para la mezcla, que es una suma, y una suma no distingue el orden de sus sumandos. La consecuencia es incómoda: si barajas las filas de y , las salidas se barajan igual y ningún número cambia.
De modo que el perro muerde al cartero y al cartero muerde el perro llegan a la capa como el mismo conjunto de vectores. La recurrencia no tenía este problema, y no por virtud propia: lo tenía resuelto de nacimiento, porque leía en orden y el orden de lectura era el orden de la frase. El MLP (multilayer perceptron) concatenado de la lección sobre por qué falla el MLP en secuencias, tampoco lo tenía, por la razón contraria: cada posición multiplicaba su propio bloque de pesos, y por eso sabía distinguirlas y no sabía generalizar entre ellas. La atención no tiene ni lo uno ni lo otro.
La concesión es grande y esta lección no la arregla: quitar la recurrencia se lleva por delante lo único que sabía el orden. Se arregla sumándole a cada fila algo que dependa de dónde está, y eso es una lección más adelante, sobre la codificación posicional. Hasta entonces, todo lo que sigue trata la entrada como una bolsa de vectores.
Compruébalo a mano con una frase de 50 tokens
Haz las dos cuentas con números, que es donde se ve que el cambio no es teórico. Toma —la anchura del modelo del artículo— y una frase de tokens.
La recurrencia: multiplicaciones, repartidas en pasos que van uno detrás de otro. La rejilla: , y no en esperas sino en dos productos de matrices. Diez veces menos trabajo, y la profundidad de la cadena ha pasado de a un número que ni siquiera menciona a .
Sube ahora a , un texto largo. La rejilla pide y la recurrencia : casi el doble, y esta vez el caro es el nuevo. La razón entre los dos es , tal como decía . Hazlo tú con y comprueba que sale —y fíjate en que la profundidad de la cadena sigue sin moverse, mientras la de la recurrencia se ha ido a —.
Ese es el trato, con sus dos columnas a la vista: se paga trabajo, que se puede repartir entre procesadores, y se compra espera, que no se puede repartir entre nada.
Comprueba tu intuición
Cuatro preguntas: qué es lo que no se puede solapar, dónde se cruzan las dos cuentas, qué pasa si barajas las filas y qué le ocurre al camino entre dos posiciones lejanas.
Tienes un ordenador con tantos procesadores como quieras y una frase de tokens ya tokenizada entera. ¿Qué es lo que sigue costando pasos que no se pueden solapar?
Con , ¿a partir de qué longitud cuesta más multiplicaciones la rejilla de atención que la recurrencia?
A margin of ±0 is accepted.
Le pasas a la llamada de atención las mismas filas en otro orden —los mismos tokens, barajados—. ¿Qué sale?
Sobre el camino que une la posición con la posición , marca lo que es cierto.
Select every correct option. This is graded all-or-nothing: there is no partial credit.
Queda un agujero en el sitio más visible. La llamada de atención necesita tres listas, y en todo el bloque anterior las consultas venían del decoder: eran sus estados, uno por paso. Ese decoder acaba de desaparecer del dibujo. Nadie fabrica ya , y sin consultas la operación que esta lección ha puesto en el centro de la arquitectura no tiene con qué empezar.
La respuesta es la que le da nombre a la lección siguiente, sobre la auto-atención: que pregunte la propia secuencia. Si las consultas, las claves y los valores son tres lecturas de la misma lista de vectores, no hace falta ninguna segunda red que produzca nada —y cada posición pasa a mirar a todas las demás, incluida ella misma—. Es la operación de siempre con los tres papeles repartidos de otra manera, y es lo que convierte el diagrama de arriba en algo que se puede calcular.
Further reading1 source · 1 paper
Where this lesson comes from, and where to go next. None of it is needed to carry on with the course.
- Attention Is All You Need
Su §4 y su tabla 1 reúnen las tres cuentas de esta lección: operaciones que no se solapan, camino entre dos posiciones y coste por capa, O(T²d) frente a O(Td²). La tabla borra las constantes; el cruce en T = d lo despejas tú.