Para quienes crecimos antes de que la IA generativa se volviera común (como Ernie), solíamos usar algoritmos basados en árboles para aprendizaje supervisado. Los árboles funcionan muy bien con conjuntos de características heterogéneos y tabulares, y al limitar el número de nodos o la profundidad de las ramas, ya hay una selección de características implícita.
Con redes neuronales (NN), antes de la llegada del deep learning, era común usar regularización L1 para seleccionar características, es decir, agregar un término de penalización L1 a la función objetivo para incentivar que algunos parámetros se vuelvan cero. Sin embargo, la regularización L1 es tediosa cuando hay millones o miles de millones de parámetros en una red profunda.
En su lugar, los transformers y la atención se han convertido en técnicas clave para seleccionar características en redes neuronales profundas (ver capítulo 5 de nuestro libro). Pero más allá de hacer viable la selección de características en redes profundas, el mecanismo de atención aporta un beneficio importante que no tienen los métodos tradicionales (como MDA, SHAP o LIME; ver Chan & Man https://arxiv.org/abs/2005.12483): las características seleccionadas dependen de cada muestra específica. No se seleccionan globalmente como hacen los métodos tradicionales. En otras palabras, las características se eligen en función de sus propios valores. En lenguaje de transformers, usamos *self-attention* para la selección de características.
Los transformers suelen ilustrarse con texto. Por ejemplo, una oración con 4 características (palabras): “I”, “am”, “a”, “student”. Llamaremos a este vector de entrada de características X. En redes neuronales profundas, cada característica puede ser un vector (por ejemplo, un vector d-dimensional por palabra), en lugar de un escalar. Así, X puede tener dimensión n × d, donde n es el número de características y d la dimensión de cada una.
En aplicaciones financieras, esto es útil cuando una fila del vector representa datos como retorno diario, PER, rentabilidad por dividendo, etc., hasta d tipos de características en un instante t. Otra fila captura lo mismo en t–1, y así hasta n periodos anteriores. Así, la matriz X tiene dimensión n × d.
Pero en muchos casos financieros, cada característica es un escalar real (por ejemplo, el retorno diario de una acción). Entonces, X = [r(t), r(t–1), …, r(t–n+1)]ᵀ. Este es el ejemplo que usaremos en nuestro *Transformer para pobres*: d = 1, y X es un vector columna n × 1.
En los transformers típicos, el siguiente paso es transformar X en tres vectores/matrices: Q (query), K (key) y V (value). Un elemento de Q representa “qué busca esta característica en otras”, K representa “el contexto que puede ofrecer” y V es “una nueva representación de esa característica”.
En transformers con self-attention, Q, K y V se calculan como transformaciones lineales de X. Las matrices WQ, WK, WV son parámetros aprendidos, entrenados en función del objetivo (clasificación, regresión, optimización, etc.). Los W tienen altura n pero diferentes anchos: dq, dk y dv.
La intuición es que buscamos combinaciones lineales de X que representen mejor la información, algo parecido al PCA. En el ejemplo del n × d financiero, queremos proyectar el retorno y los fundamentales en vectores tipo “componentes principales”, conservando la especificidad de cada instante temporal (cada fila).

La figura muestra un transformer con n=4, d=4 y dq=dk=dv=2. También se observa cómo Q y K se multiplican, se escalan con √dk para evitar magnitudes explosivas, y se pasa por softmax, en lo que se llama Scaled Dot-Product Attention.
¿Por qué √dk? Citando a Cong et al.: “Si los componentes de q y k son variables aleatorias independientes con media 0 y varianza 1, entonces su producto escalar tiene media 0 y varianza dk”.
¿Por qué softmax? La función softmax normaliza el producto escalar escalado en una matriz cuyas filas son pesos de atención (suman 1). Estos pesos se aplican sobre V.

Pero en nuestro *Transformer para pobres*, W es solo un escalar, y Q, K y V son vectores unidimensionales. Así que podemos eliminar este paso y simplemente usar X en lugar de Q, K y V.
Esto no colapsa la matriz QKᵀ a un escalar, sino que produce una matriz n × n igual a X·Xᵀ. Cada elemento A(i, j) representa la interacción entre las características i y j. Como siempre, cada fila de A suma 1.
¿Quieres saber la importancia de una característica j? Suma la columna j, pues representa la clave j. Si solo buscas puntajes de importancia, ya terminaste.
Pero normalmente queremos usar estos puntajes en aplicaciones posteriores. En el ejemplo de una acción y n retornos diarios, queremos usar estos valores ponderados para predecir el retorno del día siguiente. Entonces, multiplicamos la matriz de atención A por V (que es igual a X) para obtener el vector de contexto Z = AX.
Z es una versión ponderada por atención del vector original X. Podemos usar Z como entrada a una red MLP para aprendizaje supervisado (por ejemplo, para predecir el retorno del próximo día) o para optimización con aprendizaje por refuerzo.
¿Funciona esto? Puedes pedirle a ChatGPT o a tu chatbot favorito que te cree un programa basado en esta idea y probarlo.