Neste artigo
O que estou analisando
O registro 10.5281/zenodo.20798102 — ΨQRH Stack
Corrigida — é incomum entre os trabalhos que já revisei: ele é, em boa parte,
uma autocrítica. O documento analise_matematica.md desmonta as próprias
reivindicações da stack, listando o que está implementado e o que é apenas
metáfora. Isso merece ser dito antes de qualquer crítica: quem escreveu o
registro já apontou contra si mesmo os problemas mais óbvios.
O que faço aqui é diferente. Não repito a autocrítica; verifico as afirmações matemáticas com cálculo independente e examino o que o benchmark efetivamente mede. Três coisas mudam de lugar nesse processo.
1. O que é exato, e por quê
A peça central é uma substituição do embedding wte + wpe por uma superfície
paramétrica bidimensional:
$$f(\lambda, t) = I_0 \cdot \sin(\omega t + \alpha\lambda) \cdot \cos(\omega t - k\lambda + \beta\lambda^2) + 0{,}1\,\lambda$$
Aqui $\lambda$ é a dimensão do embedding do token e $t$ a do embedding posicional. A diferença estrutural em relação à soma clássica é mensurável, e não é a curvatura — é o acoplamento.
Uma soma de duas funções de uma variável,
$$g(\lambda, t) = L(\lambda) + P(t)$$
tem derivada mista identicamente nula:
$$\frac{\partial^2 g}{\partial\lambda\,\partial t} = 0 \quad \text{em todo ponto.}$$
Para $f$, derivando (conferi tudo contra sympy):
$$\frac{\partial^2 f}{\partial\lambda\,\partial t} = -I_0\,\omega\,(\alpha - k + 2\beta\lambda)\,\sin(\varphi_1 + \varphi_2),$$
com $\varphi_1 = \omega t + \alpha\lambda$ e $\varphi_2 = \omega t - k\lambda + \beta\lambda^2$. Como $\omega \neq 0$ e o fator $(\alpha - k + 2\beta\lambda)$ só se anula em um ponto isolado, a derivada mista é não-nula em praticamente todo o domínio.
Verifiquei numericamente numa grade de $200 \times 200$ sobre o domínio que o demo mostra: 100% dos pontos para $f$ e 0% para $g$. É uma separação limpa, e é a única que encontrei no registro inteiro com essa nitidez.
A curvatura não é o que separa
O registro afirma, na seção 6.3, que "K = 0 é uma propriedade de embeddings lineares (wte+wpe), não de embeddings paramétricos". Isso é falso, e o painel direito do demo é a contraprova.
A curvatura gaussiana de um gráfico $z = f(x,y)$ é
$$K = \frac{f_{xx}f_{yy} - f_{xy}^2}{\left(1 + f_x^2 + f_y^2\right)^2}.$$
Para $g(\lambda,t) = L(\lambda) + P(t)$ temos $g_{xy} = 0$, mas $g_{xx} = L''(\lambda)$ e $g_{yy} = P''(t)$ não são nulos. Logo
$$K = \frac{L''(\lambda)\,P''(t)}{\left(1 + L'^2 + P'^2\right)^2} \neq 0.$$
Medindo na mesma grade, o painel separável tem $K \neq 0$ em 100% dos pontos. O que se anula num embedding separável é a derivada mista, não a curvatura gaussiana. A distinção importa porque a afirmação publicada é mais forte do que a matemática permite — e porque ela é justamente o tipo de exagero que o resto do registro se esforça para evitar.
2. As fórmulas publicadas estão erradas
Este é o ponto mais concreto. A seção 5.4 do zenodo_benchmark_stack.md
publica as derivadas segundas de $f$. Comparei cada uma com a derivação exata:
| Derivada | Status |
|---|---|
| $f_\lambda$ | ✅ correta |
| $f_t$ | ✅ correta |
| $f_{tt}$ | ✅ correta |
| $f_{\lambda\lambda}$ | ❌ errada |
| $f_{\lambda t}$ | ❌ errada |
A fórmula publicada para $f_{\lambda\lambda}$ é
$$-\left(\alpha^2 + (-k + 2\beta\lambda)^2\right) I_0 \sin\varphi_1 \cos\varphi_2,$$
mas a derivada real contém dois termos que ela omite, ambos vindos de $\frac{\partial}{\partial\lambda}\left(-k + 2\beta\lambda\right) = 2\beta$:
$$-2\alpha\left(-k+2\beta\lambda\right)\cos\varphi_1\sin\varphi_2 \;-\; 2\beta\,\sin\varphi_1\sin\varphi_2.$$
E a fórmula publicada para $f_{\lambda t}$ usa $\cos(\varphi_1-\varphi_2)$ onde o cálculo dá $\sin(\varphi_1+\varphi_2)$.
O erro não é cosmético. Avaliando com os próprios parâmetros treinados que o registro reporta na Tabela 5.6 ($I_0 = 0{,}871$, $\omega = 2{,}011$, $\alpha = 1{,}423$, $k = 1{,}635$, $\beta = 0{,}348$):
| Ponto $(\lambda, t)$ | $f_{\lambda\lambda}$ exato | $f_{\lambda\lambda}$ publicado | erro |
|---|---|---|---|
| $(0{,}7;\ 1{,}3)$ | $-2{,}698$ | $-0{,}105$ | $2{,}593$ |
Isso contamina a conclusão central da seção 5.5. Recalculei $K$ numa grade $60\times60$ com os dois conjuntos de fórmulas:
| $K$ médio | $\lvert K\rvert$ médio | $K$ mín | $K$ máx | |
|---|---|---|---|---|
| Fórmulas exatas | $+0{,}014$ | $2{,}818$ | $-48{,}11$ | $+48{,}33$ |
| Como o registro publica | $+1{,}637$ | $1{,}744$ | $-0{,}98$ | $+52{,}42$ |
| Registro afirma (§5.5) | $0{,}845$ | $1{,}022$ | $-1{,}18$ | $38{,}99$ |
Nenhuma das duas colunas reproduz os números publicados. O $K$ médio de $0{,}845$ não sai das fórmulas do próprio documento. A boa notícia: o sinal qualitativo sobrevive — $K$ é genuinamente não-nulo e assume ambos os sinais, com metade da grade em curvatura negativa pela fórmula exata. A conclusão "a superfície é genuinamente curvada" está certa. Os números que a sustentam estão errados, e precisariam ser recalculados antes de qualquer citação.
3. O benchmark não mede o que a conclusão afirma
O registro conclui que o FullStack tem "a pior loss de treino mas a melhor PPL
em todos os 5 domínios — evidência de que a stack geométrica atua como
regularizador". Examinei o script que produz essa tabela
(kaggle_script_final.py). Três problemas independentes.
3.1 Os dados não têm estrutura para aprender
O corpus sintético é gerado com
tokens = rng.randint(4, VOCAB, 50000).tolist()
São inteiros uniformes e independentes em ${4, \dots, 99}$. A entropia de Shannon de uma uniforme sobre 96 símbolos é
$$H = \ln 96 = 4{,}564 \text{ nats},$$
e nenhum modelo — por melhor que seja — consegue ficar abaixo disso. É o piso de perplexidade da distribuição, não uma limitação de arquitetura.
O baseline reportado tem loss $4{,}60$. Ele está a $0{,}036$ nats do ótimo teórico. A 0,8% do piso. Não existe margem para "regularização geométrica" melhorar coisa alguma: o que resta ali é ruído de inicialização.
3.2 O laço de treino treina 3 batches
for ep in range(3):
for x, y in dl:
l, _ = model(x, labels=y); l.backward(); ...
break # <- sai após a PRIMEIRA batch
Com batch_size=16, o modelo vê 48 sequências no total. O DataLoader tem
3125 batches por época; ele usa 3. A diferença entre as arquiteturas A–D não
pode ser atribuída a convergência — nenhuma delas convergiu.
Reproduzi o protocolo com 5 seeds diferentes:
| Config | loss por seed | média | desvio |
|---|---|---|---|
| A. Baseline | 4,759 4,767 4,771 4,775 4,771 | 4,769 | 0,005 |
| B. +Riemann | 4,759 4,766 4,771 4,774 4,772 | 4,768 | 0,005 |
| C. +Surface | 17,93 17,91 18,20 18,39 18,54 | 18,193 | 0,249 |
| D. FullStack | 17,80 17,79 18,13 18,30 18,48 | 18,101 | 0,272 |
A separação A/B versus C/D é grande e reprodutível. Mas repare no que ela significa: C e D têm a mesma loss (18,19 vs 18,10, dentro do desvio), e A e B são indistinguíveis (4,769 vs 4,768). A RiemannSphere não move nada. O que separa os grupos é a presença do ParametricSurface — e ela piora a loss por um fator de quase quatro, o oposto do que a narrativa de "regularizador" sugere.
Isso também explica a inversão entre loss e PPL que o registro lê como regularização: as configurações com Surface estão em regime numérico diferente, não em regime melhor.
3.3 Os "5 domínios" são o mesmo dado
Os prompts de teste são
'code': [4,12,8,10,4,30,20,...]
'poetry': [4,30,8,10,24,10,22,...]
'math': [4,10,15,30,8,4,8,10,...]
Todos são sequências de inteiros uniformes na mesma faixa, no mesmo vocabulário, geradas pelo mesmo processo. "code", "poetry" e "math" são rótulos, não distribuições distintas. Dizer que o FullStack venceu "nos 5 domínios" é dizer que venceu cinco recortes da mesma amostra aleatória — uma evidência, contada cinco vezes.
O que um teste honesto exigiria
- Dados com estrutura. Sequências onde o próximo token dependa do anterior; caso contrário a loss fica presa no piso de entropia e nenhuma arquitetura pode se distinguir.
- Treinar até convergência, ou pelo menos reportar a curva. Três batches não é treino, é inicialização.
- Múltiplas seeds com desvio, não uma seed fixa. A seed 42 é declarada como "controle de confundidores", mas com uma só realização ela é uma variável aleatória, não um controle.
- Domínios com distribuições distintas de verdade — outro vocabulário, outra entropia, outra estrutura de dependência.
- Baselines de parâmetros equivalentes e, idealmente, um controle negativo: a mesma arquitetura com a componente geométrica desligada por inicialização aleatória em vez de identidade.
4. Onde a autocrítica do registro acerta
Volto ao começo. O próprio analise_matematica.md é honesto em pontos que eu
não teria como contestar:
- Não há quaternions. A estrutura implementada é $\mathbb{C}$ e $PSL(2,\mathbb{C})$, não $\mathbb{H}$ com $ij = k$. Não há anticomutatividade.
- Não há SU(2), SO(4), Dirac ou QFT. São nomes na narrativa teórica, não estruturas no código.
- Não há HMC. O otimizador é AdamW.
- A atenção é $O(n^2)$. Confirmado; não há mecanismo $O(n\log n)$.
E acrescento uma observação que o registro não faz. A RiemannSphere inicializa sua matriz de Möbius na identidade ($a=1, b=0, c=0, d=1$), o que é correto para $w = z$. Mas a saída do módulo não é $x$: é $x + \text{projeção}(z)$. Medi: a norma do que o módulo acrescenta é cerca de 55% da norma do próprio embedding na inicialização. O teste do registro chama isso de "identidade mantida (diff < 100)" — um limiar tão largo que qualquer coisa passaria. A RiemannSphere é uma perturbação não-linear grande, não uma transformação próxima da identidade, e o teste não verifica o que o nome sugere.
4b. O benchmark que eu rodei — e que me contradisse
Escrevi um benchmark separado, de escopo estreito: apenas o núcleo geométrico. Fora dele ficam a RiemannSphere, a atenção espectral e o weight tying, porque aquelas são decisões de arquitetura e já foram medidas sem conclusão por falta de dados com estrutura. O que sobra para testar com rigor é a superfície $f(\lambda,t)$.
Cinco experimentos, cada um com hipótese e critério de falsificação declarados antes da execução. Rodei em RTX 5060 Ti, 127 segundos no total.
| # | Pergunta | Resultado |
|---|---|---|
| E1 | O acoplamento é real e estrutural? | PASSOU — $f_{\lambda t}\neq0$ em 100% vs 0% |
| E2 | A curvatura separa este embedding? | Registro refutado — separável tem $K\neq0$ em 99,7% |
| E3 | O acoplamento sobrevive ao treino? | PASSOU — 100% do domínio, $\beta$ até cresceu |
| E4 | Ajuda onde a tarefa não saturou? | Nenhuma das três tarefas separou |
| E5 | Efeito fora do ruído em 10 seeds? | ICs não se sobrepõem — mas ver E5b |
| E5b | A causa é o acoplamento? | NÃO — o controle linear também resolve |
E1 — o resultado sólido
Grade de 160 000 pontos sobre $\lambda\in[-3,3]$, $t\in[0,6]$, avaliação analítica (sem diferenças finitas, que foi o erro do benchmark original):
| Configuração | $f_{\lambda t}\neq0$ | $\lvert f_{\lambda t}\rvert_{\max}$ |
|---|---|---|
| ΨQRH ($\alpha{=}1{,}423$, $\beta{=}0{,}348$) | 100,00% | 4,028 |
| ΨQRH ($\alpha{=}0$) | 100,00% | 6,521 |
| ΨQRH ($\beta{=}0$) | 100,00% | 0,371 |
| separável ($wte{+}wpe$) | 0,00% | 0,000 |
Este é o achado que sustenta o registro. O acoplamento é propriedade algébrica da função, não artefato de medição, e não depende de treino. Note também que $\alpha{=}0$ não desliga o acoplamento — o termo $\omega t$ aparece dentro dos dois fatores.
E3 — o acoplamento não colapsa
Treinei a superfície isolada numa tarefa que exige distinguir token de posição, até 100% de acurácia (600 passos). Os parâmetros convergiram para longe de zero:
| Parâmetro | Inicial | Após treino | Razão |
|---|---|---|---|
| $I_0$ | 1,000 | 1,374 | 1,37× |
| $\omega$ | 1,618 | 1,990 | 1,23× |
| $\alpha$ | 0,618 | 0,927 | 1,50× |
| $k$ | 1,618 | 2,051 | 1,27× |
| $\beta$ | 0,382 | 0,785 | 2,06× |
$f_{\lambda t}\neq0$ em 100% do domínio depois do treino. O gradiente não empurrou a geometria para o caso separável — pelo contrário, ampliou o acoplamento. Isso responde à preocupação de que a curvatura fosse decorativa.
E4 — onde o benchmark se recusa a dar razão
Montei três tarefas com estrutura determinística e alvo causalmente alcançável (a versão anterior deste texto tentava prever um alvo que dependia do token atual a partir do contexto anterior — impossível, e o modelo ficava preso em perplexidade aleatória). As três têm regra exata:
- T1 $x_{t+1}=(x_t+1) \bmod 40$
- T2 mesma regra, $V=200$ — exige mais da representação
- T3 $x_{t+1}=(x_t+1+(t \bmod 2)) \bmod 40$
Resultado: ambas as arquiteturas batem 100% de acurácia nas três. A diferença de loss é de $10^{-4}$ nats — ruído de ponto flutuante, não evidência. Quando as duas chegam ao teto, a tarefa não separa nada. Marquei as três como saturadas em vez de reportar uma vitória de 0,0004 nats.
E5 e E5b — o controle que derrubou minha própria conclusão
Em orçamento apertado (T2, 500 passos, 10 seeds), o acoplado mostrou $0{,}0061$ de loss contra $0{,}0214$ do separável, com IC 95% bootstrap sem sobreposição: $[0{,}0059;\ 0{,}0062]$ contra $[0{,}0165;\ 0{,}0281]$. Um resultado que eu teria publicado como "efeito real do acoplamento".
Antes de publicar, rodei um controle: troquei a codificação senoidal do braço separável por uma soma linear de embeddings de token e posição — mesma capacidade de parâmetros, mas sem periodicidade.
| Braço | Loss | Acurácia |
|---|---|---|
| acoplado ΨQRH | 0,0061 | 100,00% |
| separável senoidal | 0,0030 | 100,00% |
| separável linear | 0,0041 | 100,00% |
O controle linear resolve a tarefa tão bem quanto o acoplado. O efeito de E5 não é do acoplamento — é da capacidade de representar 200 tokens distintos. A codificação senoidal colidia por periodicidade, e era isso que quebrava o braço separável, não a falta de acoplamento.
Se eu tivesse parado em E5, teria publicado a conclusão errada com significância estatística. O controle é o que separa um efeito de uma coincidência bem medida.
O que este benchmark estabelece
Provado: o acoplamento $\lambda$–$t$ existe, é algébrico, sobrevive ao treino e é o que distingue estruturalmente este embedding de um separável. A curvatura gaussiana não é esse critério, e o registro erra ao dizer que é.
Não provado: que o acoplamento compra desempenho. Nas tarefas que consegui montar, ou as duas arquiteturas saturam, ou a vantagem se explica por capacidade de representação. A hipótese permanece aberta — e testá-la exige um alvo onde a estrutura $\lambda$–$t$ seja o gargalo, não a memorização do vocabulário.
Fora de escopo, declarado: que ΨQRH seja melhor que $wte{+}wpe$ em linguagem natural. Para isso seria preciso treinar em corpus real com orçamento de compute comparável — o que o registro original não fez e este benchmark também não faz.
Rodar você mesmo
O notebook já está montado no Colab — abra, dê Runtime → Run all e ele imprime todos os resultados e baixa o JSON ao final:
O notebook é autossuficiente (só torch e numpy, ambos nativos no Colab)
e leva cerca de 2 minutos em GPU. Para rodar local ou versionar o script:
- psiqrh_core_bench.py — baixe e rode
python3 psiqrh_core_bench.py. - Use
--quickpara a versão curta (~16 s).
Cada experimento imprime o critério de falsificação que declarou, para que qualquer número possa ser contestado nos seus próprios termos.
5. O que sobra de pé
Separando o que resistiu à verificação:
Exato e verificado. A superfície paramétrica tem acoplamento genuíno entre
token e posição: $f_{\lambda t} \neq 0$ em 100% do domínio amostrado, contra
zero no embedding separável. A projeção estereográfica e a transformada de
Möbius em $PSL(2,\mathbb{C})$ estão corretas como construções matemáticas. O
weight tying entre lm_head e token_lambda está implementado e verificado
por identidade de ponteiro.
Real, mas não medido. A questão interessante — se uma topologia de embedding mais rica ajuda um transformer — permanece aberta. Este registro não a responde, nem a favor nem contra. Meu benchmark (seção 4b) também não: nas tarefas que montei, o acoplamento não se distinguiu da capacidade bruta de representação. O que ficou provado é a existência e a robustez da estrutura, não o seu valor preditivo.
Errado e corrigível. As fórmulas de $f_{\lambda\lambda}$ e $f_{\lambda t}$ precisam ser rederivadas e o $K$ da seção 5.5 recalculado. O $0{,}845$ publicado não é reprodutível a partir das fórmulas do documento.
A conclusão que me parece defensável é mais estreita do que o título do registro sugere, e mais interessante do que "a stack funciona". A contribuição real do ΨQRH, no estado atual, é uma construção geométrica correta e verificável — uma superfície paramétrica com acoplamento demonstrável, e um demonstrador de que a curvatura de um embedding não é o critério certo para julgá-la. O acoplamento é. Essa distinção vale mais do que a tabela de perplexidade que a acompanha.
Reproduzir
O demo acima roda a forma fechada das duas superfícies. Todo o resto deste artigo sai de três scripts curtos:
sympy.diffsobre $f(\lambda,t)$ para as cinco derivadas — a comparação campo a campo com as fórmulas publicadas.- Reavaliação de $K$ numa grade $60\times60$ com os dois conjuntos de fórmulas, usando os parâmetros da Tabela 5.6.
- Reimplementação do
kaggle_script_final.pycom 5 seeds, medindo média e desvio por arquitetura.
Arquivos do registro: zenodo.org/records/20798102.
O demo
Os dois embeddings lado a lado. À esquerda a superfície paramétrica do registro, com acoplamento λ–t. À direita uma soma separável, o análogo de wte+wpe. A cor é altura, a luz vem da normal analítica.
A única coisa que a curvatura de fato separa
Repare na direita: as cristas correm sempre na horizontal e na vertical. É uma chapa ondulada, soma de duas curvas 1D, e a derivada mista f_λt é exatamente zero em todo ponto. Na esquerda as cristas se inclinam e se cruzam em diagonais — isso é acoplamento: mover λ muda a fase em t. O slider α deforma essas diagonais, mas não as apaga: mesmo com α = 0 a derivada mista continua não-nula em 100% dos pontos, porque ωt aparece dentro dos dois fatores. Não há posição do slider em que a esquerda vire a direita.
Duas correções a afirmações do próprio registro, ambas verificáveis por sympy. (1) A seção 6.3 diz que "K=0 é propriedade de embeddings lineares" — é falso: o painel da direita tem K≠0 em 100% dos pontos que amostrei. O que se anula no embedding separável é a derivada mista f_λt, não a curvatura gaussiana. (2) As fórmulas de f_λλ e f_λt publicadas na seção 5.4 estão erradas: trocam seno por cosseno e omitem termos cruzados, e o K médio de 0,845 da seção 5.5 não é reproduzível a partir delas. Este shader usa as derivadas corrigidas, diferenciadas à mão e conferidas contra sympy.
Forma fechada, sem diferenças finitas. O erro do benchmark original foi justamente usar torch.diff ao longo do índice da sequência, o que mede a curvatura de uma curva 1D — e a curvatura gaussiana de uma curva é zero por definição, não por medição.
../shaders/superficie-acoplada.glsl.