Parte 8 do processo de desenvolvimento de LLM — técnica de self-attention treinável
(gilesthomas.com)- Em Transformers no estilo GPT, apenas com decodificador, a self-attention treinável calcula em quais tokens da entrada anterior cada token deve focar para criar vetores de contexto
- O ponto central é a scaled dot product attention, que usa três matrizes treináveis
Wq,WkeWvpara enviar os embeddings de entrada aos espaços de query, key e value - A matriz de entrada
Xé transformada emQ=XWq,K=XWkeV=XWv, e depois de dividirΩ=QKᵀpor√c, obtém-se a matriz de pesos de atençãoAcom softmax aplicada por linha - Os vetores de contexto são produzidos com uma única multiplicação de matrizes,
C=AV, e todo o cálculo pode ser aplicado a todos os tokens com 5 multiplicações de matrizes e uma transposição - Esta etapa vai além do exemplo didático em que se fazia dot product diretamente entre embeddings de entrada e leva a uma attention treinável que pode ser implementada com PyTorch
nn.Moduleenn.Linear
Posição da self-attention no fluxo de processamento de um LLM
- Um LLM baseado em Transformer apenas com decodificador, no estilo GPT, é uma arquitetura que prevê o próximo token olhando para os tokens vistos até então
- O fluxo de processamento segue a ordem: dividir a string em tokens, converter cada token em um embedding de token e depois somar um embedding posicional que representa a informação de posição para formar os embeddings de entrada
- A self-attention gera, para cada embedding de entrada, uma lista de pontuações de atenção que indica o quanto ele deve focar nos outros tokens
- Na frase de exemplo
"the fat cat sat on the mat", ao observar"cat","fat"pode ser importante - Ao observar
"mat", a importância de"fat"pode ser relativamente menor
- Na frase de exemplo
- As pontuações de atenção passam por softmax e se tornam pesos de atenção cuja soma é 1; esses pesos são usados para fazer uma soma ponderada dos embeddings de entrada e criar um vetor de contexto
- O vetor de contexto é tratado como um vetor que representa o significado de cada token dentro do contexto de toda a entrada
Objetivo da self-attention treinável
- Até a etapa anterior, era usada uma self-attention didática que calculava diretamente o dot product entre embeddings de entrada
- O objetivo desta etapa é montar um mecanismo de atenção treinável capaz de produzir pontuações de atenção a partir dos vetores de entrada
- A seção 3.4 de Sebastian Raschka em Build a Large Language Model (from Scratch) implementa isso como scaled dot product attention
- O foco está menos em por que essa estrutura é eficaz e mais em como ela funciona em termos de cálculo
Matrizes Query, Key, Value e projeção em espaços
- Considere o comprimento da sequência de entrada como
n, a dimensão do embedding de entrada comode a dimensão do vetor de contexto comoc - A sequência de embeddings de entrada é representada como
x1, x2, x3, ... xn, e cada embedding de entrada é um vetor de dimensãod - Definem-se três matrizes de pesos treináveis
- query weights matrix:
Wq - key weights matrix:
Wk - value weights matrix:
Wv
- query weights matrix:
- Cada matriz tem tamanho
d×ce projeta um vetor de entrada de dimensãodpara um espaço de dimensãoc - O cálculo que envia o vetor de entrada
xmpara o espaço de query éqm=xmWq - Os espaços de key e value também projetam os embeddings de entrada para espaços
c-dimensionais distintos da mesma forma
Entendendo matrizes como projeções
- Matrizes podem ser usadas em transformações geométricas, como rotacionar pontos
- Matrizes quadradas realizam transformações dentro da mesma dimensão, enquanto matrizes não quadradas podem enviar vetores para espaços de outra dimensão
- Por exemplo, uma matriz
3×2pode transformar vetores 3D em vetores 2D - Em gráficos 3D, a matriz de frustum que transforma pontos 3D em pontos 2D na tela também é um exemplo desse tipo de projeção
- A self-attention envia os embeddings de entrada para três espaços de projeção diferentes — query, key e value — e depois realiza os cálculos usando os vetores projetados
- Como essas matrizes de projeção são aprendidas durante o treinamento, surge uma indireção que não existia na atenção por dot product simples
Cálculo das pontuações de atenção
- Ao considerar uma entrada específica
xm, a pontuação de atenção para outra entradaxpé definida como o dot product entre a projeção em query e a projeção em key - As fórmulas são as seguintes
qm=xmWqkp=xpWkωm,p=qm·kp
- É possível fazer esse cálculo com loops para todas as entradas, mas o uso de multiplicação de matrizes permite calcular tudo de uma vez
- Se tomarmos toda a entrada embutida como a matriz
X, entãoXtem tamanhon×d - A matriz key é calculada de uma vez como
K=XWk- O resultado
Ktem tamanhon×c - Cada linha é o vetor correspondente ao embedding de entrada projetado no espaço de key
- O resultado
- A matriz query é calculada da mesma forma, como
Q=XWq - O dot product entre todas as queries e todas as keys é obtido com
QKᵀQén×cKᵀéc×n- O resultado
Ωén×n
Ωm,pé a pontuação de atenção que indica o quanto se deve focar emxpao criar o vetor de contexto dexm
Escalonamento e normalização com softmax
- Assim como no exemplo anterior, as pontuações de atenção passam por softmax para se transformar em pesos cuja soma é 1
- O softmax amplia valores altos, reduz valores baixos e ajusta a lista inteira para que a soma seja 1
- Em LLMs reais,
decpodem chegar à casa dos milhares, e usar apenas softmax pode gerar gradientes pequenos - Nessa situação, o softmax pode se comportar “como uma step function”
- Isso pode ser interpretado como um cenário em que o maior valor domina e os demais se tornam muito pequenos
- Para aliviar isso, divide-se a pontuação de atenção pela raiz quadrada da dimensão do espaço projetado,
c, antes de aplicar o softmax - Em notação matricial, isso fica assim
A=softmax(Ω/√c, axis=1)
axis=1é a notação no estilo PyTorch e significa aplicar o softmax por linha- O resultado
Aé a matriz de pontuações de atenção normalizadas, ou seja, a matriz de pesos de atenção
Criação dos vetores de contexto
- A projeção no espaço de value é calculada como
V=XWv Aé uma matriz de pesos de atenção de tamanhon×nAm,pé o peso de atenção aplicado à entradapao criar o vetor de contexto dexm
Vtem tamanhon×c, e cada linha é um vetor do embedding de entrada projetado no espaço de value- A matriz de vetores de contexto é calculada como
C=AV- O resultado
Cén×c - A linha
mdeCé o vetor de contexto da entradaxm
- O resultado
- Esse cálculo faz, com uma única multiplicação de matrizes, o trabalho de multiplicar os vetores value pelos pesos de atenção e somá-los para cada token
Resumo do cálculo completo
- A matriz de entrada
Xcontém os embeddings de entrada da sequência de tokens e tem tamanhon×d - Três matrizes treináveis projetam a entrada, respectivamente, para os espaços de query, key e value
Q=XWqK=XWkV=XWv
- As pontuações de atenção são calculadas pelo dot product entre query e key
Ω=QKᵀ
- Depois de escalar as pontuações, aplica-se softmax por linha para gerar os pesos de atenção
A=softmax(Ω/√c, axis=1)
- Multiplicam-se a projeção em value e os pesos de atenção para produzir os vetores de contexto
C=AV
- Todo o mecanismo de self-attention pode produzir os vetores de contexto de todos os tokens de entrada com 5 multiplicações de matrizes e uma transposição
Implementação em PyTorch e próximos passos
- A seção 3.4 do livro implementa os cálculos acima em código PyTorch e cria uma subclasse simples de
nn.Moduleque realiza as mesmas operações matriciais - A primeira versão usa objetos
nn.Parametercomuns para as três matrizes de pesos - A segunda versão usa
nn.Linearpara um treinamento mais eficiente - Depois disso, há dois temas a tratar
- causal self-attention: uma abordagem em que, ao observar um determinado token, não se presta atenção aos tokens posteriores
- multi-head attention: apresentada como um tema menos complexo do que parecia inicialmente
- O processamento em lote continua como uma questão separada
- Mesmo com uma única sequência de entrada, usa-se uma matriz de pontuações de atenção
- Para processar várias sequências de entrada em paralelo, pode ser necessário usar tensores de ordem superior às matrizes
- O próximo texto continua em Writing an LLM from scratch, part 9 -- causal attention
Ainda não há comentários.