Um Embedding É uma Consulta, Não uma Função
Uma Primeira Camada Após um Tokenizer
Um tokenizer fornece ao modelo IDs inteiros: [256, 1842, 7301, ...]. A primeira coisa que um transformer faz é converter cada ID em um vetor de floats de d_model. Esse vetor vive em um espaço de d_model dimensões (768 dimensões para ANDREA-120M).
Uma camada de embedding é uma tabela de consulta, não uma função. Imagine uma matriz gigante:
shape: (V, d_model)
linha 0: [e_0_0, e_0_1, ..., e_0_767]
linha 1: [e_1_0, e_1_1, ..., e_1_767]
...
linha 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
O ID do token i seleciona a linha i. Acesso direto ao array. Sem aritmética, sem ativação. Apenas um índice.
Floats Treináveis
Cada entrada nessa tabela começa como um float aleatório pequeno (geralmente extraído de uma distribuição normal escalada por 1/sqrt(d_model)). A retropropagação atualiza cada linha sempre que seu ID de token aparece em um lote. Após o treinamento, tokens semelhantes (cat, dog, pet) acabam com vetores semelhantes; tokens não relacionados (cat, Tuesday, xylophone) ficam distantes no espaço vetorial.
ANDREA-120M Custo de Embedding de Tokens
[BLOCK_TYPE SECTION/STEP][BLOCK_TYPE SECTION/STEP]
| Quantidade | Valor | [BLOCK_TYPE SECTION/STEP]
|------------|-----------| [BLOCK_TYPE SECTION/STEP]
| V | 8.449 | [BLOCK_TYPE SECTION/STEP]
| d_model | 768 | [BLOCK_TYPE SECTION/STEP]
| Parâmetros | 6.488.832 | [BLOCK_TYPE SECTION/STEP]
Aproximadamente 6,5M parâmetros residem apenas em uma tabela de embeddings de tokens, cerca de 5,4% do total de ANDREA-120M. Cada posição do vocabulário recebe esses 768 floats.
Dimensionamento de Tabelas de Embeddings
Produtos Internos Medem Similaridade
Vetores como Setas
Um vetor de 768 dimensões vive em um espaço que humanos não conseguem visualizar, mas a mesma álgebra funciona em qualquer dimensão. Duas operações-chave importam para transformers:
Magnitude (comprimento de uma seta):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Produto escalar (alinhamento entre duas setas):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
O que um Produto Escalar Revela
Dois fatos que valem em qualquer dimensão:
- u · v = ||u|| × ||v|| × cos(theta), onde theta é o ângulo entre eles.
- Vetores que apontam na mesma direção produzem produtos escalares grandes e positivos.
- Vetores que apontam em direções opostas produzem produtos escalares grandes e negativos.
- Vetores em ângulo reto produzem um produto escalar igual a zero.
Produto escalar = similaridade não normalizada. Duas embeddings treinadas de tokens para cat e dog acabam com um produto escalar alto porque a retropropagação as aproximou (ambas preveem contextos relacionados a animais de estimação). cat e Tuesday acabam quase ortogonais porque preveem contextos diferentes.
Por que um Transformer se Importa
A Atividade 5 (grow_a_language_model_attention) constrói atenção a partir de produtos escalares: um vetor de consulta (query) multiplicado escalarmente por vetores-chave (key) gera pontuações que indicam quais tokens anteriores são relevantes para prever o próximo. Embeddings e produtos escalares juntos carregam toda interação dentro de um transformer.
Prever Similaridade
ANDREA Usa Embeddings de Posição Aprendidos
Um Problema
Um embedding de token informa ao modelo qual palavra está naquela posição. Ele não informa ao modelo onde essa palavra se encontra. Sem informação de posição, um transformer trata the cat sat on a mat e mat a on sat cat the de forma idêntica: um mesmo conjunto de tokens, sem sinal de ordem.
Existem três soluções na literatura de transformers:
Senoide (Vaswani 2017). Uma fórmula matemática fixa baseada em senos e cossenos. A posição 0 recebe um vetor específico de 768 dimensões; a posição 1 recebe outro; nunca é treinada, nunca é atualizada. Generaliza para qualquer posição por meio da fórmula.
RoPE (Rotary Position Embedding). Rotaciona os vetores de query e key com base na posição. Usado por LLaMA, Qwen. Sem parâmetros adicionais; a rotação é integrada à atenção.
Aprendida. Uma tabela de embeddings separada com formato (T, d_model), onde T é o comprimento do contexto. Cada linha é treinada via retropropagação, assim como os embeddings de tokens.
Escolha da ANDREA: Aprendida
ANDREA herda a abordagem de posições aprendidas do microGPT, que herdou do nanoGPT, que herdou do GPT-2. Um raciocínio:
- Simplicidade. Nenhuma matemática especial na atenção. Uma tabela de posições parece uma tabela de tokens.
- Compatibilidade com CUDA personalizado. O motor microgpt_cuda.cu do ANDREA trata duas buscas de embeddings de forma idêntica; nenhum kernel de sin/cos é necessário.
- Suficiente para contexto fixo. O ANDREA limita T a 1024. Uma tabela aprendida funciona bem para sequências de comprimento fixo.
Custo de Embedding de Posição do ANDREA-120M
| Quantidade | Valor |
|---|---|
| T (contexto) | 1.024 |
| d_model | 768 |
| Parâmetros | 786.432 |
0,79M parâmetros para posição. Combinados com embeddings de token: 6,49M + 0,79M = 7,27M parâmetros de embedding no total para ANDREA-120M.
Como Eles se Combinam
Em cada posição t de uma sequência de entrada:
x_t = token_embedding[token_id_t] + position_embedding[t]
Dois vetores de 768 dimensões, somados elemento a elemento. O resultado, x_t, flui para o primeiro bloco transformer. O modelo nunca os separa novamente; ele aprende a usar o sinal combinado.
Aprendidos Versus Senoidais
Onde os Parâmetros dos Embeddings Vivem
Uma Camada de Embedding Completa ANDREA-120M
| Componente | Forma | Parâmetros |
|---|---|---|
| Tabela de embeddings de token | 8.449 × 768 | 6.488.832 |
| Tabela de embeddings de posição | 1.024 × 768 | 786.432 |
| Total | 7.275.264 |
Aproximadamente 7,3 milhões de parâmetros. O total de parâmetros do ANDREA-120M é de ~120M. Apenas a camada de embeddings representa 6%. Os 94% restantes estão nos blocos transformer (atenção + MLP, abordados nas atividades 5-7).
Embeddings Desvinculados vs Vinculados
Muitos designs de transformers (incluindo o GPT-2) vinculam um embedding de token a uma projeção final de saída: a mesma matriz V × d_model é usada na entrada e na saída (logits sobre o vocabulário). Vincular economiza parâmetros V × d_model e frequentemente melhora a qualidade.
ANDREA usa embeddings não vinculados: o embedding de entrada e a projeção de saída são treinados como matrizes separadas. A Atividade 7 (grow_a_language_model_transformer_block) cobre uma camada final.
Uma Passagem Direta Até Agora
Entrada: IDs de tokens [256, 1842, 7301, ...] (1024 deles). Cada ID busca um vetor de 768. Cada posição busca um vetor de 768. Soma elemento a elemento. Resultado: uma matriz (1024, 768) x de vetores token+posição. x flui para o bloco transformer 1.
A Atividade 5 (grow_a_language_model_attention) cobre o que o bloco 1 faz: atenção por produto escalar escalonado com máscara causal e softmax.