Duração estimada deste módulo: 1.5–2 horas
Objetivo: Entender como a representação inicial das palavras é construída, por que é crucial saber sua posição na frase e como o Transformer "enxerga" o texto de múltiplas perspectivas simultaneamente.
Antes que o Transformer possa aplicar o mecanismo de atenção, ele precisa converter palavras em algo que os computadores entendam: números.
Mas não quaisquer números. Não se trata de atribuir IDs arbitrários (como "gato = 1", "cachorro = 2"). Isso não captura significado.
É aí que entram os embeddings.
🔹 Definição simples:
Um embedding é uma representação vetorial densa de uma palavra (ou token), onde palavras com significados ou usos similares têm vetores similares.
Exemplo:
- "rei" → [0.85, -0.2, 0.67, ...]
- "rainha" → [0.82, -0.18, 0.65, ...]
- "mesa" → [-0.3, 0.9, 0.1, ...]
"rei" e "rainha" estão próximos no espaço vetorial. "mesa" está distante.
Imagine que todas as palavras do idioma estejam localizadas em um gigantesco mapa de significados.
Um embedding é como as coordenadas GPS de uma palavra nesse mapa.
Quando o modelo vê a palavra "gato", não vê a letra 'g' ou 'a'. Vê seu vetor: um ponto nesse mapa semântico. E graças a isso, pode raciocinar:
"Se 'gato' está próximo de 'cachorro', e 'cachorro' geralmente vai com 'coleira', talvez 'gato' também tenha algo a ver com 'coleira'... embora não exatamente igual."
Esse mapa não é programado manualmente. É aprendido automaticamente durante o treinamento!
Existem duas formas principais:
Como Word2Vec ou GloVe. Treinados uma vez em grandes corpora textuais e depois usados como camada fixa. Limitação: cada palavra tem apenas um vetor, independentemente do contexto.
"banco" sempre tem o mesmo vetor, quer signifique "financeiro" ou "de praça".
Aqui é onde o Transformer brilha! Em vez de atribuir um vetor fixo, o modelo gera um embedding específico para cada contexto.
Em "fui ao banco depositar", "banco" terá um vetor próximo de "dinheiro".
Em "sentei-me no banco do parque", terá um vetor próximo de "madeira" ou "descanso".
Isso é conseguido combinando:
Aqui vem um desafio chave:
Se o Transformer processa todas as palavras simultaneamente... como ele sabe qual vem primeiro, qual está no meio e qual é a última?
Posições importam!
"O cachorro mordeu o homem" ≠ "O homem mordeu o cachorro"
Nas RNNs, a ordem estava implícita na sequência de processamento. No Transformer, não está.
Solução: Codificação Posicional (Positional Encoding)
A ideia é simples: adicionar ao embedding de cada palavra um sinal numérico indicando sua posição na sequência.
Mas não qualquer sinal. Um contador simples (posição 1, 2, 3...) não escala bem e não captura relações relativas ("a palavra 5 está próxima da 6").
A solução do Transformer original: funções senoidais.
🔹 Fórmula (apenas para referência):
Para uma posição pos e uma dimensão i do vetor:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
Onde d_model é a dimensão do embedding (por exemplo, 512 ou 768).
Imagine que cada posição na frase emita uma "frequência única", como uma estação de rádio.
Cada palavra recebe seu embedding semântico + sua "onda de posição".
Quando o modelo soma ambos, obtém um vetor que diz:
"Sou a palavra 'banco', e estou na posição 5 da frase."
E a parte mais inteligente: essas funções senoidais permitem que o modelo aprenda relações relativas.
"A palavra na posição 5 pode aprender que a palavra na posição 6 está 'próxima', mesmo nunca tendo visto uma frase de 100 palavras durante o treinamento."
Imagine que você esteja analisando uma peça teatral.
Todos estão vendo a mesma peça... mas de perspectivas diferentes. E todas são válidas.
É isso que faz o mecanismo de atenção multi-cabeça (Multi-Head Attention).
Em vez de calcular uma única matriz de atenção, o Transformer calcula várias "cabeças" de atenção em paralelo, cada uma com suas próprias matrizes de Query, Key e Value aprendidas.
h espaços diferentes (por exemplo, 8 cabeças).🔹 Resultado: O modelo não tem apenas uma forma de "olhar" a frase. Tem múltiplas lentes, cada uma especializada.
Imagine a frase:
"A cientista que descobriu a vacina recebeu um prêmio."
Cada cabeça contribui com uma peça do quebra-cabeça. Juntas, dão uma compreensão completa.
Pegue a frase: "O músico que tocou o violino emocionou o público."
Imagine três "cabeças de atenção" distintas. Descreva quais palavras cada uma conectaria e por quê. Use categorias como: sintaxe, semântica, emoção, instrumento, etc.
Palavra: "cientista"
Embedding: [0.7, -0.3, 0.5, ...] → "significado base"
Posição 3: [0.1, 0.05, -0.2, ...] → "onda senoidal para pos=3"
Vetor inicial = Embedding + Posição → [0.8, -0.25, 0.3, ...]
Projetado em 3 cabeças:
Cabeça 1: Q1, K1, V1 → atenção a verbos
Cabeça 2: Q2, K2, V2 → atenção a objetos
Cabeça 3: Q3, K3, V3 → atenção a prêmios/conquistas
Saídas das cabeças:
Cabeça 1: [0.6, 0.1, ...]
Cabeça 2: [-0.2, 0.8, ...]
Cabeça 3: [0.4, 0.5, ...]
Concatenado: [0.6, 0.1, -0.2, 0.8, 0.4, 0.5, ...]
Projeção final: [0.55, 0.3, 0.45, ...] → representação final enriquecida
O Transformer não começa do zero. Constrói compreensão em camadas:
- Embeddings dão significado semântico inicial.
- Codificação posicional dá consciência da ordem.
- Atenção multi-cabeça permite enxergar o texto de múltiplos ângulos simultaneamente.
É como uma equipe de especialistas analisando um texto: cada um contribui sua perspectiva, resultando em uma compreensão muito mais rica e matizada do que qualquer analista sozinho poderia alcançar.
Agora que entendemos as peças fundamentais, é hora de montá-las: Como essas peças são organizadas para formar um Transformer completo? Qual a diferença entre um codificador e um decodificador? Por que BERT e GPT, embora ambos usem Transformers, funcionam de formas tão diferentes?
Veremos isso no próximo módulo.