A palestra faz duas afirmações sobre energia que dá para conferir com régua: que a inferência é uma busca pelo mínimo, e que treinar um modelo de energia é impedir que a paisagem fique plana. Fomos medir as duas no nosso modelo. A primeira nos pegou onde dói: existe um ajuste em que o que chamávamos de busca por energia não achava o mínimo em nenhuma das 96 posições testadas — e outro em que ele acha sempre, mas só porque a energia virou a própria política.
Do trecho da palestra sobre modelos de energia, duas afirmações são checáveis e nunca tinham sido checadas aqui.
A primeira é sobre inferência. "Inference by optimization, not by forward propagation." Dado um
A segunda é sobre treino. "To train an energy-based model you have to prevent collapse. The collapse problem would be manifested by the energy function being flat everywhere." E as duas saídas: a contrastiva, "you generate points outside the region of data and you push the energy up"; e a regularizada, que ele prefere, "minimizing the volume of space that can take low energy".
A apostila 13 §1 montou a energia de dependência com o mínimo sobre as oito ações mais prováveis da política. Era uma escolha de custo, escrita como tal. Mas "as oito mais prováveis" saem da cabeça de tokens, que é propagação direta — exatamente o que a frase manda não usar. Enquanto ninguém calculou o mínimo verdadeiro, não dava para saber se o atalho era inofensivo ou se ele apagava o conceito inteiro. Agora dá: o vocabulário tem 16.392 entradas e o modelo tem 256 dimensões, então o mínimo exato cabe numa passada em lote na CPU.
O planejador do modo energia (server/ours.py) fazia assim, a cada token: pegava os
Se estava sempre, o atalho é inofensivo e a discussão acaba. Se não estava, o que chamávamos de "inferência por otimização" era uma reordenação de uma lista que a propagação direta já tinha fechado — e o nome estava errado.
O script model/inference.py responde isso com o argmin exato sobre o vocabulário inteiro, e mede três coisas: a cobertura (com que frequência o mínimo exato está no top-
Modelo mini-moderno-reg1-wm1-sz1-duelo. Seis sequências de 64 tokens sorteadas do conjunto de validação com semente fixa, 16 posições por sequência: 96 buscas, cada uma sobre 16.392 ações. Nenhum texto escolhido a dedo. As duas energias são medidas separadamente porque respondem a perguntas diferentes, e o número de uma não vale para a outra.
A energia de dependência é a da apostila 13: dado o par real (
| k | cobertura | energia perdida |
|---|---|---|
| 1 | 11,5% | +706,6% |
| 8 | 30,2% | +109,1% |
| 32 | 41,7% | +34,9% |
| 128 | 53,1% | +9,3% |
Com os oito candidatos que a apostila 13 usou, o mínimo verdadeiro estava fora da lista em 70% das posições, e a energia relatada era o dobro da real. Nem com 128 candidatos — dezesseis vezes mais caro — a cobertura passa de metade. Isso não invalida os números da 13, que mediam outra coisa (se a energia sobe numa violação, e sobe), mas invalida a leitura de que aquele mínimo era o mínimo.
O gerador não usa a energia de dependência. Ele usa a da tarefa, que tem dois termos: o rumo e a plausibilidade.
| γ | k = 1 | k = 8 | k = 32 | k = 128 | perdida no top-8 |
|---|---|---|---|---|---|
| 0 (só o rumo) | 0,0% | 0,0% | 0,0% | 9,4% | +35,9% |
| 0,1 | 33,3% | 85,4% | 97,9% | 100,0% | +1,2% |
| 1 (o padrão) | 90,6% | 100,0% | 100,0% | 100,0% | +0,0% |
Leia as duas linhas extremas juntas, porque elas formam uma tesoura:
Entre os dois extremos não há um ponto confortável, há um preço: γ = 0,1, que a apostila 12 já apontava como "o valor que dá voz ao rumo", deixa 14,6% das posições sem o mínimo no top-8. Ou a energia é dominada pela plausibilidade e planejar não muda quase nada, ou o rumo tem voz e o conjunto de candidatos passa longe do mínimo. As duas pontas esvaziam a frase da palestra, por motivos opostos.
A apostila 12 registra que com γ = 1 "a plausibilidade domina a energia e a tarefa quase não pesa". Estava certo como observação sobre o resultado. O que não estava medido é a consequência para o método: com γ = 1 a busca é supérflua, e com γ baixo ela é insuficiente. O problema não era o peso; era o conjunto onde se procurava.
A outra metade da frase é que não existe a resposta. Com o mínimo exato em mãos, dá para contar quantas ações ficam a menos de 1%, 5% e 10% dele.
| energia | ≤ 1% | ≤ 5% | ≤ 10% |
|---|---|---|---|
| dependência (modelo de mundo) | 1,4 (1) | 12,9 (3) | 40,6 (6) |
| tarefa, γ = 0 | 2,2 (2) | 35,5 (28) | 136,9 (119) |
| tarefa, γ = 0,1 | 1,4 (1) | 4,1 (2) | 12,1 (6) |
| tarefa, γ = 1 | 1,1 (1) | 1,4 (1) | 1,9 (1) |
A leitura é direta e é a da palestra: quanto mais a energia é só o rumo, mais ela descreve um conjunto; quanto mais ela é a política, mais ela vira função. Com γ = 1 há praticamente uma resposta única — o que é outro jeito de dizer que aquilo não é mais um modelo de energia, é um modelo probabilístico, que a própria fala classifica como o caso particular.
Um exemplo concreto, na mesma posição, mostra os dois lados. O contexto termina em our mindset,” e o token que de fato veio foi Ash. Pela energia de dependência, as cinco ações de menor energia são ro, pl, tr, pr, gl, todas entre 0,1628 e 0,1648 — cinco começos de sílaba que levam o estado quase ao mesmo lugar, e nenhum deles é o token real. Pela energia da tarefa com γ = 0, as cinco melhores são ac, oc, ú, v, í: fragmentos que apontam para o rumo em português e que nenhuma política escolheria. O mínimo do rumo, sozinho, é quase sempre um token implausível — e é por isso que o termo de plausibilidade existe. O erro não era tê-lo; era deixá-lo tão pesado que ele escolhe sozinho.
Duas mudanças, as duas aditivas — o comportamento antigo continua sendo o padrão.
| onde | o que passou a existir |
|---|---|
Transformer.energia_dependencia | k=None busca sobre todas as ações do vocabulário, em pedaços dimensionados por um orçamento de memória; respostas=N devolve as N ações de menor energia em vez de uma só — as "multiple answers" da fala |
server/ours.py | a origem dos candidatos aceita todos: cada token do vocabulário é imaginado um passo e pontuado pela energia, e o top- |
model/inference.py | o script desta apostila: cobertura, energia perdida e contagem de respostas, nas duas energias e em qualquer γ |
server/ours.py, _todos_por_energia | correção posterior (apostila 18): a ordenação do vocabulário passou a usar a energia inteira, com o termo γ · (−log inference.py. Antes ela ordenava só pelo rumo |
model/collapse.py | --only-volume, --volume-seed e --sample-scale: medir só o volume, com outra semente e com outra norma dos pontos sorteados (§10) |
O custo é uma passada em lote de 16.392 × 256 por token gerado, contra 8 × 256 antes. É cara, e por isso não virou padrão: ela existe para medir quanto o atalho custa em cada configuração, e para ser ligada quando o rumo importa mais que a velocidade.
A segunda frase. Colapso, na definição da palestra, não é o modelo errar: é a energia ficar igual em todo lugar. Um modelo assim passa em qualquer teste de "energia baixa nos dados", porque ela é baixa em tudo — e não serve para nada, porque não distingue.
O teste é direto: medir a energia nos pares reais e em alvos fora da região dos dados. Não precisamos inventar pontos: os negativos mais duros são estados reais no lugar errado — mesma norma, mesma geometria, só não são o alvo daquele
| alvo | condicional | vs real | dependência | vs real | identidade |
|---|---|---|---|---|---|
| par real (dentro) | 0,1583 | — | 0,1252 | — | 0,8916 |
| alvo 7 posições à frente | 1,2315 | +677,9% | 0,4876 | +289,6% | 1,4512 |
| alvo de outra sequência | 1,9020 | +1.101,5% | 1,3863 | +1.007,6% | 2,0783 |
| alvo embaralhado no lote | 1,9116 | +1.107,6% | 1,1403 | +811,0% | 2,0739 |
| ruído do mesmo tamanho dos estados reais | 2,0545 | +1.197,9% | 1,5433 | +1.132,9% | 2,2344 |
Não é plana. O vale dos dados está dez vezes abaixo da borda, e a graduação faz sentido sozinha: sete posições à frente é o alvo menos errado de todos (+289,6%), porque o texto ainda é o mesmo; ruído puro é o mais caro. Uma paisagem colapsada daria a mesma coluna inteira.
Aqui está a grandeza que a família regularizada diz minimizar, e que até aqui não medíamos: quanto do espaço consegue energia baixa. A medida é feita em quatro passos.
A leitura é intuitiva. Num modelo colapsado, os destinos se amontoam e cobrem o espaço inteiro: quase qualquer ponto sorteado cai perto de algum deles, e a fração é alta. Num modelo que separa bem, os vales são estreitos: um ponto ao acaso fica longe de todos os destinos, e a fração é baixa.
Contar só os pontos abaixo da própria referência não serve: em 256 dimensões, um ponto sorteado ao acaso praticamente nunca chega tão perto de um destino quanto o estado verdadeiro, e todo modelo marcaria zero. Por isso contamos em vários múltiplos da referência. A curva mostra o formato do vale e, por ser medida em múltiplos, permite comparar modelos cujas energias têm escalas diferentes.
| medida | wm1-sz1 (regularizado) | wm1det (atalho) |
|---|---|---|
| energia do par real (dependência) | 0,1252 | 0,4179 |
| ruído vs real (dependência) | +1.132,9% | +358,6% |
| energia mediana de um ponto sorteado | 15,0× a referência | 4,6× a referência |
| fração do espaço abaixo de 5× a referência | 0,00% | 82,49% |
| fração do espaço abaixo de 10× a referência | 53,12% | 99,93% |
| linhas diferentes (cosseno entre amostras) | +0,0738 | +0,1352 |
| colunas diferentes (|correlação| fora da diagonal) | 0,2484 | 0,1841 |
| colunas diferentes (posto efetivo, de 1 a 256) | 75,7 | 135,5 |
| perda de validação (melhor checkpoint) | 5,7761 | 5,2653 |
As duas linhas em negrito são o resultado desta apostila. No modelo regularizado, nenhum ponto sorteado consegue energia abaixo de cinco vezes a referência; no atalho, 82% conseguem. É a frase "minimizing the volume of space that can take low energy" saindo como número, confirmando o que a palestra descreve.
Mas o resto da tabela é desconfortável, e por isso está inteira aqui:
Colapso de representação e colapso de energia são coisas diferentes, e as nossas medidas de rotina só viam a primeira. Um espaço bem espalhado, com dimensões independentes e posto alto, pode estar apoiado numa paisagem de energia rasa — porque o que define o volume não é como os estados se distribuem, e sim quão longe o preditor leva ações diferentes. Enquanto a curva de volume não entrar na avaliação do treino, "não colapsou" continua sendo uma afirmação sobre a matriz, não sobre a energia.
A palestra organiza as duas famílias pela matriz do lote, uma linha por amostra e uma coluna por variável: "one way is to make sure all the rows are different; another way is to make sure all the columns are different". Fazer as linhas diferentes é o método por amostra (InfoNCE, CLIP); fazer as colunas diferentes é o método por dimensão (VICReg, SigReg), o preferido dele.
Temos um controle contrastivo por amostra na fila desde a apostila 13 — a rodada wm1-nce1, com InfoNCE no lugar do SigReg. O resultado dela, pelo histórico de treino:
| rodada | validação | linhas | colunas |r| | posto |
|---|---|---|---|---|
wm1-nce1 (contrastivo por amostra) | 6,5129 | 0,1193 | 0,1065 | 242,5 |
wm1-sz1 (regularizado por dimensão) | 5,7761 | 0,0485 | 0,0894 | 243,5 |
wm1det (atalho) | 5,2653 | 0,0527 | 0,0663 | 244,6 |
reg1 (controle sem modelo de mundo) | 5,2577 | 0,0485 | 0,0640 | 245,2 |
A taxonomia não apareceu. O método contrastivo por amostra deveria ganhar justamente na coluna das linhas, e perdeu: 0,1193 contra 0,0485, o dobro e meio de cosseno entre amostras. Perdeu também nas colunas, e custou 0,74 nats de validação. No nosso teste, a vantagem esperada do método por amostra não apareceu — o que, pelas ressalvas abaixo, diz mais sobre os limites do teste do que sobre a taxonomia.
Em 17/09 a rodada foi refeita guardando os pesos, e deu os mesmos números de validação até a quarta casa. Com os pesos, a medida sai na matriz certa — a dos estados do lote — e com a paisagem de energia ao lado, no mesmo protocolo da §8 (24 sequências, 12 posições no volume):
| rodada | validação | linhas (cos) | colunas |r| | posto | ruído vs real | mediana |
|---|---|---|---|---|---|---|
wm1-nce1 (contrastivo por amostra) | 6,5129 | 0,0916 | 0,1701 | 70,5 | +2.302,7% | 33,6× |
wm1-sz1 (regularizado por dimensão) | 5,7761 | 0,0541 | 0,2403 | 78,8 | +915,6% | 21,9× |
wm1det (atalho) | 5,2653 | 0,1199 | 0,1831 | 139,4 | +312,7% | 5,4× |
Na matriz certa, a taxonomia continua sem aparecer do jeito esperado: o método por amostra fica atrás do regularizado nas linhas (0,0916 contra 0,0541) e à frente na correlação entre colunas (0,170 contra 0,240), o inverso do que a divisão prevê. O que ele tem de próprio aparece na paisagem: a energia fora dos dados sobe mais que em qualquer outra rodada — ruído 23 vezes acima do par real, ponto sorteado 33,6 vezes a referência. É a descrição da família contrastiva na fala, "push the energy up" fora da região dos dados, medida. E é também a rodada que mais custa ao gerador (+23,87%): a paisagem mais funda não veio de graça.
Isso merece três ressalvas, porque é o resultado de uma rodada só e vai contra o esperado:
A primeira versão desta apostila fechou com quatro perguntas que só uma rodada responderia. As duas sobre inferência — se buscar no vocabulário inteiro melhora o texto e se existe um γ com rumo e cobertura ao mesmo tempo — viraram a apostila 18, porque a resposta mudou de assunto: o que decide o texto é a energia, não a busca. No caminho apareceu um defeito no modo todos, que a 18 descreve. As duas perguntas sobre o volume estão aqui. Rodaram na CPU, no wm1-sz1 e no wm1det.
| posições | wm1-sz1: ≤ 5× | wm1det: ≤ 5× | wm1-sz1: mediana | wm1det: mediana |
|---|---|---|---|---|
| 3 | 0 / 0 / 0% | 67 / 49 / 33% | 19,5 / 24,3 / 31,7× | 4,2 / 5,5 / 7,0× |
| 6 | 17 / 17 / 0% | 71 / 77 / 83% | 14,2 / 16,9 / 21,4× | 3,8 / 4,4 / 3,3× |
| 12 | 0 / 0 / 0% | 53 / 31 / 70% | 20,5 / 19,5 / 17,0× | 5,4 / 6,3 / 4,7× |
A ordem entre os dois modelos vale nas 18 medidas: nenhuma do atalho fica abaixo de nenhuma do regularizado. O número absoluto, não. Com 12 posições o atalho ainda vai de 31% a 70% abaixo de 5× a referência, e o 0,00% contra 82,49% da §8 é um sorteio dentro dessas faixas. As frações redondas (16,67% é uma posição em seis) mostram o motivo: cada posição tende a contar tudo ou nada, porque a referência muda muito de uma posição para outra. A variação está entre posições, não entre os alvos sorteados.
A mediana é mais estável. Com 12 posições ela fica entre 17,0× e 20,5× no regularizado e entre 4,7× e 6,3× no atalho: faixas estreitas e longe uma da outra. Para entrar na avaliação do treino, a medida a guardar é a mediana com 12 posições — cerca de 15 segundos por posição nesta CPU, três minutos por avaliação. A fração abaixo de 5× serve para ilustrar, não para comparar rodadas.
| norma | wm1-sz1: ≤ 5× | ≤ 10× | mediana | wm1det: ≤ 5× | ≤ 10× | mediana | razão das medianas |
|---|---|---|---|---|---|---|---|
| 0,5 | 33,3% | 81,1% | 6,6× | 100,0% | 100,0% | 1,6× | 4,1 |
| 0,8 | 16,7% | 46,2% | 10,6× | 99,4% | 100,0% | 2,7× | 3,9 |
| 1 | 16,7% | 33,1% | 14,2× | 71,0% | 100,0% | 3,8× | 3,7 |
| 1,25 | 5,4% | 16,7% | 19,9× | 37,5% | 100,0% | 5,4× | 3,7 |
| 2 | 0,0% | 0,1% | 44,5× | 0,0% | 33,3% | 12,4× | 3,6 |
Depende muito, e de um jeito que separa as duas coisas que a pergunta queria separar. A fração é escolha de amostragem: o mesmo atalho vai de 100% a 0% abaixo de 5× só mudando onde se sorteia, e com norma 2 os dois modelos marcam zero. A comparação é forma do vale: a razão entre as medianas fica entre 3,6 e 4,1 numa faixa de quatro vezes na norma. O atalho oferece energia cerca de quatro vezes mais barata que o regularizado, onde quer que se olhe.
A afirmação da §8 continua de pé — o regularizado deixa bem menos espaço com energia barata —, mas o número a carregar adiante é a razão das medianas, perto de 4, e não 0,00% contra 82,49%.
| afirmação da palestra | estado aqui |
|---|---|
| inferência por otimização, não por propagação direta | era falso no nosso código quando o rumo tinha voz: 0% de cobertura até o top-32 com γ = 0. Agora existe a busca sobre o vocabulário inteiro, e o custo dela está medido. Ela não melhora o texto: com γ = 0,1 chega ao mesmo ponto de afinidade e perplexidade que a política com γ = 0, e a busca exata dentro do núcleo da política também (apostila 18) |
| relação, não função; múltiplas respostas | confirmado e quantificado: 12,9 ações a menos de 5% do mínimo na energia de dependência, 35,5 no rumo puro, 1,4 com γ = 1 |
| colapso é a energia ficar plana | não estamos colapsados: vale dez vezes abaixo da borda, com graduação coerente entre os quatro tipos de alvo |
| a família regularizada minimiza o volume de energia baixa | confirmado na ordem, nas 18 medidas da §10: o atalho deixa cerca de quatro vezes mais energia barata (razão das medianas entre 3,6 e 4,1). A fração abaixo de 5× varia com o sorteio e com a norma dos pontos |
| linhas diferentes × colunas diferentes | não apareceu como esperado, nem na tabela de embedding nem na matriz de estados: o contrastivo por amostra fica atrás nas linhas e à frente nas colunas. O que ele tem de próprio é a paisagem mais funda (ponto sorteado a 33,6× a referência), com o maior custo ao gerador (+23,87%) |