Desarrollo de LLM, parte 8 - técnica de self-attention entrenable
(gilesthomas.com)- En un Transformer decoder-only de estilo GPT, la self-attention entrenable calcula a qué tokens de la entrada previa debe prestar atención cada token para crear vectores de contexto
- La clave es la scaled dot product attention, que usa tres matrices entrenables
Wq,Wk,Wvpara enviar los embeddings de entrada a los espacios de query, key y value - La matriz de entrada
Xse transforma comoQ=XWq,K=XWk,V=XWv, y tras dividirΩ=QKᵀentre√cse obtiene la matriz de pesos de atenciónAcon softmax aplicada por filas - Los vectores de contexto se crean con una sola multiplicación matricial,
C=AV, y todo el cálculo puede aplicarse a todos los tokens con 5 multiplicaciones de matrices y una transposición - Esta etapa va más allá del ejemplo de juguete que hacía dot product directamente entre embeddings de entrada, y lleva a una attention entrenable que puede implementarse con PyTorch
nn.Moduleynn.Linear
Dónde se ubica la self-attention en el flujo de procesamiento de un LLM
- Un LLM basado en un Transformer decoder-only de estilo GPT es una arquitectura que predice el siguiente token viendo los tokens anteriores
- El flujo de procesamiento consiste en dividir una cadena en tokens, convertir cada token en un token embedding, y luego sumar un positional embedding que representa la información de posición para crear los embeddings de entrada
- La self-attention genera, para cada embedding de entrada, una lista de attention scores que indica cuánto debe fijarse en los demás tokens
- En la oración de ejemplo
"the fat cat sat on the mat", al mirar"cat","fat"puede ser importante - Al mirar
"mat", la importancia de"fat"puede ser relativamente menor
- En la oración de ejemplo
- Los attention scores pasan por softmax para convertirse en pesos de atención cuya suma es 1, y con esos pesos se hace una suma ponderada de los embeddings de entrada para formar un vector de contexto
- El vector de contexto se trata como un vector que representa el significado de cada token dentro del contexto de toda la entrada
Objetivo de la self-attention entrenable
- Hasta la etapa anterior se usaba una self-attention de juguete que calculaba directamente el dot product entre embeddings de entrada
- El objetivo de esta etapa es construir un mecanismo de attention entrenable que pueda generar attention scores a partir de los vectores de entrada
- La sección 3.4 de Sebastian Raschka, Build a Large Language Model (from Scratch), lo implementa como scaled dot product attention
- El foco no está tanto en por qué esta estructura es efectiva, sino en con qué cálculos funciona
Matrices Query, Key, Value y proyección de espacios
- Se define
ncomo la longitud de la secuencia de entrada,dcomo la dimensión del embedding de entrada yccomo la dimensión del vector de contexto - La secuencia de embeddings de entrada se representa como
x1, x2, x3, ... xn, y cada embedding de entrada es un vector de dimensiónd - Se definen tres matrices de pesos entrenables
- query weights matrix:
Wq - key weights matrix:
Wk - value weights matrix:
Wv
- query weights matrix:
- Cada matriz tiene tamaño
d×cy proyecta un vector de entrada de dimensiónda un espacio de dimensiónc - El cálculo para enviar el vector de entrada
xmal espacio de query esqm=xmWq - Los espacios key y value también proyectan los embeddings de entrada a distintos espacios de dimensión
cdel mismo modo
Ver las matrices como proyecciones
- Las matrices pueden usarse para transformaciones geométricas, como rotar puntos
- Las matrices cuadradas realizan transformaciones dentro de la misma dimensión, y las matrices no cuadradas pueden enviar vectores a espacios de otra dimensión
- Por ejemplo, una matriz
3×2puede transformar vectores de 3 dimensiones en vectores de 2 dimensiones - En gráficos 3D, una matriz de frustum que transforma puntos 3D en puntos de una pantalla 2D también es un ejemplo de este tipo de proyección
- La self-attention envía los embeddings de entrada a tres espacios de proyección distintos llamados query, key y value, y luego hace los cálculos con esos vectores proyectados
- Como estas matrices de proyección se aprenden durante el entrenamiento, aparece una indirección que no existía en la atención por dot product simple
Cálculo de los attention scores
- Al considerar una entrada específica
xm, el attention score respecto a otra entradaxpse define como el dot product entre la proyección query y la proyección key - La fórmula es la siguiente
qm=xmWqkp=xpWkωm,p=qm·kp
- Este cálculo podría hacerse con bucles para todas las entradas, pero usando multiplicación matricial puede calcularse todo de una vez
- Si se toma la totalidad de los embeddings de entrada como la matriz
X,Xtiene tamañon×d - La matriz key se calcula de una vez como
K=XWk- El resultado
Ktiene tamañon×c - Cada fila es el vector que proyecta el embedding de entrada correspondiente al espacio key
- El resultado
- La matriz query se calcula del mismo modo como
Q=XWq - El dot product entre todas las query y todas las key se obtiene con
QKᵀQesn×cKᵀesc×n- El resultado
Ωesn×n
Ωm,pes el attention score que indica cuánto debe atenderse axpal construir el vector de contexto dexm
Escalado y normalización con softmax
- Los attention scores se convierten, como en el ejemplo anterior, en pesos cuya suma es 1 mediante softmax
- Softmax amplifica los valores grandes, reduce los pequeños y ajusta la lista completa para que la suma total sea 1
- En los LLM reales,
dycpueden llegar a estar en el orden de los miles, por lo que usar solo softmax puede producir gradientes pequeños - En ese caso, softmax puede comportarse “como una step function”
- Puede interpretarse como una situación en la que domina el valor más grande y los demás quedan muy pequeños
- Para aliviar esto, los attention scores se dividen por la raíz cuadrada de la dimensión
cdel espacio proyectado y luego se aplica softmax - La expresión matricial es la siguiente
A=softmax(Ω/√c, axis=1)
axis=1es notación al estilo PyTorch y significa que softmax se aplica por filas- El resultado
Aes la matriz de attention scores normalizados, es decir, la matriz de pesos de atención
Creación de vectores de contexto
- La proyección al espacio value se calcula como
V=XWv Aes una matriz de pesos de atención de tamañon×nAm,pes el peso de atención que se aplica a la entradapal construir el vector de contexto dexm
Vtiene tamañon×c, y cada fila es el vector que proyecta un embedding de entrada al espacio value- La matriz de vectores de contexto se calcula como
C=AV- El resultado
Cesn×c - La fila
mdeCes el vector de contexto para la entradaxm
- El resultado
- Este cálculo realiza, con una sola multiplicación matricial, la operación de multiplicar los vectores value por los pesos de atención y sumarlos para cada token
Resumen del cálculo completo
- La matriz de entrada
Xcontiene los embeddings de entrada de la secuencia de tokens y su tamaño esn×d - Con tres matrices entrenables, la entrada se proyecta por separado a los espacios query, key y value
Q=XWqK=XWkV=XWv
- Los attention scores se calculan con el dot product entre query y key
Ω=QKᵀ
- Tras escalar los puntajes, se aplica softmax por filas para crear los pesos de atención
A=softmax(Ω/√c, axis=1)
- Al multiplicar la proyección value por los pesos de atención, se generan los vectores de contexto
C=AV
- Todo el mecanismo de self-attention puede crear los vectores de contexto de todos los tokens de entrada con 5 multiplicaciones de matrices y una transposición
Implementación en PyTorch y siguiente paso
- La sección 3.4 del libro implementa el cálculo anterior en código PyTorch y crea una subclase simple de
nn.Moduleque realiza las mismas operaciones matriciales - La primera versión usa objetos
nn.Parametercomunes para las tres matrices de pesos - La segunda versión usa
nn.Linearpara un entrenamiento más efectivo - Después se tratan dos temas
- causal self-attention: una forma en la que, al mirar un token, no se presta atención a los tokens posteriores
- multi-head attention: se adelanta como un tema no tan complicado como se pensaba al principio
- El procesamiento por lotes queda como una cuestión aparte
- Incluso con una sola secuencia de entrada se usa una matriz de attention scores
- Para procesar varias secuencias de entrada en paralelo, podrían necesitarse tensores de orden superior a una matriz
- El siguiente artículo continúa en Writing an LLM from scratch, part 9 -- causal attention
Aún no hay comentarios.