Antevisão · Latent Rehearsal
03

A geometria
do embedding

O treino começa com um espaço perfeito e o estraga. Quatro instrumentos para ver como — e por que nenhum deles sozinho basta.

Apostila 03 Pré-requisito: apostila 02 do curso GPT-2

1 A descoberta que motivou o projeto

No curso anterior, tentamos busca semântica com os embeddings do RoBERTa. Falhou de um jeito específico: todas as similaridades deram acima de +0,99. Frases sobre assuntos completamente diferentes pareciam idênticas.

Na época diagnosticamos como anisotropia e seguimos. Aqui a pergunta virou outra: isso é um defeito do RoBERTa, ou acontece com qualquer modelo? Medimos no nosso.

Cosseno médio entre pares de tokens aleatórios da tabela de embedding. Zero significa espaço bem espalhado.
MomentoCosseno médio
Na inicialização aleatória+0,0004
Depois de 700 passos (arquitetura clássica)+0,3824
Depois de 700 passos (arquitetura moderna)+0,3775
O achado

O espaço começa perfeitamente isotrópico e o treino cria o cone. Não é defeito de nenhum modelo específico: é o que acontece quando se treina embedding com softmax e weight tying. RoPE, RMSNorm e SwiGLU não mudam nada — os dois números são praticamente iguais.

Isso tem nome na literatura: representation degeneration problem (Gao et al., 2019).

Por que o treino faz isso

A causa está no gradiente da entropia cruzada. Para cada posição, um token é o alvo e recebe gradiente positivo; os outros 16 391 recebem gradiente negativo — "não era você".

Um token raro é alvo quase nunca e "não-alvo" milhões de vezes. O empurrão líquido dele é sistematicamente negativo, na direção oposta à média dos estados ocultos. E como todos os tokens raros sofrem o mesmo empurrão, eles são empilhados na mesma região — um cone.

Analogia

Imagine uma sala onde, a cada rodada, uma pessoa é chamada pelo nome e todas as outras ouvem "não é você, afaste-se". Quem é chamado com frequência fica espalhado pela sala. Quem quase nunca é chamado passa a vida recuando — e todos os que recuam acabam amontoados no mesmo canto, encostados uns nos outros.

Perguntar "esses dois são parecidos?" sobre duas pessoas daquele canto não tem resposta útil: todo mundo ali está colado.

2 Quatro instrumentos, quatro cegueiras

Uma medida só não descreve a saúde de um espaço. Usamos quatro, e o ponto desta seção é que cada uma é cega para uma falha que outra enxerga.

Anisotropia — cosseno médio entre pares

Mede o deslocamento da origem: os vetores apontam todos para o mesmo lado? É a medida mais direta do cone. Cega para: colapso de posto, redundância entre dimensões.

Decorrelação — |correlação| média fora da diagonal

As dimensões carregam informação diferente, ou repetem a mesma? É o que Barlow Twins e o termo de covariância do VICReg atacam. Cega para: deslocamento da origem.

Posto efetivo — exp(H(σ / Σσ))

Quantas das 256 dimensões o espaço realmente usa. Entropia dos valores singulares, exponenciada: vai de 1 (tudo numa reta) a 256 (uso pleno). Cega para: colapso para um ponto — porque a medida centra os dados antes, e um ponto único mais ruído vira "posto cheio" depois de centrado.

SigReg — distância a uma gaussiana isotrópica

Projeta em direções aleatórias e compara cada projeção com N(0,1). Por Cramér–Wold, se todas as projeções 1-D são gaussianas padrão, a distribuição inteira é gaussiana isotrópica. É a medida mais abrangente — e a mais difícil de interpretar sozinha.

A prova das cegueiras

Construímos cinco distribuições sintéticas e medimos as quatro:

Cada linha é uma patologia diferente. Repare que nenhuma coluna acusa todas.
Distribuiçãoanisodecorrpostosigregvar (VICReg)
gaussiana isotrópica−0,0010,0152530,0060,009
a mesma, escalada 10×+0,0010,0152530,0060,009
cone+0,9910,0152532,7690,009
posto baixo (rank 8)+0,0030,2918,00,06831,80
colapso total—0,015253 ✗—0,999
Leia a linha do posto baixo

Um espaço que usa 8 das 256 dimensões é uma patologia grave. A anisotropia acusa +0,003 — indistinguível de um espaço perfeito. Se essa fosse a única medida, o problema passaria despercebido para sempre.

