- Embeddings são a espinha dorsal semântica dos LLMs, convertendo texto em vetores numéricos para que o modelo consiga entender
- A evolução dos embeddings passou por várias mudanças, desde técnicas estatísticas como count-based e TF-IDF até abordagens modernas como Word2Vec, BERT e a família GPT
- Em bons embeddings, é importante equilibrar a preservação da similaridade semântica entre palavras e o controle do número de dimensões; em LLMs, eles são treinados junto com o modelo e otimizados para os dados e tarefas
- O texto explica métodos representativos de embedding como TF-IDF, Word2Vec e BERT com exemplos e visualizações; em especial, os embeddings em LLMs convertem tokens de entrada em vetores de alta dimensão e depois são atualizados em camadas de acordo com o contexto
- Com códigos práticos da camada de embedding no Torch, análise de grafos de vetores de embedding e outros materiais visuais, o guia ajuda a entender intuitivamente como embeddings funcionam na prática
O que é embedding
- Embedding é uma técnica que converte dados como texto, imagem e áudio em vetores de alta dimensão
- Em NLP, especialmente, é o processo de transformar palavras ou tokens em vetores, em um formato que o computador consiga compreender
- Embeddings podem ser aplicados não só a texto, mas também a vários outros tipos de dados; neste texto, porém, o foco é embedding de texto
Evolução e tipos de embedding
- As técnicas iniciais de embedding eram dominadas por métodos estatísticos como count vectors, TF-IDF e Co-Occurrence Matrix
- Depois surgiram embeddings baseados em redes neurais, como Word2Vec, GloVe e FastText, que passaram a refletir a similaridade semântica no espaço vetorial
- Em modelos baseados em transformers como BERT e GPT, o embedding de cada token é atualizado em camadas após a entrada, incorporando informações de contexto (embeddings dinâmicos/contextualizados)
Condições para um bom embedding
Representação semântica (semantic representation)
- Palavras com significado parecido devem ficar próximas também no espaço vetorial
Ex.: "cat" e "dog" são mapeadas como mais semelhantes entre si do que "dog" e "strawberry"
Tamanho da dimensão (dimensionality)
- Se a dimensão do embedding for pequena demais, falta capacidade de representação; se for grande demais, há desperdício de memória e risco de overfitting
Ex.: o GPT-2 tem dimensão de embedding mínima de 768
Técnica tradicional de embedding: TF-IDF
- TF-IDF calcula a importância de uma palavra multiplicando frequência da palavra e raridade (frequência inversa de documento)
- TF: quantas vezes a palavra aparece em um documento
- IDF: quão rara é a palavra no conjunto total de documentos
- O resultado do TF-IDF é útil para análises simples, como recuperação de informação e extração de palavras-chave, mas não reflete bem a similaridade semântica
- Em visualizações, a maioria das palavras tende a se concentrar em um único agrupamento, com baixa separação semântica
Word2Vec
- Word2Vec é um embedding baseado em rede neural que representa com eficiência relações semânticas no espaço vetorial
- Há métodos como CBOW (prever a palavra central a partir das palavras ao redor) e Skipgram (prever as palavras ao redor a partir da palavra central)
- Com o treinamento, a matriz de embedding da camada oculta passa a ser usada como vetor semântico das palavras
- Técnicas de otimização como negative sampling permitem treinamento eficiente mesmo em dados de grande escala
- Ao visualizar com ferramentas como o TensorFlow Embedding Projector, é possível ver palavras semanticamente parecidas formando clusters
BERT e embeddings baseados em transformers
- BERT é um modelo transformer encoder-only, e a cada camada reflete dinamicamente mais informação de contexto
- Etapa de entrada: tokenizar o texto com o tokenizer → converter em vetores de embedding dos tokens → somar com o positional embedding
- Depois disso, ao passar por várias camadas transformer, o embedding muda dinamicamente para incorporar o contexto
- Tokens especiais como [CLS] e [SEP] também são usados para tratar informações da frase inteira ou de separação
- Depois do BERT, muitos LLMs passaram a adotar embeddings dinâmicos (contextualizados)
Estrutura e treinamento dos embeddings em LLMs
- Embeddings em LLMs são implementados como a primeira camada (lookup table), que converte tokens de entrada em vetores de alta dimensão
- Eles são estruturados em forma de tabela, como em
torch.nn.Embedding, recebendo IDs de tokens e retornando o vetor de embedding correspondente para cada um
- Durante o treinamento, o LLM otimiza junto até os pesos da camada de embedding, refinando os embeddings de acordo com os dados processados e o objetivo do modelo
- Exemplo: o modelo DeepSeek-R1-Distill-Qwen-1.5B usa vetores de embedding de 1536 dimensões
Visualização de embeddings e análise de grafos
- Com base na similaridade entre vetores de embedding (como similaridade de cosseno), é possível analisar o espaço de embedding na forma de grafo
- Ex.: é possível tokenizar a frase "AI agents will be the most hot topic..." e visualizar conexões entre tokens com alta similaridade em seus embeddings
- Diferentes variações de uma mesma palavra (ex.: "list", "_list", "List") também costumam ter embeddings semelhantes
Conclusão
- Embeddings são um elemento central de LLMs e NLP, convertendo dados de entrada em vetores numéricos para que o modelo consiga processar estrutura semântica e informação contextual
- Mesmo na era dos LLMs, os princípios e a estrutura básica dos embeddings não mudaram muito, e eles continuam tendo papel muito importante no desempenho e na interpretação dos modelos
- Com exemplos de código intuitivos e materiais de visualização, é possível entender com facilidade como embeddings funcionam na prática
2 comentários
king - man + woman = queen
Opiniões do Hacker News
É realmente surpreendente que embeddings sejam uma das partes quase não discutidas da stack de LLMs; intuitivamente, eu achava que isso teria um impacto enorme na capacidade da rede de inferir conexões semânticas, mas as pessoas quase não falam sobre isso.
O problema dos embeddings é que eles são quase ilegíveis fora do próprio modelo; embora codifiquem claramente o significado da sequência de entrada, essa informação fica tão comprimida durante o treinamento que só a cabeça decodificadora do modelo consegue decifrá-la. A Anthropic tem uma pesquisa que tornou interpretáveis os recursos internos do Sonnet 3, mas isso exige treinar uma rede separada em paralelo para interpretar as ativações das camadas internas, o que é caro.
A coisa estranha em espaços de alta dimensionalidade é que a maioria dos valores é ortogonal entre si e fica muito distante, mas ainda assim é fascinante que técnicas de redução de dimensionalidade consigam agrupar conceitos mesmo em 50 mil dimensões.
Quando comecei a aprender embeddings mais a fundo, pensei: “Pelo menos um terço da mágica dos LLMs vem dos embeddings”. O simples fato de que as palavras já estão organizadas de um jeito semanticamente útil remove um pouco do mistério dos LLMs; continua sendo impressionante, mas é como dar uma espiada por trás da cortina.
Embeddings funcionam como uma espécie de “Pedra de Roseta” que permite aos computadores quantificar a linguagem humana. Acho que isso deveria ser um tema realmente importante, mas também entendo que tentar compreender um espaço vetorial de 1.000 dimensões é algo bem intimidador.
Não entendo muito bem a opinião de que há pouca discussão sobre embeddings; especialmente em exemplos de aplicação de RAG ou em conversas sobre bancos de dados vetoriais, embeddings são sempre tratados como tema central.
O tutorial foi muito bom — a diferença entre embeddings contextuais e embeddings estáticos é importante. Muita gente conhece
word2vec(embedding estático), mas embeddings contextuais costumam ser muito mais poderosos. (Aliás, o sequestro do histórico do navegador na página é pesado demais, só de rolar já entra um monte de registros no histórico.)Uma parte que eu acho que precisaria de uma explicação mais avançada é a diferença, do ponto de vista de embeddings, entre transformers Encoder-Decoder (BERT) e modelos generativos decoder-only.
Pequena correção: BERT é um encoder (não um Encoder-Decoder), e o ChatGPT é um decoder. Modelos encoder (BERT) conseguem ver a frase inteira, o que é vantajoso para representação semântica. Por exemplo, em “The bank was steep and muddy”, ele consegue determinar o significado de
bank(margem de rio ou instituição financeira) olhando a frase toda. Já os modelos do tipo GPT (decoders) só veem da esquerda para a direita, então fazem a previsão sem acesso ao que vem depois. Para mais material sobre isso, veja o post do modernBERT no Hugging Face e o paper do neoBERT, que também é útil.Complementando a explicação do dust42: BERT é encoder, GPT é decoder e T5 é encoder-decoder. Hoje em dia, encoder-decoders são menos populares. Modelos encoder são muito usados em classificação, extração de informação e busca; decoders são adequados para geração de texto, resumo e tradução. Pesquisas recentes (paper Ettin) também confirmam isso. Como ambos são transformers, você pode transformar um encoder em decoder e vice-versa. A diferença de projeto está entre atenção bidirecional (todos os tokens podem ver todos os tokens) e atenção autoregressiva (só é possível ver os tokens anteriores).
Usar um embedding projector ajuda não só com mais de 50 palavras, mas também a desenvolver intuição para visualização de dados em 3D. Veja o Tensorflow Embedding Projector.
Guia visual excelente! Eu também criei, com um conceito parecido, uma lição sobre embeddings de LLM com visual + áudio + quiz para ajudar na compreensão profunda de deep learning em app.vidyaarthi.ai, link para experimentar. A ideia é seguir uma abordagem de “aprender fazendo”, tornando conceitos abstratos mais intuitivos e interativos. Feedback é bem-vindo (não é autopromoção, é realmente uma ferramenta feita com muita paixão).
Parece que o acesso não está funcionando bem; aparece um monte de mensagens de erro no console como “Content-Security-Policy: The page’s settings blocked an inline style…”.
Acho que uma visualização em nuvem de palavras ou mostrar os resultados top-k da consulta poderia ser mais intuitivo. Recomendo testar o Embedding Projector do Tensorflow, inserir palavras e depois escolher a projeção UMAP.
Uma explicação com abordagem mais prática também aparece neste texto da sgnt.ai sobre embeddings, que fui eu mesmo quem escreveu.
Ótimo material, obrigado! Pelo que entendi, os LLMs têm três grandes problemas:
Sua abordagem é muito mais intuitiva. Eu fiquei me perguntando por que você não mostrou exemplos de embeddings para características categóricas/escalaras.
Artigo muito educativo e bem estruturado, agradecimentos ao autor.
Os embeddings de LLM normalmente fazem parte da camada de entrada e, diferentemente de modelos pré-treinados como Word2Vec, são atualizados durante o treinamento.
Outra dúvida: na inferência, o embedding é uma lookup table no formato “ID do token -> vetor”.
Matematicamente, isso equivale a codificar o ID do token como um vetor one-hot longo e depois passá-lo por uma camada linear para obter o vetor de embedding.
Essa mesma estrutura também é usada no treinamento do embedding, ou seja, embeddings são tratados como uma camada linear e aprendidos via backpropagation?
Embeddings também fazem parte do processo normal de backpropagation, mas, por eficiência, a codificação one-hot não é usada de fato.
A indexação é implementada de forma diferenciável para que o gradiente flua apenas para o vetor selecionado.
Um exemplo concreto pode ser visto no código-fonte do SmallPebble, minha mini biblioteca de deep learning, que talvez ajude.
Para explicar um pouco mais o outro comentário:
indexação e multiplicação por vetor one-hot são matematicamente equivalentes.
Por exemplo, se o vocabulário tem N itens e a sequência tem comprimento L, seria preciso multiplicar uma matriz esparsa NxL pela matriz de embeddings.
Na prática, como basta saber um índice por coluna, isso é representado internamente por um único número (índice).
Dessa forma, tanto o forward quanto o backward são implementados separadamente com base nessa indexação,
permitindo que o gradiente flua para os vetores de embedding selecionados.