E na linha do colapso total, o posto efetivo diz 253, um valor saudável, para um espaço onde todos os vetores são o mesmo ponto. Só o termo de variância do VICReg acusa (0,999).

3 Um erro de medição que quase passou

A primeira versão do nosso SigReg começava assim:

def sigreg(Z, …):
    Z = Z - Z.mean(0, keepdim=True)     # "normalizar"
    Z = Z / (Z.std() + 1e-6)

Parecia razoável. O teste sintético mostrou o contrário:

caso                      sigreg
gaussiana isotropica      0.0037
cone (anisotropica)       0.0029   <- MENOR que a gaussiana!

O cone — cosseno médio +0,99, a pior patologia da tabela — pontuava melhor que o espaço perfeito.

A causa: a nossa anisotropia é um deslocamento da origem. O cone sintético é ruído pequeno em torno de um ponto distante do zero. Ao subtrair a média, esse ponto some, e sobra ruído isotrópico. Centrar apagava exatamente o que queríamos medir.

O SigReg do paper não centra, e agora entendemos por quê: o alvo é N(0, I), e média zero faz parte do alvo, não da preparação. Removida a linha:

cone (anisotropica)       2.7687   <- 440x o piso de ruido
A lição, que vale além deste caso

Uma normalização que parece inofensiva pode remover o sinal. E o erro era invisível no treino — a perda descia, o modelo aprendia, nada gritava. Só apareceu porque testamos o instrumento contra distribuições cuja resposta certa já sabíamos.

Instrumento novo se calibra antes de usar.

4 O remédio simples, e o que ele custa

Somamos à perda um termo que castiga o cosseno médio entre linhas da tabela, amostrando 512 por passo:

def reg_cosseno(W, n=512):
    i = torch.randint(W.shape[0], (n,))
    E = F.normalize(W[i], dim=-1)
    G = E @ E.T
    return (G.sum() - G.diagonal().sum()) / (n * (n - 1))
Mesmo corpus, mesmos 700 passos, mesma semente. Melhor checkpoint de cada.
RodadaValidaçãoAnisotropiaPosto
sem regularizador5,26160,3775232,4
com λ = 1,05,27060,0497244,8

7,6× menos anisotropia por 0,17% de qualidade — uma diferença dentro da oscilação que a validação já tem entre avaliações. E de brinde, o posto sobe de 232 para 245.

Por isso o regularizador está ligado por padrão em train.py, com a evidência escrita no próprio código. Desligar exige --reg-cos 0 explícito.

Uma hipótese que os dados não confirmaram

Tokens nunca vistos no treino ficam com norma 3,15× maior que os treinados (1,52 contra 0,48). Com weight tying, a tabela é também a camada de saída — então um vetor de norma grande deveria produzir logit grande, e tokens-lixo apareceriam nas previsões.

Testamos em seis prompts:

Onde os tokens nunca vistos aparecem no ranking de 16 392 candidatos.
MedidaEsperado por acasoObservado
Tokens mortos no top-501,440,00
Posição do melhor token morto~8 19610 892

Os dados não confirmaram a hipótese. A norma cresce, mas a direção aprendeu a ser contrária aos estados ocultos reais — o modelo empurrou esses tokens para abaixo do aleatório. É um bom sinal sobre o treino, e um lembrete: norma grande não implica logit grande quando a direção está errada.

5 Por que isso importa para o objetivo final

Três razões, em ordem de concretude:

  1. Embeddings de sentença. Se o modelo vai gerar vetores para busca ou agrupamento, um cone de cosseno 0,38 torna a similaridade quase inútil. Foi literalmente o que quebrou a busca semântica no curso anterior.
  2. A Bússola (a primeira versão do leme, que só previa a direção do próximo estado) depende disso. O termo de rumo na geração soma β · cos(E[v], g) aos logits. Num espaço anisotrópico, todo token tem cosseno parecido com todo alvo — e a bússola não aponta para lugar nenhum. A apostila 05 mostra isso medido.
  3. Conhecimento transferido. Um espaço melhor condicionado é ponto de partida melhor para qualquer ajuste fino depois.
Perguntas em aberto

O diagnóstico feito e o remédio simples funcionando, a apostila 04 — quando a fila de experimentos fechar — percorre a linhagem
que a visão computacional construiu para o mesmo problema, e testa cada elo no nosso.