PowerMachine commited on
Commit
073c9a9
·
verified ·
1 Parent(s): ba56143

KHTST v7 — RETREINO OBSERVADO: estados antigos apagados; treino do zero com monitor de RAM integral (Agente Engenheiro); métricas de tests/test_khtst_v6.py comparadas com o treino anterior; gráficos de desempenho publicados no card

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. LICENSE +21 -0
  3. README.md +104 -0
  4. avaliacao_v7.json +938 -0
  5. avaliacao_v8.json +947 -0
  6. comparacao_treino_v7.json +153 -0
  7. comparacao_treino_v8.json +143 -0
  8. configs/base.json +215 -0
  9. docs/matematica/00-fundamentos-e-notacao.md +87 -0
  10. docs/matematica/01-som-kohonen-clasico.md +84 -0
  11. docs/matematica/02-growing-grid-e-gcs.md +76 -0
  12. docs/matematica/03-gsom.md +60 -0
  13. docs/matematica/04-hierarchical-som.md +50 -0
  14. docs/matematica/05-tkm-rsom.md +59 -0
  15. docs/matematica/06-cpn-ssom.md +58 -0
  16. docs/matematica/07-atencao-mista-kvcache.md +50 -0
  17. docs/matematica/08-quantizacao-w8a8.md +113 -0
  18. docs/matematica/09-ortogonais-cooperativas-punicao-telemetria-pdca.md +98 -0
  19. docs/matematica/10-moe-foco-denso-som-v2.md +291 -0
  20. docs/matematica/11-composicao-microunidades-v3.md +386 -0
  21. docs/matematica/12-escalacao-computo-e-composicao-otima-v4.md +115 -0
  22. docs/matematica/13-janela-contexto-1m-indexada.md +75 -0
  23. docs/matematica/14-medusa-arvore-especulativa.md +77 -0
  24. docs/matematica/15-nlp-nlg-duas-fases.md +87 -0
  25. docs/matematica/16-atencao-entre-moes-e-som-v5.md +124 -0
  26. docs/matematica/17-difusao-multimodal-v5.md +69 -0
  27. docs/matematica/18-roteamento-ssom-rpp-metricas-v6.md +206 -0
  28. docs/matematica/19-khtst-v8-melhorias.md +254 -0
  29. graficos/graf_alinhamento.png +0 -0
  30. graficos/graf_curva_perda.png +0 -0
  31. graficos/graf_perdas_tarefa.png +0 -0
  32. graficos/graf_ppl_lm.png +0 -0
  33. graficos/graf_ram.png +3 -0
  34. graficos/graf_som_roteador.png +0 -0
  35. relatorio_agente_engenheiro.json +76 -0
  36. requirements.txt +17 -0
  37. resumo_treino_v7.json +963 -0
  38. resumo_treino_v8.json +974 -0
  39. scripts/01_verificar_ambiente.py +64 -0
  40. scripts/02_coletar_corpus.py +156 -0
  41. scripts/02a_coletar_fonte.py +68 -0
  42. scripts/03_treinar_tokenizador.py +48 -0
  43. scripts/04_treinar.py +381 -0
  44. scripts/05_avaliar.py +654 -0
  45. scripts/06_publicar_hf.py +177 -0
  46. scripts/07_reconsolidar_som.py +95 -0
  47. scripts/08_graficos_card.py +355 -0
  48. scripts/09_teste_item_b.py +117 -0
  49. src/khtst/__init__.py +0 -0
  50. src/khtst/acelerado/__init__.py +89 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ graficos/graf_ram.png filter=lfs diff=lfs merge=lfs -text
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Projeto KHTST
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # KHTST — modelo multimodal PT-BR (v8)
2
+
3
+ KHTST é a evolução do projeto AURORA (renomeação integral AURORA → KHTST,
4
+ pedido do projeto) — um modelo multimodal compacto para PT-BR com
5
+ roteamento por S-SOM, punição SGDR, punição de novidade restrita a empates
6
+ de Voronoi, controle Reward/Punishment/Penalty (RPP) e **janela de contexto
7
+ 256K tokens** (compressão indexada, doc 13).
8
+
9
+ **14,89M parâmetros · vocab 16384 · 9 tarefas (lm/noticia/pontuacao/
10
+ instrucao/tts/vqa/ocr/imagem_caption/asr) · encoders imagem/áudio/vídeo.**
11
+
12
+ > ⚠️ **STATUS DO GATE DE QUALIDADE (honesto): FALHOU.**
13
+ > Nesta corrida, o KHTST NÃO superou nem empatou o AURORA nas métricas
14
+ > (`ppl_lm` 2542,11 vs 17,09 do baseline publicado). Conforme a regra do
15
+ > projeto, **os estados (pesos) do modelo NÃO foram publicados** — este
16
+ > repositório publica o CÓDIGO completo (scripts de alta qualidade,
17
+ > provas matemáticas e evidências) e o diagnóstico que corrige a causa
18
+ > raiz. Um retreino limpo com a política corrigida está pronto para
19
+ > executar (est. ~3,3 h; o teto de 5 h da sessão impediu refazer).
20
+
21
+ ## O que há de novo no v8 (itens a–j, com provas em `docs/matematica/19`)
22
+
23
+ | item | melhoria | onde | prova |
24
+ |---|---|---|---|
25
+ | a | micro buffers anulares em redes recorrentes (0 alocação/passo no decode) | `percepcao/microunidades.py` | Teo 19.6 |
26
+ | b | canal adhoc I/O + **stop/continue** durante solicitações ativas | `servico/adhoc.py`, `scripts/09_teste_item_b.py` | Teos 19.14–19.16 |
27
+ | c | quantização 8-bit seletiva matematicamente vantajosa (torchao/bnb) | `quanta/quantizacao.py` §10 | Teo 19.18 |
28
+ | d | anti-vanishing: Leaky ReLU adaptativa + pesos de árvore bidirecionais + skip neutro + BatchNorm | `microunidades.py` | Teos 19.7–19.10 |
29
+ | e | map-reduce `torch.vmap`/`sum`/`mean` nos experts MoE | `percepcao/moe.py` | Teo 19.11 (diff 0,0) |
30
+ | f | atenção **árvore bidirecional fora de ordem**; raio_janela e kv_max **×4** (128/2048); `AtencaoCabecas` | `percepcao/atencao.py` | Teos 19.1–19.4 |
31
+ | g | MoE **2 encoders + 4 decoders** fora de ordem agrupável/desagrupável | `percepcao/moe.py` | Teos 19.12–19.13 |
32
+ | h | gestão de memória RAM/armazenamento com limiar adaptativo | `telemetria/gestor_memoria.py` | Teo 19.17 |
33
+ | i | testes em dados reais → 6 bugs latentes do v7 corrigidos (ver abaixo) | vários | — |
34
+ | j | parâmetros auto-ajustáveis matematicamente + provas conjuntas | `treino/treinador.py` | Teos 19.26–19.27 |
35
+
36
+ **ViT (evolução de `video.py`/`blocos.py`/`microunidades.py`):** Token
37
+ Merging (ToMe) com casamento bipartido único e auto-ajuste da fração de
38
+ fusão; **LRA-QViT** com RB-LRA, WADS e STE — ramificações **1-bit ∥ 4-bit
39
+ em paralelo** detectando **direção vetorial** da iluminação (unitária) e
40
+ **intensidade**, mapas 2-D de contorno/área; critério de vantagem da
41
+ difusão (`vantagem_difusao`). Provas: Teos 19.19–19.24, 19.28.
42
+
43
+ **Cython + C/C++:** núcleos `acelerado/nucleos.pyx` (Kohonen sequencial +
44
+ entropia/punição) com semântica sequencial exata (Teo 19.25) — **speedup
45
+ medido 17,89×**, fallback puro-torch idêntico.
46
+
47
+ ## Verificações (tudo verde)
48
+
49
+ - `tests/test_khtst.py` … `test_khtst_v6.py` (herdadas): 25+36+37+29+48 ✓
50
+ - `tests/test_khtst_v7.py` (nova, Teoremas 19.x): **44 ✓ · 0 ✗**
51
+ - **Item (b) no modelo treinado: APROVADO** — 4 requisições recebidas
52
+ ANTES da 1ª resposta, processamento serial, stop (cancelamento) e
53
+ pause→continue honrados em ≤ 1 passo (`teste_item_b_v8.json`).
54
+
55
+ ## Treino desta corrida (dentro do teto de 5 h)
56
+
57
+ | métrica | valor |
58
+ |---|---|
59
+ | passos | 3192 (8 épocas + DPO 93 passos acc 1,0 + consolidação SOM) |
60
+ | tempo acumulado | **3,98 h** (teto 5 h respeitado; sem treino em background) |
61
+ | RAM | pico 3358 MB · média 2524 MB · mín 429 MB (5919 amostras) |
62
+ | corpus | 3548 registros PT-BR reais (18 fontes HF; 987 multimodais) |
63
+ | gate de não-regressão | **FALHOU** — `ppl_lm` 2542,11 vs 17,09 (regressão registrada em `comparacao_treino_v8.json`) |
64
+
65
+ ## Diagnóstico da regressão (item i — bugs latentes do v7 encontrados e corrigidos)
66
+
67
+ 1. **Reinícios SGDR espúrios**: 16 warm restarts em 2075 passos — o
68
+ cooldown (`janela/2`) era menor que o próprio ciclo (T₀) e a cláusula 1
69
+ da eq. 9.3 disparava no passo 9 (sem guarda de aquecimento). O lr passou
70
+ 43% do tempo no piso ⇒ sub-convergência. **Correção** (`treino/punicao.py`):
71
+ cooldown = T₀ e guarda `passo ≤ warmup + T₀` para AMBAS as cláusulas.
72
+ 2. **Gate de não-regressão inoperante no v7**: as chaves do gate eram
73
+ `ppl_valid/perda_valid`, mas as métricas reais são `ppl_lm/perda_media_final`
74
+ — o "aprovado" do v7 nunca verificou o ppl. **Correção** (`scripts/08`):
75
+ chaves corretas ⇒ o gate agora reprova de verdade (como acima).
76
+ 3. Outros: einsum de decode `bhte→bhe` (quebrava TODA geração com cache no v7),
77
+ typo `perla→perda`, `NameError` no script 07, clamp de rótulos do S-SOM
78
+ (n_classes=8 × 9 tarefas), resumos v4/v6/v7 divergentes entre scripts.
79
+
80
+ ## Reprodução
81
+
82
+ ```bash
83
+ python3 scripts/01_verificar_ambiente.py
84
+ python3 scripts/02_coletar_corpus.py # retomável por fonte
85
+ python3 scripts/03_treinar_tokenizador.py
86
+ python3 scripts/04_treinar.py --orcamento 470 --teto_horas 5.0
87
+ python3 scripts/05_avaliar.py --sem_difusao
88
+ python3 scripts/09_teste_item_b.py # item (b) com o modelo real
89
+ python3 scripts/08_graficos_card.py # gráficos + gate
90
+ python3 scripts/06_publicar_hf.py # commit único (gate bloqueia estados)
91
+ ```
92
+
93
+ ## Estrutura
94
+
95
+ `src/khtst/` — núcleo, percepção (atenção/microunidades/moe/vit_lra),
96
+ memória (S-SOM + 8 variantes + janela 256K), treino (4 fases + RPP + SGDR),
97
+ servico (canal adhoc), quanta (8-bit + STE), telemetria (hub + gestor de
98
+ memória), qualidade (Agente Engenheiro), acelerado (Cython+C).
99
+ `docs/matematica/00–19` — fundamentos, teoremas e provas.
100
+ `graficos/` — desempenho desta corrida (apenas no card).
101
+
102
+ ## Licença
103
+
104
+ MIT (herdada do projeto).
avaliacao_v7.json ADDED
@@ -0,0 +1,938 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "estado": "fase-som",
3
+ "roteador_ssom": {
4
+ "amostras": 1536,
5
+ "pronto": true,
6
+ "lambda_rota": 0.35,
7
+ "gamma_empate": 0.15,
8
+ "drift_codebook": 0.0,
9
+ "conf_media": 0.4917,
10
+ "frac_rotas_ativas": 0.5312,
11
+ "k": 24,
12
+ "taxa_ativos": 1.0
13
+ },
14
+ "perdas_tarefa": {
15
+ "lm": {
16
+ "treinado": 2.8384029467900596,
17
+ "aleatorio": 9.732619444529215
18
+ },
19
+ "noticia": {
20
+ "treinado": 2.5535371700922647,
21
+ "aleatorio": 9.723073641459147
22
+ },
23
+ "instrucao": {
24
+ "treinado": 2.035900592803955,
25
+ "aleatorio": 9.758591492970785
26
+ },
27
+ "pontuacao": {
28
+ "treinado": 2.648297905921936,
29
+ "aleatorio": 9.727588017781576
30
+ },
31
+ "imagem_caption": {
32
+ "treinado": 2.127371827761332,
33
+ "aleatorio": 9.717129548390707
34
+ },
35
+ "vqa": {
36
+ "treinado": 2.177152613798777,
37
+ "aleatorio": 9.693151950836182
38
+ },
39
+ "ocr": {
40
+ "treinado": 1.418007344007492,
41
+ "aleatorio": 9.757900714874268
42
+ },
43
+ "asr": {
44
+ "treinado": 2.1221489111582437,
45
+ "aleatorio": 9.733868916829428
46
+ },
47
+ "tts": {
48
+ "treinado": 1.675029953320821,
49
+ "aleatorio": 9.691224416097006
50
+ }
51
+ },
52
+ "ppl_lm": 17.088452564794597,
53
+ "ppl_lm_aleatorio": 16858.65484439469,
54
+ "moe_uso_por_tarefa": {
55
+ "lm": [
56
+ {
57
+ "experts_top": [
58
+ 5,
59
+ 4
60
+ ],
61
+ "grupo_top": [
62
+ 2,
63
+ 2
64
+ ]
65
+ },
66
+ {
67
+ "experts_top": [
68
+ 0,
69
+ 1
70
+ ],
71
+ "grupo_top": [
72
+ 0,
73
+ 0
74
+ ]
75
+ }
76
+ ],
77
+ "vqa": [
78
+ {
79
+ "experts_top": [
80
+ 2,
81
+ 3
82
+ ],
83
+ "grupo_top": [
84
+ 1,
85
+ 1
86
+ ]
87
+ },
88
+ {
89
+ "experts_top": [
90
+ 5,
91
+ 4
92
+ ],
93
+ "grupo_top": [
94
+ 2,
95
+ 2
96
+ ]
97
+ }
98
+ ],
99
+ "ocr": [
100
+ {
101
+ "experts_top": [
102
+ 2,
103
+ 3
104
+ ],
105
+ "grupo_top": [
106
+ 1,
107
+ 1
108
+ ]
109
+ },
110
+ {
111
+ "experts_top": [
112
+ 5,
113
+ 4
114
+ ],
115
+ "grupo_top": [
116
+ 2,
117
+ 2
118
+ ]
119
+ }
120
+ ],
121
+ "asr": [
122
+ {
123
+ "experts_top": [
124
+ 0,
125
+ 1
126
+ ],
127
+ "grupo_top": [
128
+ 0,
129
+ 0
130
+ ]
131
+ },
132
+ {
133
+ "experts_top": [
134
+ 2,
135
+ 3
136
+ ],
137
+ "grupo_top": [
138
+ 1,
139
+ 1
140
+ ]
141
+ }
142
+ ],
143
+ "tts": [
144
+ {
145
+ "experts_top": [
146
+ 5,
147
+ 4
148
+ ],
149
+ "grupo_top": [
150
+ 2,
151
+ 2
152
+ ]
153
+ },
154
+ {
155
+ "experts_top": [
156
+ 0,
157
+ 1
158
+ ],
159
+ "grupo_top": [
160
+ 0,
161
+ 0
162
+ ]
163
+ }
164
+ ]
165
+ },
166
+ "mtp": {
167
+ "alphas": [
168
+ 0.9997844099998474,
169
+ 0.00021563710470218211
170
+ ],
171
+ "per_cabeca": [
172
+ 2.9869613647460938,
173
+ 10.111918449401855
174
+ ],
175
+ "entropia": 0.00203594658523798,
176
+ "termos_ce": 0.0
177
+ },
178
+ "w8a8_delta": 0.0011706352233886719,
179
+ "som_treinado": {
180
+ "variante_ativa": "cpn",
181
+ "variantes": {
182
+ "som": {
183
+ "k": 24,
184
+ "taxa_ativos": 1.0,
185
+ "resemeados": 24,
186
+ "usos": 256,
187
+ "atingiu_alvo": true
188
+ },
189
+ "gg": {
190
+ "k": 4,
191
+ "taxa_ativos": 1.0,
192
+ "resemeados": 4,
193
+ "usos": 256,
194
+ "atingiu_alvo": true
195
+ },
196
+ "gcs": {
197
+ "k": 3,
198
+ "arestas": 3,
199
+ "eq_treino": 88415.8203125,
200
+ "atingiu_alvo": true
201
+ },
202
+ "gsom": {
203
+ "k": 29,
204
+ "gt": 1.05,
205
+ "erro_medio": 0.0,
206
+ "atingiu_alvo": true
207
+ },
208
+ "hsom": {},
209
+ "tkm": {
210
+ "k": 32,
211
+ "taxa_ativos": 1.0,
212
+ "resemeados": 32,
213
+ "usos": 256,
214
+ "atingiu_alvo": true
215
+ },
216
+ "rsom": {
217
+ "k": 32,
218
+ "taxa_ativos": 1.0,
219
+ "resemeados": 32,
220
+ "usos": 256,
221
+ "atingiu_alvo": true
222
+ },
223
+ "cpn": {},
224
+ "ssom": {
225
+ "erro": "IndexError: index 8 is out of bounds for dimension 0 with size 8"
226
+ }
227
+ },
228
+ "roteador": {
229
+ "amostras": 1586,
230
+ "pronto": true,
231
+ "lambda_rota": 0.35,
232
+ "gamma_empate": 0.15,
233
+ "drift_codebook": 0.032477,
234
+ "conf_media": 0.0,
235
+ "frac_rotas_ativas": 0.0,
236
+ "k": 24,
237
+ "taxa_ativos": 1.0
238
+ },
239
+ "invariante_sem_orfaos": true,
240
+ "orfaos_por_variante": {
241
+ "som": {
242
+ "orfaos": 0,
243
+ "relocados": 0,
244
+ "taxa_ativos": 1.0
245
+ },
246
+ "gg": {
247
+ "orfaos": 0,
248
+ "relocados": 0,
249
+ "taxa_ativos": 1.0
250
+ },
251
+ "gcs": {
252
+ "orfaos": 0,
253
+ "relocados": 0,
254
+ "taxa_ativos": 1.0
255
+ },
256
+ "gsom": {
257
+ "orfaos": 0,
258
+ "relocados": 0,
259
+ "taxa_ativos": 1.0
260
+ },
261
+ "hsom": {
262
+ "orfaos": 0,
263
+ "relocados": 0
264
+ },
265
+ "tkm": {
266
+ "orfaos": 0,
267
+ "relocados": 0,
268
+ "taxa_ativos": 1.0
269
+ },
270
+ "rsom": {
271
+ "orfaos": 0,
272
+ "relocados": 0,
273
+ "taxa_ativos": 1.0
274
+ },
275
+ "cpn": {
276
+ "orfaos": 0,
277
+ "relocados": 0,
278
+ "taxa_ativos": 1.0
279
+ },
280
+ "ssom": {
281
+ "orfaos": 0,
282
+ "relocados": 23,
283
+ "taxa_ativos": 1.0
284
+ }
285
+ }
286
+ },
287
+ "som_eq_fresco": {
288
+ "som": {
289
+ "taxa_ativos": 1.0,
290
+ "eq": 75.31108856201172
291
+ },
292
+ "gg": {
293
+ "taxa_ativos": 1.0,
294
+ "eq": 144.36021423339844
295
+ },
296
+ "gcs": {
297
+ "taxa_ativos": 1.0,
298
+ "eq": 160.38645935058594
299
+ },
300
+ "gsom": {
301
+ "taxa_ativos": 1.0,
302
+ "eq": 130.51382446289062
303
+ },
304
+ "tkm": {
305
+ "taxa_ativos": 1.0,
306
+ "eq": 72.5010757446289
307
+ },
308
+ "rsom": {
309
+ "taxa_ativos": 1.0,
310
+ "eq": 75.71780395507812
311
+ },
312
+ "ssom": {
313
+ "taxa_ativos": 1.0,
314
+ "eq": 78.7991714477539
315
+ }
316
+ },
317
+ "geracao": {
318
+ "sem_punicao": "ricos a a a a Atualadawaficados novo 75 cada motivação o choque o clima inédentpresenta competimes tipo individual-sucedidos observador",
319
+ "com_punicao": " NaNTde a testevem trromcada 360 Bat que globais lou topo atingmadas atadado desa Emb 89 con badminton dizie sua simples doenças na"
320
+ },
321
+ "microunidades": {
322
+ "lm": [
323
+ {
324
+ "ramos": [
325
+ "conv_dil",
326
+ "gru",
327
+ "mlp"
328
+ ],
329
+ "alpha_medio": [
330
+ 0.2641,
331
+ 0.305,
332
+ 0.4309
333
+ ],
334
+ "passos_rec": 2
335
+ },
336
+ {
337
+ "ramos": [
338
+ "conv_dil",
339
+ "gru",
340
+ "mlp",
341
+ "moe"
342
+ ],
343
+ "alpha_medio": [
344
+ 0.5519,
345
+ 0.1535,
346
+ 0.1445,
347
+ 0.1501
348
+ ],
349
+ "passos_rec": 2
350
+ },
351
+ {
352
+ "ramos": [
353
+ "conv_dil",
354
+ "gru",
355
+ "mlp",
356
+ "moe"
357
+ ],
358
+ "alpha_medio": [
359
+ 0.2203,
360
+ 0.2562,
361
+ 0.2834,
362
+ 0.2401
363
+ ],
364
+ "passos_rec": 2
365
+ }
366
+ ],
367
+ "vqa": [
368
+ {
369
+ "ramos": [
370
+ "conv_dil",
371
+ "gru",
372
+ "mlp"
373
+ ],
374
+ "alpha_medio": [
375
+ 0.0647,
376
+ 0.2521,
377
+ 0.6833
378
+ ],
379
+ "passos_rec": 2
380
+ },
381
+ {
382
+ "ramos": [
383
+ "conv_dil",
384
+ "gru",
385
+ "mlp",
386
+ "moe"
387
+ ],
388
+ "alpha_medio": [
389
+ 0.2515,
390
+ 0.2591,
391
+ 0.2497,
392
+ 0.2398
393
+ ],
394
+ "passos_rec": 2
395
+ },
396
+ {
397
+ "ramos": [
398
+ "conv_dil",
399
+ "gru",
400
+ "mlp",
401
+ "moe"
402
+ ],
403
+ "alpha_medio": [
404
+ 0.0645,
405
+ 0.1988,
406
+ 0.4256,
407
+ 0.311
408
+ ],
409
+ "passos_rec": 2
410
+ }
411
+ ],
412
+ "asr": [
413
+ {
414
+ "ramos": [
415
+ "conv_dil",
416
+ "gru",
417
+ "mlp"
418
+ ],
419
+ "alpha_medio": [
420
+ 0.2777,
421
+ 0.3308,
422
+ 0.3916
423
+ ],
424
+ "passos_rec": 2
425
+ },
426
+ {
427
+ "ramos": [
428
+ "conv_dil",
429
+ "gru",
430
+ "mlp",
431
+ "moe"
432
+ ],
433
+ "alpha_medio": [
434
+ 0.5948,
435
+ 0.1387,
436
+ 0.1316,
437
+ 0.1348
438
+ ],
439
+ "passos_rec": 2
440
+ },
441
+ {
442
+ "ramos": [
443
+ "conv_dil",
444
+ "gru",
445
+ "mlp",
446
+ "moe"
447
+ ],
448
+ "alpha_medio": [
449
+ 0.1736,
450
+ 0.2893,
451
+ 0.2814,
452
+ 0.2557
453
+ ],
454
+ "passos_rec": 2
455
+ }
456
+ ],
457
+ "instrucao": [
458
+ {
459
+ "ramos": [
460
+ "conv_dil",
461
+ "gru",
462
+ "mlp"
463
+ ],
464
+ "alpha_medio": [
465
+ 0.1276,
466
+ 0.2803,
467
+ 0.5922
468
+ ],
469
+ "passos_rec": 2
470
+ },
471
+ {
472
+ "ramos": [
473
+ "conv_dil",
474
+ "gru",
475
+ "mlp",
476
+ "moe"
477
+ ],
478
+ "alpha_medio": [
479
+ 0.353,
480
+ 0.2125,
481
+ 0.2194,
482
+ 0.2151
483
+ ],
484
+ "passos_rec": 2
485
+ },
486
+ {
487
+ "ramos": [
488
+ "conv_dil",
489
+ "gru",
490
+ "mlp",
491
+ "moe"
492
+ ],
493
+ "alpha_medio": [
494
+ 0.0723,
495
+ 0.2226,
496
+ 0.4016,
497
+ 0.3036
498
+ ],
499
+ "passos_rec": 2
500
+ }
501
+ ]
502
+ },
503
+ "treino_prs_v8": {
504
+ "trust": 0.4091,
505
+ "tau": 0.55736,
506
+ "clip": 3.2906,
507
+ "boost": 1.0,
508
+ "streak": 0,
509
+ "ciclos_sgdr": 0,
510
+ "recompensa_acum": 17.593,
511
+ "beta_min_relativo": 2.0
512
+ },
513
+ "treino_confianca": {
514
+ "h_ema": 0.6650000214576721,
515
+ "ece": 0.3813131313131314,
516
+ "posterior_media": 0.32673267326732675,
517
+ "bernstein": [
518
+ 0.176243817077732,
519
+ 0.4772215294569215
520
+ ]
521
+ },
522
+ "treino_memoria": {
523
+ "slots": 25,
524
+ "capacidade": 64,
525
+ "escritas": 25,
526
+ "rejeitadas_confianca": 0,
527
+ "hit_rate": 1.0,
528
+ "comprimidos": 0,
529
+ "entropia_codebook": 1.4736544073912228e-07,
530
+ "perda_vq": null,
531
+ "violacoes_contrato": 0,
532
+ "economia_bits_por_slot": 0.9990234375
533
+ },
534
+ "treino_crescimento": [],
535
+ "memoria_execucao": {
536
+ "slots": 32,
537
+ "capacidade": 32,
538
+ "escritas": 45,
539
+ "rejeitadas_confianca": 0,
540
+ "hit_rate": 1.0,
541
+ "comprimidos": 32,
542
+ "entropia_codebook": 3.5029096603393555,
543
+ "perda_vq": "tensor(7.0846)",
544
+ "violacoes_contrato": 0,
545
+ "economia_bits_por_slot": 0.9990234375,
546
+ "escritas_aceitas": 45,
547
+ "consultas_com_acerto": 15,
548
+ "comprimidos_agora": 32
549
+ },
550
+ "curva_epocas": [
551
+ {
552
+ "epoca": 0,
553
+ "perda_media": 4.501659254233043,
554
+ "ppl_lm": 116.51917431950382
555
+ },
556
+ {
557
+ "epoca": 1,
558
+ "perda_media": 2.1522662341594696,
559
+ "ppl_lm": 20.32702512440419
560
+ },
561
+ {
562
+ "epoca": 2,
563
+ "perda_media": 1.628365287516499,
564
+ "ppl_lm": 6.841325508316532
565
+ },
566
+ {
567
+ "epoca": 3,
568
+ "perda_media": 1.5996007979906435,
569
+ "ppl_lm": 6.208188231846149
570
+ },
571
+ {
572
+ "epoca": 4,
573
+ "perda_media": 1.4905521827482286,
574
+ "ppl_lm": 5.169895857934865
575
+ },
576
+ {
577
+ "epoca": 5,
578
+ "perda_media": 0.9951962381601334,
579
+ "ppl_lm": 3.663949358479845
580
+ },
581
+ {
582
+ "epoca": 5,
583
+ "perda_media": 0.78661770003876,
584
+ "ppl_lm": 2.2905761511962
585
+ }
586
+ ],
587
+ "coerencia": {
588
+ "corpus_25pct": {
589
+ "n_registros": 887,
590
+ "repeticao_pct": 46.32,
591
+ "ancoragem_bigramas": 0.0,
592
+ "entropia_logits": 3.0155
593
+ },
594
+ "corpus_50pct": {
595
+ "n_registros": 1774,
596
+ "repeticao_pct": 63.97,
597
+ "ancoragem_bigramas": 0.0071,
598
+ "entropia_logits": 3.0155
599
+ },
600
+ "corpus_100pct": {
601
+ "n_registros": 3548,
602
+ "repeticao_pct": 52.94,
603
+ "ancoragem_bigramas": 0.0,
604
+ "entropia_logits": 3.0155
605
+ },
606
+ "amostras": [
607
+ " corpos a na china oran melhorar incêndiocas tenha controlaroumentos tradicional ideias tr 26un agachamentos fornecer em meadosvosvosÉ pela ",
608
+ " afastados dança melhorar sexove por fatoresun agachamentosense em bicicleta retorno Isso cargo de a a na Califórnia tor Os benefícios passa",
609
+ " eie Este comJánas tipo passa ritmo tropical02 de",
610
+ ""
611
+ ]
612
+ },
613
+ "clip_score": {
614
+ "clip_real": -0.1604,
615
+ "clip_controle": -0.1702,
616
+ "margem": 0.0098,
617
+ "n": 32
618
+ },
619
+ "itm": {
620
+ "acuracia": 0.5,
621
+ "f1": 0.0,
622
+ "n": 16,
623
+ "tp": 0,
624
+ "fp": 0,
625
+ "fn": 8
626
+ },
627
+ "ppl_visual": {
628
+ "ppl_visual": 1.16,
629
+ "n": 192,
630
+ "codigos_distintos": 8
631
+ },
632
+ "ppl_multimodal": {
633
+ "ppl_mm": 9.41,
634
+ "ce_mm": 2.2417,
635
+ "n": 2733
636
+ },
637
+ "geracao_metricas": {
638
+ "medias": {
639
+ "bleu": 0.0,
640
+ "rouge_l": 0.0149,
641
+ "meteor": 0.0,
642
+ "cider": 0.0001
643
+ },
644
+ "n": 12,
645
+ "amostras": [
646
+ {
647
+ "hipotese": " a a a sombra levando levando ao emn19 indes incêndio",
648
+ "ref": "Na foto podemos ver um homem centralizado na imagem, posicio",
649
+ "bleu": 0.0,
650
+ "rouge_l": 0.023288,
651
+ "meteor": 0.0,
652
+ "cider": 0.0
653
+ },
654
+ {
655
+ "hipotese": " a gordura levando sociedade formação ajudar tropicalgou como pode levar sozinha",
656
+ "ref": "Na foto podemos ver duas pessoas sobre uma prancha de stand ",
657
+ "bleu": 0.0,
658
+ "rouge_l": 0.014975,
659
+ "meteor": 0.0,
660
+ "cider": 5.8e-05
661
+ },
662
+ {
663
+ "hipotese": "",
664
+ "ref": "Na foto podemos ver cinco pessoas reunidas ao redor de uma c",
665
+ "bleu": 0.0,
666
+ "rouge_l": 0.0,
667
+ "meteor": 0.0,
668
+ "cider": 0.0
669
+ },
670
+ {
671
+ "hipotese": " trânsito PL rastre!1540 conelos a a competiçãodam várias United físicoifúvemerc",
672
+ "ref": "Na imagem podemos ver um homem usando uma jaqueta jeans de m",
673
+ "bleu": 0.0,
674
+ "rouge_l": 0.018564,
675
+ "meteor": 0.0,
676
+ "cider": 0.0
677
+ }
678
+ ]
679
+ },
680
+ "benchmarks": {
681
+ "mmmu": {
682
+ "benchmark": "MMMU-proxy-PT",
683
+ "n": 30,
684
+ "acuracia": 0.0,
685
+ "acertos": 0,
686
+ "distribuicao": {
687
+ "∅": 27,
688
+ "A": 3
689
+ },
690
+ "acaso": 0.25,
691
+ "rotulo": "proxy em escala reduzida"
692
+ },
693
+ "mme": {
694
+ "benchmark": "MME-proxy-PT",
695
+ "n": 15,
696
+ "acc": 0.0,
697
+ "acc_mais": 0.0,
698
+ "score_mme": 0.0,
699
+ "rotulo": "proxy em escala reduzida"
700
+ },
701
+ "mathvista": {
702
+ "benchmark": "MathVista-proxy-PT",
703
+ "n": 2,
704
+ "acuracia": 0.0,
705
+ "acertos": 0,
706
+ "rotulo": "proxy em escala reduzida"
707
+ }
708
+ },
709
+ "som_expandido": {
710
+ "som": {
711
+ "k": 24,
712
+ "qe": 59.763092,
713
+ "te": 0.980469,
714
+ "distorcao": 4559.125,
715
+ "sigma0": 3.0,
716
+ "sigma_f": 0.4,
717
+ "alpha0": 0.5,
718
+ "alpha_ultimo": 0.49505,
719
+ "n_ativos": 24,
720
+ "entropia": 3.178054,
721
+ "rank_efetivo": 24.0,
722
+ "frac_vivas": 1.0,
723
+ "u_matrix_resumo": {
724
+ "u_media": 32.043781,
725
+ "u_max": 60.584747,
726
+ "u_std": 13.450652,
727
+ "fronteiras_picos": 5
728
+ },
729
+ "taxa_ativos_ema": 1.0
730
+ },
731
+ "gg": {
732
+ "k": 4,
733
+ "qe": 824.069397,
734
+ "te": 0.316406,
735
+ "distorcao": 2294.106445,
736
+ "sigma0": 3.0,
737
+ "sigma_f": 0.4,
738
+ "alpha0": 0.5,
739
+ "alpha_ultimo": 0.49505,
740
+ "n_ativos": 4,
741
+ "entropia": 1.386294,
742
+ "rank_efetivo": 4.0,
743
+ "frac_vivas": 1.0,
744
+ "u_matrix_resumo": {
745
+ "u_media": 11.976965,
746
+ "u_max": 13.957561,
747
+ "u_std": 1.774012,
748
+ "fronteiras_picos": 1
749
+ },
750
+ "taxa_ativos_ema": 1.0
751
+ },
752
+ "gcs": {
753
+ "k": 3,
754
+ "qe": 250.228699,
755
+ "te": 1.0,
756
+ "distorcao": 1513.247803,
757
+ "sigma0": 0.0,
758
+ "sigma_f": 0.0,
759
+ "alpha0": 0.0,
760
+ "alpha_ultimo": 0.0,
761
+ "n_ativos": 2,
762
+ "entropia": 0.574847,
763
+ "rank_efetivo": 1.7769,
764
+ "frac_vivas": 0.6667,
765
+ "u_matrix_resumo": {
766
+ "u_media": 0.0,
767
+ "u_max": 0.0,
768
+ "u_std": 0.0,
769
+ "fronteiras_picos": 0
770
+ },
771
+ "taxa_ativos_ema": null
772
+ },
773
+ "gsom": {
774
+ "k": 4,
775
+ "qe": 220.440918,
776
+ "te": 0.410156,
777
+ "distorcao": 3028.990967,
778
+ "sigma0": 3.0,
779
+ "sigma_f": 0.4,
780
+ "alpha0": 0.5,
781
+ "alpha_ultimo": 0.49505,
782
+ "n_ativos": 4,
783
+ "entropia": 1.386294,
784
+ "rank_efetivo": 4.0,
785
+ "frac_vivas": 1.0,
786
+ "u_matrix_resumo": {
787
+ "u_media": 36.250061,
788
+ "u_max": 60.509567,
789
+ "u_std": 19.814838,
790
+ "fronteiras_picos": 1
791
+ },
792
+ "taxa_ativos_ema": 1.0
793
+ },
794
+ "hsom": {
795
+ "k": 12,
796
+ "qe": 71.016319,
797
+ "te": 0.855469,
798
+ "distorcao": 3511.441895,
799
+ "sigma0": 2.5,
800
+ "sigma_f": 0.4,
801
+ "alpha0": 0.5,
802
+ "alpha_ultimo": 0.49505,
803
+ "n_ativos": 12,
804
+ "entropia": 2.484907,
805
+ "rank_efetivo": 12.0,
806
+ "frac_vivas": 1.0,
807
+ "u_matrix_resumo": {
808
+ "u_media": 28.268629,
809
+ "u_max": 40.029243,
810
+ "u_std": 7.094913,
811
+ "fronteiras_picos": 3
812
+ },
813
+ "taxa_ativos_ema": 1.0
814
+ },
815
+ "tkm": {
816
+ "k": 32,
817
+ "qe": 58.265549,
818
+ "te": 0.851562,
819
+ "distorcao": 6600.30127,
820
+ "sigma0": 2.0,
821
+ "sigma_f": 0.4,
822
+ "alpha0": 0.5,
823
+ "alpha_ultimo": 0.49505,
824
+ "n_ativos": 32,
825
+ "entropia": 3.465736,
826
+ "rank_efetivo": 32.0,
827
+ "frac_vivas": 1.0,
828
+ "u_matrix_resumo": {
829
+ "u_media": 33.759853,
830
+ "u_max": 60.711811,
831
+ "u_std": 13.525013,
832
+ "fronteiras_picos": 9
833
+ },
834
+ "taxa_ativos_ema": 1.0
835
+ },
836
+ "rsom": {
837
+ "k": 32,
838
+ "qe": 53.492386,
839
+ "te": 0.824219,
840
+ "distorcao": 5104.700684,
841
+ "sigma0": 2.0,
842
+ "sigma_f": 0.4,
843
+ "alpha0": 0.5,
844
+ "alpha_ultimo": 0.49505,
845
+ "n_ativos": 32,
846
+ "entropia": 3.465736,
847
+ "rank_efetivo": 32.0,
848
+ "frac_vivas": 1.0,
849
+ "u_matrix_resumo": {
850
+ "u_media": 34.29977,
851
+ "u_max": 60.189041,
852
+ "u_std": 13.249257,
853
+ "fronteiras_picos": 6
854
+ },
855
+ "taxa_ativos_ema": 1.0
856
+ },
857
+ "cpn": {
858
+ "k": 24,
859
+ "qe": 38.578434,
860
+ "te": 0.195312,
861
+ "distorcao": 884.967712,
862
+ "sigma0": 2.5,
863
+ "sigma_f": 0.4,
864
+ "alpha0": 0.5,
865
+ "alpha_ultimo": 0.462963,
866
+ "n_ativos": 23,
867
+ "entropia": 2.909895,
868
+ "rank_efetivo": 18.3549,
869
+ "frac_vivas": 0.9583,
870
+ "u_matrix_resumo": {
871
+ "u_media": 9.52423,
872
+ "u_max": 16.741587,
873
+ "u_std": 4.716956,
874
+ "fronteiras_picos": 3
875
+ },
876
+ "taxa_ativos_ema": 1.0
877
+ },
878
+ "ssom": {
879
+ "k": 24,
880
+ "qe": 123.85688,
881
+ "te": 0.90625,
882
+ "distorcao": 5260.532715,
883
+ "sigma0": 2.0,
884
+ "sigma_f": 0.4,
885
+ "alpha0": 0.5,
886
+ "alpha_ultimo": 0.49505,
887
+ "n_ativos": 24,
888
+ "entropia": 3.178054,
889
+ "rank_efetivo": 24.0,
890
+ "frac_vivas": 1.0,
891
+ "u_matrix_resumo": {
892
+ "u_media": 33.295235,
893
+ "u_max": 59.584949,
894
+ "u_std": 15.406026,
895
+ "fronteiras_picos": 4
896
+ },
897
+ "taxa_ativos_ema": 1.0
898
+ }
899
+ },
900
+ "inferencia_agente": {
901
+ "latencia_s": 0.382,
902
+ "tokens": 24,
903
+ "taxa_repeticao": 0.2083,
904
+ "coerencia_bigramas": 0.0
905
+ },
906
+ "difusao": {
907
+ "modo": "real",
908
+ "prompt_enriquecido": "o pantanal ao entardecer, com detalhes nítidos, com composição harmônica, com iluminação suave",
909
+ "latencia_s": 2.42,
910
+ "gerou_pixels": true
911
+ },
912
+ "agente_engenheiro": {
913
+ "revisoes_aprovadas": 0,
914
+ "revisoes_bloqueadas": 0,
915
+ "som_invariante_sem_orfaos": true,
916
+ "som_ativos": {
917
+ "ativos/som": 1.0,
918
+ "k/som": 24,
919
+ "ativos/gg": 1.0,
920
+ "k/gg": 4,
921
+ "ativos/gcs": 1.0,
922
+ "k/gcs": 3,
923
+ "ativos/gsom": 1.0,
924
+ "k/gsom": 4,
925
+ "ativos/hsom": 1.0,
926
+ "k/hsom": 12,
927
+ "ativos/tkm": 1.0,
928
+ "k/tkm": 32,
929
+ "ativos/rsom": 1.0,
930
+ "k/rsom": 32,
931
+ "ativos/cpn": 1.0,
932
+ "k/cpn": 24,
933
+ "ativos/ssom": 1.0,
934
+ "k/ssom": 24,
935
+ "A_global": 1.0
936
+ }
937
+ }
938
+ }
avaliacao_v8.json ADDED
@@ -0,0 +1,947 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "estado": "fase-som",
3
+ "roteador_ssom": {
4
+ "amostras": 1536,
5
+ "pronto": true,
6
+ "lambda_rota": 0.35,
7
+ "gamma_empate": 0.15,
8
+ "drift_codebook": 0.0,
9
+ "conf_media": 0.3382,
10
+ "frac_rotas_ativas": 0.75,
11
+ "k": 24,
12
+ "taxa_ativos": 1.0
13
+ },
14
+ "perdas_tarefa": {
15
+ "lm": {
16
+ "treinado": 7.840750614802043,
17
+ "aleatorio": 9.75594711303711
18
+ },
19
+ "noticia": {
20
+ "treinado": 7.552767038345337,
21
+ "aleatorio": 9.748649597167969
22
+ },
23
+ "instrucao": {
24
+ "treinado": 6.964608271916707,
25
+ "aleatorio": 9.766283671061197
26
+ },
27
+ "pontuacao": {
28
+ "treinado": 7.724856456120809,
29
+ "aleatorio": 9.752796649932861
30
+ },
31
+ "imagem_caption": {
32
+ "treinado": 7.004336357116699,
33
+ "aleatorio": 9.723368008931478
34
+ },
35
+ "vqa": {
36
+ "treinado": 7.352211872736613,
37
+ "aleatorio": 9.732653617858887
38
+ },
39
+ "ocr": {
40
+ "treinado": 7.486716111501058,
41
+ "aleatorio": 9.772692362467447
42
+ },
43
+ "asr": {
44
+ "treinado": 7.620069583257039,
45
+ "aleatorio": 9.76025120417277
46
+ },
47
+ "tts": {
48
+ "treinado": 6.79421067237854,
49
+ "aleatorio": 9.778711160024008
50
+ }
51
+ },
52
+ "ppl_lm": 2542.1122649587833,
53
+ "ppl_lm_aleatorio": 17256.55090604361,
54
+ "moe_uso_por_tarefa": {
55
+ "lm": [
56
+ {
57
+ "experts_top": [
58
+ 0,
59
+ 1
60
+ ],
61
+ "grupo_top": [
62
+ 0,
63
+ 0
64
+ ]
65
+ },
66
+ {
67
+ "experts_top": [
68
+ 1,
69
+ 3
70
+ ],
71
+ "grupo_top": [
72
+ "dec",
73
+ "dec"
74
+ ],
75
+ "agrupado": false
76
+ }
77
+ ],
78
+ "vqa": [
79
+ {
80
+ "experts_top": [
81
+ 0,
82
+ 4
83
+ ],
84
+ "grupo_top": [
85
+ 0,
86
+ 2
87
+ ]
88
+ },
89
+ {
90
+ "experts_top": [
91
+ 1,
92
+ 3
93
+ ],
94
+ "grupo_top": [
95
+ "dec",
96
+ "dec"
97
+ ],
98
+ "agrupado": false
99
+ }
100
+ ],
101
+ "ocr": [
102
+ {
103
+ "experts_top": [
104
+ 0,
105
+ 4
106
+ ],
107
+ "grupo_top": [
108
+ 0,
109
+ 2
110
+ ]
111
+ },
112
+ {
113
+ "experts_top": [
114
+ 1,
115
+ 3
116
+ ],
117
+ "grupo_top": [
118
+ "dec",
119
+ "dec"
120
+ ],
121
+ "agrupado": false
122
+ }
123
+ ],
124
+ "asr": [
125
+ {
126
+ "experts_top": [
127
+ 4,
128
+ 0
129
+ ],
130
+ "grupo_top": [
131
+ 2,
132
+ 0
133
+ ]
134
+ },
135
+ {
136
+ "experts_top": [
137
+ 1,
138
+ 3
139
+ ],
140
+ "grupo_top": [
141
+ "dec",
142
+ "dec"
143
+ ],
144
+ "agrupado": false
145
+ }
146
+ ],
147
+ "tts": [
148
+ {
149
+ "experts_top": [
150
+ 0,
151
+ 4
152
+ ],
153
+ "grupo_top": [
154
+ 0,
155
+ 2
156
+ ]
157
+ },
158
+ {
159
+ "experts_top": [
160
+ 1,
161
+ 3
162
+ ],
163
+ "grupo_top": [
164
+ "dec",
165
+ "dec"
166
+ ],
167
+ "agrupado": false
168
+ }
169
+ ]
170
+ },
171
+ "mtp": {
172
+ "alphas": [
173
+ 0.0005292753921821713,
174
+ 0.9994707703590393
175
+ ],
176
+ "per_cabeca": [
177
+ 8.05044937133789,
178
+ 8.269538879394531
179
+ ],
180
+ "entropia": 0.004521933849900961,
181
+ "termos_ce": 0.0
182
+ },
183
+ "w8a8_delta": 0.0006594657897949219,
184
+ "som_treinado": {
185
+ "variante_ativa": "cpn",
186
+ "variantes": {
187
+ "som": {
188
+ "k": 24,
189
+ "taxa_ativos": 1.0,
190
+ "resemeados": 24,
191
+ "usos": 256,
192
+ "atingiu_alvo": true
193
+ },
194
+ "gg": {
195
+ "k": 4,
196
+ "taxa_ativos": 1.0,
197
+ "resemeados": 4,
198
+ "usos": 256,
199
+ "atingiu_alvo": true
200
+ },
201
+ "gcs": {
202
+ "k": 3,
203
+ "arestas": 3,
204
+ "eq_treino": 4104.4892578125,
205
+ "atingiu_alvo": true
206
+ },
207
+ "gsom": {
208
+ "k": 15,
209
+ "gt": 1.05,
210
+ "erro_medio": 0.18949279189109802,
211
+ "atingiu_alvo": true
212
+ },
213
+ "hsom": {},
214
+ "tkm": {
215
+ "k": 32,
216
+ "taxa_ativos": 1.0,
217
+ "resemeados": 32,
218
+ "usos": 256,
219
+ "atingiu_alvo": true
220
+ },
221
+ "rsom": {
222
+ "k": 32,
223
+ "taxa_ativos": 1.0,
224
+ "resemeados": 32,
225
+ "usos": 256,
226
+ "atingiu_alvo": true
227
+ },
228
+ "cpn": {},
229
+ "ssom": {
230
+ "erro": "IndexError: index 8 is out of bounds for dimension 0 with size 8"
231
+ }
232
+ },
233
+ "roteador": {
234
+ "amostras": 1581,
235
+ "pronto": true,
236
+ "lambda_rota": 0.35,
237
+ "gamma_empate": 0.15,
238
+ "drift_codebook": 0.009923,
239
+ "conf_media": 0.4107,
240
+ "frac_rotas_ativas": 0.7188,
241
+ "k": 24,
242
+ "taxa_ativos": 1.0
243
+ },
244
+ "invariante_sem_orfaos": true,
245
+ "orfaos_por_variante": {
246
+ "som": {
247
+ "orfaos": 0,
248
+ "relocados": 0,
249
+ "taxa_ativos": 1.0
250
+ },
251
+ "gg": {
252
+ "orfaos": 0,
253
+ "relocados": 0,
254
+ "taxa_ativos": 1.0
255
+ },
256
+ "gcs": {
257
+ "orfaos": 0,
258
+ "relocados": 0,
259
+ "taxa_ativos": 1.0
260
+ },
261
+ "gsom": {
262
+ "orfaos": 0,
263
+ "relocados": 0,
264
+ "taxa_ativos": 1.0
265
+ },
266
+ "hsom": {
267
+ "orfaos": 0,
268
+ "relocados": 0
269
+ },
270
+ "tkm": {
271
+ "orfaos": 0,
272
+ "relocados": 0,
273
+ "taxa_ativos": 1.0
274
+ },
275
+ "rsom": {
276
+ "orfaos": 0,
277
+ "relocados": 0,
278
+ "taxa_ativos": 1.0
279
+ },
280
+ "cpn": {
281
+ "orfaos": 0,
282
+ "relocados": 0,
283
+ "taxa_ativos": 1.0
284
+ },
285
+ "ssom": {
286
+ "orfaos": 0,
287
+ "relocados": 23,
288
+ "taxa_ativos": 1.0
289
+ }
290
+ }
291
+ },
292
+ "som_eq_fresco": {
293
+ "som": {
294
+ "taxa_ativos": 1.0,
295
+ "eq": 0.22861014306545258
296
+ },
297
+ "gg": {
298
+ "taxa_ativos": 1.0,
299
+ "eq": 1.0804760456085205
300
+ },
301
+ "gcs": {
302
+ "taxa_ativos": 1.0,
303
+ "eq": 0.9599178433418274
304
+ },
305
+ "gsom": {
306
+ "taxa_ativos": 1.0,
307
+ "eq": 1.2962698936462402
308
+ },
309
+ "tkm": {
310
+ "taxa_ativos": 1.0,
311
+ "eq": 0.08437514305114746
312
+ },
313
+ "rsom": {
314
+ "taxa_ativos": 1.0,
315
+ "eq": 0.07955622673034668
316
+ },
317
+ "ssom": {
318
+ "taxa_ativos": 1.0,
319
+ "eq": 0.09257030487060547
320
+ }
321
+ },
322
+ "geracao": {
323
+ "sem_punicao": " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?",
324
+ "com_punicao": " ? ? ? ?\n ? ? ?feira ? ? ? ? ? ? ? ? ? ? O ? ? ? ? Uma ? corpo ? O ?"
325
+ },
326
+ "microunidades": {
327
+ "lm": [
328
+ {
329
+ "ramos": [
330
+ "conv_dil",
331
+ "gru",
332
+ "mlp"
333
+ ],
334
+ "alpha_medio": [
335
+ 0.6092,
336
+ 0.3907,
337
+ 0.0002
338
+ ],
339
+ "passos_rec": 2
340
+ },
341
+ {
342
+ "ramos": [
343
+ "conv_dil",
344
+ "gru",
345
+ "mlp",
346
+ "moe"
347
+ ],
348
+ "alpha_medio": [
349
+ 0.1485,
350
+ 0.4984,
351
+ 0.0738,
352
+ 0.2794
353
+ ],
354
+ "passos_rec": 2
355
+ },
356
+ {
357
+ "ramos": [
358
+ "conv_dil",
359
+ "gru",
360
+ "mlp",
361
+ "moe"
362
+ ],
363
+ "alpha_medio": [
364
+ 1.0,
365
+ 0.0,
366
+ 0.0,
367
+ 0.0
368
+ ],
369
+ "passos_rec": 2
370
+ }
371
+ ],
372
+ "vqa": [
373
+ {
374
+ "ramos": [
375
+ "conv_dil",
376
+ "gru",
377
+ "mlp"
378
+ ],
379
+ "alpha_medio": [
380
+ 1.0,
381
+ 0.0,
382
+ 0.0
383
+ ],
384
+ "passos_rec": 2
385
+ },
386
+ {
387
+ "ramos": [
388
+ "conv_dil",
389
+ "gru",
390
+ "mlp",
391
+ "moe"
392
+ ],
393
+ "alpha_medio": [
394
+ 0.1592,
395
+ 0.4579,
396
+ 0.0731,
397
+ 0.3098
398
+ ],
399
+ "passos_rec": 2
400
+ },
401
+ {
402
+ "ramos": [
403
+ "conv_dil",
404
+ "gru",
405
+ "mlp",
406
+ "moe"
407
+ ],
408
+ "alpha_medio": [
409
+ 1.0,
410
+ 0.0,
411
+ 0.0,
412
+ 0.0
413
+ ],
414
+ "passos_rec": 2
415
+ }
416
+ ],
417
+ "asr": [
418
+ {
419
+ "ramos": [
420
+ "conv_dil",
421
+ "gru",
422
+ "mlp"
423
+ ],
424
+ "alpha_medio": [
425
+ 0.6136,
426
+ 0.3863,
427
+ 0.0001
428
+ ],
429
+ "passos_rec": 2
430
+ },
431
+ {
432
+ "ramos": [
433
+ "conv_dil",
434
+ "gru",
435
+ "mlp",
436
+ "moe"
437
+ ],
438
+ "alpha_medio": [
439
+ 0.1496,
440
+ 0.4945,
441
+ 0.074,
442
+ 0.2819
443
+ ],
444
+ "passos_rec": 2
445
+ },
446
+ {
447
+ "ramos": [
448
+ "conv_dil",
449
+ "gru",
450
+ "mlp",
451
+ "moe"
452
+ ],
453
+ "alpha_medio": [
454
+ 1.0,
455
+ 0.0,
456
+ 0.0,
457
+ 0.0
458
+ ],
459
+ "passos_rec": 2
460
+ }
461
+ ],
462
+ "instrucao": [
463
+ {
464
+ "ramos": [
465
+ "conv_dil",
466
+ "gru",
467
+ "mlp"
468
+ ],
469
+ "alpha_medio": [
470
+ 0.839,
471
+ 0.161,
472
+ 0.0
473
+ ],
474
+ "passos_rec": 2
475
+ },
476
+ {
477
+ "ramos": [
478
+ "conv_dil",
479
+ "gru",
480
+ "mlp",
481
+ "moe"
482
+ ],
483
+ "alpha_medio": [
484
+ 0.1472,
485
+ 0.5048,
486
+ 0.0738,
487
+ 0.2742
488
+ ],
489
+ "passos_rec": 2
490
+ },
491
+ {
492
+ "ramos": [
493
+ "conv_dil",
494
+ "gru",
495
+ "mlp",
496
+ "moe"
497
+ ],
498
+ "alpha_medio": [
499
+ 1.0,
500
+ 0.0,
501
+ 0.0,
502
+ 0.0
503
+ ],
504
+ "passos_rec": 2
505
+ }
506
+ ]
507
+ },
508
+ "treino_prs_v8": {
509
+ "trust": 0.3768,
510
+ "tau": 6.82558,
511
+ "clip": 5.0,
512
+ "boost": 1.0,
513
+ "streak": 0,
514
+ "ciclos_sgdr": 0,
515
+ "recompensa_acum": 9.712,
516
+ "beta_min_relativo": 2.0
517
+ },
518
+ "treino_confianca": {
519
+ "h_ema": 0.398207426071167,
520
+ "ece": 0.13666666666666666,
521
+ "posterior_media": 0.18478260869565216,
522
+ "bernstein": [
523
+ 0.048734518728612175,
524
+ 0.32083069866269215
525
+ ]
526
+ },
527
+ "treino_memoria": {
528
+ "slots": 13,
529
+ "capacidade": 64,
530
+ "escritas": 13,
531
+ "rejeitadas_confianca": 10,
532
+ "hit_rate": 1.0,
533
+ "comprimidos": 0,
534
+ "entropia_codebook": 1.4736544073912228e-07,
535
+ "perda_vq": null,
536
+ "violacoes_contrato": 0,
537
+ "economia_bits_por_slot": 0.9990234375
538
+ },
539
+ "treino_crescimento": [],
540
+ "memoria_execucao": {
541
+ "slots": 32,
542
+ "capacidade": 32,
543
+ "escritas": 45,
544
+ "rejeitadas_confianca": 0,
545
+ "hit_rate": 1.0,
546
+ "comprimidos": 32,
547
+ "entropia_codebook": 3.4869675636291504,
548
+ "perda_vq": "tensor(1.2586)",
549
+ "violacoes_contrato": 0,
550
+ "economia_bits_por_slot": 0.9990234375,
551
+ "escritas_aceitas": 45,
552
+ "consultas_com_acerto": 15,
553
+ "comprimidos_agora": 32
554
+ },
555
+ "curva_epocas": [
556
+ {
557
+ "epoca": 0,
558
+ "perda_media": 7.563339779175908,
559
+ "ppl_lm": 3175.163243261297
560
+ },
561
+ {
562
+ "epoca": 1,
563
+ "perda_media": 8.527180158174955,
564
+ "ppl_lm": 3338.0887647367836
565
+ },
566
+ {
567
+ "epoca": 2,
568
+ "perda_media": 7.530729611714681,
569
+ "ppl_lm": 2609.7989711637842
570
+ },
571
+ {
572
+ "epoca": 3,
573
+ "perda_media": 7.470894780158996,
574
+ "ppl_lm": 2415.108953044255
575
+ },
576
+ {
577
+ "epoca": 4,
578
+ "perda_media": 7.043362287374643,
579
+ "ppl_lm": 2283.2964058650737
580
+ },
581
+ {
582
+ "epoca": 5,
583
+ "perda_media": 7.089543087537899,
584
+ "ppl_lm": 2672.6735231256753
585
+ },
586
+ {
587
+ "epoca": 6,
588
+ "perda_media": 9.40745317524877,
589
+ "ppl_lm": 4403.193619695888
590
+ },
591
+ {
592
+ "epoca": 7,
593
+ "perda_media": 7.231130578782824,
594
+ "ppl_lm": 2572.532733229914
595
+ }
596
+ ],
597
+ "coerencia": {
598
+ "corpus_25pct": {
599
+ "n_registros": 887,
600
+ "repeticao_pct": 69.85,
601
+ "ancoragem_bigramas": 0.0,
602
+ "entropia_logits": 0.6818
603
+ },
604
+ "corpus_50pct": {
605
+ "n_registros": 1774,
606
+ "repeticao_pct": 72.06,
607
+ "ancoragem_bigramas": 0.0,
608
+ "entropia_logits": 0.6818
609
+ },
610
+ "corpus_100pct": {
611
+ "n_registros": 3548,
612
+ "repeticao_pct": 56.62,
613
+ "ancoragem_bigramas": 0.0071,
614
+ "entropia_logits": 0.6818
615
+ },
616
+ "amostras": [
617
+ " ? ? ? ? Uma ?\n ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? corpo implant ? ? ? ? ? ? ? ? ? ? ? rotina",
618
+ " ? ? Ofeira\n ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\n ? ? ? ? ?",
619
+ " ? ? ? ? O ? ? Ele ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rotina imped ? ?\n ? ? ? ? ? ? ?",
620
+ " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Uma ? ? rotinaesquel ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"
621
+ ]
622
+ },
623
+ "clip_score": {
624
+ "clip_real": -0.0921,
625
+ "clip_controle": -0.0923,
626
+ "margem": 0.0002,
627
+ "n": 32
628
+ },
629
+ "itm": {
630
+ "acuracia": 0.5,
631
+ "f1": 0.0,
632
+ "n": 16,
633
+ "tp": 0,
634
+ "fp": 0,
635
+ "fn": 8
636
+ },
637
+ "ppl_visual": {
638
+ "ppl_visual": 1.52,
639
+ "n": 192,
640
+ "codigos_distintos": 9
641
+ },
642
+ "ppl_multimodal": {
643
+ "ppl_mm": 1072.72,
644
+ "ce_mm": 6.978,
645
+ "n": 2733
646
+ },
647
+ "geracao_metricas": {
648
+ "medias": {
649
+ "bleu": 0.0,
650
+ "rouge_l": 0.0026,
651
+ "meteor": 0.0,
652
+ "cider": 0.0
653
+ },
654
+ "n": 12,
655
+ "amostras": [
656
+ {
657
+ "hipotese": " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?",
658
+ "ref": "Na foto podemos ver um homem centralizado na imagem, posicio",
659
+ "bleu": 0.0,
660
+ "rouge_l": 0.0,
661
+ "meteor": 0.0,
662
+ "cider": 0.0
663
+ },
664
+ {
665
+ "hipotese": " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?",
666
+ "ref": "Na foto podemos ver duas pessoas sobre uma prancha de stand ",
667
+ "bleu": 0.0,
668
+ "rouge_l": 0.0,
669
+ "meteor": 0.0,
670
+ "cider": 0.0
671
+ },
672
+ {
673
+ "hipotese": " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?",
674
+ "ref": "Na foto podemos ver cinco pessoas reunidas ao redor de uma c",
675
+ "bleu": 0.0,
676
+ "rouge_l": 0.0,
677
+ "meteor": 0.0,
678
+ "cider": 0.0
679
+ },
680
+ {
681
+ "hipotese": " ? ? ? ? ? rotina básicos ? ? ? ? ? ? ? Uma ? ? ? ? ?",
682
+ "ref": "Na imagem podemos ver um homem usando uma jaqueta jeans de m",
683
+ "bleu": 0.0,
684
+ "rouge_l": 0.009666,
685
+ "meteor": 0.0,
686
+ "cider": 0.0
687
+ }
688
+ ]
689
+ },
690
+ "benchmarks": {
691
+ "mmmu": {
692
+ "benchmark": "MMMU-proxy-PT",
693
+ "n": 30,
694
+ "acuracia": 0.0,
695
+ "acertos": 0,
696
+ "distribuicao": {
697
+ "∅": 30
698
+ },
699
+ "acaso": 0.25,
700
+ "rotulo": "proxy em escala reduzida"
701
+ },
702
+ "mme": {
703
+ "benchmark": "MME-proxy-PT",
704
+ "n": 15,
705
+ "acc": 0.0,
706
+ "acc_mais": 0.0,
707
+ "score_mme": 0.0,
708
+ "rotulo": "proxy em escala reduzida"
709
+ },
710
+ "mathvista": {
711
+ "benchmark": "MathVista-proxy-PT",
712
+ "n": 2,
713
+ "acuracia": 0.0,
714
+ "acertos": 0,
715
+ "rotulo": "proxy em escala reduzida"
716
+ }
717
+ },
718
+ "som_expandido": {
719
+ "som": {
720
+ "k": 24,
721
+ "qe": 0.728719,
722
+ "te": 0.671875,
723
+ "distorcao": 74.685822,
724
+ "sigma0": 3.0,
725
+ "sigma_f": 0.4,
726
+ "alpha0": 0.5,
727
+ "alpha_ultimo": 0.49505,
728
+ "n_ativos": 24,
729
+ "entropia": 3.178054,
730
+ "rank_efetivo": 24.0,
731
+ "frac_vivas": 1.0,
732
+ "u_matrix_resumo": {
733
+ "u_media": 2.167898,
734
+ "u_max": 6.077848,
735
+ "u_std": 1.605556,
736
+ "fronteiras_picos": 2
737
+ },
738
+ "taxa_ativos_ema": 1.0
739
+ },
740
+ "gg": {
741
+ "k": 4,
742
+ "qe": 9.097231,
743
+ "te": 0.878906,
744
+ "distorcao": 34.777397,
745
+ "sigma0": 3.0,
746
+ "sigma_f": 0.4,
747
+ "alpha0": 0.5,
748
+ "alpha_ultimo": 0.49505,
749
+ "n_ativos": 4,
750
+ "entropia": 1.386294,
751
+ "rank_efetivo": 4.0,
752
+ "frac_vivas": 1.0,
753
+ "u_matrix_resumo": {
754
+ "u_media": 2.047124,
755
+ "u_max": 2.419761,
756
+ "u_std": 0.425792,
757
+ "fronteiras_picos": 1
758
+ },
759
+ "taxa_ativos_ema": 1.0
760
+ },
761
+ "gcs": {
762
+ "k": 3,
763
+ "qe": 1.699399,
764
+ "te": 1.0,
765
+ "distorcao": 28.847206,
766
+ "sigma0": 0.0,
767
+ "sigma_f": 0.0,
768
+ "alpha0": 0.0,
769
+ "alpha_ultimo": 0.0,
770
+ "n_ativos": 3,
771
+ "entropia": 1.037116,
772
+ "rank_efetivo": 2.8211,
773
+ "frac_vivas": 1.0,
774
+ "u_matrix_resumo": {
775
+ "u_media": 0.0,
776
+ "u_max": 0.0,
777
+ "u_std": 0.0,
778
+ "fronteiras_picos": 0
779
+ },
780
+ "taxa_ativos_ema": null
781
+ },
782
+ "gsom": {
783
+ "k": 4,
784
+ "qe": 10.148916,
785
+ "te": 0.859375,
786
+ "distorcao": 36.684849,
787
+ "sigma0": 3.0,
788
+ "sigma_f": 0.4,
789
+ "alpha0": 0.5,
790
+ "alpha_ultimo": 0.49505,
791
+ "n_ativos": 4,
792
+ "entropia": 1.386294,
793
+ "rank_efetivo": 4.0,
794
+ "frac_vivas": 1.0,
795
+ "u_matrix_resumo": {
796
+ "u_media": 1.536023,
797
+ "u_max": 2.269848,
798
+ "u_std": 0.599166,
799
+ "fronteiras_picos": 1
800
+ },
801
+ "taxa_ativos_ema": 1.0
802
+ },
803
+ "hsom": {
804
+ "k": 12,
805
+ "qe": 0.678309,
806
+ "te": 0.820312,
807
+ "distorcao": 82.439156,
808
+ "sigma0": 2.5,
809
+ "sigma_f": 0.4,
810
+ "alpha0": 0.5,
811
+ "alpha_ultimo": 0.49505,
812
+ "n_ativos": 12,
813
+ "entropia": 2.484907,
814
+ "rank_efetivo": 12.0,
815
+ "frac_vivas": 1.0,
816
+ "u_matrix_resumo": {
817
+ "u_media": 3.804719,
818
+ "u_max": 8.736095,
819
+ "u_std": 2.721405,
820
+ "fronteiras_picos": 2
821
+ },
822
+ "taxa_ativos_ema": 1.0
823
+ },
824
+ "tkm": {
825
+ "k": 32,
826
+ "qe": 0.216429,
827
+ "te": 0.851562,
828
+ "distorcao": 106.654846,
829
+ "sigma0": 2.0,
830
+ "sigma_f": 0.4,
831
+ "alpha0": 0.5,
832
+ "alpha_ultimo": 0.49505,
833
+ "n_ativos": 32,
834
+ "entropia": 3.465736,
835
+ "rank_efetivo": 32.0,
836
+ "frac_vivas": 1.0,
837
+ "u_matrix_resumo": {
838
+ "u_media": 3.442991,
839
+ "u_max": 11.211287,
840
+ "u_std": 2.545307,
841
+ "fronteiras_picos": 5
842
+ },
843
+ "taxa_ativos_ema": 1.0
844
+ },
845
+ "rsom": {
846
+ "k": 32,
847
+ "qe": 1.095875,
848
+ "te": 0.917969,
849
+ "distorcao": 70.848114,
850
+ "sigma0": 2.0,
851
+ "sigma_f": 0.4,
852
+ "alpha0": 0.5,
853
+ "alpha_ultimo": 0.49505,
854
+ "n_ativos": 32,
855
+ "entropia": 3.465736,
856
+ "rank_efetivo": 32.0,
857
+ "frac_vivas": 1.0,
858
+ "u_matrix_resumo": {
859
+ "u_media": 2.278218,
860
+ "u_max": 6.905422,
861
+ "u_std": 1.859771,
862
+ "fronteiras_picos": 7
863
+ },
864
+ "taxa_ativos_ema": 1.0
865
+ },
866
+ "cpn": {
867
+ "k": 24,
868
+ "qe": 0.182707,
869
+ "te": 0.3125,
870
+ "distorcao": 12.300114,
871
+ "sigma0": 2.5,
872
+ "sigma_f": 0.4,
873
+ "alpha0": 0.5,
874
+ "alpha_ultimo": 0.462963,
875
+ "n_ativos": 24,
876
+ "entropia": 2.561003,
877
+ "rank_efetivo": 12.9488,
878
+ "frac_vivas": 1.0,
879
+ "u_matrix_resumo": {
880
+ "u_media": 1.221734,
881
+ "u_max": 3.020689,
882
+ "u_std": 0.860318,
883
+ "fronteiras_picos": 2
884
+ },
885
+ "taxa_ativos_ema": 1.0
886
+ },
887
+ "ssom": {
888
+ "k": 24,
889
+ "qe": 0.824301,
890
+ "te": 0.945312,
891
+ "distorcao": 84.187256,
892
+ "sigma0": 2.0,
893
+ "sigma_f": 0.4,
894
+ "alpha0": 0.5,
895
+ "alpha_ultimo": 0.49505,
896
+ "n_ativos": 24,
897
+ "entropia": 3.178054,
898
+ "rank_efetivo": 24.0,
899
+ "frac_vivas": 1.0,
900
+ "u_matrix_resumo": {
901
+ "u_media": 1.757095,
902
+ "u_max": 8.05575,
903
+ "u_std": 1.751349,
904
+ "fronteiras_picos": 3
905
+ },
906
+ "taxa_ativos_ema": 1.0
907
+ }
908
+ },
909
+ "inferencia_agente": {
910
+ "latencia_s": 0.414,
911
+ "tokens": 24,
912
+ "taxa_repeticao": 0.9167,
913
+ "coerencia_bigramas": 0.0
914
+ },
915
+ "difusao": {
916
+ "modo": "planejado",
917
+ "prompt_enriquecido": "o pantanal ao entardecer, com detalhes nítidos, com composição harmônica, com iluminação suave",
918
+ "latencia_s": 0.0,
919
+ "gerou_pixels": false
920
+ },
921
+ "agente_engenheiro": {
922
+ "revisoes_aprovadas": 0,
923
+ "revisoes_bloqueadas": 0,
924
+ "som_invariante_sem_orfaos": true,
925
+ "som_ativos": {
926
+ "ativos/som": 1.0,
927
+ "k/som": 24,
928
+ "ativos/gg": 1.0,
929
+ "k/gg": 4,
930
+ "ativos/gcs": 1.0,
931
+ "k/gcs": 3,
932
+ "ativos/gsom": 1.0,
933
+ "k/gsom": 4,
934
+ "ativos/hsom": 1.0,
935
+ "k/hsom": 12,
936
+ "ativos/tkm": 1.0,
937
+ "k/tkm": 32,
938
+ "ativos/rsom": 1.0,
939
+ "k/rsom": 32,
940
+ "ativos/cpn": 1.0,
941
+ "k/cpn": 24,
942
+ "ativos/ssom": 1.0,
943
+ "k/ssom": 24,
944
+ "A_global": 1.0
945
+ }
946
+ }
947
+ }
comparacao_treino_v7.json ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "versao_atual": "v7-retreino-observado-ram",
3
+ "versao_anterior": "v6-roteamento-ssom-rpp-metricas",
4
+ "test_khtst_v6": {
5
+ "ok": 48,
6
+ "falhou": 0
7
+ },
8
+ "ram": {
9
+ "amostras": 6059,
10
+ "rss_min_mb": 542.6,
11
+ "rss_med_mb": 2692.2,
12
+ "rss_max_mb": 3579.5,
13
+ "disponivel_min_mb": 138.6,
14
+ "duracao_s": 12836.7
15
+ },
16
+ "perdas_tarefa": {
17
+ "asr": {
18
+ "anterior": 1.890599290529887,
19
+ "atual": 2.1221489111582437
20
+ },
21
+ "imagem_caption": {
22
+ "anterior": 1.6015255053838093,
23
+ "atual": 2.127371827761332
24
+ },
25
+ "instrucao": {
26
+ "anterior": 2.210473636786143,
27
+ "atual": 2.035900592803955
28
+ },
29
+ "lm": {
30
+ "anterior": 2.840959151585897,
31
+ "atual": 2.8384029467900596
32
+ },
33
+ "noticia": {
34
+ "anterior": 2.5332184632619223,
35
+ "atual": 2.5535371700922647
36
+ },
37
+ "ocr": {
38
+ "anterior": 2.109198252360026,
39
+ "atual": 1.418007344007492
40
+ },
41
+ "pontuacao": {
42
+ "anterior": 2.8601644039154053,
43
+ "atual": 2.648297905921936
44
+ },
45
+ "tts": {
46
+ "anterior": 1.7698550621668498,
47
+ "atual": 1.675029953320821
48
+ },
49
+ "vqa": {
50
+ "anterior": 2.4512375791867576,
51
+ "atual": 2.177152613798777
52
+ }
53
+ },
54
+ "som_taxa_ativos": {
55
+ "cpn": {
56
+ "anterior": null,
57
+ "atual": null
58
+ },
59
+ "gcs": {
60
+ "anterior": null,
61
+ "atual": null
62
+ },
63
+ "gg": {
64
+ "anterior": 1.0,
65
+ "atual": 1.0
66
+ },
67
+ "gsom": {
68
+ "anterior": null,
69
+ "atual": null
70
+ },
71
+ "hsom": {
72
+ "anterior": null,
73
+ "atual": null
74
+ },
75
+ "rsom": {
76
+ "anterior": 1.0,
77
+ "atual": 1.0
78
+ },
79
+ "som": {
80
+ "anterior": 1.0,
81
+ "atual": 1.0
82
+ },
83
+ "ssom": {
84
+ "anterior": null,
85
+ "atual": null
86
+ },
87
+ "tkm": {
88
+ "anterior": 1.0,
89
+ "atual": 1.0
90
+ }
91
+ },
92
+ "rpp": {
93
+ "anterior": {
94
+ "rho": 1.0,
95
+ "streak": 0,
96
+ "recompensas": 0,
97
+ "punicoes": 2,
98
+ "penalidades": 99,
99
+ "kappa_rotas_mortas": 0.01
100
+ },
101
+ "atual": {
102
+ "rho": 1.0,
103
+ "streak": 0,
104
+ "recompensas": 0,
105
+ "punicoes": 2,
106
+ "penalidades": 104,
107
+ "kappa_rotas_mortas": 0.01
108
+ }
109
+ },
110
+ "alinhamento": {
111
+ "anterior": {
112
+ "clip_real": 0.1104,
113
+ "clip_controle": 0.1169,
114
+ "ppl_mm": 5.59,
115
+ "ppl_visual": 1.06,
116
+ "itm_acc": 0.5
117
+ },
118
+ "atual": {
119
+ "clip_real": -0.1604,
120
+ "clip_controle": -0.1702,
121
+ "ppl_mm": 9.41,
122
+ "ppl_visual": 1.16,
123
+ "itm_acc": 0.5
124
+ }
125
+ },
126
+ "ppl_lm": {
127
+ "anterior": 17.132190026332925,
128
+ "atual": 17.088452564794597,
129
+ "delta_pct": -0.26
130
+ },
131
+ "perda_media_final": {
132
+ "anterior": 0.78661770003876,
133
+ "atual": 0.8830587758666997
134
+ },
135
+ "passos": {
136
+ "anterior": 3192,
137
+ "atual": 3192
138
+ },
139
+ "nao_regressao": {
140
+ "antes": {
141
+ "ppl_lm": 17.132190026332925,
142
+ "perda_media_final": 0.78661770003876,
143
+ "taxa_ativos_min": 1.0
144
+ },
145
+ "depois": {
146
+ "ppl_lm": 17.088452564794597,
147
+ "perda_media_final": 0.8830587758666997,
148
+ "taxa_ativos_min": 1.0
149
+ },
150
+ "regressoes": {},
151
+ "aprovado": true
152
+ }
153
+ }
comparacao_treino_v8.json ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "versao_atual": "v8-khtst-melhorias-a-j",
3
+ "versao_anterior": "aurora-v7-baseline-publicado",
4
+ "test_khtst_v6": {
5
+ "ok": 48,
6
+ "falhou": 0
7
+ },
8
+ "ram": {
9
+ "amostras": 5919,
10
+ "rss_min_mb": 428.7,
11
+ "rss_med_mb": 2524.4,
12
+ "rss_max_mb": 3358.4,
13
+ "disponivel_min_mb": 435.4,
14
+ "duracao_s": 14340.3
15
+ },
16
+ "perdas_tarefa": {
17
+ "asr": {
18
+ "anterior": 2.1221489111582437,
19
+ "atual": 7.620069583257039
20
+ },
21
+ "imagem_caption": {
22
+ "anterior": 2.127371827761332,
23
+ "atual": 7.004336357116699
24
+ },
25
+ "instrucao": {
26
+ "anterior": 2.035900592803955,
27
+ "atual": 6.964608271916707
28
+ },
29
+ "lm": {
30
+ "anterior": 2.8384029467900596,
31
+ "atual": 7.840750614802043
32
+ },
33
+ "noticia": {
34
+ "anterior": 2.5535371700922647,
35
+ "atual": 7.552767038345337
36
+ },
37
+ "ocr": {
38
+ "anterior": 1.418007344007492,
39
+ "atual": 7.486716111501058
40
+ },
41
+ "pontuacao": {
42
+ "anterior": 2.648297905921936,
43
+ "atual": 7.724856456120809
44
+ },
45
+ "tts": {
46
+ "anterior": 1.675029953320821,
47
+ "atual": 6.79421067237854
48
+ },
49
+ "vqa": {
50
+ "anterior": 2.177152613798777,
51
+ "atual": 7.352211872736613
52
+ }
53
+ },
54
+ "som_taxa_ativos": {
55
+ "cpn": {
56
+ "anterior": null,
57
+ "atual": null
58
+ },
59
+ "gcs": {
60
+ "anterior": null,
61
+ "atual": null
62
+ },
63
+ "gg": {
64
+ "anterior": 1.0,
65
+ "atual": 1.0
66
+ },
67
+ "gsom": {
68
+ "anterior": null,
69
+ "atual": null
70
+ },
71
+ "hsom": {
72
+ "anterior": null,
73
+ "atual": null
74
+ },
75
+ "rsom": {
76
+ "anterior": 1.0,
77
+ "atual": 1.0
78
+ },
79
+ "som": {
80
+ "anterior": 1.0,
81
+ "atual": 1.0
82
+ },
83
+ "ssom": {
84
+ "anterior": null,
85
+ "atual": null
86
+ },
87
+ "tkm": {
88
+ "anterior": 1.0,
89
+ "atual": 1.0
90
+ }
91
+ },
92
+ "rpp": {
93
+ "anterior": {},
94
+ "atual": {
95
+ "rho": 1.0,
96
+ "streak": 0,
97
+ "recompensas": 2,
98
+ "punicoes": 1,
99
+ "penalidades": 90,
100
+ "kappa_rotas_mortas": 0.01
101
+ }
102
+ },
103
+ "alinhamento": {
104
+ "anterior": {
105
+ "clip_real": -0.1604,
106
+ "clip_controle": -0.1702,
107
+ "ppl_mm": 9.41,
108
+ "ppl_visual": 1.16,
109
+ "itm_acc": 0.5
110
+ },
111
+ "atual": {
112
+ "clip_real": -0.0921,
113
+ "clip_controle": -0.0923,
114
+ "ppl_mm": 1072.72,
115
+ "ppl_visual": 1.52,
116
+ "itm_acc": 0.5
117
+ }
118
+ },
119
+ "ppl_lm": {
120
+ "anterior": 17.088452564794597,
121
+ "atual": 2542.1122649587833,
122
+ "delta_pct": 14776.2
123
+ },
124
+ "nao_regressao": {
125
+ "antes": {
126
+ "ppl_lm": 17.088452564794597,
127
+ "taxa_ativos_min": 1.0
128
+ },
129
+ "depois": {
130
+ "ppl_lm": 2542.1122649587833,
131
+ "perda_media_final": 7.231130578782824,
132
+ "taxa_ativos_min": 1.0
133
+ },
134
+ "regressoes": {
135
+ "ppl_lm": {
136
+ "antes": 17.088452564794597,
137
+ "depois": 2542.1122649587833,
138
+ "queda_relativa": 147.762
139
+ }
140
+ },
141
+ "aprovado": false
142
+ }
143
+ }
configs/base.json ADDED
@@ -0,0 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "modelo": {
3
+ "vocab": 16384,
4
+ "d_modelo": 192,
5
+ "n_camadas": 3,
6
+ "n_cabecas": 4,
7
+ "d_ff": 512,
8
+ "comprimento_ctx": 192,
9
+ "janela_sliding": 128,
10
+ "kv_cache_max": 2048,
11
+ "n_experts_fusao": 4,
12
+ "moe": {
13
+ "ativo": true,
14
+ "n_camadas_moe": 2,
15
+ "n_grupos": 3,
16
+ "experts_por_grupo": 2,
17
+ "d_ff_expert": 160,
18
+ "top_k": 2,
19
+ "margem_foco": 1.0,
20
+ "n_tarefas": 9,
21
+ "vetorial": true
22
+ },
23
+ "mtp": {
24
+ "ativo": true,
25
+ "k_cabecas": 2,
26
+ "beta_entropia": 0.05,
27
+ "k_adaptativo": true
28
+ },
29
+ "roteador": {
30
+ "ativo": true,
31
+ "k": 24,
32
+ "lambda_rota": 0.35,
33
+ "gamma_empate": 0.15,
34
+ "conf_min": 0.25,
35
+ "min_amostras": 200
36
+ },
37
+ "microunidades": {
38
+ "d_gru": 96,
39
+ "d_ramo": 96,
40
+ "d_refino": 128,
41
+ "kernel1": 3,
42
+ "kernel2": 5,
43
+ "gamma_rec": 0.5,
44
+ "k_rec_max": 2,
45
+ "eps_stop": 0.01,
46
+ "tau0": 0.8,
47
+ "kappa_conf": 1.0,
48
+ "delta_explora": 0.3
49
+ },
50
+ "atencao_moe": {
51
+ "ativo": true,
52
+ "alpha0": 0.0
53
+ },
54
+ "usar_atencao_arvore": true,
55
+ "moe_enc_dec": {
56
+ "ativo": true,
57
+ "n_encoders": 2,
58
+ "n_decoders": 4,
59
+ "d_ff_expert": 160,
60
+ "top_k": 2,
61
+ "fora_de_ordem": true
62
+ },
63
+ "autoajuste": {
64
+ "ativo": true,
65
+ "janela_lr": 200,
66
+ "lr_passo": 0.5,
67
+ "raio_min": 32,
68
+ "raio_max": 256,
69
+ "alpha_peso_arvore": 0.05,
70
+ "ppl_alvo": 17.0
71
+ }
72
+ },
73
+ "treino": {
74
+ "epocas": 8,
75
+ "lote": 8,
76
+ "lr_max": 0.003,
77
+ "lr_min": 0.0003,
78
+ "warmup": 60,
79
+ "clip_grad": 1.0,
80
+ "janela_estagnacao": 120,
81
+ "checkpoint_a_cada": 150,
82
+ "avaliar_a_cada": 100,
83
+ "qat_ultimos_passos": 80,
84
+ "fase_densa_ate_epoca": 5,
85
+ "pcgrad": true,
86
+ "lambda_moe_lb": 0.01,
87
+ "lambda_moe_ort": 0.01,
88
+ "lambda_mtp": 0.3,
89
+ "lambda_som": 0.05,
90
+ "mistura_tarefas": {
91
+ "instrucao": 0.22,
92
+ "lm": 0.14,
93
+ "noticia": 0.1,
94
+ "pontuacao": 0.1,
95
+ "imagem_caption": 0.1,
96
+ "vqa": 0.1,
97
+ "ocr": 0.07,
98
+ "asr": 0.09,
99
+ "tts": 0.08
100
+ },
101
+ "abmo": {
102
+ "ativo": true,
103
+ "margem": 0.25,
104
+ "cap_min": 0.05,
105
+ "cap_max": 500.0
106
+ },
107
+ "dpo": {
108
+ "ativo": true,
109
+ "passos": 100,
110
+ "beta": 0.1,
111
+ "lr": 5e-05,
112
+ "lr_beta": 0.001,
113
+ "kl_alvo": 0.5,
114
+ "lote": 4,
115
+ "beta_min": 0.05
116
+ },
117
+ "fase_som": {
118
+ "ativo": true,
119
+ "epocas": 2,
120
+ "alvo_ativos": 0.9,
121
+ "gamma_empate": 0.15,
122
+ "lambda_novidade": 0.25,
123
+ "dim_lote": 64
124
+ },
125
+ "prs_v8": {
126
+ "ativo": true,
127
+ "eta_up": 0.05,
128
+ "eta_down": 0.02,
129
+ "T_ciclo": 400,
130
+ "decay_piso": 1.0,
131
+ "percentil": 0.75,
132
+ "janela_clip": 50,
133
+ "coef_streak": 0.3,
134
+ "vel_alvo": 0.01,
135
+ "boost_max": 1.0
136
+ },
137
+ "confianca": {
138
+ "ativo": true,
139
+ "kappa_punicao": 0.3,
140
+ "kappa_premio": 0.1,
141
+ "janela_tau": 50,
142
+ "quantil_tau": 0.25,
143
+ "h_escrita_memoria": 0.25
144
+ },
145
+ "crescimento": {
146
+ "ativo": true,
147
+ "a_cada": 200,
148
+ "tau_expand": 0.1,
149
+ "tau_prune": 0.01,
150
+ "eps_gate": 0.05,
151
+ "janela_uso": 8,
152
+ "n_max_ramos": 5,
153
+ "n_sondas": 2
154
+ },
155
+ "rpp": {
156
+ "ativo": true,
157
+ "rho_max": 0.15,
158
+ "rho_step": 0.05,
159
+ "rho_decaimento": 0.5,
160
+ "janela": 30,
161
+ "kappa_rotas_mortas": 0.01,
162
+ "alvo_ativos": 0.9
163
+ },
164
+ "sgdr_t_mult": 2
165
+ },
166
+ "ciclo": {
167
+ "tau_escalada": 0.35,
168
+ "entropia_limite": 0.85,
169
+ "orcamento_passos": 6,
170
+ "cache_ferramentas_ttl": 600,
171
+ "cache_ferramentas_max": 64
172
+ },
173
+ "memoria_interna": {
174
+ "ativo": true,
175
+ "n_slots": 64,
176
+ "h_escrita": 0.25,
177
+ "idade_compressao_s": 900.0,
178
+ "n_codigos": 64,
179
+ "lambda_utilidade": 0.1,
180
+ "meia_vida_s": 1800.0,
181
+ "replay_a_cada": 40
182
+ },
183
+ "checkpoints": {
184
+ "dir_local": "/home/z/my-project/khtst/estados_local",
185
+ "pasta_publicacao": "estados/fase-v8"
186
+ },
187
+ "som_atencao": {
188
+ "ativo": true,
189
+ "tau": 0.5,
190
+ "gamma_novidade": 0.15
191
+ },
192
+ "difusao": {
193
+ "ativo": true,
194
+ "repo_id": "hf-internal-testing/tiny-stable-diffusion-torch",
195
+ "altura": 128,
196
+ "largura": 128,
197
+ "passos_inferencia": 8,
198
+ "guia_escala": 7.5
199
+ },
200
+ "agente_engenheiro": {
201
+ "ativo": true,
202
+ "intervalo": 50,
203
+ "tolerancia_regressao": 0.05
204
+ },
205
+ "janela_1m": {
206
+ "ativo": true,
207
+ "n_max_tokens": 262144,
208
+ "l_fino": 4096,
209
+ "w_segmento": 256,
210
+ "s_passo": 128,
211
+ "k_recall": 4,
212
+ "viz_r": 2,
213
+ "m_max": 2017
214
+ }
215
+ }
docs/matematica/00-fundamentos-e-notacao.md ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 00 — Fundamentos e Notação (KHTST)
2
+
3
+ > **Regra do projeto (item 7 do escopo):** nenhum script é escrito antes da análise matemática
4
+ > e da demonstração das equações que ele implementará. Este documento fixa a notação comum
5
+ > a todos os demais. Os documentos são independentemente legíveis e cada teorema lista
6
+ > explicitamente as hipóteses usadas.
7
+
8
+ ## 1. Notação
9
+
10
+ | Símbolo | Significado |
11
+ |---|---|
12
+ | $\mathcal{X}$ | espaço de entrada (texto, imagem, áudio, vídeo, tabular, documentos) |
13
+ | $x_t \in \mathcal{X}$ | amostra no instante discreto $t \in \mathbb{N}$ |
14
+ | $W = \{w_1,\dots,w_K\}$, $w_i \in \mathbb{R}^d$ | protótipos/pesos de unidades de um SOM |
15
+ | $c(x) = \arg\min_i \|x - w_i\|$ | unidade vencedora (Best Matching Unit, BMU) |
16
+ | $\alpha(t) \in (0,1)$ | taxa de aprendizado no tempo |
17
+ | $h_{ci}(t)$ | função de vizinhança, $0 \le h_{ci} \le 1$, máx. em $i=c$ |
18
+ | $\sigma(t)$ | raio efetivo da vizinhança gaussiana |
19
+ | $E_q$ | erro de quantização médio: $E_q = \mathbb{E}\,\min_i \|x - w_i\|^2$ |
20
+ | $\theta$ | parâmetros treináveis do modelo neural (transformers etc.) |
21
+ | $Q(\cdot), s$ | quantização W8A8 e fator de escala |
22
+ | $\varphi(\cdot)$ | feature map de atenção linear (kernel trick) |
23
+ | $\mathcal{L}(\theta)$ | perda escalar a minimizar |
24
+
25
+ Convenções: vetores são colunas; $\|\cdot\|$ é a norma euclidiana; $\odot$ produto de Hadamard;
26
+ $\mathbb{E}$ denota esperança empírica sobre o minibatch quando o contexto é amostral.
27
+ Aproximações numéricas usam `float32`; provas são analíticas e independentes da precisão.
28
+
29
+ ## 2. Princípios de projeto derivados da matemática
30
+
31
+ 1. **Estabilidade antes de plasticidade.** Toda atualização de parâmetro tem a forma
32
+ $\theta_{t+1} = \theta_t + \Delta_t$ com $\|\Delta_t\|$ controlado (taxa decrescente ou clip).
33
+ Isso garante que o "punir/retreinar" (doc 09) não desestabiliza o modelo.
34
+ 2. **Convergência tipo Robbins–Monro.** Toda taxa de aprendizado cumpre
35
+ $\sum_t \alpha_t = \infty$ e $\sum_t \alpha_t^2 < \infty$ dentro de cada ciclo de treino
36
+ (ex.: decaimento coseno por reinício, doc 09, Teorema 9.4).
37
+ 3. **Erro limitado por construção.** Quantização (doc 08) e camadas ortogonais (doc 09)
38
+ têm cotas de erro/distorção provadas — o modelo nunca opera com erro não caracterizado.
39
+ 4. **Crescimento só com evidência.** Variantes crescentes de SOM (docs 02–04) inserem
40
+ unidades apenas onde o erro local o justifica; a monotonicidade do refinamento de
41
+ Voronoi (Teorema 2.1 do doc 02) garante que crescer nunca aumenta $E_q$.
42
+ 5. **Memória recursiva estável.** Contextos temporais (doc 05) são médias móveis
43
+ exponenciais com fator $(1-\alpha)\in(0,1)$ — garantia de estabilidade BIBO.
44
+
45
+ ## 3. Teorema 0.1 (contração da atualização de Kohonen)
46
+
47
+ **Hipóteses.** $0 < \alpha(t) \le 1$; $0 \le h_{ci}(t) \le 1$ para todo $c,i$.
48
+
49
+ **Afirmação.** A atualização
50
+ $$w_i(t+1) = w_i(t) + \alpha(t)\,h_{c i}(t)\,\big(x(t) - w_i(t)\big)$$
51
+ é uma contração em relação ao alvo $x$: vale
52
+ $$\|w_i(t+1) - x\| = \big(1 - \alpha(t) h_{ci}(t)\big)\,\|w_i(t) - x\| \;\le\; \|w_i(t) - x\|.$$
53
+
54
+ **Demonstração.** Substituindo,
55
+ $w_i(t+1) - x = w_i(t) - x + \alpha h_{ci}(x - w_i(t)) = \big(1 - \alpha h_{ci}\big)\big(w_i(t)-x\big)$.
56
+ Tomando normas, $\|w_i(t+1)-x\| = |1-\alpha h_{ci}|\,\|w_i(t)-x\|$. Como
57
+ $\alpha h_{ci} \in (0,1]$, tem-se $1-\alpha h_{ci} \in [0,1)$ e o resultado segue. $\blacksquare$
58
+
59
+ **Corolário 0.1.1 (não-explosão).** Se $\|x\| \le M$ (dados normalizados), então
60
+ $\|w_i(t)\| \le \max(M, \|w_i(0)\|)$ para todo $t$ — os pesos nunca divergem, o que
61
+ fundamenta os guard-rails de telemetria (doc 09, §5).
62
+
63
+ ## 4. Teorema 0.2 (desigualdade de Bhattacharyya/erro de partição — usada nos SOMs crescentes)
64
+
65
+ Seja $V(w)$ a célula de Voronoi do protótipo $w$ e $E_q(V,w)=\int_V \|x-w\|^2 p(x)\,dx$.
66
+ Se $V$ é particionada em $V_1\cup V_2$ com novos protótipos $w_1\in V_1$, $w_2\in V_2$, então
67
+ $$E_q(V_1\cup V_2,\; w_1,w_2) \;\le\; E_q(V,\; w)$$
68
+ **Demonstração.** Para cada $x\in V_1$: $\|x-w_1\|^2 \le \|x-w\|^2$? Não em geral ponto a ponto —
69
+ mas o ótimo por região satisfaz $w_1^\star=\mathbb{E}[x\mid x\in V_1]$ (centroide), e o mínimo
70
+ de uma função convexa restrita a um subconjunto não pode ser maior que o mínimo no conjunto
71
+ todo: $E_q(V_1,w_1^\star) \le E_q(V_1, w) \le E_q(V, w)$, pois $w\notin V_1$ é um candidato
72
+ viável (pior) para $V_1$. Somando sobre $V_1, V_2$ obtém-se o resultado. $\blacksquare$
73
+
74
+ **Uso prático:** inserção de unidades em SOMs crescentes (GG/GCS/GSOM) nunca piora o erro
75
+ de quantização *global* quando os novos centros são inicializados perto do pai — é a base
76
+ da prova do doc 02.
77
+
78
+ ## 5. Referências primárias
79
+
80
+ - Kohonen, T. *Self-Organizing Maps*, 3ª ed. Springer (2001) — Teorema 0.1, condições de convergência.
81
+ - Robbins & Monro (1951) — aproximação estocástica.
82
+ - Fritzke, B. (1995; 1994) — Growing Grid, Growing Cell Structures.
83
+ - Alahakoon et al. (2000) — GSOM; Voegtlin (2002) — RSOM; Hecht-Nielsen (1987) — CPN.
84
+ - Roy & Vetterli (2007) — effective rank; Swets/Wu — PSI de população.
85
+ - Vaswani et al. (2017); Katharopoulos et al. (2020) — atenção e atenção linear.
86
+ - Dettmers et al. (2022) — LLM.int8(); W8A8 conforme docs 08.
87
+ - Bengio et al. (2013) — straight-through estimator.
docs/matematica/01-som-kohonen-clasico.md ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 01 — SOM de Kohonen clássico: derivação, convergência e ordenamento
2
+
3
+ **Objetivo do módulo `memoria/som_base.py`.** Minimizar o erro de quantização vetorial
4
+ *topologicamente ordenado*: aproximar $p(x)$ por um conjunto $W=\{w_i\}_{i=1}^K$ de protótipos
5
+ dispostos numa grade cuja vizinhança preserva a topologia dos dados.
6
+
7
+ ## 1. Derivação da função objetivo
8
+
9
+ O SOM minimiza (Erwin–Obermayer–Schulten, 1992)
10
+ $$E(W) \;=\; \sum_{i=1}^{K}\int_{V_i} \sum_{j=1}^{K} h_{ij}\,\|x - w_j\|^2\, p(x)\,dx,$$
11
+ onde $V_i$ é a célula de Voronoi de $w_i$. Fazendo gradiente em $w_j$ e usando
12
+ $\int_{V_i} p(x) dx$ como frequência de ativação $n_i$:
13
+ $$\frac{\partial E}{\partial w_j} \;=\; -2\sum_i h_{ij}\, n_i\,\big(\mathbb{E}[x \mid V_i] - w_j\big),$$
14
+ logo o gradiente descendente estocástico sobre amostras produz exatamente a **regra de Kohonen**:
15
+ $$\boxed{\;w_j(t+1) = w_j(t) + \alpha(t)\, h_{c(t),j}(t)\,\big(x(t) - w_j(t)\big),\qquad
16
+ c(t)=\arg\min_i \|x(t)-w_i(t)\|\;} \tag{1.1}$$
17
+ com vizinhança gaussiana
18
+ $$h_{cj}(t) = \exp\!\Big(-\frac{\|r_c - r_j\|^2}{2\sigma(t)^2}\Big), \qquad \sigma(t)=\sigma_0\Big(\frac{\sigma_f}{\sigma_0}\Big)^{t/T}. \tag{1.2}$$
19
+
20
+ ## 2. Teorema 1.1 (estabilidade com alvos móveis — extensão do Teorema 0.1)
21
+
22
+ **Hipóteses.** $\alpha h_{cj}\in[0,1)$; $\|x(t)\|\le M$.
23
+ **Afirmação.** $\|w_j(t+1)\| \le (1-\alpha h)\,\|w_j(t)\| + \alpha h\, M$, e por indução
24
+ $\limsup_t \|w_j(t)\| \le M$.
25
+ **Demonstração.** Da regra (1.1), $\|w_j(t+1)\| \le (1-\alpha h)\|w_j(t)\| + \alpha h \|x(t)\|
26
+ \le (1-\alpha h)\|w_j(t)\| + \alpha h M$. A recorrência linear com ponto fixo $M$ dá
27
+ $\|w_j(t)\| \le M + (1-\alpha h)^t(\|w_j(0)\|-M) \to M$ quando $\alpha h>0$ com frequência
28
+ positiva. $\blacksquare$
29
+
30
+ ## 3. Teorema 1.2 (convergência — condições de Robbins–Monro)
31
+
32
+ **Hipóteses.**
33
+ (R1) $\alpha(t) = \alpha_0 (t+1)^{-\gamma}$ com $\gamma\in(\tfrac12,1]$;
34
+ (R2) os dados são i.i.d. de $p$ com suporte compacto;
35
+ (R3) $\sigma(t)\to\sigma_f > 0$ (fase de convergência após ordenamento).
36
+
37
+ **Afirmação.** $E\big[\|W(t+1)-W(t)\|^2\big] \to 0$ e $W(t)\to W^\star$ q.s., com $W^\star$
38
+ ponto estacionário de $E(W)$.
39
+
40
+ **Esboço de demonstração** (padrão de Kohonen 2001, cap. 3.5; Erwin et al. 1992).
41
+ Escreva a atualização como processo estocástico aproximator
42
+ $W(t+1)-W(t) = \alpha(t)\big[\,F(W(t)) + G(t)\,\big]$, com
43
+ $F(W) = \mathbb{E}_x\big[h_{c(x),\cdot}\,(x-W_\cdot)\big]$ o campo médio e $G(t)$ ruído centrado
44
+ condicional. As condições (R1) dão $\sum\alpha=\infty$, $\sum\alpha^2<\infty$ — exatamente as
45
+ condições de Robbins–Monro — e então, pela teoria clássica de aproximação estocástica,
46
+ $W(t)$ converge q.s. ao conjunto estacionário de $F$, desde que $G$ tenha momento finito
47
+ (garantido por R2) e $F$ seja Lipschitz (garantido pela suavidade de $h$ gaussiana e
48
+ compacidade do suporte). $\blacksquare$
49
+
50
+ **Consequência de engenharia (implementada em `treinador.py`):** a fase 1 (ordenamento) usa
51
+ $\sigma$ alto e $\alpha$ alto; a fase 2 (convergência) usa $\sigma=\sigma_f$ pequeno e
52
+ $\alpha$ decaindo como $(t+1)^{-\gamma}$ — nunca constante para sempre, evitando oscilação
53
+ estacionária (que a telemetria classificaria como *não-aprendizado*).
54
+
55
+ ## 4. Teorema 1.3 (ordenamento topológico 1-D — prova completa de Erwin et al.)
56
+
57
+ **Hipóteses.** Grade 1-D com $K$ unidades, pesos escalares ordenáveis $w_1<\dots<w_K$,
58
+ $h_{cj}$ decrescente com $|c-j|$.
59
+ **Afirmação.** Sob apresentação repetida de amostras, o vetor de pesos converge para
60
+ ordenação monotônica; qualquer inversão $(w_i>w_{i+1}$ com $\mu_i<\mu_{i+1}$, onde
61
+ $\mu_i=\int_{V_i} x\,p(x)dx$ é o centroide da célula) é corrigida com probabilidade 1.
62
+
63
+ **Demonstração.** Defina a troca de energia esperada por passo para um par invertido.
64
+ Para $K=2$ e vizinhança passo-1, o erro quadrático esperado
65
+ $E(w_1,w_2)=\int_{-\infty}^{m}\!(x-w_1)^2 p dx + \int_m^\infty\!(x-w_2)^2 p dx$ (com $m$ a fronteira
66
+ de Voronoi) tem única bacia de mínimo em $w_1=\mu_1<w_2=\mu_2$; o fluxo do campo médio
67
+ $\dot w = F(w)$ leva monotonicamente à bacia (Erwin et al., 1992, §3, prova para $K=2$).
68
+ Para $K$ geral, usa-se indução: o par invertido de *menor* índice reduz seu erro esperado
69
+ a cada passo pois a atualização puxa $w_c$ para $x$ e $w_{c\pm1}$ na direção de $x$ com peso
70
+ $h>0$, o que diminui a distância entre $\mu$ e $w$ nos pares não-invertidos e corrige a
71
+ inversão mínima; removendo-se o par, repete-se. O processo termina pois $E(W)$ é função de
72
+ Lyapunov estritamente decrescente fora do conjunto estacionário. $\blacksquare$
73
+
74
+ *(No projeto, o ordenamento é verificado empiricamente pela telemetria: correlação de
75
+ Spearman entre posição na grade e 1ª componente principal das amostras, `indicadores.py`.)*
76
+
77
+ ## 5. Métricas derivadas
78
+
79
+ 1. **EQ (erro de quantização):** $\widehat{E_q} = \frac1n\sum_k \min_i\|x_k-w_i\|^2$ — decresce
80
+ monotonicamente por Teorema 0.2 quando unidades crescem.
81
+ 2. **TE (erro topográfico):** fração de amostras cujas 2 BMUs não são vizinhas na grade —
82
+ mede a qualidade do mapeamento.
83
+ 3. **Rank efetivo da matriz $U$ de ativações por unidade** (doc 09, §4) — mede diversidade
84
+ de uso das unidades; rank baixo = unidades mortas (dispara poda/retreino, item 6 do escopo).
docs/matematica/02-growing-grid-e-gcs.md ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 02 — Growing Grid (GG) e Growing Cell Structures (GCS)
2
+
3
+ **Módulos:** `memoria/gg.py`, `memoria/gcs.py`. Ideia de Fritzke (1995, 1994): em vez de
4
+ grade fixa, **inserir/remover unidades** onde o erro acumulado é maior, ajustando $K$ ao dado.
5
+
6
+ ## 1. GG — inserção por linhas/colunas (Fritzke, 1995)
7
+
8
+ Estrutura: grade retangular $L_1\times L_2$. Cada unidade $i$ acumula erro
9
+ $e_i \leftarrow e_i + \|x - w_{c}\|^2$ por amostra (decaimento periódico $e_i \leftarrow (1-\beta)e_i$).
10
+ A cada $\lambda$ amostras, na unidade $q=\arg\max_i e_i$ insere-se uma **linha ou coluna**
11
+ (escolhida pela direção de maior dispersão de $q$ com seus vizinhos), distribui-se o erro de $q$
12
+ entre os novos vizinhos e decai todos os erros.
13
+
14
+ ### Teorema 2.1 (monotonicidade do refinamento — fundamento da inserção)
15
+
16
+ **Hipóteses.** Protótipo novo inicializado na média entre $q$ e seu vizinho mais distante $v$
17
+ (perto da célula de maior erro); população fixa $p$.
18
+ **Afirmação.** $\widehat{E_q}$ após inserção $\le \widehat{E_q}$ antes, para a mesma amostra histórica.
19
+ **Demonstração.** A partição de Voronoi após inserção é um **refinamento** da anterior: cada
20
+ antiga célula é subdividida ou mantida. Para cada amostra $x$ que permanece na célula de $q$
21
+ sem subdivisão, o erro é idêntico. Para $x$ que migra para o novo protótipo $w_{new}$:
22
+ $\|x - w_{new}\| \le \|x - w_q\|$ se, e somente se, $w_{new}$ está mais perto — verdade para a
23
+ sub-região do lado de $w_{new}$ (definição de fronteira de Voronoi). Logo o erro empírico
24
+ ponto a ponto não aumenta em nenhuma amostra, e o ótimo por região (Teorema 0.2) só o reduz.
25
+ Portanto $E_q$ é **monótona não-crescente** sob inserção. $\blacksquare$
26
+
27
+ *(Isso responde diretamente ao item 7 do escopo: "se um problema não tem solução imediata,
28
+ outra equação auxilia" — quando a grade fixa satura em $E_q$, a equação de refinamento
29
+ (Teorema 2.1) abre caminho em vez de estagnar.)*
30
+
31
+ ### Escolha da dimensão a crescer
32
+ Seja $v_1, v_2$ os dois vizinhos de $q$ mais distantes entre si. Cresce-se na direção
33
+ $v_1 \leftrightarrow v_2$ (Fritzke usa $L_1/L_2$ pela razão de distâncias médias):
34
+ direção $d^\star = \arg\max_{d\in\{1,2\}} \frac{\bar d_d(q)}{L_d}$, garantindo grade o mais
35
+ quadrada possível — minimiza $\max_i \|r_i - r_j\|$ médio, i.e. o raio da vizinhança.
36
+
37
+ ## 2. GCS — crescimento simplicial com poda por utilidade (Fritzke, 1994)
38
+
39
+ Topologia: complexo simplicial 2-D (triângulos) ou 3-D (tetraedros); cada nova unidade
40
+ insere-se **no meio da aresta** $(q, f)$ com $f$ = vizinho mais distante de $q$.
41
+
42
+ ### Teorema 2.2 (conectividade preservada após inserção)
43
+
44
+ **Hipóteses.** Rede inicial um triângulo (conectada). Inserção de $w_{new}$ no ponto médio da
45
+ aresta $(q,f)$, conectado a $q$, $f$ e a todos os vizinhos comuns de $q$ e $f$.
46
+ **Afirmação.** A rede permanece conexa e a vizinhança direta refina a anterior.
47
+ **Demonstração.** Remover a aresta $(q,f)$ e reconectar ambos a $w_{new}$ preserva caminhos:
48
+ todo caminho que usava $(q,f)$ usa $(q,w_{new})+(w_{new},f)$. Vizinhos comuns ganham aresta a
49
+ $w_{new}$ sem perder as antigas — o grau só aumenta localmente. Conexidade é invariante. $\blacksquare$
50
+
51
+ ### 2.3 Distribuição de erro e remoção (pruning)
52
+ Inserção: $e_{new} = e_q/2$; $e_q \leftarrow e_q/2$; vizinhos decaem $e_i \leftarrow (1-\beta)e_i$.
53
+ **Utilidade** (Fritzke): $u_i = e_i - e_{i^\dagger}$ não funciona para poda direta; usa-se
54
+ $u_i = \frac{\text{número de usos como 2ª BMU}}{\text{usos como 1ª BMU}}$ ponderado, ou a versão
55
+ clássica: $u_i$ = erro que a rede teria se $w_i$ fosse removido e suas amostras absorvidas pelo
56
+ vizinho mais útil. Remove-se a unidade com menor $u_i$ se $K>K_{max}/2$ e $u_i < u_{max}/k_{prune}$.
57
+
58
+ **Teorema 2.3 (podas não aumentam $E_q$ além de cota local).** Remover $w_i$ realoca seus
59
+ pontos ao vizinho mais próximo $w_j$: $\|x-w_j\| \le \|x-w_i\| + \|w_i - w_j\|$ para esses pontos,
60
+ logo $\Delta E_q \le \int_{V_i}\big(\|x-w_j\|^2-\|x-w_i\|^2\big)p\,dx \le 2\,\|w_i-w_j\|\,\|w_i\|_V + \|w_i-w_j\|^2$,
61
+ com $\|w_i-w_j\|$ pequeno por construção da vizinhança — poda é *segura* quando a unidade é
62
+ redundante ($w_j$ quase coincide com $w_i$), que é exatamente o caso detectado por $u_i$ baixo. $\blacksquare$
63
+
64
+ ## 3. Parâmetros implementados (e sua justificativa matemática)
65
+
66
+ | Parâmetro | Valor padrão | Justificativa |
67
+ |---|---|---|
68
+ | $\lambda$ | 600 | período entre inserções: compromisso entre adaptação e crescimento |
69
+ | $\beta$ | 0.9995 | decaimento do erro acumulado (meia-vida $\approx 1385$ amostras) |
70
+ | $\alpha_{burnin}$ | decaimento (1.1) | convergência Robbins–Monro (Teorema 1.2) |
71
+ | $K_{max}$ | orçamento de RAM | acoplado ao requisito de otimização de memória |
72
+
73
+ ## 4. Critério de parada de crescimento
74
+ Crescer enquanto $\max_i e_i > \tau_{grow}\cdot \overline{E_q}$ e $K<K_{max}$; parar quando a
75
+ inserção marginal reduz $\widehat{E_q}$ menos que $\epsilon_{min}$ (regra do cotovelo
76
+ computável em linha).
docs/matematica/03-gsom.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 03 — GSOM (Growing Self-Organizing Map) com fator de espalhamento
2
+
3
+ **Módulo:** `memoria/gsom.py`. Referência: Alahakoon, Halgamuge & Srinivasan (2000).
4
+ O GSOM introduz um único hiperparâmetro de granularidade, o **Spread Factor** $SF\in(0,1)$,
5
+ que controla o quanto o mapa cresce.
6
+
7
+ ## 1. Gatilho de crescimento (Growth Threshold)
8
+
9
+ Cada unidade acumula erro $e_i$; define-se
10
+ $$\boxed{\;GT = -D\,\ln(SF)\;} \tag{3.1}$$
11
+ com $D$ a dimensionalidade da entrada. Quando $e_c > GT$ na BMU $c$ **e** $c$ é uma unidade
12
+ de fronteira, cresce uma nova unidade na direção livre com
13
+ $w_{new} = w_c + (w_c - w_{vizinho})$ (espelhamento para fora).
14
+
15
+ ### Teorema 3.1 (derivação de $GT$ a partir da distância média entre vizinhos)
16
+
17
+ **Afirmação.** $GT$ equivale à distância quadrática que a rede considera "resolvida".
18
+ **Demonstração.** Sejam $x,x'$ amostras vizinhas em uma mesma região já bem quantizada, com
19
+ distância média intra-região $\delta$. A rede deve crescer somente quando o erro acumulado
20
+ local supera a escala natural dos dados. Sob normalização para $[0,1]^D$, a distância média
21
+ entre pares aleatórios é $\mathbb{E}\|x-x'\|^2 = 2D\cdot\mathrm{Var}$ com $\mathrm{Var}=1/12$
22
+ (uniforme), dando $\mathbb{E}\|x-x'\|^2 = D/6$. O GSOM padroniza o limiar como múltiplo
23
+ negativo-logarítmico do $SF$ para obter monotonicidade estrita e invariância de escala:
24
+ $GT(SF)=-D\ln(SF)$ é **decrescente em $SF$** ($\partial GT/\partial SF = -D/SF < 0$), logo:
25
+ $$SF_1 < SF_2 \;\Rightarrow\; GT_1 > GT_2 \;\Rightarrow\; \text{crescimento mais raro} \;\Rightarrow\; \text{mapa menor.} \tag{3.2}$$
26
+ A forma logarítmica garante que duplicações sucessivas de resolução correspondam a incrementos
27
+ aditivos constantes em $\ln(1/SF)$ — granularidade geométrica, não linear. $\blacksquare$
28
+
29
+ **Corolário 3.1.1 (orçamento de memória).** Como $K(SF)$ cresce aproximadamente como
30
+ $\mathcal{O}\big(SF^{-c}\big)$ para constante $c\in(0,1)$ dependente de $p$, o $SF$ dá controle
31
+ direto e **pré-computável** do uso de RAM — requisito do item 1 do escopo.
32
+
33
+ ## 2. Fases e suavização
34
+
35
+ 1. **Inicialização:** 4 unidades $(0,0),(0,1),(1,0),(1,1)$ em grade mínima.
36
+ 2. **Crescimento:** varre o dataset; unidade de fronteira com $e_i>GT$ gera vizinho.
37
+ 3. **Suavização:** congela o crescimento e roda $\eta_{sm}$ épocas com vizinhança reduzida.
38
+
39
+ **Teorema 3.2 (finitude).** Com $SF>0$ fixo e dados de suporte compacto, o mapa atinge tamanho
40
+ finito quase certamente.
41
+ **Demonstração.** Cada crescimento exige $e_i>GT>0$. Após suficientes apresentações, o erro
42
+ médio por unidade tende ao mínimo local $\bar\epsilon(\sigma_f)$ (Teorema 1.2). Se
43
+ $\bar\epsilon(\sigma_f) \le GT$, apenas um número finito de unidades pode ultrapassar $GT$
44
+ (massa de probabilidade finita acima do limiar); cada unidade nova tem vizinhança própria que
45
+ reduz localmente o erro (Teorema 0.2/2.1), então a probabilidade de novos disparos decresce
46
+ estritamente e a soma de disparos é finita q.s. (argumento de supermartingale em
47
+ $\sum_i \mathbb{P}(e_i>GT \text{ após adaptação})$). $\blacksquare$
48
+
49
+ ## 3. Comparação com GG/GCS (por que os três existem no KHTST)
50
+
51
+ | | GG | GCS | GSOM |
52
+ |---|---|---|---|
53
+ | Topologia | retangular | simplicial | retangular livre |
54
+ | Controle de tamanho | $K_{max}$ | $K_{max}$ + poda | $SF$ contínuo |
55
+ | Crescimento | linhas/colunas | arestas | unidades de fronteira |
56
+ | Indicador de parada | cotovelo de $E_q$ | utilidade baixa | Teorema 3.2 (finitude) |
57
+
58
+ O **orquestrador SOM-of-SOMs** (`memoria/orquestrador.py`) escolhe a variante por perfil:
59
+ dados densos e estáveis → GG; necessidade de detectar redundância → GCS (poda);
60
+ orçamento de RAM apertado e granularidade desejada → GSOM.
docs/matematica/04-hierarchical-som.md ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 04 — Hierarchical SOM (H-SOM): erro decomposto por nível
2
+
3
+ **Módulo:** `memoria/hsom.py`. Ideia: empilhar SOMs em níveis; o nível $1$ quantiza grosso,
4
+ cada unidade $i$ do nível 1 governa um mapa filho $\mathcal{M}_i$ do nível 2 que quantiza o
5
+ resíduo (ou a sub-população) daquela região.
6
+
7
+ ## 1. Decomposição do erro
8
+
9
+ Seja $x$ atribuído ao protótipo $w^{(1)}_i$ no nível 1 e, dentro do mapa filho $\mathcal{M}_i$,
10
+ ao protótipo $w^{(2)}_{ij}$. O erro total de reconstrução de dois níveis é
11
+ $$E^{(2)}(x) = \|x - w^{(1)}_i\|^2 + \|x - w^{(2)}_{ij}\|^2 - 2\,(x-w^{(1)}_i)^\top (x-w^{(2)}_{ij}) \;\le\; 2\big(\|x-w^{(1)}_i\|^2 + \|x-w^{(2)}_{ij}\|^2\big), \tag{4.1}$$
12
+ pela desigualdade $2ab \le a^2+b^2$. A composição hierárquica implementa
13
+ $$w^{(2)}_{ij} \approx w^{(1)}_i + \text{correção local},$$
14
+ e o erro **residual** $\|x - w^{(2)}_{ij}\|$ satisfaz:
15
+
16
+ **Teorema 4.1 (hierarquia reduz o raio efetivo).** Se nível 1 tem $K_1$ unidades cobrindo o
17
+ suporte $\Omega$ com diâmetro $\Delta$, cada célula de Voronoi do nível 1 tem diâmetro
18
+ $\le \Delta/\sqrt{K_1}$ em média (partição uniforme), e o nível 2 opera apenas dentro dessas
19
+ células — a distância que os protótipos filhos precisam alcançar é menor que a global, logo
20
+ com o mesmo orçamento total $K_1 + K_2$ unidades, $E_q$ hierárquico $\le E_q$ de um mapa plano
21
+ com $K_1$ unidades quando as distribuições locais são multimodais.
22
+ **Demonstração (esboço).** Para população local $p_i$ multimodal dentro da célula $V_i$, um
23
+ mapa plano com $K_1$ centros comete erro $\approx$ variância intra-célula total. A hierarquia
24
+ gasta $K_2$ centros para capturar os modos locais; pelo Teorema 0.2 (refinamento), a soma dos
25
+ erros das partições finas é $\le$ erro da partição grossa. Somando sobre $i$: $E^{(2)}\le E^{(1)}$
26
+ quando $K_2$ é alocado às células de maior massa de erro (greedy pelo erro acumulado). $\blacksquare$
27
+
28
+ ## 2. Treinamento em dois estágios (evita beco sem saída — item 7)
29
+
30
+ 1. Estágio A: treinar nível 1 até $\sigma$ pequeno (Teorema 1.2).
31
+ 2. Estágio B: **congelar** nível 1 e treinar cada filho com as amostras que caem na sua célula
32
+ (rotação por unidade — memória amigável: só um filho em RAM por vez).
33
+ 3. Estágio C (opcional): descongelar nível 1 com $\alpha$ pequeno ($10^{-3}$) para ajuste fino.
34
+
35
+ **Teorema 4.2 (estágio B não degrada o nível 1).** Congelar $W^{(1)}$ torna a atribuição de
36
+ célula invariante; o erro total é soma de termos independentes, e minimizar cada termo filho
37
+ minimiza a soma — não há termo cruzado ativo. $\blacksquare$
38
+
39
+ ## 3. Custo computacional
40
+
41
+ Busca BMU hierárquica: $O(K_1) + O(K_2)$ em vez de $O(K_1 K_2)$ de um mapa plano equivalente —
42
+ a busca em dois níveis é um índice (quantização produto por partição), com
43
+ $K_{plano}=K_1\cdot K_2/K_1=K_2$ unidades por célula média; ganho prático de RAM:
44
+ só o filho ativo fica residente.
45
+
46
+ ## 4. Uso no KHTST
47
+
48
+ H-SOM implementa a **memória episódica multinível** do raciocínio cíclico: nível 1 = "tipo de
49
+ situação", nível 2 = "detalhe da situação". O plano do ciclo PDCA consulta o nível 1
50
+ (barato, sempre em RAM) e só carrega o filho relevante sob demanda (item 1: otimização de RAM).
docs/matematica/05-tkm-rsom.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 05 — Variantes temporais: TKM e RSOM (Kohonen com memória)
2
+
3
+ **Módulos:** `memoria/tkm.py`, `memoria/rsom.py`. Referências: Kangas (1990) TKM;
4
+ Voegtlin (2002) RSOM.
5
+
6
+ ## 1. Temporal Kohonen Map (TKM)
7
+
8
+ O TKM define o vencedor não pela amostra corrente, mas pelo **erro acumulado na janela temporal**:
9
+ $$D_i(t) \;=\; \sum_{s=0}^{W-1} \lambda^s\,\|x(t-s) - w_i\|^2, \qquad \lambda\in(0,1), \tag{5.1}$$
10
+ $c(t) = \arg\min_i D_i(t)$; a atualização usa a regra de Kohonen na amostra corrente.
11
+
12
+ **Teorema 5.1 (memória efetiva finita).** A contribuição da amostra $x(t-s)$ em $D_i(t)$ é
13
+ $\lambda^s\|x(t-s)-w_i\|^2$; como $\sum_{s\ge0}\lambda^s = \frac{1}{1-\lambda}$, a soma das
14
+ contribuições além de $S_\epsilon$ é $\frac{\lambda^{S_\epsilon+1}}{1-\lambda}$. Para capturar
15
+ $(1-\epsilon)$ da massa de memória: $S_\epsilon = \frac{\ln(\epsilon(1-\lambda))}{\ln\lambda} - 1$.
16
+ **Demonstração.** Série geométrica direta + desigualdade do resto. $\blacksquare$
17
+ **Uso:** a janela efetiva $S_\epsilon$ é logada pela telemetria; $\lambda$ padrão $=0.5$
18
+ (janela média $=1/(1-\lambda)=2$ amostras; configurável).
19
+
20
+ ## 2. Recurrent SOM (RSOM) — diferenças acumuladas
21
+
22
+ O RSOM acumula o **resíduo** em vez da distância:
23
+ $$\boxed{\;c_i(t) = (1-\alpha)\,c_i(t-1) + \alpha\,\big(x(t) - w_i(t)\big)\;} \tag{5.2}$$
24
+ com vencedor $c(t) = \arg\min_i \|c_i(t)\|$ e atualização de Kohonen aplicada ao longo da
25
+ sequência. Expandindo (5.2):
26
+ $$c_i(t) = \alpha\sum_{s=0}^{t-1}(1-\alpha)^s\,\big(x(t-s)-w_i(t-s)\big) + (1-\alpha)^t c_i(0). \tag{5.3}$$
27
+
28
+ **Teorema 5.2 (c é média móvel exponencial do resíduo).** (5.3) segue por indução:
29
+ $c_i(t+1) = (1-\alpha)\big[\alpha\sum_{s=0}^{t-1}(1-\alpha)^s r_i(t-s)\big] + \alpha r_i(t)
30
+ = \alpha\sum_{s=0}^{t}(1-\alpha)^s r_i(t+1-(s+1))$. $\blacksquare$
31
+
32
+ **Teorema 5.3 (estabilidade BIBO).** Se $\|x-w_i\|\le B$ e $c_i(0)$ finito, então
33
+ $\|c_i(t)\| \le \alpha B \frac{1-(1-\alpha)^t}{\alpha} + (1-\alpha)^t\|c_i(0)\| \le B + o(1)$ —
34
+ o contexto é limitado independentemente do comprimento da sequência.
35
+ **Demonstração.** Norma triangular em (5.3) + soma geométrica. $\blacksquare$
36
+
37
+ **Teorema 5.4 (filtro passa-baixa).** No domínio $z$, (5.2) é
38
+ $C_i(z) = \frac{\alpha}{1-(1-\alpha)z^{-1}} R_i(z)$ — filtro de 1ª ordem com polo em $1-\alpha\in(0,1)$
39
+ (estável, já que o polo está dentro do círculo unitário). Frequência de corte
40
+ $\omega_c \approx \alpha$ rad/amostra: $\alpha$ pequeno ⇒ memória longa e suave. $\blacksquare$
41
+
42
+ ## 3. Diferença prática TKM × RSOM (e por que ambas)
43
+
44
+ | | TKM | RSOM |
45
+ |---|---|---|
46
+ | Acumula | distâncias (escalares positivos) | resíduos vetoriais (cancela componentes) |
47
+ | Vencedor | erro ponderado no tempo | norma do contexto |
48
+ | Detecta | duração de padrões (prolongamento) | **tendência** (direção média do resíduo) |
49
+ | RAM | $O(K)$ | $O(Kd)$ |
50
+
51
+ No orquestrador, TKM roteia tarefas com "eventos longos" (áudio/vídeo) e RSOM tarefas com
52
+ transições de estado (diálogos, raciocínio multi-passo).
53
+
54
+ ## 4. Inicialização e higiene numérica
55
+
56
+ $c_i(0)=0$ (equivale a assumir resíduo nulo — o vencedor inicial coincide com o BMU estático);
57
+ a cota $\|c_i\|\le B$ é checada a cada lote por asserção local (Teorema 5.3) e tratada
58
+ como **bug** (não como dados) — a revisão de contratos antes de cada modificação é
59
+ responsabilidade do **Agente Engenheiro** (ver README).
docs/matematica/06-cpn-ssom.md ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 06 — Counterpropagation Network (CPN) e Supervised SOM (S-SOM)
2
+
3
+ ## 1. CPN (Hecht-Nielsen, 1987)
4
+
5
+ Arquitetura em duas camadas: **Kohonen** (competitiva, WTA) + **Grossberg** (outstar, LMS).
6
+ Dado par $(x, y)$: camada 1 escolhe $c=\arg\min_i\|x-w_i\|$; camada 2 aprende
7
+ $$v_j \leftarrow v_j + \eta_g\,(y - \hat y)_j\,\mathbb{1}[i=c], \qquad \hat y = v_c. \tag{6.1}$$
8
+
9
+ ### Teorema 6.1 (convergência por célula — regressão por partes)
10
+
11
+ **Hipóteses.** $W$ congelado após sua fase (alternância de fases); $\eta_g = \eta_0/t$ com
12
+ $\eta_0>0$; pares i.i.d.
13
+ **Afirmação.** Para cada célula $c$, $v_c(t) \to \bar y_c := \mathbb{E}[y \mid c(x)=c]$
14
+ (média condicional), que é o minimizador de $\mathbb{E}[\|y-v\|^2 \mid c(x)=c]$.
15
+ **Demonstração.** Com $W$ congelado, a atribuição $c(x)$ é uma função determinística de $x$.
16
+ Restringe-se (6.1) às amostras de $c$: $v \leftarrow v + \eta_t (y_t - v)$, que é o SGD de
17
+ $J(v)=\frac12\mathbb{E}[\|y-v\|^2 \mid c]$ com gradiente $\mathbb{E}[v-y\mid c]$. $J$ é
18
+ fortemente convexa com mínimo em $\bar y_c$; por Robbins–Monro ($\sum\eta=\infty$,
19
+ $\sum\eta^2<\infty$), $v\to\bar y_c$ q.s. A saída global é, portanto, a **regressão por
20
+ partes** (piecewise regression) sobre a partição de Voronoi de $W$. $\blacksquare$
21
+
22
+ **Uso no KHTST:** a CPN é o "conector" SOM→saída simbólica: quantiza o estado latente e
23
+ produz, por região, a resposta média — base do **decodificador de roteamento** do orquestrador
24
+ e do preditor de ferramenta no ciclo PDCA.
25
+
26
+ ### 6.2 Duas fases, duas taxas
27
+ Fase 1 (Kohonen): $\alpha_K$ decaindo (Teorema 1.2). Fase 2 (Grossberg): $\eta_g$ decaindo.
28
+ Alternância evita alvo móvel (Teorema 6.1 exige $W$ congelado).
29
+
30
+ ## 2. S-SOM (Supervised SOM)
31
+
32
+ Objetivo: mapa auto-organizável **com rótulos**, misturando quantização e classificação.
33
+ Perda combinada:
34
+ $$J(W, V) = \underbrace{\mathbb{E}\big[\textstyle\sum_j h_{cj}\|x-w_j\|^2\big]}_{\text{quantização (não-supervisionada)}} \;+\; \lambda\, \underbrace{\mathrm{CE}\big(y,\; \mathrm{softmax}(V W_a)\big)}_{\text{supervisão}}, \tag{6.2}$$
35
+ onde $a(x)=\arg\min_i\|x-w_i\|$ e $V W_a$ lê o vetor de pontuação da unidade vencedora.
36
+
37
+ **Teorema 6.2 (equilíbrio ótimo de $\lambda$ por normalização de escala).** Se
38
+ $\|x\|=1$ (entradas normalizadas) e $\|v\|\le v_{max}$, os gradientes dos dois termos são da
39
+ ordem de $\sigma_x$ e $\sigma_{CE}$; escolher $\lambda = \sigma_x/\sigma_{CE}$ iguala as
40
+ magnitudes de gradiente — implementado com $\sigma$ medidos por EMA na telemetria
41
+ (autoajuste com taxa de Robbins–Monro $\beta_t$): $\lambda_{t+1} = \lambda_t(1+\beta_t(\sigma_x/\sigma_{CE} - \lambda_t)/\lambda_t)$.
42
+ **Demonstração.** Gradiente do termo 1 w.r.t. $w_j$: $2h_{cj}(x-w_j)$ com norma esperada
43
+ $\approx 2\sigma_x$ (Teorema 0.1). Gradiente do termo CE via softmax: norma esperada
44
+ $\propto \sigma_{CE}$. Igualar esperanças normaliza as taxas efetivas — condição de
45
+ estabilidade de passo único (Teorema 0.1) para ambos. $\blacksquare$
46
+
47
+ **Teorema 6.3 (rótulos não destroem a topologia).** Para $\lambda \le \lambda_{max}$ finito, o
48
+ termo de quantização domina em coeficiente de Lipschitz nos protótipos na medida em que
49
+ $h$ tem suporte local; a ordenação de Teorema 1.3 sobrevive com distorção limitada por
50
+ $\lambda/\alpha$ (distância máxima que o gradiente CE move um peso por passo).
51
+ **Consequência de engenharia:** limitamos $\lambda\, v_{max} \le 0.1\,\alpha$ na implementação
52
+ (guarda em `ssom.py`), garantindo a cota.
53
+
54
+ ## 3. Papel das duas no pipeline
55
+
56
+ - **CPN** → roteamento estado→ação (qual módulo/ferramenta executa o próximo passo do PDCA).
57
+ - **S-SOM** → classificador de intenção com memória organizada (intenção→rota no arbiter);
58
+ também fornece **confiança** (margem do softmax) usada pelo limiar de escalada a humano (doc 09, §6).
docs/matematica/07-atencao-mista-kvcache.md ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 07 — Atenção: mistura de mecanismos, √d, atenção linear e KV-cache
2
+
3
+ **Módulos:** `percepcao/atencao.py` (MixtureOfAttention), `nucleo/modelo.py` (KV-cache).
4
+ O modelo combina **mais de um mecanismo de atenção** (item 10 do escopo): global (softmax
5
+ completo), janela deslizante (sliding window) e linear (kernel) — com **gating aprendido**.
6
+
7
+ ## 1. Por que escalar por $\sqrt{d_k}$ (prova)
8
+
9
+ **Hipóteses.** Componentes de $q, k$ i.i.d. com média 0, variância 1 (pós-LayerNorm com
10
+ pesos inicializados ortogonalmente).
11
+ **Afirmação.** $\mathrm{Var}(q^\top k) = d_k$, logo $q^\top k/\sqrt{d_k}$ tem variância 1.
12
+ **Demonstração.** $\mathrm{Var}(q^\top k)=\sum_{i=1}^{d_k}\mathrm{Var}(q_i k_i)=\sum_i \mathrm{E}[q_i^2]\mathrm{E}[k_i^2]=d_k$ (independência; média zero elimina o termo cruzado). Sem a
13
+ normalização, as pontuações têm desvio $\sqrt{d_k}$ e o softmax satura (gradientes
14
+ $\approx 0$): a escala evita o beco sem saída do gradiente anulado. $\blacksquare$
15
+
16
+ ## 2. Complexidades e cota da mistura
17
+
18
+ Seja $n$ o comprimento da sequência, $d$ o modelo. Custo FLOPs por cabeça:
19
+ - **Global:** $O(n^2 d_k)$ — toda a matriz $QK^\top$.
20
+ - **Janela** de raio $r$: cada consulta vê $\le 2r+1$ chaves ⇒ $O(n\,(2r{+}1)\,d_k) = O(n r d_k)$.
21
+ - **Linear** com feature map $\varphi:\mathbb{R}^{d_k}\to\mathbb{R}^m$: computa-se
22
+ $\big(\varphi(Q)(\varphi(K)^\top V)\big)$ — **prova de associatividade** que muda a ordem
23
+ das matrizes: $\sum_i \varphi(q)^\top\varphi(k_i) v_i = \varphi(q)^\top\big(\sum_i \varphi(k_i) v_i^\top\big)$;
24
+ logo $O(n\,m\,d_k + n\,m\,d_v)$ — linear em $n$. Usamos $\varphi(x)=\mathrm{elu}(x)+1$
25
+ (não-negatividade necessária para a interpretação probabilística de Katharopoulos et al. 2020).
26
+
27
+ **Teorema 7.1 (custo do gating como mistura convexa).** Se o gate $g$ sobre os $J$ mecanismos
28
+ satisfaz $\sum_j g_j = 1,\ g_j\ge 0$, o custo esperado do MixtureOfAttention é
29
+ $\sum_j g_j C_j$ — limitado pela mistura convexa dos custos; a camada pode reduzir custo
30
+ deslocando massa do mecanismo global ($C=n^2d_k$) para o linear ($C=nm d_k$) sem sair do
31
+ simplex (restrito em `atencao.py` por `softmax` sobre logits do gate).
32
+ **Demonstração.** Linearidade da esperança sobre a execução por cabeça com pesos $g_j$. $\blacksquare$
33
+
34
+ ## 3. KV-cache: decodificação $O(1)$ por token
35
+
36
+ Autoregressão com cache: guardam-se $K, V$ históricos ($n_{kv}\times d_k$ cada). No passo $t$,
37
+ a nova consulta custa $O(t\,d_k)$ leituras+FLOPs (uma linha de $Q$ contra $t$ linhas de $K,V$) —
38
+ por token, custo constante; sem cache seria $O(t^2 d_k)$ reprocessar tudo.
39
+ **Memória:** $2\,n_{kv}\,H\,d_k$ floats — para $n_{kv}=512$, $H=4$, $d_k=48$ (config CPU):
40
+ $2\cdot512\cdot4\cdot48\cdot4\text{B} \approx 786\,\text{kB}$ por requisição. O cache é
41
+ **recortado por janela** (máx. `n_kv`) — coerente com a otimização de RAM do item 1.
42
+
43
+ ## 4. Multi-modal: fusão por cross-attention
44
+
45
+ Embeddings por modalidade $z_m = \mathrm{Enc}_m(x_m)$ (texto, imagem, áudio, vídeo, tabular)
46
+ projetados a $d$ comum; a fusão usa cross-attention
47
+ $$z = \mathrm{MHA}(Q=W_q z_{\text{texto}},\; K=W_k z_{\text{todos}},\; V=W_v z_{\text{todos}}) + z_{\text{texto}} \tag{7.1}$$
48
+ mais **gating por modalidade** $\pi_m = \mathrm{softmax}_m(a_m)$ com $a_m$ aprendido e
49
+ condicionado à presença da modalidade — modalidade ausente recebe gate $0$ (máscara).
50
+ A prova de estabilidade segue do Teorema 1 (norma controlada) + LayerNorm pré-atuação.
docs/matematica/08-quantizacao-w8a8.md ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 08 — Quantização W8A8: cotas de erro e treino consciente de quantização
2
+
3
+ **Módulo:** `quanta/quantizacao.py`. Pesos e ativações em 8 bits (item 9 do escopo),
4
+ com fallback puro-PyTorch quando `bitsandbytes` não dispõe de backend CPU/CUDA.
5
+
6
+ ## 1. Quantização simétrica W8
7
+
8
+ Dado tensor real $X$, com escala por tensor (ou por canal de saída):
9
+ $$s \;=\; \frac{\max|X|}{127}, \qquad Q(X) = \mathrm{clamp}\Big(\mathrm{round}\big(X/s\big),\;-127,\;127\Big), \qquad \tilde X = s\,Q(X). \tag{8.1}$$
10
+
11
+ **Teorema 8.1 (cota suprema do erro).** $\|\tilde X - X\|_\infty \le s/2$.
12
+ **Demonstração.** $\mathrm{round}(u)$ muda $u$ por no máximo $1/2$; o *clamp* só atua fora de
13
+ $[-127,127]$, onde $\mathrm{round}(X/s)=\pm127$ exatamente no limite, mudança $<1/2$ após
14
+ arredondamento; logo $|Q(u)-u|\le 1/2$ e $\|\tilde X - X\|_\infty = s\,\|Q(X/s)-X/s\|_\infty \le s/2$. $\blacksquare$
15
+
16
+ **Teorema 8.2 (erro médio).** Para $X$ com fração de massa uniforme dentro de cada célula de
17
+ arredondamento, $\mathbb{E}|\tilde X - X| \approx s/4$ (esperança de $|U|$, $U\sim U(-s/2,s/2)$).
18
+ **Uso:** a telemetria compara o erro observado com $s/4$; desvios grandes indicam outliers
19
+ densos (dispara escala por canal).
20
+
21
+ ## 2. Matmul inteira (caminho W8A8 real)
22
+
23
+ $\tilde Y = \tilde X \tilde W^\top = s_x s_w\, \big(Q(X)\,Q(W)^\top\big)$. Em hardware com
24
+ int8 GEMM (CUDA/bnb) a soma acumula em int32; em CPU (nossa execução) faz-se o produto em
25
+ `int32` via `torch` (conversão explícita) ou **simulação fake-quant** em fp32 — o erro segue
26
+ a cota do Teorema 8.1 em ambos os casos, pois a simulação aplica as mesmas funções (8.1).
27
+
28
+ ## 3. QAT — straight-through estimator (STE)
29
+
30
+ Na fase de treino quantizado, o passo de quantização tem gradiente nulo quase sempre
31
+ (escadinhas); usa-se STE (Bengio et al., 2013): forward com $\tilde X$, backward com
32
+ identidade.
33
+
34
+ **Teorema 8.3 (STE é subgradiente válido).** A função $q(u)=s\,\mathrm{clamp}(\mathrm{round}(u/s),-127,127)$
35
+ é Lipschitz com constante 1 (composição de 1-Lipschitz: clamp e round são 1-Lipschitz;
36
+ por Rademacher, $q$ é diferenciável a.e. com $|q'|\le 1$; o conjunto de descontinuidades tem
37
+ medida nula). O STE substitui $q'$ por $1$ — um subgradiente admissível no sentido de Clarke,
38
+ e o SGD com subgradientes converge para um mínimo local sob Robbins–Monro (Teorema 1.2). $\blacksquare$
39
+
40
+ ## 4. LLM.int8() (bitsandbytes) — decomposição de outliers
41
+
42
+ Dettmers et al. (2022): separar colunas de ativação com magnitude acima de limiar $\tau$:
43
+ $$X W^\top \;=\; \underbrace{X_{:,O} W_{O,:}^\top}_{\text{fp16, colunas de outliers } O} \;+\; \underbrace{X_{:,I} W_{I,:}^\top}_{\text{int8, } I=O^c}. \tag{8.2}$$
44
+ **Cota de erro:** o erro da parte int8 é limitado por $\tfrac{s_x s_w}{2}\|W_{I,:}\|_1$
45
+ (Teorema 8.1 + subaditividade), e os outliers — únicos responsáveis por explosões de erro —
46
+ ficam exatos em fp16. Implementação: se `bitsandbytes` disponível com backend funcional,
47
+ delega; senão, o mesmo critério ($\tau = 6\,\mathrm{MAD}$) é aplicado manualmente.
48
+
49
+ ## 5. Onde o KHTST aplica
50
+
51
+ 1. **Inferência/avaliação:** pesos do decoder quantizados W8 após o treino (compara-se
52
+ perplexidade fp32 × W8 — relatada na telemetria).
53
+ 2. **Treino (opcional, config):** QAT-STE nas projeções lineares nos últimos passos.
54
+ 3. **bitsandbytes:** integração condicionada a CUDA; no ambiente CPU usa-se o caminho
55
+ simétrico puro-PyTorch com as mesmas cotas (honestidade documentada no README).
56
+
57
+ ## 5. v4 — Escalas por grupo (Teorema 8.4)
58
+
59
+ Divide-se a última dimensão em grupos de tamanho $g$ (64) com escala própria
60
+ $s_g = \max|x|_g/q_{\max}$.
61
+
62
+ **Teorema 8.4 (erro estruturalmente menor).** Com escalas por grupo, o erro
63
+ $\infty$-norma por elemento é $\le s_g/2$ e, para entradas aproximadamente
64
+ uniformes dentro de cada grupo, $\mathbb{E}[\mathrm{erro}^2] \approx s_g^2/12
65
+ \le (s_{\text{tensor}}/g^{1/d})^2/12$ — redução de raiz quadrada em $g$ no caso
66
+ 1D ($\approx\sqrt{g}$× menos erro RMS que a escala por tensor).
67
+
68
+ **Demonstração.** Arredondamento simétrico: $|\mathrm{erro}|\le s/2$ por célula
69
+ (mesmo argumento do Teorema 8.1 restrito ao grupo). Para $x$ uniforme em
70
+ $[-s/2, s/2]$ dentro do grupo, $\mathbb{E}[\mathrm{erro}^2] = s^2/12$; como
71
+ $s_g$ usa o máximo de APENAS $g$ elementos (vs. todo o tensor), $s_g \le
72
+ s_{\text{tensor}}$ com igualdade apenas quando o máximo global está no grupo —
73
+ em média, sobre grupos com distribuição semelhante, a razão dos máximos é
74
+ $O(1/\sqrt{g})$ para subamostragem aleatória, dando o fator $\sqrt{g}$. $\blacksquare$
75
+
76
+ ## 6. v4 — Correção de viés pós-quantização (Teorema 8.5)
77
+
78
+ **Teorema 8.5 (eliminação do desvio de 1ª ordem).** Seja
79
+ $\Delta b = \mathbb{E}_a[a\,W^\top] - \mathbb{E}_a[a_q W_q^\top]$ calibrado em
80
+ um lote representativo. Então $y_{\text{corr}} = y_q + \Delta b$ tem
81
+ $\|\mathbb{E}[y_{\text{fp}} - y_{\text{corr}}]\| \le \|\,\mathrm{Cov}\,\|\cdot
82
+ \varepsilon_2$ — o erro MÉDIO restante é de 2ª ordem (Teorema 8.2: média $s/4$
83
+ por produto interno).
84
+
85
+ **Demonstração.** $y_{\text{fp}} - y_q = a W^\top - a_q W_q^\top = (a-a_q)W^\top
86
+ + a_q (W-W_q)^\top - (a-a_q)(W-W_q)^\top$; tomando esperança, os dois primeiros
87
+ termos são exatamente $\Delta b$ (removido pela correção); resta o produto
88
+ cruzado, quadrático nos erros de quantização — $O(\varepsilon^2)$. $\blacksquare$
89
+
90
+ Implementação: `quantiza_por_grupo` (fallback automático p/ dim < g) e
91
+ `FakeQuantW8A8Grupo.calibrar` → `correcao_vies` (GPTQ-lite).
92
+
93
+ ## §§7–9 (v5) — Quantização REAL sem fakes
94
+
95
+ Refactor v5 (`quanta/quantizacao.py`): `FakeQuantW8A8`, `FakeQuantW8A8Grupo` e
96
+ `aplicar_w8_linear` REMOVIDOS. A inferência NUNCA é simulada — os backends reais:
97
+
98
+ §7.1 torchao `Int8DynamicActivationInt8WeightConfig` — kernels int8 reais (CPU/GPU);
99
+ §7.2 torch.ao.quantization `prepare_qat`→`convert` — Treinamento INT8 UNIVERSAL
100
+ (backend x86/fbgemm/qnnpack; conversão final REAL, fluxo do pedido);
101
+ §7.3 torchao.float8 `convert_to_float8` — treino nativo FP8 (GPU H100+; degrada
102
+ honesta em CPU);
103
+ §7.4 bitsandbytes `load_in_8bit=True` — weight-only 8-bit GPU (integração HF).
104
+
105
+ **Teorema 16.7 (equivalência).** Simulação round→clamp→dequantize e kernel int8
106
+ real implementam o MESMO mapa afim ⇒ erro idêntico; as cotas 8.1–8.5 valem ao
107
+ kernel. A diferença é VELOCIDADE/MEMÓRIA (Teorema 16.8: ≈3,76× com escalas por
108
+ grupo), não erro.
109
+ **§8 métricas honestas:** `metricas_qualidade` (erro relativo, SNR dB, erro máx).
110
+ **§9 diagnóstico:** `modo_quantizacao()` — disponibilidade real por backend.
111
+ Durante o TREINO mantém-se QAT com STE (Teorema 8.3) — classe `QATW8A8`
112
+ (metodologia idêntica ao prepare_qat, escalas por grupo) — mas a conversão de
113
+ exportação é sempre REAL (§7.1/§7.2).
docs/matematica/09-ortogonais-cooperativas-punicao-telemetria-pdca.md ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 09 — Camadas ortogonais e cooperativas; punição/retreino; telemetria; ciclo PDCA
2
+
3
+ ## 1. Camadas ortogonais (Householder)
4
+
5
+ **Módulo:** `percepcao/ortogonais.py`. Uma camada linear com $W$ ortogonal satisfaz
6
+ $W W^\top = I$. Implementação parametrizada por reflexões de Householder
7
+ $$H(v) = I - 2\frac{v v^\top}{\|v\|^2}, \qquad W = \prod_{i=1}^{p} H(v_i), \tag{9.1}$$
8
+ **Teorema 9.1 (ortogonalidade exata por construção).** $H(v)H(v)^\top =
9
+ (I - 2\hat v\hat v^\top)(I - 2\hat v\hat v^\top) = I - 4\hat v\hat v^\top + 4\hat v(\hat v^\top\hat v)\hat v^\top = I$,
10
+ pois $\hat v^\top \hat v = 1$. Produto de ortogonais é ortogonal. $\blacksquare$
11
+ **Custo:** $p$ reflexões custam $O(p d^2)$ no geral, mas como produto vetor-matriz
12
+ sucessivo: $O(p\,d^2)$ → com $p=d$ (casa completa) $O(d^3)$ é caro; usamos $p\in\{1,2\}$
13
+ (ortogonalidade parcial suficiente) ou projeção QR periódica da base de pesos (cada
14
+ $N$ passos, custo $O(d^2)$ amortizado).
15
+
16
+ **Teorema 9.2 (gradiente estável).** Se $W$ ortogonal, $\|Wx\|_2=\|x\|_2$ e o número de
17
+ condição $\kappa(W)=1$; o gradiente que retropropaga por $W$ tem norma preservada:
18
+ $\|W^\top g\|=\|g\|$ — elimina explosão/vanishing associados a $\sigma_{min}\ll\sigma_{max}$.
19
+ **Uso:** nas camadas de **fusão multimodal**, onde escalas de modalidades diferentes
20
+ amenizariam o gradiente.
21
+
22
+ ## 2. Camadas cooperativas (mistura de expertos com balanceamento)
23
+
24
+ $N$ expertos $\{E_i\}$ com gate $g=\mathrm{softmax}(a)$; saída $y=\sum_i g_i E_i(x)$.
25
+ Perda de balanceamento (Switch Transformer):
26
+ $$L_{bal} = N \sum_{i=1}^{N} f_i \cdot P_i, \qquad f_i=\tfrac{1}{B}\#\{x: i = \arg\max g(x)\},\; P_i = \overline{g_i}. \tag{9.2}$$
27
+ **Teorema 9.3 (mínimo uniforme).** $L_{bal} \ge N\cdot\frac1N\cdot\frac1N = \frac1N$ com
28
+ igualdade sse $f_i=P_i=1/N$ (por desigualdade da média aritmética nas somas $\sum f_i=\sum P_i=1$).
29
+ Logo minimizar $L_{bal}$ força cooperação (uso equilibrado) em vez de colapso a um expert. $\blacksquare$
30
+ **Cooperação ativa:** 2 expertos sempre ativos por token (top-2), exigindo divisão de trabalho
31
+ — combinada com $L_{bal}$, evita a solução degenerada "um expert faz tudo".
32
+
33
+ ## 3. Punição e retreino (item 6): detectar não-aprendizado e reagir
34
+
35
+ **Detector de estagnação:** janela deslizante de $W_s$ passos sobre a perda de validação
36
+ $\ell_t$; estagnado se
37
+ $$\frac{\min_{t-W_s<t'\le t} \ell_{t'} - \min_{t-2W_s<t'\le t-W_s} \ell_{t'}}{\min_{t-2W_s<t'\le t-W_s}\ell_{t'} } < \epsilon \quad \text{ou} \quad \mathrm{EMA}_t(\ell) \text{ crescente por } k \text{ janelas}. \tag{9.3}$$
38
+ **Políticas de retreino (em ordem de agressividade):**
39
+ 1. **Warm restart (SGDR, Loshchilov & Hutter 2017):** $\alpha_t = \alpha_{min}+\frac12(\alpha_{max}-\alpha_{min})\big(1+\cos(\pi T_{cur}/T_i)\big)$ — reinício curto do coseno.
40
+ *Fundamento:* reinícios re-amostram bacias (multistart estocástico); com Robbins–Monro
41
+ dentro de cada ciclo, convergência preservada (Teorema 1.2 aplicado por ciclo).
42
+ 2. **Reinit parcial guiado:** reinicializar a camada com **menor contribuição**
43
+ $c_l = \mathbb{E}\|g_l\| \cdot \|W_l\|$ (camada "dorminhoca") — fundamento: ablação de
44
+ menor gradiente perturba menos a perda (Teorema 9.2 garante que ortogonais re-init
45
+ preservam escala de ativações).
46
+ 3. **Replay:** re-amostrar do buffer de históricos (cache) com 20% de mistura — corrige
47
+ esquecimento catastrófico local (distribuição deslocada).
48
+ **Teorema 9.4 (convergência sob punição).** Se cada política reinicia um ciclo que cumpre
49
+ Robbins–Monro (R1) e o número de punições é finito q.s. (estagnação tem probabilidade que
50
+ decai com adaptação), a sequência global ainda cumpre $\sum\alpha=\infty,\sum\alpha^2<\infty$
51
+ — punição não quebra a convergência. $\blacksquare$
52
+
53
+ ## 4. Telemetria matemática (item 5)
54
+
55
+ 1. **Rank efetivo** (Roy & Vetterli 2007) da matriz de ativações $A$:
56
+ $r_{eff} = \exp\big(H(\bar\lambda)\big)$ com $H$ a entropia da distribuição
57
+ $\bar\lambda_i = \sigma_i^2/\sum_j\sigma_j^2$ dos autovalores normalizados.
58
+ *Interpretação:* número efetivo de direções usadas; $r_{eff}$ caindo = colapso
59
+ representacional (dispara punição tipo 2).
60
+ 2. **Delta de parâmetros:** $d_t = \|\theta_t-\theta_{t-1}\|_2 / (\|\theta_{t-1}\|_2+\varepsilon)$
61
+ — evolução completa de todos os parâmetros por passo (EMA + percentis; por camada).
62
+ 3. **PSI (Population Stability Index)** para drift de distribuição de ativações:
63
+ $\mathrm{PSI} = \sum_b (p_b - q_b)\ln(p_b/q_b)$ sobre histogramas de 10 faixas;
64
+ $\mathrm{PSI}>0.25$ = deslocamento grave.
65
+ 4. **EQ/TE dos SOMs** (doc 01 §5) — evolução da memória auto-organizável.
66
+ 5. **Saúde do treino:** combinador booleano ponderado (estagnação, gradiente fora de
67
+ $[10^{-7},10^{2}]$, NaN/Inf, PSI, rank efetivo) → classificação de **bug** × **ruído**
68
+ (doc qualidade).
69
+
70
+ ## 5. Contratos de qualidade — responsabilidade do Agente Engenheiro
71
+
72
+ **Regras de classificação (revisadas pelo Agente Engenheiro antes de cada modificação,
73
+ com garantia de monotonia de capacidade — nenhuma alteração pode remover uma
74
+ funcionalidade existente):**
75
+ - **Bug (invariante violado):** formas incompatíveis, NaN/Inf, norma de gradiente explosiva,
76
+ $\mathrm{rank}_{eff}$ colapsando, contexto RSOM acima da cota do Teorema 5.3, erro de
77
+ quantização acima de $s/2$ (violaria o Teorema 8.1 — impossível em código correto).
78
+ - **Erro de digitação que causa falha de lógica:** identificador definido mas nunca usado /
79
+ usado uma única vez em comparação com igualdade sempre-falsa, string de configuração
80
+ desconhecida ("cuda"×"cpu"), constantes duplicadas divergentes — heurísticas estáticas
81
+ (AST) + dinâmicas (asserts de sanidade) — reportadas **separadas** dos bugs.
82
+ - **Ruído (não é bug):** perda com alta variância mas mediana estável; gradiente esparso
83
+ em minibatches pequenos.
84
+
85
+ ## 6. Ciclo de raciocínio cíclico PDCA (item 3) — limiar de escalada humana
86
+
87
+ Estados: **Planejar** → **Distribuir** → **Executar** → **Feedback** → (redistribuir | planejar | entregar).
88
+ A decisão de entregar vs. redistribuir é um **teste de razão de verossimilhança** sobre a
89
+ confiança $p$ do passo (probabilidade posterior de estar correto, estimada por S-SOM+entropia):
90
+ escalada ao humano se $p < \tau$, com
91
+ $$\tau^\star = \frac{C_{falso\,positivo}}{C_{falso\,positivo} + C_{falso\,negativo}} \tag{9.4}$$
92
+ **Teorema 9.5 (limiar bayesiano ótimo).** Minimizar o custo esperado $\mathbb{E}[C] =
93
+ p\,C_{FN}(1-a) + (1-p)C_{FP}a$ sobre a ação binária $a\in\{\text{entregar}=1,\text{escalar}=0\}$
94
+ dá $a=1$ sse $p > C_{FP}/(C_{FP}+C_{FN}) = \tau^\star$.
95
+ **Demonstração.** $a=1$ custa $(1-p)C_{FP}$; $a=0$ custa $p C_{FN}$; comparar. $\blacksquare$
96
+ Redistribuição interna (novos módulos/ferramentas) ocorre quando $p\ge\tau^\star$ mas a
97
+ incerteza $H(\pi)$ do gate é alta — custo esperado da tentativa adicional é limitado por
98
+ orçamento $B$ de passos (busca best-first com orçamento).
docs/matematica/10-moe-foco-denso-som-v2.md ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 10 — MoE Agrupável com Foco na Tarefa e o Pipeline Denso→SOM (KHTST v2)
2
+
3
+ Este documento fundamenta matematicamente as inovações da v2 antes da implementação:
4
+ (a) MoE **agrupável** com otimização por foco na tarefa — dar ênfase ao que é importante
5
+ e ignorar, por compactação e indexação, o que é irrelevante; (b) o pipeline em duas
6
+ fases **denso→SOM** — a rede aprimorada treina todos os parâmetros com o máximo de
7
+ conexões e só depois os estados ocultos são organizados pelo mapa de Kohonen com o
8
+ máximo de neurônios ativos; (c) predição multi-token (MTP) com pesos α aprendíveis;
9
+ (d) DPO com β adaptativo; (e) cirurgia de gradiente (PCGrad); (f) barreira analítica
10
+ de taxa de aprendizado (ABMO); (g) SmoothQuant com α aprendível; (h) punição dinâmica
11
+ de repetição. Reaproveitamos e corrigimos defeitos identificados no estudo do código
12
+ BiGRU_T_version, CNN-BiGRU e HAKO-v1/v3 do autor.
13
+
14
+ ## 0. Notação adicional (sobre o doc 00)
15
+
16
+ - Especialistas: E = {e_1, …, e_N}, N = G·E_g, com grupos g(e) ∈ {1..G}. Grupos na v2:
17
+ **texto** (lm, noticia, pontuacao, instrucao, tts), **visual** (vqa, ocr,
18
+ imagem_caption), **áudio** (asr com características reais).
19
+ - Expert e é um MLP SwiGLU f_e: R^d → R^d com âncora (protótipo) μ_e ∈ R^d.
20
+ - Compactação de contexto: x̄(X) = (1/T)Σ_t x_t — o resumo do lote de tokens.
21
+ - Índice de roteamento: I = {μ_e, vieses de grupo, uso EMA} — O(N·d) escalares,
22
+ independente do tamanho de cada expert (é por isso que "ignorar" é barato: o
23
+ expert não selecionado nem é computado, e sua identidade é só uma linha no índice).
24
+ - Tarefa τ ∈ T = {lm, noticia, pontuacao, instrucao, tts, vqa, ocr, imagem_caption, asr}.
25
+
26
+ ## 1. MoE agrupável com foco na tarefa
27
+
28
+ ### 1.1 Definição (gate duplo: afinidade + viés de tarefa)
29
+
30
+ Dado o lote de estados ocultos X ∈ R^{B×T×d}, o score do expert e para a amostra b é
31
+
32
+ s_{b,e} = ⟨x̄_b, μ_e⟩ / √d + b_{g(e), τ} (10.1)
33
+
34
+ onde b ∈ R^{G×|T|} é uma tabela aprendida de viés de tarefa. O gate por amostra é
35
+
36
+ g_{b,e} = softmax_top-k( s_{b,·} )_e (fase foco), g = softmax(s) (fase densa) (10.2)
37
+
38
+ e a saída é y_b = Σ_e g_{b,e} f_e(x_b). Na **fase densa** (item d — máximo de
39
+ conexões) todos os experts participam com peso softmax completo: cada parâmetro
40
+ recebe gradiente. Na **fase foco** apenas os k = 2 melhores por amostra são
41
+ computados; experts fora do top-k e fora do grupo da tarefa corrente **não são
42
+ sequer calculados** (ignorar por indexação, Proposição 10.4).
43
+
44
+ ### 1.2 Teorema 10.1 (não-interferência do viés de tarefa no top-k)
45
+
46
+ Sejam s_(1) ≥ … ≥ s_(N) os scores ordenados de uma amostra e δ = s_(k) − s_(k+1)
47
+ a lacuna de Voronoi na fronteira do top-k. Se |b_{g,τ}|_∞ ≤ δ/2 para todos os
48
+ grupos g e a tarefa τ, então o conjunto top-k com viés é igual ao conjunto sem viés.
49
+
50
+ **Prova.** Para qualquer par e_i ∈ top-k, e_j ∉ top-k temos s_i + b_i ≥ s_(k) − δ/2
51
+ e s_j + b_j ≤ s_(k+1) + δ/2 = s_(k) − δ/2. Logo s_i + b_i ≥ s_j + b_j, com desempate
52
+ impossível pois a desigualdade é estrita quando |b|_∞ < δ/2. A ordem relativa dentro
53
+ do top-k pode mudar (afetando apenas os pesos g, que são contínuos em s + b), mas o
54
+ **conjunto** selecionado não muda. ∎
55
+
56
+ Corolário (garantia de foco): ampliar o viés do grupo da tarefa além de δ/2 pode
57
+ trocar especialistas, mas o dano máximo de QE de roteamento é limitado — o análogo
58
+ do Teorema de punição restrita a empates do HAKO-v3 (QE excesso ≤ √(1+γ) − 1):
59
+ aqui, se ‖b‖_∞ ≤ γ·d_min/2 com d_min a menor lacuna entre scores consecutivos
60
+ distintos, a perda relativa de afinidade é ≤ γ.
61
+
62
+ ### 1.3 Teorema 10.2 (equilíbrio de carga agrupado)
63
+
64
+ Com a perda de balanceamento estilo Switch (Fedus et al. 2022) aplicada por grupo,
65
+
66
+ L_lb = (1/G) Σ_g G_g · Σ_{e∈g} f_e · p_e, f_e = fração de amostras roteadas a e,
67
+ p_e = fração média do gate, (10.3)
68
+
69
+ o mínimo L_lb = 1 (com N_g = E_g experts por grupo e roteamento uniforme). Sob
70
+ descida de gradiente com passo somável, f e p convergem ao produto uniforme dentro
71
+ de cada grupo. **Prova.** f_e, p_e ≥ 0 com Σ_{e∈g} f_e = 1, Σ_{e∈g} p_e = 1 (softmax);
72
+ pela desigualdade de Cauchy–Schwarz, Σ f_e p_e ≥ (Σ√(f_e p_e))²/N_g ≥ 1/N_g, com
73
+ igualdade sse f_e = p_e = 1/N_g. O gradiente de L_lb em relação aos scores empurra
74
+ p para 1/N_g (cálculo padrão do Switch), e o roteamento segue p. ∎
75
+
76
+ ### 1.4 Teorema 10.3 (ortogonalidade intra-grupo reduz redundância)
77
+
78
+ Com φ_e = média das ativações do expert e no lote normalizada (φ̂_e = φ_e/‖φ_e‖),
79
+ a penalidade L_ort = Σ_{g} Σ_{p<q ∈ g} (φ̂_p·φ̂_q)² tem mínimo global 0 alcançado
80
+ sse o conjunto {φ̂_e}_{e∈g} é ortogonal em pares; L_ort é diferenciável e
81
+ descida de gradiente com passo somável a converge a qualquer mínimo local com
82
+ L_ort ≤ L_ort(0)·e^{−ct}. **Prova.** Cada termo é um quadrado não-negativo; soma
83
+ zero sse todos os produtos internos são zero. Para a taxa: L_ort é C¹ com
84
+ gradiente localmente Lipschitz em domínios compactos de φ̂ (norma 1), logo a
85
+ desigualdade de descida padrão dá L_{t+1} ≤ L_t − c‖∇L_t‖²; somando e usando
86
+ a continuidade do gradiente segue a taxa exponencial assintótica. ∎
87
+
88
+ Efeito prático: especialistas do **mesmo grupo** são empurrados a respostas
89
+ complementares (especialização), não cópias — este é o mecanismo de agrupamento
90
+ flexível: grupos definem O QUE deve ser diferente; o gate define QUANDO cada grupo
91
+ é relevante.
92
+
93
+ ### 1.5 Proposição 10.4 (economia de computação por foco)
94
+
95
+ Na fase foco com top-k e máscara de grupo da tarefa τ (experts fora de g(τ) só são
96
+ elegíveis se sua afinidade ⟨x̄, μ_e⟩ exceder o melhor score do grupo de τ menos
97
+ margem m), o custo médio por token é C = (k/N)·C_full + O(N·d) para o índice.
98
+ **Prova.** São computados no máximo k + |elegíveis extras| experts por amostra;
99
+ o índice é um produto interno x̄·μ_e por expert (O(N·d) por amostra, N·d ≪ d_ff·d
100
+ por expert). Com k=2, N=6: C/C_full = 1/3 por amostra. ∎
101
+
102
+ ### 1.6 Roteamento por âncora como compactação
103
+
104
+ O par (μ_e, b_{g,τ}) é um **índice de 2·d + G·|T| escalares por expert**. A
105
+ "irrelevância" é representada por: (i) baixa afinidade de âncora (o expert não é
106
+ escolhido), (ii) viés negativo do grupo (o grupo é de baixa prioridade para a
107
+ tarefa), (iii) uso EMA baixo (candidato a dormir/podar — telemetria). Nenhum peso
108
+ de expert é tocado ao ignorar: a compactação é só do índice.
109
+
110
+ ## 2. Pipeline denso→SOM (item d do escopo v2)
111
+
112
+ ### 2.1 Fase densa (rede aprimorada, máximo de conexões)
113
+
114
+ Na fase densa: (i) o gate MoE é softmax sobre TODOS os experts (nenhuma conexão
115
+ cortada); (ii) as cabeças MTP participam; (iii) o alinhamento SOM usa alvo
116
+ stop-grad. Todos os parâmetros recebem gradiente a cada passo — análogo ao
117
+ "máximo de conexões" dos neurônios humanos: nunca saberemos a priori quais
118
+ conexões serão úteis, então todas são cultivadas primeiro.
119
+
120
+ ### 2.2 Teorema 10.5 (não-regressão da consolidação SOM)
121
+
122
+ Seja L(θ) a perda LM e A(θ, S) a perda de alinhamento com alvo stop-grad (mapa
123
+ SOM congelado no passo). Treinar L_total = L + λ·A com λ ≤ 1 e passo Robbins–Monro
124
+ (Σ α_t = ∞, Σ α_t² < ∞) garante: liminf_t L(θ_t) ≤ liminf_t L(θ_t^{CE}) + λ·B_A,
125
+ onde B_A é o mínimo de A sobre a trajetória e θ_t^{CE} é a trajetória só-CE.
126
+
127
+ **Prova.** A perda total é soma de L com um termo limitado por A ≤ B_A (stop-grad
128
+ torna A uma função quadrática em θ com mínimo ≥ 0 na bola do alvo). Pela condição
129
+ de Robbins–Monro, o método de descida estocástica em L_total converge ao conjunto
130
+ estacionário de L + λA; para qualquer ponto do conjunto, L(θ) ≤ min-est(L_CE) +
131
+ λ·B_A pela desigualdade triangular da variação total (mesma estrutura da prova do
132
+ Teorema 9.5 do doc 09). ∎
133
+
134
+ Consequência: a fase SOM **não destrói** o que a fase densa aprendeu, e o
135
+ alinhamento (proj = alvo do SOM) fornece gradiente de alinhamento sem retropropagar
136
+ no mapa (o mapa evolui pela sua própria regra de Kohonen — separação limpa de
137
+ responsabilidades).
138
+
139
+ ### 2.3 Fase SOM com máximo de neurônios ativos
140
+
141
+ Três mecanismos (corrigindo o que o estudo do HAKO v3 mostrou ser seguro):
142
+
143
+ **(a) Penalidade de novidade restrita a empates** (HAKO-v3, adaptada): o vencedor
144
+ é escolhido dentro do conjunto quase-empatado C(x) = {j : d²_j(x) ≤ d*_²(x)(1+γ)},
145
+ γ = 0.15, por argmin_j d²_j(x) + λ(t)·u_j·log(1+h_j), onde h_j é o EMA de acertos
146
+ (β=0.92) e u_j o EMA da escala de erro.
147
+
148
+ **Proposição 10.6 (cota de QE com novidade restrita).** O excesso de erro de
149
+ quantização do vencedor penalizado sobre o BMU clássico é ≤ √(1+γ) − 1 ≈ 7,2%.
150
+
151
+ **Prova.** Por construção d²_w(x) ≤ d*_²(x)(1+γ) para w ∈ C(x); raiz quadrada em
152
+ ambos os lados dá d_w ≤ d*·√(1+γ). ∎
153
+
154
+ **(b) Reseeding de neurônios mortos**: neurônios com acertos EMA h_j < ε_h por uma
155
+ janela W de amostras são reinicializados para amostras reais do lote (nascimento
156
+ por dados).
157
+
158
+ **Teorema 10.7 (taxa de ativação máxima).** Se em cada janela W o lote contém
159
+ pelo menos m amostras distintas e o processo de reseeding reinicializa no máximo
160
+ R neurônios por janela com R·σ_0 ≥ diâmetro do suporte dos dados, então a taxa de
161
+ neurônios ativos (h_j ≥ ε_h) converge para ≥ 1 − δ, com δ = ε_observado dependente
162
+ da cobertura — em particular, taxa → 1 sob cobertura total do suporte.
163
+ **Prova (esboço).** Um neurônio só permanece morto se nenhum dado tem BMU nele;
164
+ reseeding o posiciona exatamente sobre uma amostra real, tornando-o BMU dessa
165
+ amostra (distância 0) com h_j ≥ 1/W > ε_h na janela seguinte. Por indução nas
166
+ janelas, o número de mortos decresce a não ser que a cobertura de dados seja
167
+ menor que K — caso em que δ é a fração de células não-visitadas, limite
168
+ informacional e não algorítmico. ∎
169
+
170
+ **(c) Orçamento de crescimento** (GSOM/GCS): o alvo de "máximo de neurônios
171
+ ativos" cap o crescimento quando taxa_ativos ≥ alvo (0.90) OU orçamento
172
+ esgotado — crescimento além disso degrada QE por fragmentação.
173
+
174
+ ### 2.4 Métrica da fase
175
+
176
+ taxa_ativos = |{j : h_j ≥ ε_h}| / K por variante; EQ, TE, rank efetivo do uso
177
+ (doc 01 §5). Telemetria: `som/taxa_ativos_{nome}`.
178
+
179
+ ## 3. Predição multi-token (MTP) com α aprendíveis
180
+
181
+ Cabeças K=2: h^{(m)}_t = SiLU(W_m h_t), logits^{(m)} = E·h^{(m)}_t (com E = tabela
182
+ de embeddings empatada — sem parâmetros de vocabulário extra, corrigindo o custo
183
+ K·V·d = 65M do Medusa do CNN-BiGRU). Perda com deslocamento m:
184
+
185
+ L_m = CE(logits^{(m)}_{0:T−m}, alvo_{m:T}), L_MTP = Σ_m α_m L_m − β_ent·H(α) (10.4)
186
+
187
+ **Teorema 10.8 (anti-colapso dos α).** O minimizador de Σ α_m L_m − β H(α) sobre
188
+ o simplex é α*_m ∝ exp(−L_m/β); com β → 0+, colapso winner-takes-all; com β > 0,
189
+ α*_m/α*_n ≥ exp(−(L_m − L_n)/β) — a razão entre pesos é limitada, impedindo que
190
+ uma única cabeça absorva todo o gradiente. **Prova.** Lagrangiano do simplex;
191
+ condição de KKT dá log α_m = −L_m/β + const. A desigualdade segue por divisão. ∎
192
+
193
+ ## 4. DPO com β adaptativo (corrigindo o sinal da dualidade)
194
+
195
+ Dado o par (escolhido = saída dourada, rejeitado = corrupção por aumento — dropout/
196
+ embaralhamento de tokens do doc de estudo), com logps de sequência na região de
197
+ resposta:
198
+
199
+ L_DPO = −log σ( β·[(π_c − ref_c) − (π_r − ref_r)] ) (10.5)
200
+ β_{t+1} = β_t · exp( −η_β·(KL̄_t − K_alvo) ) (10.6)
201
+
202
+ **Proposição 10.9 (ponto fixo da dualidade).** O passo (10.6) é um gradiente em
203
+ log β do lagrangiano KL̄(β) com multiplicador; seu ponto fixo satisfaz KL̄ = K_alvo;
204
+ com η_β pequeno, |KL̄_t − K_alvo| é limitado por O(η_β + 1/β_t·ΔKL). (Esta é a
205
+ correção do sinal documentado no estudo: β deve DIMINUIR quando KL excede o alvo,
206
+ soltando a âncora de referência.) ∎
207
+
208
+ ## 5. Cirurgia de gradiente (PCGrad de duas perdas)
209
+
210
+ Dado g₁ = ∇L_ce e g₂ = ∇L_aux: se ⟨g₁, g₂⟩ < 0, substitua g₂ por
211
+ g₂ − (⟨g₁,g₂⟩/‖g₁‖²)·g₁ (projeção no complemento ortogonal de g₁), com guarda
212
+ ‖g₁‖² > ε.
213
+
214
+ **Proposição 10.10.** Após a projeção, ⟨g₁, g₂'⟩ = 0, logo o passo combinado
215
+ g₁ + g₂' não aumenta L_ce em primeira ordem (a componente de g₂ contra o
216
+ gradiente principal foi removida). ∎
217
+
218
+ Implementação: dois `torch.autograd.grad` com `retain_graph=True` na primeira
219
+ chamada (as perdas compartilham o grafo do único forward) — contratado como no
220
+ estudo do BiGRU_T, mas com `set_to_none` e atribuição por parâmetro.
221
+
222
+ ## 6. Barreira analítica de LR (ABMO — "a rede propõe, a analítica corta")
223
+
224
+ Proxy de curvatura por inflação de perda (adimensional):
225
+ L̂_t = clip(0.9·L̂_{t−1} + 0.1·(|L_t|/L_ref), 0.05, 500), L_ref fixado no 1º passo.
226
+
227
+ **Teorema 10.11 (garantia de descida).** Se L é L-suave, o passo de gradiente com
228
+ η_eff ≤ (2 − m)/L̂ tem redução garantida L(θ_{t+1}) ≤ L(θ_t) − η_eff(1 − L̂η_eff/2)‖∇L‖²
229
+ para qualquer L̂ ≥ L real. Com m = 0.25, η_eff = min(lr, 1.75/L̂). **Prova.** Desigualdade
230
+ de descida padrão para funções L-suaves com passo η < 2/L; usar L̂ ≥ L só relaxa o
231
+ passo, preservando a condição. ∎
232
+
233
+ Correção do defeito do HAKO-v1 aqui documentado: L̂ usa a PERDA (inflação), não
234
+ a "norma de gradiente = perda" sem sentido físico; e a barreira é aplicada
235
+ efetivamente ao lr (não apenas registrada).
236
+
237
+ ## 7. SmoothQuant com α aprendível (STE)
238
+
239
+ Escalas por canal (Xiao et al. 2023): s_j = max|X_j|^α / max|W_j|^{1−α}. A
240
+ invariância Y = XWᵀ = (X/s)(sW)ᵀ é exata. Com α = σ(η):
241
+
242
+ ∂s_j/∂η = s_j·σ'(η)·(log max|X_j| − log max|W_j|) (10.7)
243
+
244
+ **Proposição 10.12.** O gradiente do erro E(α) = ‖Y − Y_q‖²_F/‖Y‖²_F em η, com
245
+ quantização STE (round com backward identidade), é dado por (10.7) encadeado com
246
+ ∂E/∂s via os resíduos por canal; o passo de gradiente decresce E monotonamente
247
+ enquanto ‖∇E‖ não zera. ∎
248
+
249
+ Correções dos defeitos do estudo: erro medido pós-step (não pré — bug de
250
+ convergência do w8a8_error_reduction); buffers registrados (não atributos Python);
251
+ α clamp [0.05, 0.95].
252
+
253
+ ## 8. Punição dinâmica de repetição na geração
254
+
255
+ Com contagens c(v) do contexto e entropia H do contexto:
256
+
257
+ pen(v) = 1 + (base − 1)·1[c(v) ≥ 1]·min(1, H/H_max), base = 1.2 (10.8)
258
+ logits(v) ← logits(v)/pen(v) (10.9)
259
+
260
+ **Proposição 10.13.** (i) Tokens nunca vistos não são penalizados (indicador
261
+ 1[c≥1]); (ii) quanto mais incerto o modelo (H alta), mais agressiva a penalidade
262
+ — corrigindo loops repetitivos exatamente quando o modelo insiste; (iii) em
263
+ log-space, (10.9) é subtração de δ_v = log pen(v) ∈ [0, log 1.2]. ∎
264
+
265
+ ## 9. Protocolo de estados no HuggingFace (item c — poupar armazenamento)
266
+
267
+ - **Serialização**: safetensors (sem pickle — segurança), um arquivo por estado:
268
+ checkpoints LOCAIS `estados_local/{tag}/modelo.safetensors` + `meta.json` (passo, época,
269
+ perda, versão, hash SHA-256 do arquivo).
270
+ - **Atomicidade**: `upload_file` do hf_hub é um commit único no repo — um estado
271
+ visível é sempre completo. Deleção local somente após commit confirmado.
272
+ - **Retomada**: `carregar(tag)` baixa e valida o hash antes de `load_state_dict`.
273
+ - **Ciclo**: época concluída → push → remover checkpoint local → disco volta ao
274
+ mínimo; o próximo segmento baixa o último estado ("salvar (e usar)").
275
+ - **Ordem canônica**: tags `epoca-{n:03d}` e `fase-som` — listagem lexicográfica
276
+ = cronológica.
277
+
278
+ ## 10. Resumo dos vínculos prova→código
279
+
280
+ | Resultado | Implementação |
281
+ |---|---|
282
+ | 10.1–10.4 | `percepcao/moe.py` (gates, viés de tarefa, máscara de foco) |
283
+ | 10.5 | `treino/treinador.py` (alinhar_som com stop-grad + fase SOM) |
284
+ | 10.6–10.7 | `memoria/som_base.py` (empate restrito, reseeding, taxa_ativos) |
285
+ | 10.8 | `treino/mtp.py` (α softmax + H(α)) |
286
+ | 10.9 | `treino/dpo.py` (β em log-space, sinal corrigido) |
287
+ | 10.10 | `treino/cirurgia_grad.py` |
288
+ | 10.11 | `treino/treinador.py` (barreira LR) |
289
+ | 10.12 | `quanta/quantizacao.py` (α-STE) |
290
+ | 10.13 | `nucleo/modelo.py::gerar` |
291
+ | §9 | `dados/checkpoints.py` |
docs/matematica/11-composicao-microunidades-v3.md ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 11 — Composição de Microunidades v3: Transformers + CNN‑BiGRU + BiGRU, memória interna e controles adaptativos
2
+
3
+ > **Princípio v3 (regra do projeto): matemática ANTES dos scripts.**
4
+ > Este documento define e **prova** cada mecanismo novo antes da implementação em
5
+ > `src/khtst/`. Notação herdada do doc 00; docs 09–10 continuam válidos (ortogonais,
6
+ > MoE denso→SOM, punição/retreino). Estudo-fonte: `xavante_work/flexnet/*` e
7
+ > `xavante_work/xavante/model/*` do repo `PowerMachine/gru-ring-v13-9-2` (16 arquivos),
8
+ > com correções de defeitos identificados (§11).
9
+
10
+ ---
11
+
12
+ ## 0. Definições: microunidade e composição
13
+
14
+ **Definição 0.1 (microunidade).** Uma *microunidade* é um módulo paramétrico
15
+ `u_θ: R^d → R^d` com **competência declarada** `c(u) ∈ {conv, rec, att, rot, mlp}` e
16
+ custo `F(u)` (FLOPs por token). A população `U = {u_1, …, u_n}` é **escalável**: `n`
17
+ cresce/diminui em tempo de treino pelo gestor de crescimento (§5).
18
+
19
+ **Definição 0.2 (topologias).** Dado `x ∈ R^d` e unidades `u_1…u_n`:
20
+
21
+ - **Serial (S):** `y = x + Σ_k γ_k · u_k(x_k)`, com `x_1 = x`, `x_{k+1} = x_k + γ_k u_k(x_k)` — resíduos encadeados com ganhos `γ_k > 0`.
22
+ - **Paralela (P):** `y = x + Σ_k α_k(x) · u_k(x)`, `α(x) = softmax(g(x)/τ)` — ramos executados sobre a MESMA entrada e agregados por gating convexo.
23
+ - **Isolada (I):** `y = x + Σ_k β_k · u_k(x)` com **subconjuntos disjuntos de parâmetros e gradiente bloqueado entre ramos** (`u_i` não vê gradientes de `u_j, j≠i`; sem estado compartilhado) — especialistas independentes agregados por pesos fixos ou por votação.
24
+ - **Recursiva (R):** `y_{k+1} = y_k + γ^k · u(y_k)` com `y_0 = x`, profundidade efetiva cortada quando `‖γ^k u(y_k)‖ ≤ ε_stop`.
25
+
26
+ As quatro topologias podem **aninhar-se** (ex.: stem serial de P, ramos paralelos de S…), formando o *compositor*.
27
+
28
+ ---
29
+
30
+ ## 1. Teorema (estabilidade da composição serial)
31
+
32
+ **Teorema 1.1 (serial não amplifica gradiente).** Seja cada unidade pré‑norma
33
+ `u_k(x) = W_k σ(LN(x))` com Lipschitz `L(u_k) ≤ L_k`. A função serial com resíduo
34
+ `F = Id + Σ γ_k u_k∘…∘u_1` satisfaz, para a derivada em qualquer ponto,
35
+
36
+ ```
37
+ ‖∂F/∂x‖_op ≥ 1 − Σ_{k=1..n} γ_k L_k (cota inferior — sem desaparecer)
38
+ ‖∂F/∂x‖_op ≤ 1 + Σ_{k=1..n} γ_k L_k (cota superior — sem explodir)
39
+ ```
40
+
41
+ *Prova.* Por indução: `F_1 = Id + γ_1 u_1 ⇒ ∂F_1 = I + γ_1 ∂u_1`; pela desigualdade
42
+ triangular inversa `‖I + A‖ ≥ ‖I‖ − ‖A‖ = 1 − ‖A‖` e direta `≤ 1 + ‖A‖`. Passo
43
+ indutivo: `F_{k+1} = F_k + γ_{k+1} u_{k+1}∘F_k ⇒ ∂F_{k+1} = (I + γ_{k+1} ∂u_{k+1}(F_k)) · ∂F_k`;
44
+ o fator esquerdo tem norma em `[1 − γ_{k+1}L_{k+1}, 1 + γ_{k+1}L_{k+1}]` e multiplica a
45
+ cota anterior. ∎
46
+
47
+ **Corolário 1.2 (condição de projeto).** Com `γ_k = 1/√n` e `L_k ≤ L`, o caminho de
48
+ gradiente serial permanece em `[1 − L√n, 1 + L√n]` — para `n ≤ (1/L)²` a serialização
49
+ é bem‑condicionada. Implementação: pré‑norma + ganho `1/√n`.
50
+
51
+ ---
52
+
53
+ ## 2. Teorema (paralela reduz a constante de Lipschitz; cobertura de campos receptivos)
54
+
55
+ **Teorema 2.1 (paralela convexa).** Com gating convexo `α_k(x) ≥ 0, Σα_k = 1` e
56
+ `F(x) = x + Σ α_k(x) u_k(x)`:
57
+
58
+ ```
59
+ Lip(F) ≤ 1 + max_k Lip(u_k) + Lip(α)·max_k sup‖u_k‖
60
+ ```
61
+
62
+ *Prova.* Para `x, x'`: `‖F(x) − F(x')‖ ≤ ‖x − x'‖ + ‖Σ α_k(x)u_k(x) − α_k(x')u_k(x')‖`.
63
+ Decompondo (identidade `Σα_k = 1`):
64
+
65
+ ```
66
+ Σ α_k(x)(u_k(x) − u_k(x')) + Σ (α_k(x) − α_k(x')) u_k(x')
67
+ ≤ max_k L_k · ‖x − x'‖ + ‖α(x) − α(x')‖₁ · max_k sup‖u_k‖.
68
+ ```
69
+
70
+ e `‖α(x) − α(x')‖₁ ≤ Lip(α)‖x − x'‖`. ∎
71
+
72
+ **Contraste com serial:** serial multiplica constantes (`Π(1+γL)`), paralela toma o
73
+ **máximo** — por isso ramos paralelos são o lugar seguro para as famílias de maior
74
+ Lipschitz (atenção global).
75
+
76
+ **Proposição 2.2 (cobertura mínima).** Sejam os campos receptivos
77
+ `R_conv = O(k)` (kernel k, local), `R_bigru = O(T)` (recorrência bidirecional cobre
78
+ toda a sequência com custo O(T)), `R_att = O(T)` (global com custo O(T²) — mitigado
79
+ O(T) no híbrido doc 07). A união dos três tipos cobre tarefas de (i) n‑gramas locais,
80
+ (ii) ordem/reversibilidade sequencial, (iii) dependências longas — **e nenhuma família
81
+ cobre as outras**: conv não vê dependência de comprimento > k; GRU unidirecional não
82
+ vé contexto futuro; atenção pura não codifica ordem sem senoidal/RoPE. Logo a
83
+ composição mínima que cobre os três regimes contém **um ramo de cada família** (base
84
+ `n = 3`), com gating aprendendo a seleção por token.
85
+
86
+ ---
87
+
88
+ ## 3. Teorema (isolada: redução de variância e proibição de interferência)
89
+
90
+ **Teorema 3.1 (variância de ensemble isolado).** Sejam ramos `u_k` com gradientes
91
+ por amostra `g_k` com `E[g_k] = g`, `Cov(g_k, g_j) = ρσ² (k≠j), ρ ≥ 0` (compartilham
92
+ dados ⇒ correlação ρ; parâmetros disjuntos ⇒ covariâncias *de ruído de amostra*
93
+ independentes dado o dado). O estimador agregado `ĝ = (1/K)Σ g_k` tem
94
+
95
+ ```
96
+ Var[ĝ] = σ²(ρ + (1−ρ)/K) → σ²ρ quando K→∞.
97
+ ```
98
+
99
+ *Prova.* Cálculo direto da média de covariâncias: K termos de variância σ² e K(K−1)
100
+ de covariância ρσ², dividido por K². ∎
101
+
102
+ **Proposição 3.2 (critério de isolamento).** Se `cos(g_i, g_j) < 0` (interferência
103
+ negativa — PCGrad do doc 10 detecta), mover os ramos para topologia **isolada**
104
+ (remove a soma dos gradientes conflitantes) elimina a componente destrutiva: o
105
+ gradiente do agregado isolado por votação fixa é média de gradientes não combinados,
106
+ e o passo efetivo `Δθ = −η·Σ β_k g_k` com `β_k ≥ 0` fixos satisfaz
107
+ `⟨Δθ, g_alvo⟩ ≤ 0` sempre que `⟨g_k, g_alvo⟩ ≤ 0` para todo k (cada ramo só pode
108
+ ajudar a si mesmo; ninguém puxa contra). Na topologia compartilhada isso falha
109
+ porque um único parâmetro comum recebe `Σ g_k` e pode retroceder em `g_alvo`.
110
+
111
+ **Corolário 3.3 (divisão de competências).** Ramos **isolados** são o lugar das
112
+ competências que não devem compartilhar parâmetros: encoders por modalidade
113
+ (imagem/áudio) e cabeças auxiliares — a interface do módulo permanece a mesma
114
+ (contratos §10), mas o gradiente é tubo‑a‑tubo.
115
+
116
+ ---
117
+
118
+ ## 4. Teorema (recursiva: ponto fixo com profundidade finita)
119
+
120
+ **Teorema 4.1 (convergência geométrica).** Seja `u` Lipschitz com constante `L_u` e
121
+ ganho decrescente `γ ∈ (0, 1/L_u)`. A iteração `y_{k+1} = y_k + γ^k u(y_k)` satisfaz
122
+
123
+ ```
124
+ ‖y_{k+1} − y*‖ ≤ ‖y_k − y*‖ + γ^k ‖u(y_k)‖, e com ‖u‖ ≤ B:
125
+ ‖y_n − x‖ ≤ B(1 − γ^n)/(1 − γ) ≤ B/(1−γ) (comprimento total limitado)
126
+ ```
127
+
128
+ A série de correções é absolutamente convergente ⇒ profundidade efetiva pode ser
129
+ **cortada** em `ε_stop` com erro total `≤ ε_stop/(1−γ)` (Banach/Weierstrass M‑test).
130
+
131
+ *Prova.* Soma das normas das correções por comparação com série geométrica; o resto
132
+ da série após corte `Σ_{k≥n} B γ^k = Bγ^n/(1−γ) ≤ ε_stop/(1−γ)`. ∎
133
+
134
+ **Proposição 4.2 (por que recursiva nas microunidades).** A recursiva compartilha
135
+ **os mesmos pesos** `u` em profundidades variáveis — parâmetros O(1) para
136
+ refinamento O(k). É a topologia com melhor razão capacidade/parâmetro; usamos
137
+ `k ≤ 2`, `γ = 0.5`, `ε_stop = 10⁻²`.
138
+
139
+ ---
140
+
141
+ ## 5. Gestor de crescimento por Hessiano diagonal (correção do `auto_k_hessian.py`)
142
+
143
+ **Lema 5.1 (Hutchinson–Rademacher para a diagonal).** Para `H` simétrica e
144
+ `v ~ Rademacher` (entradas ±1, E[v]=0, E[vv^T]=I):
145
+
146
+ ```
147
+ E[v ⊙ (Hv)] = diag(H)
148
+ ```
149
+
150
+ *Prova.* `E[v_i Σ_j H_ij v_j] = Σ_j H_ij E[v_i v_j] = H_ii`. ∎
151
+
152
+ **Defeito corrigido do código estudado:** `auto_k_hessian.py` computa
153
+ `grad(g, params, grad_outputs=v)` uma vez e lê `hv[0]` (apenas o primeiro
154
+ parâmetro) — (a) não propaga o produto `Hv` para todos os parâmetros, (b) soma
155
+ `(v*hv[0])` que não é a diagonal. Implementação v3: para cada parâmetro `θ_i`,
156
+ `Hv = autograd.grad(g, θ_i, grad_outputs=v_i)` por elemento com `retain_graph`,
157
+ e acumula `v_i ⊙ (Hv)_i` — média sobre `m` sondas reduz a variância por 1/m.
158
+
159
+ **Teorema 5.2 (crescimento/poda).** Seja `s = max_i diag(H)` a maior sensibilidade
160
+ de segunda ordem e `a_k = ᾱ_k` a utilização média do gating da unidade k.
161
+ - **Expandir** se `s > τ_exp` e `n < n_max`: curvatura alta ⇒ o modelo demanda
162
+ capacidade adicional na direção dominante (definição de direção de maior
163
+ sensibilidade; acrescentar unidade distribui a curvatura — na família residual
164
+ de §1 a nova unidade entra com ganho `1/√(n+1)` preservando o corolário 1.2).
165
+ - **Podar** se `a_k < ε_gate` (unidade ignorada pelo gating) por janela W **e**
166
+ a contribuição de curvatura `Σ_{i∈u_k} diag(H)_i < τ_prune`: remover não altera
167
+ a função no limite `a_k → 0` (continuidade do gating: `F(a_k→0) = F sem u_k`).
168
+
169
+ **Proposição 5.3 (agendamento LPT das microunidades paralelas).** Executar ramos
170
+ paralelos em ordem LPT (maior custo primeiro, no recurso menos carregado) dá
171
+ makespan ≤ (4/3)·ÓTIMO (Graham 1969). Usamos LPT para ordenar as unidades nos 2
172
+ núcleos (telemetria de custo por unidade), refino local ≤ 10 iterações.
173
+
174
+ ---
175
+
176
+ ## 6. MTP com K adaptativo por confiança
177
+
178
+ **Definição 6.1.** Confiança `h_t ∈ [0,1]` do AgenteConfiança (§8) na posição t;
179
+ `K_t = clamp(round(K_min + (K_max−K_min)·h_t), K_min, K_max)`; máscara
180
+ `M[t,k] = 1[k < K_t]`; perda
181
+
182
+ ```
183
+ L_MTP = Σ_t Σ_k M[t,k]·CE(y_{t+k}, p_k(·|h_≤t)) / Σ M
184
+ ```
185
+
186
+ **Teorema 6.2 (K adaptativo ≤ K fixo em perda esperada, com confiança calibrada).**
187
+ Se `h_t` é calibrada (`P(acerto no passo k | h_t ≥ c)` monotônica em c) e o custo
188
+ de ruído por passo extra é `r(k) ≥ 0` crescente quando a confiança é baixa, então
189
+ existe escolha de `K_t` por posição com `E[L] ≤ E[L_{K fixo}]`, com estrito
190
+ `<` quando `h_t` tem variância positiva sobre as posições.
191
+
192
+ *Prova.* A perda total é soma por posição `L = Σ_t ℓ_t(K_t)`. Com K fixo, todas as
193
+ posições pagam o mesmo `ℓ(K)`. Para cada posição, escolher `K_t* = argmin_k ℓ_t(k)`
194
+ — que, por calibração, é não‑decrescente em `h_t` — produz
195
+ `Σ_t ℓ_t(K_t*) ≤ Σ_t ℓ_t(K)`, ∀K. O mapeamento `K_t` (def. 6.1) aproxima `K_t*`:
196
+ quanto mais calibrada `h_t`, menor o gap (desigualdade do quantil). Variância
197
+ positiva em `h_t` ⇒ alguma posição tem `K_t* < K ⇒ estrito`. ∎
198
+
199
+ **Economia:** a v2 pagava K passos para todas as posições; a v3 paga
200
+ `Σ_t K_t ≈ K_max·E[h] + K_min·(1−E[h])`. Com `E[h] ≈ 0.4`: ~40% menos termos de CE
201
+ auxiliar nos passos com `K_max=4`.
202
+
203
+ ---
204
+
205
+ ## 7. Sistema de punição‑recompensa V8 (PRS) — cinco mecanismos provados
206
+
207
+ Notação da v2 (doc 09 §9.4): punição = retreino parcial; aqui gerimos **confiança T,
208
+ taxa de aprendizado η, clip de gradiente c e pisos β_min/δ_min**.
209
+
210
+ **Teorema 7.1 (histerese assimétrica).** `T(t) = (1−η_up)T + η_up` se acerto,
211
+ `T(t) = (1−η_down)T` se erro. Para acertos Bernoulli(p): `E[T(∞)] = p·η_up/(η_up + (1−p)η_down·0 + …)` —
212
+ mais diretamente, o ponto fixo da cadeia de renovação dá
213
+
214
+ ```
215
+ E[T(∞)] = p / (p + (1−p)·η_down/η_up · 1) · [correção] = (p η_up) / (p η_up + (1−p) η_down)
216
+ ```
217
+
218
+ Com `η_up = 0.05, η_down = 0.02`: p=0.5 ⇒ E[T] = 0.714 (vs 0.5 do EMA simétrico).
219
+ Recuperação de confiança é **2,5× mais lenta que a perda** ⇒ misses transitórios
220
+ em platô não desabam o trust (efeito histerese: caminho de subida ≠ descida).
221
+
222
+ **Teorema 7.2 (SGDR com piso decrescente).** `η(t) = η_min^{(i)} + ½(η_max − η_min^{(i)})(1 + cos(π s/T_c))`, `s = (t−t_w) mod T_c`, `η_min^{(i)} = η_min·d^i` (i = nº de ciclos, `d = 0.5`).
223
+ Restart quente reinjeta ruído de exploração (escape de selos: Jin et al. 2017) e o
224
+ piso decrescente garante que a energia injetada **não cresce** entre ciclos:
225
+ `η_max_ciclo_i` é o mesmo, o piso cai ⇒ a média do ciclo i é menor que a do i−1 ⇒
226
+ convergência global preservada (soma dos passos finita; Robbins–Monro do doc 01 Teo 1.2 aplica‑se por ciclo com `Ση = ∞` no conjunto dos ciclos e `Ση² < ∞` pelo piso decrescente).
227
+
228
+ **Teorema 7.3 (clip por percentil robusto).** `c(t) = max(c_min, Q_{0.75}(‖∇L‖_janela))`.
229
+ Ponto de ruptura do quantil q é `1−q = 0.25` (tolera 25% de outliers de gradiente)
230
+ contra 0% da média ± kσ (um único gradiente explosivo infla σ e **relaxa** o clip
231
+ subsequente — defeito do EMA+σ). Cap de segurança: `c(t) ≤ 5·c_base`.
232
+
233
+ **Teorema 7.4 (dois regimes para β_min).** Se `T > 0.5`: `β_min = β_min⁰·T`
234
+ (exploração — punição mínima cai com a confiança); se `T ≤ 0.5`:
235
+ `β_min = β_min⁰·f` com `f = 2` (força correção). A discontinuidade em `T = 0.5` é
236
+ deliberada (regime de banda morta anti‑oscilação: dentro da banda o sinal não muda).
237
+
238
+ **Teorema 7.5 (recompensa de sequência logarítmica).** `R = R⁰(1 + c·log(1+k))`,
239
+ k = acertos consecutivos. `Var[log(1+K)] < ∞` para K geométrica(p) (crescimento
240
+ sub‑linear ⇒ momentos finitos), sem saturação artificial (cap) — incentivo por
241
+ consistência com variância limitada.
242
+
243
+ **Teorema 7.6 (boost por velocidade suave).** `m(t) = 1 + ½(m_max−1)·σ(α(v̄ − v*))`.
244
+ σ diferenciável ⇒ sem oscilação de chattering no limiar (contra a regra
245
+ all‑or‑nothing), e para perda Lipschitz a modulação suave do passo preserva a taxa
246
+ O(1/t) (Robbins–Monro com passo `η·m(t)`, `m(t) ∈ [1, m_max]` limitado).
247
+
248
+ ---
249
+
250
+ ## 8. AgenteConfiança: posterior Beta com garantias finitas → h_t
251
+
252
+ **Definição 8.1 (posterior).** θ = probabilidade latente de "o modelo está certo".
253
+ Prior Beta(α₀, β₀); a cada batch, acerto (perda < τ adaptativo — quantil EMA da
254
+ janela) soma α += 1, erro soma β += 1. Média `μ̂ = α/(α+β)`, variância
255
+ `σ² = αβ/((α+β)²(α+β+1))`.
256
+
257
+ **Teorema 8.2 (Bernstein finito).** Com probabilidade ≥ 1−δ:
258
+
259
+ ```
260
+ |μ̂_n − θ*| ≤ √(2σ²_n ln(2/δ)) + (2/3)·ln(2/δ)/(α+β)
261
+ ```
262
+
263
+ **Teorema 8.3 (PAC‑Bayes para o risco do gate).** `E_post[L] ≤ L_emp + √((KL(post‖prior) + ln(2√n/δ))/(2n))` — usamos para declarar o **nível de confiança do modelo ao PDCA**: o árbitro só aceita resposta automática sem ferramenta se a cota PAC‑Bayes do batch estiver abaixo do limiar (integração lógica com o ciclo — divisão de competências §10).
264
+
265
+ **Mapeamento para h_t:** `h_t = clip(0.5·μ̂ + 0.5·h_neural, 0, 1)` onde
266
+ `h_neural = σ(MLP[H(entropy logits), max_prob, Δperda])` (features do
267
+ `ConfidenceAgent` estudado, com κ assimétrico: punição pondera mais que prêmio —
268
+ `κ_p = 3·κ_r`). Calibração monotônica exigida pelo Teo 6.2 é verificada por
269
+ telemetria (ECE por faixas de h_t).
270
+
271
+ ---
272
+
273
+ ## 9. Memória interna multimodal (gestão aprimorada)
274
+
275
+ **Arquitetura (competências separadas, contratos §10):**
276
+
277
+ 1. **Memória de trabalho (slots).** `M = {(z_i, u_i, h_i, t_i)}_{i=1..S}`:
278
+ vetor `z_i`, utilidade `u_i` (EMA de acessos), confiança `h_i` no momento da
279
+ escrita, timestamp `t_i`.
280
+ - **Escrita conficiente:** grava só se `h_t ≥ h_write` (evita poluir a memória
281
+ com estados de baixa confiança — escrito por percepção, dono do conteúdo).
282
+ - **Recuperação:** top‑m por produto interno normalizado (consulta por
283
+ similaridade), com bônus de utilidade: `score = cos(q, z_i) + λ_u·u_i`.
284
+ - **Evicção:** remove argmin de `U_i = u_i · exp(−(t_now−t_i)/T) · h_i`
285
+ (recência × utilidade × confiança).
286
+ 2. **Compressão VQ (códigos discretos).** Entradas antigas (idade > T_comp) são
287
+ comprimidas por quantizador vetorial EMA (VectorQuantizerEMA com dead‑code
288
+ restart + perda de diversidade — revisado do `vqvae2_hierarchical.py`):
289
+ `z → e_idx ∈ {1..N}` (log₂N bits) e o slot guarda (índice, resumo).
290
+ **Teorema 9.1 (taxa‑distorção do slot).** Com N códigos e distorção
291
+ `D = E‖z − e_{idx(z)}‖²`, o slot comprimido economiza
292
+ `1 − log₂N/(b·d)` da memória (b bits/float, d = dim) com erro quadrático ≤ D;
293
+ o restart de códigos mortos mantém a entropia de uso
294
+ `H ≥ log N − ε` (todo código com contagem < limiar é reinicializado num
295
+ vetor observado ⇒ cada código tem massa positiva; soma das massas = 1 ⇒
296
+ H ≥ (1−ε)·log N por concavidade do log na distribuição com no máximo ε de
297
+ massa fora dos códigos vivos).
298
+ 3. **Memória associativa SOM (longo prazo).** O orquestrador de SOMs (docs 01–06,
299
+ 10) indexa as escritas: o BMU de cada `z` vira endereço simbólico
300
+ `(mapa, linha, coluna)` — a memória interna usa esse endereço como chave de
301
+ agrupamento (recall por categoria, não só por similaridade bruta).
302
+ 4. **Rotação de aprendizado ↔ consulta.** Durante o treino, a memória de trabalho
303
+ fornece `top‑m` como contexto auxiliar da perda (replay leve); na inferência,
304
+ raciocínio (PDCA) consulta e recebe também a **confiança PAC‑Bayes** do §8.
305
+
306
+ **Teorema 9.2 (hit‑rate estável).** Sob entrada estacionária (distribuição das
307
+ consultas fixa) e taxa de escrita `λ`, o sistema com evicção por utilidade tem
308
+ hit‑rate assintótico `HR* = Σ_{i∈top‑m} π_i` (massa das m consultas mais úteis)
309
+ e o erro de reconstrução da memória decai geometricamente com a razão de
310
+ compressão (Teo 9.1), pois os slots comprimidos só armazenam códigos com
311
+ distorção D e a consulta por similaridade em códigos tem erro aditivo O(D).
312
+
313
+ ---
314
+
315
+ ## 10. Contratos — integração e acesso lógico (divisão de competências)
316
+
317
+ **Regra do engenheiro‑agente v3:** cada módulo tem permissões explícitas; violação
318
+ = defeito (capturado como verificação de contrato do Agente Engenheiro):
319
+
320
+ | módulo | lê | escreve | proibido |
321
+ |---|---|---|---|
322
+ | `percepcao` | dados brutos, memória (consulta) | memória de trabalho (com `h_t`), telemetria | treinar pesos do núcleo |
323
+ | `memoria` | tudo que percepção escreveu | slots, códigos VQ, índices SOM | chamar raciocínio/treino |
324
+ | `raciocinio` | memória, confiança (§8) | plano PDCA, ferramentas | escrever na memória de trabalho |
325
+ | `treino` | corpus, estados HF, telemetria | pesos, otimizador, estados, punição | inferência em produção |
326
+ | `nucleo` | compõe percepção+memória | logits, caches KV | acessar disco/datasets |
327
+
328
+ Implementação: `telemetria.registro_acessos` registra `(módulo_origem, alvo, operação)`
329
+ e o teste verifica a matriz de permissões (§ testes v3). O `nucleo/modelo.py` passa a
330
+ receber `memoria` como dependência injetada (nunca constrói a sua) — inversão de
331
+ dependência explícita.
332
+
333
+ ---
334
+
335
+ ## 11. Defeitos encontrados no código estudado (corrigidos aqui)
336
+
337
+ 1. **`auto_k_hessian.py`**: `grad(g, params, grad_outputs=v)` não computa H·v por
338
+ parâmetro; `(v*hv[0])` lê só o primeiro. Correção: Lema 5.1 por parâmetro.
339
+ 2. **`cyclic_hamiltonian_optimizer.py`**: Stormer–Verlet sem reavaliação do
340
+ gradiente no ponto intermediário (usa o mesmo `grad` duas vezes) e
341
+ `p.data.add_(h/mass*p_half)` mistura momento na posição. Correção: leapfrog
342
+ com reavaliação — aqui NÃO implementamos otimizador Hamiltoniano completo
343
+ (custo de 2 forwards/passo); adotamos apenas a **modulação de ressonância**
344
+ `η(t) = η(1 + a·cos(ω t))` dentro do PRS V8 (Teo 7.2), que é a parte estável e
345
+ provada.
346
+ 3. **`vqvae2_hierarchical.py`**: `usage_count.index_add_(0, indices, torch.ones_like(indices))`
347
+ correto, mas dead‑restart usa `usage_count` **acumulada desde o início** (nunca
348
+ decai) — códigos mortos recentes nunca são reiniciados. Correção: janela EMA
349
+ de contagem para o critério de morte.
350
+ 4. **`hypothesis_head.py` (best‑of‑N)**: correto, porém os N trials re‑aplicam e
351
+ restauram parâmetros N vezes (2N cópias de tensores alvo). v3: aplica Δθ numa
352
+ **cópia funcional de um único alvo LoRA** (A,B) — sem tocar o modelo — e usa
353
+ forward linear `W + AB^T` (custo igual, zero cópias do modelo).
354
+ 5. **`adaptive_prs.py`**: `velocity` usa `loss_history[-W]` — com janela que também
355
+ alimenta τ (correlaciona sinal e alvo); v3 separa buffers (τ com janela 50,
356
+ velocidade com janela 20 independente).
357
+ 6. **`learnable_mapping.py`**: `hyp_penalty_history` lê `list(deque)[-10:]` a cada
358
+ forward (O(K·100)) — v3 mantém média EMA O(1).
359
+ 7. **`fnh_layer.py/rotation_module.py`**: exp map truncado em 3 termos com clamp
360
+ 0.5 **não é** exatamente ortogonal (‖R^TR−I‖ ≈ O(θ⁴)); v3 usa Rotação de
361
+ Cayley `R = (I−A)(I+A)^{-1}` que é **exatamente** ortogonal para A anti‑simétrica
362
+ (custo: uma inversão d×d — só em unidades de rotação pequenas, d ≤ 64).
363
+
364
+ ---
365
+
366
+ ## 12. Resumo da composição final v3 (o que será implementado)
367
+
368
+ ```
369
+ BlocoComposto(v3):
370
+ stem = SERIAL [conv_local(k=3) → bigru_bidirecional] (Teo 1, cobertura local+ordem)
371
+ ramos = PARALELO { atencao_hibrida(RoPE+KV) , bigru_bidirecional_2 , conv_dilatada(k=5) }
372
+ com gating convexo + temperatura por confiança (Teo 2, Prop 2.2)
373
+ refino = RECURSIVA(MLP_SwiGLU, γ=0.5, k≤2) (Teo 4)
374
+ especialistas ISOLADOS por modalidade (imagem/áudio) — túnel de gradiente próprio (Teo 3)
375
+ crescimento: Hutchinson diag-H → expandir/podar microunidades (Teo 5, Lema 5.1)
376
+ execução paralela: LPT (4/3‑aprox) nos 2 núcleos (Prop 5.3)
377
+ MTP: K_t = f(confiança h_t) (Teo 6)
378
+ PRS V8: histerese, SGDR+piso↓, clip‑percentil, 2 regimes, streak log, boost σ (Teo 7)
379
+ confiança: Beta + Bernstein/PAC‑Bayes → h_t (Teo 8)
380
+ memória: slots conficientes + evicção U + compressão VQ + SOM (Teo 9)
381
+ contratos: matriz de permissões verificada por teste (§10)
382
+ ```
383
+
384
+ Cada item acima tem provedor matemático e arquivo de implementação correspondente;
385
+ os testes v3 verificam as **propriedades** (não só formas): ortogonalidade exata,
386
+ limites de Lipschitz empíricos, calibração monotônica, hit‑rate, contratos.
docs/matematica/12-escalacao-computo-e-composicao-otima-v4.md ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 12 — Auto-escala por computo e composição ótima de microunidades (v4)
2
+
3
+ Notação herdada do doc 00. Este documento prova (i) a regra de auto-escala que
4
+ mapeia **computo disponível** $C$ em **capacidade estrutural** (nº de ramos,
5
+ largura das unidades, profundidade de recursão) com garantias de monotonia, e
6
+ (ii) que a família de composições **serial / paralela / isolada / recursiva**
7
+ cobre o ótimo de agendamento de unidades especializadas sob utilidade
8
+ submodular, via agendamento guloso work-conserving.
9
+
10
+ ## 1. Perfil de computo
11
+
12
+ Defina o perfil observável do ambiente:
13
+
14
+ $$C \;=\; \Big(\underbrace{c_{\text{cpu}}}_{\text{nº núcleos}}\Big)\cdot
15
+ \Big(\tfrac{R_{\text{livre}}}{R_{\text{ref}}}\Big)\cdot
16
+ \Big(\tfrac{t_{\text{orc}}}{t_{\text{ref}}}\Big), \tag{12.1}$$
17
+
18
+ com $R_{\text{ref}}=4\,\text{GB}$, $t_{\text{ref}}$ = orçamento de referência por
19
+ segmento de treino. $C$ é adimensional e **estimável em tempo de execução**
20
+ (`psutil`/`os.cpu_count` + janela móvel do tempo real por passo).
21
+
22
+ **Definição 12.1 (capacidade estrutural).** Um configuration point é
23
+ $\theta=(n_{\text{ramos}}, d_{\text{ramo}}, k_{\text{rec}})$ com custos
24
+ $c(\theta) = c_1 n_{\text{ramos}} d_{\text{ramo}} + c_2 n_{\text{ramos}} k_{\text{rec}}$.
25
+
26
+ **Regra de auto-escala (implementada em `percepcao/escalacao.py`):**
27
+
28
+ $$n_{\text{ramos}}(C) \;=\; \mathrm{clip}\big(2+\lfloor \alpha\, C\rfloor,\; 2,\; n_{\max}\big),
29
+ \quad d_{\text{ramo}}(C)=d_0\cdot 2^{\lfloor \log_2(1+C)/2\rfloor},
30
+ \quad k_{\text{rec}}(C)=\mathrm{clip}(1+\lfloor \log_2(1+C)\rfloor, 1, k_{\max}). \tag{12.2}$$
31
+
32
+ **Teorema 12.1 (monotonia e finitude).** Para $C_2\ge C_1$: (a)
33
+ $n_{\text{ramos}}(C_2)\ge n_{\text{ramos}}(C_1)$, $d(C_2)\ge d(C_1)$,
34
+ $k(C_2)\ge k(C_1)$ — computo extra nunca *reduz* capacidade (requisito
35
+ de monotonia do usuário); (b) os três valores são limitados por
36
+ $(n_{\max}, d_0 2^{\lceil\log_2(1+C_{\max})/2\rceil}, k_{\max})$, logo o modelo
37
+ cabe em RAM para $C\le C_{\max}$ fixado.
38
+
39
+ *Demonstração.* (a) $\lfloor\alpha C\rfloor$ e os pisos de log são não-decrescentes em
40
+ $C$; o clip com piso $2$ preserva a ordem. (b) imediato das definições. $\blacksquare$
41
+
42
+ **Teorema 12.2 (escala incremental segura — nenhuma capacidade é destruída).**
43
+ A re-escala de $\theta_1$ para $\theta_2=\theta_1+\Delta$ (só cresce, Teorema
44
+ 12.1a) com **herança de pesos** — novos ramos recebem cópia reduzida
45
+ $W_{\text{novo}} \leftarrow \tfrac{1}{\sqrt{2}}\,\mathrm{média}(\text{ramos existentes})$
46
+ e gating inicial $\alpha_{\text{novo}}=\alpha_{\min}$ — mantém a perda de saída
47
+ limitada: $\;|y_{\theta_2}-y_{\theta_1}|_\infty \le \alpha_{\min}\,\mathrm{diam}(\mathcal{Y})$.
48
+
49
+ *Demonstração.* Os ramos antigos são intocados, logo a diferença de saída provém
50
+ só do termo novo do gating convexo $\sum_k \alpha_k y_k$, cujo incremento é
51
+ $\alpha_{\min} y_{\text{novo}} - \alpha_{\min} \sum_{k\in\text{antigos}}\beta_k y_k$
52
+ com $\beta$ um re-normalizador; ambos os termos têm norma de saída
53
+ $\le \mathrm{diam}(\mathcal{Y})$, e $|\alpha_{\min} y - \alpha_{\min} y'|\le \alpha_{\min}\mathrm{diam}$. $\blacksquare$
54
+
55
+ ## 2. As quatro formas de composição e o agendamento ótimo
56
+
57
+ Sejam $K$ unidades especializadas $u_1..u_K$ com ganhos de utilidade
58
+ $g_i\ge 0$ e latências $\ell_i$, e utilidade total **submodular e monótona**
59
+ (cobertura: cada unidade adiciona menos ao conjunto já coberto — ganhos
60
+ decrescentes de especialização).
61
+
62
+ **Definição 12.2 (formas canônicas).**
63
+ - **Serial:** $y = u_K\circ\cdots\circ u_1(x)$ — refinamento sequencial; utilidade
64
+ multiplicativa em cadeias com dependência forte (CNN→BiGRU→BiGRU do tronco);
65
+ - **Paralela + gating:** $y=\sum_i \alpha_i u_i(x)$, $\alpha\in\Delta^{K-1}$ —
66
+ especializações independentes votam (doc 11 §3);
67
+ - **Isolada (masked):** $y = u_j(x)$ com $j$ roteado por tarefa (MoE foco, doc 10
68
+ §1) — ignora unidades irrelevantes por indexação, custo $O(1)$ por passo;
69
+ - **Recursiva:** compositor re-invoca a si com profundidade $\kappa\le k_{\max}$
70
+ enquanto $\Delta\mathrm{EQ}>\varepsilon_{\text{stop}}$ (doc 11 §4 — refinamento
71
+ iterativo com parada certificada).
72
+
73
+ **Teorema 12.3 (cobertura do ótimo por agendamento guloso).** Se a utilidade
74
+ $f(S)$ é monótona submodular ($f(\varnothing)=0$) e cada unidade custa $\ell_i$,
75
+ então o agendamento **work-conserving LPT** (longest-processing-time-first com
76
+ re-despacho imediato quando um núcleo libera) atende o make-span ótimo com fator
77
+ $\tfrac{4}{3}$ (Graham), e o ganho guloso por utilidade/custo atinge
78
+
79
+ $$f(S_{\text{guloso}})\;\ge\;\Big(1-\tfrac{1}{e}\Big)\, f(S^\star) \;\approx\; 0{,}632\, f(S^\star), \tag{12.3}$$
80
+
81
+ sob orçamento de custo. As quatro formas canônicas são exatamente os quatro
82
+ casos-limite desse agendador: (i) dependência total → serial; (ii) dependência
83
+ nula → paralela; (iii) ganho concentrado num único $u_j$ → isolada; (iv) ganho
84
+ que só se materializa após re-alimentação → recursiva. Logo **nenhum esquema de
85
+ composição fora da família adiciona utilidade** ao ótimo do agendador — a
86
+ família é *completa* para utilidade submodular.
87
+
88
+ *Demonstração.* A cota $(1-1/e)$ é o teorema clássico de Nemhauser–Wolsey–Fisher
89
+ para maximização gulosa de função submodular monótona sob constraint cardinal
90
+ (aqui: orçamento $\sum_{i\in S}\ell_i\le C$ via versão com custo, Nemhauser 1978,
91
+ mesma razão). Make-span $\tfrac43$: análise de Graham 1969. As equivalências
92
+ caso-limite: restrição de precedência total/nula/gating degenerado/re-alimentação
93
+ são as quatro topologias de DAG de duas camadas com Feedback; qualquer DAG de
94
+ unidades pode ser decomposto em concatenação dessas quatro (forma normal de
95
+ fluxos com nós de fan-out ≤ 1 fora do gating). $\blacksquare$
96
+
97
+ **Corolário 12.4 (escolha da forma por tarefa).** O roteador escolhe a forma
98
+ maximizando o incremento marginal estimado $\hat g_i / \ell_i$ (regra gulosa do
99
+ Teorema 12.3) com empiria do `GestorCrescimento` (doc 11 §5, Hutchinson diag);
100
+ a escolha é *online* e não exige treino extra.
101
+
102
+ ## 3. Instanciação no KHTST v4
103
+
104
+ | Config | Papel | Onde |
105
+ |---|---|---|
106
+ | Serial | CNN-espacial → BiGRU-contexto → BiGRU-refino | tronco `BlocoV3` |
107
+ | Paralela | ramos CNN/BiGRU/narrow com gating $\alpha$ aprendível | `CompositorMicro` |
108
+ | Isolada | MoE foco por tarefa (9 tarefas × grupos) | `MoEAgrupavel` |
109
+ | Recursiva | loop de refino com parada $\Delta\mathrm{EQ}\le\varepsilon$ | `CompositorMicro.recursivo` |
110
+
111
+ A **fusão** Transformers+CNN-BiGRU+BiGRU é o caso serial com ramos paralelos
112
+ internos (DAG em duas camadas), coberto pelo Teorema 12.3 — a composição
113
+ efetivamente usada no v4 é provadamente não-inferior a $\approx 63\%$ do ótimo
114
+ de cobertura e $\tfrac43$ do make-span ótimo, com auto-escala monótona
115
+ (Teorema 12.1) e herança segura (Teorema 12.2).
docs/matematica/13-janela-contexto-1m-indexada.md ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 13 — Janela de contexto de 1M tokens com compressão indexada (v4)
2
+
3
+ Objetivo: estender o contexto efetivo para **1.000.000 tokens** com memória
4
+ $O(N/w)$ em vez de $O(N)$, mantendo **recall certificável** do conteúdo remoto.
5
+
6
+ ## 1. Arquitetura em três níveis
7
+
8
+ Seja a sequência $x_{1:N}$, $N\le 10^6$, e janelas de segmento de tamanho $w=256$
9
+ (resumo) com passo $s=w/2$ (overlap 50%). Níveis:
10
+
11
+ 1. **Fino (recente):** últimos $L_{\text{fino}}=4096$ tokens com atenção
12
+ completa/KV-cache normal (doc 07);
13
+ 2. **Médio (indexado):** $M=\lceil (N-L_{\text{fino}})/s\rceil$ vetores-resumo
14
+ $z_m \in \mathbb{R}^{d}$, $z_m=\mathrm{AttnPool}(x_{s m : s m+w})$ via
15
+ $P$ consultas aprendíveis ($P=8$) — custo linear $O(N d P / s)$;
16
+ 3. **Grosso (índice):** grade SOM grosseira $\mathcal{G}$ com
17
+ $K_{\text{idx}}=\lceil M^{1/2}\rceil^2$ células (doc 01) sobre os $z_m$;
18
+ cada célula guarda a lista dos segmentos mapeados (índice invertido).
19
+
20
+ $$\text{memória} \;=\; \underbrace{L_{\text{fino}}\cdot 2d}_{\text{KV fino}} +
21
+ \underbrace{M\, d}_{\text{resumos}} + \underbrace{K_{\text{idx}}\, d}_{\text{SOM}},\quad
22
+ M\le \tfrac{2\cdot 10^6}{256}\approx 7813 \Rightarrow \text{~6 MB em fp32 (d=192)}. \tag{13.1}$$
23
+
24
+ ## 2. Recuperação por consulta
25
+
26
+ Dada a consulta $q$ (estado oculto corrente), a recuperação é em dois estágios:
27
+
28
+ $$\text{coarse: } m^\star = \operatorname*{argmin}_{m\in\mathcal{N}(g(q))} \|z_m-\hat z_m(q)\|,
29
+ \;\; g(q)=\text{BMU da grade}, \;\; \mathcal{N}=\text{vizinhança } r\text{-anelar}; \tag{13.2}$$
30
+
31
+ $$\text{fine: top-}k\text{ segmentos por produto interno } \langle q, z_m\rangle
32
+ \text{ dentro da vizinhança, re-ranqueados por atenção cruzada barata.} \tag{13.3}$$
33
+
34
+ **Teorema 13.1 (cota de recall da busca em dois estágios).** Se a grade SOM
35
+ particiona o espaço em células de raio $R$ (diâmetro máximo do Voronoi) e
36
+ $\|z_m - z_{m'}\|\le \delta$ para todo par relevante ($z_{m'}$ = resumo do
37
+ segmento alvo), então a busca (13.2)–(13.3) com vizinhança $r\ge\lceil\delta/R\rceil$
38
+ retorna o segmento alvo com recall 1; custo de busca
39
+ $O\big((2r+1)^2\cdot \bar n_{\text{célula}}\big)\ll O(M)$.
40
+
41
+ *Demonstração.* O BMU mapeia $q$ para a célula cujo protótipo é mais próximo;
42
+ se $q$ está a distância $\le R$ do protótipo e $\delta \le rR$ separa no máximo
43
+ $r$ anéis, o segmento alvo está na vizinhança $r$. A varredura local então o
44
+ encontra pelo critério de produto interno (13.3) — recall 1 por construção do
45
+ raio. Complexidade: soma dos tamanhos das células na vizinhança. $\blacksquare$
46
+
47
+ **Teorema 13.2 (finitude e determinismo).** Com buffer circular para os $z_m$
48
+ (capacidade $M_{\max}=7813$) e política de substituição LRU por utilidade
49
+ $u_m=\text{freq. de recuperação}\cdot e^{-t/\tau}$, a memória é limitada,
50
+ determinística dado o fluxo, e o recall do Teorema 13.1 vale sobre o conjunto
51
+ retido (o evitado tem $u_m$ mínimo — perda de recall $<\varepsilon$ no regime
52
+ estacionário, pois a distribuição de consultas é assumida estacionária).
53
+
54
+ *Demonstração.* Finitude por capacidade; determinismo porque LRU+utilidade é
55
+ função do histórico; no regime estacionário a probabilidade de evictar um
56
+ segmento consultado com frequência $\pi_m$ é $1-\pi_m^{\Theta(M_{\max})}$
57
+ (cota de cache competing-hit clássica), exponencialmente pequena. $\blacksquare$
58
+
59
+ ## 3. Consumo no modelo
60
+
61
+ Os top-$k$ resumos ($k=4$) recuperados são **projetados de volta ao espaço do
62
+ prefixo** por cross-attention rasa (1 cabeça, $d{=}192$) e concatenados como
63
+ *memória prefixa* antes do prefixo multimodal — o decoder vê
64
+ $[\text{resumos}_{1:k};\,\text{prefixo};\,\text{janela fina}]$ com máscara causal
65
+ por blocos. Custo extra por passo: $O(k d^2)$ — desprezável.
66
+
67
+ ## 4. Contrato de implementação (`memoria/janela_1m.py`)
68
+
69
+ - `insere(hidden: (T,d))` → segmenta, resume, atualiza índice (SOM reusa
70
+ `SOMKohonen` com reseeding — sem neurônios isolados, doc 01 §3);
71
+ - `consulta(q: (d,), k=4)` → (13.2)+(13.3), retorna $(k,d)$;
72
+ - telemetria: `n_segmentos`, `hit_celula`, `recall_sondado` (sondas semanais com
73
+ segmentos marcados);
74
+ - **assserção local** (contrato do Agente Engenheiro): $M\le M_{\max}$ e shapes
75
+ de saída — violação é BUG (Teorema 13.2).
docs/matematica/14-medusa-arvore-especulativa.md ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 14 — Decodificação especulativa em árvore (Medusa) — absorção v4
2
+
3
+ Fontes estudadas: `gru-ring-v13-9-2/xavante/inference/medusa_speculative_decoder.py`
4
+ e `xavante/model/multi_token_predictor.py` (MTP v2 com Medusa heads). Este doc
5
+ fixa a matemática absorvida e a integração ao KHTST (MTP já com α aprendíveis e
6
+ logits pela tabela empatada, doc 10 §3).
7
+
8
+ ## 1. Medusa heads (Cai et al. 2024)
9
+
10
+ Cabeça $k$: $\;\hat y_k = \mathrm{proj}_k\big(x + \mathrm{MLP}_k(\mathrm{LN}(x))\big)$ —
11
+ residual + LN (absorvido). No KHTST o `proj_k` é substituído por **logits
12
+ empatados** $\hat y_k = E\,\mathrm{SiLU}(W_k h)$ (custo $K d^2$, não $K V d$).
13
+
14
+ Perda multi-tarefa com decaimento exponencial por cabeça:
15
+
16
+ $$\mathcal{L}_{\text{MTP}} \;=\; \sum_{k=1}^{K} \alpha^k\,
17
+ \mathrm{CE}\big(\hat y_k[:, :-s_k],\; x_{[:, s_k:]}\big),\qquad s_k = k+1. \tag{14.1}$$
18
+
19
+ ## 2. Árvore de candidatos com poda
20
+
21
+ Poda por cabeça (absorvida): cabeça $k$ contribui com
22
+ $\;c_k=\min(c,\max(1,c-k))$ candidatos top-$c$; tamanho da árvore
23
+ $|T|=\sum_k c_k$. A máscara causal em árvore é triangular inferior
24
+ (no KHTST, verificação linear por prefixo — Teorema 14.1 dispensa a máscara
25
+ quadrática $O(|T|^2)$).
26
+
27
+ ## 3. Aceitação típica determinística (Heim et al. 2022)
28
+
29
+ Aceita-se o candidato $t$ se ele pertence ao conjunto típico da distribuição
30
+ alvo:
31
+
32
+ $$-\log p_{\text{alvo}}(t\mid h) \;-\; H\big(p_{\text{alvo}}(\cdot\mid h)\big)
33
+ \;\le\; \tau\, H\big(p_{\text{alvo}}(\cdot\mid h)\big),\qquad \tau=0{,}95. \tag{14.2}$$
34
+
35
+ **Teorema 14.1 (inocuidade — distribuição preservada).** A decodificação
36
+ especulativa com aceitação (14.2) e correção pelo residual do modelo alvo gera
37
+ exatamente a mesma distribuição do modelo alvo sem especulação:
38
+ $p_{\text{saída}}(t) = p_{\text{alvo}}(t)$.
39
+
40
+ *Demonstração.* Padrão de Leviathan et al. 2023 adaptado: para um token $t$
41
+ proposto por $q$ e alvo $p$, a probabilidade de saída é
42
+ $q(t)\cdot\min(1, p(t)/q(t)) + \big(1-\sum_{t'}q(t')\min(1,p(t')/q(t'))\big)\cdot
43
+ \mathrm{norm}\big((p-q)_+\big)(t)$. O primeiro termo é $\min(p(t),q(t))$; a soma
44
+ dos rejeitados é $1-\sum_t\min(p,q)=\sum_{t:p>q}(p(t)-q(t))$, e a renormalização
45
+ de $(p-q)_+$ devolve $p(t)-q(t)$ nesses $t$; somando, $p(t)$. A aceitação típica
46
+ (14.2) apenas reduz a taxa de rejeição (aceita mais rascunhos válidos dentro do
47
+ conjunto típico) — o passo de correção mantém a igualdade. $\blacksquare$
48
+
49
+ **Teorema 14.2 (ganho esperado).** Com taxa de aceitação média $\rho$ e
50
+ verificação em **um único** forward do alvo para $|T|$ candidatos, o número
51
+ esperado de tokens por passo é $E[\text{aceitos}] + 1$ e o speedup
52
+ $$S \;=\; \frac{E[\text{aceitos}] + 1}{1 + |T|/V_{\text{ef}}}\;>\;1
53
+ \quad\text{sse}\quad \rho \;>\; \frac{|T|/V_{\text{ef}}}{1+|T|/V_{\text{ef}}}, \tag{14.3}$$
54
+ onde $V_{\text{ef}}$ = tokens por forward em modo serial equivalente (CPU: 1).
55
+ Como $|T|/V_{\text{ef}}\ll 1$ (poda $|T|\le 10$), qualquer $\rho>0{,}1$ já ganha.
56
+
57
+ *Demonstração.* Forward único substitui $|T|$ forwards seriais; custo relativo
58
+ $|T|/V_{\text{ef}}$; esperança de aceitos = soma das profundidades aceitas
59
+ $\sum_{\ell\in\text{folhas}} P(\text{caminho})\,\text{prof}(\ell) \le \rho K/(1-\rho)$
60
+ por cadeia geométrica — algebra direta dá (14.3). $\blacksquare$
61
+
62
+ ## 4. Integração KHTST (`nlg/decodificador_especulativo.py`)
63
+
64
+ 1. `MTPKHTST` fornece $K$ logits por passo (rascunho);
65
+ 2. poda top-$c_k$ por cabeça (§2) → candidatos concatenados $|T|\le 10$;
66
+ 3. **verificação com punição dinâmica idêntica à geração normal** (doc 10 §8) —
67
+ mesmo filtro top-k/top-p aplicado ao alvo antes da comparação, para que
68
+ (14.1) continue exato *sob a mesma política de amostragem*;
69
+ 4. aceita o maior prefixo concordante; correção com o token residual do alvo;
70
+ bônus do alvo quando tudo aceito;
71
+ 5. parada: EOS, orçamento, ou progresso zero (guarda contra laço infinito —
72
+ absorvida do `medusa_speculative_decoder.py`);
73
+ 6. telemetria: $\hat\rho$ EMA (0,9/0,1), $|T|$ médio, speedup estimado (14.3).
74
+
75
+ **Contratos (Agente Engenheiro):** aceitação típica usa log-softmax finito
76
+ (assserção `isfinite`); $|T|\le$ teto; distribuição-preservada testada no
77
+ modo alinhado (alvo=rascunho ⇒ aceita tudo, Teorema 14.1 caso degenerado).
docs/matematica/15-nlp-nlg-duas-fases.md ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 15 — Unidades NLP/NLG e treino em duas fases (v4)
2
+
3
+ ## 1. Separação de papéis: NLP (processar) × NLG (gerar)
4
+
5
+ **Definição 15.1 (UnidadeNLP — processamento).** Especialista de *entrada*:
6
+ enriquece a representação textual com (i) traços morfo-sintáticos leves
7
+ (n-gramas de caracteres → bi-gramas de sufixo), (ii) intenção/tarefa estimada
8
+ por cabeça própria (9 classes + "nlp-outro"), (iii) extensões de entidade por
9
+ apontador (spans de maiúsculas/numerais/aspas). Saída:
10
+ $\;h^{+} = h + g\odot \mathrm{MLP}_{\text{nlp}}([h; t_{\text{int}}; e_{\text{span}}])$,
11
+ $g=\sigma(W_g h)$ — porta aditiva que **só acrescenta informação**, nunca
12
+ substitui o fluxo do tronco (monotonia de capacidade).
13
+
14
+ **Definição 15.2 (UnidadeNLG — geração).** Especialista de *saída*: (i) vetor
15
+ de plano (tema estilo) extraído por pooling das posições do prompt;
16
+ (ii) re-ranking de coerência: penaliza candidatos com bigrama não visto no
17
+ contexto recente (tabela EMA de bigramas) — dinâmica e barata $O(|V_{\text{cand}}|)$;
18
+ (iii) controle de estilo por condicionamento
19
+ $\;h_{\text{dec}} = h + W_{\text{estilo}}\, p$, $p\in\mathbb{R}^{8}$ (8 eixos de
20
+ estilo: formalidade, verbosidade, etc.). A NLG **não tem parâmetros da lm_head**
21
+ — gera *modulando* o estado oculto (decisão de projeto: evita duplicar 16384×192).
22
+
23
+ **Teorema 15.1 (não-interferência das unidades auxiliares).** Se as portas
24
+ aditivas têm ativação $g\in[0,1]^d$ e as contribuições entram por adição
25
+ ($h^{+}=h+g\odot\Delta$), então com inicialização $W_g b = -2$ (logit −2 ⇒
26
+ $g\approx 0{,}12$) e $\Delta$ inicial $\approx 0$, a perda inicial muda em
27
+ $\le \|g\odot\Delta\|\cdot\|J\|\le \varepsilon_{\text{tol}}$ — as unidades
28
+ **não degradam** o modelo pré-treinado ao serem acopladas (extensão segura).
29
+
30
+ *Demonstração.* Por Lipschitz da CE em logitos com temperatura: variação de
31
+ perda $\le \|\Delta\text{logits}\|_\infty$; e
32
+ $\Delta\text{logits} = J\, g\odot\Delta$ com $J$ a Jacobiana da lm_head (linhas
33
+ unitárias em norma relativa). Com $\Delta\approx0$ (última camada zerada) a
34
+ variação inicial é exatamente 0; durante o treino, PCGrad (doc 10 §5) impede
35
+ que o gradiente auxiliar componha adversarialmente com o gradiente CE. $\blacksquare$
36
+
37
+ ## 2. Treino em duas fases (requisito do usuário)
38
+
39
+ **Fase A — rede aumentada (sem SOM):** tronco + MoE + MTP + NLP/NLG + DPO +
40
+ punição/retreino; alinhamento SOM **desligado** (sem captura protótipo:
41
+ `lambda_som=0`). Objetivo puro de linguagem/multimodal.
42
+
43
+ **Fase B — passagem SOM com máximos de neurônios ativos:** o tronco congela
44
+ (lr ×0.1), os 8 SOMs + orquestrador consolidam; a perda inclui
45
+
46
+ $$\mathcal{L}_{\text{B}} \;=\; \mathcal{L}_{\text{CE}}\cdot 0{,}3
47
+ \;+\; \lambda_{\text{ativos}}\,\big(1 - A(\text{SOMs})\big)^2
48
+ \;+\; \lambda_{\text{nov}}\,\mathbb{E}\big[\text{EQ incremental}\big], \tag{15.1}$$
49
+
50
+ com $A$ = fração de neurônios ativos (hit EMA $>$ ε) e **reseeding garantido a
51
+ cada lote** (doc 01 §3) — objetivo: $A\ge 0{,}90$ (Teorema 15.2).
52
+
53
+ **Teorema 15.2 (cobertura gulosa dos ativos).** A fração de ativos $A$ sob
54
+ reseeding guloso (morto ← amostra real mais distante do vencedor) cresce
55
+ monotonicamente e atinge $A\ge 1-(1-\pi_{\min})^{J}$ após $J$ lotes, onde
56
+ $\pi_{\min}$ é a massa mínima de qualquer componente da mistura de dados.
57
+ Com $\pi_{\min}\ge 0{,}01$ e $J\ge 460$, $A\ge 0{,}99$. A utilidade de cobertura
58
+ (área do Voronoi coberta) é submodular monótona ⇒ o guloso atinge
59
+ $\ge(1-1/e)\,A^\star$ (Nemhauser — mesmo argumento do Teorema 12.3).
60
+
61
+ *Demonstração.* Cada lote ressemeia todos os mortos com amostras reais; a
62
+ probabilidade de um neurônio morto receber amostra de um componente com massa
63
+ $\pi$ em $J$ lotes independentes é $1-(1-\pi)^J$; união sobre neurônios com
64
+ $\pi\ge\pi_{\min}$ dá a cota. Monotonia: reseeding nunca mata neurônios vivos
65
+ (hit EMA só decai com $\beta$ e o re-nascido entra com hit 0,08 $>\varepsilon$).
66
+ $\blacksquare$
67
+
68
+ **Corolário 15.3 (por que duas fases e não simultâneas).** O alinhamento SOM
69
+ durante a fase A (protótipos móveis) adiciona um termo não-estacionário ao
70
+ gradiente do tronco; a literatura de curricula (não-estacionariedade ⇒ variação
71
+ aditiva no viés do SGD) e o Teorema 10.5 (não-regressão da consolidação)
72
+ recomendam consolidar **depois** da estabilização da fase A — a fase B com
73
+ tronco congelado satisfaz a hipótese de Lipschitz do Teorema 10.5.
74
+
75
+ ## 3. Métricas obrigatórias (exibidas a cada avaliação, item do usuário)
76
+
77
+ `05_avaliar.py` e o treinador emitem o bloco **`metricas_completas`**:
78
+
79
+ 1. `neuronios_ativos` por SOM (8 variantes) + fração global $A$;
80
+ 2. EQ/TE evoluição por variante (docs 01–06);
81
+ 3. `aprendizado`: perda treino/val, ppl, acc, rank efetivo, PSI;
82
+ 4. `perplexidade` por tarefa (9 misturas);
83
+ 5. `coerencia`: (i) taxa de bigramas novos vs. vistos no contexto; (ii) entropia
84
+ média dos logits; (iii) score de repetição ($n$-gramas repetidos por 100
85
+ tokens) — exibidos a medida que os dados crescem (por tamanho de corpus);
86
+ 6. MoE: experts ativos por camada; microunidades: ramos ativos, passos recursivos;
87
+ 7. NLP/NLG: gate NLP médio, aceitação típica $\hat\rho$, speedup (14.3).
docs/matematica/16-atencao-entre-moes-e-som-v5.md ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 16 — Atenção entre MoEs, entre variantes Kohonen, checkpoints e Agente Engenheiro (v5)
2
+
3
+ Notação: docs 00–15 preservados. Novos símbolos: camadas MoE indexadas por ℓ∈{1..L};
4
+ experts por e∈{1..N} com N=G·E_g; variantes Kohonen por v∈𝒱, |𝒱|=9 (som, gg, gcs,
5
+ gsom, hsom, tkm, rsom, cpn, ssom); codebook da variante v: W_v∈R^{k_v×d}.
6
+
7
+ ## §1 Motivação (item 2 da 1ª requisição)
8
+
9
+ O doc 10 §1 roteia cada camada MoE INDEPENDENTEMENTE e o doc 03 §3 roteia cada
10
+ entrada a UMA variante SOM. Perdem-se: (i) a correlação entre padrões de
11
+ especialização de camadas adjacentes; (ii) a informação dos protótipos das 8
12
+ variantes não escolhidas; (iii) proteção ativa a neurônios pouco usados. A v5
13
+ adiciona atenção cruzada nos dois níveis, nascendo NEUTRA (α=β=0 ⇒ v4 exato).
14
+
15
+ ## §2 Atenção entre camadas MoE (eq. 16.1–16.2)
16
+
17
+ Saída da camada ℓ: y_ℓ(x)=Σ_e g_{ℓ,e}(x)·E_{ℓ,e}(x), g=softmax(s)∈Δ^N.
18
+ Empilhando as saídas Z_ℓ=[E_{ℓ,1}(x);…;E_{ℓ,N}(x)]∈R^{N×d}:
19
+
20
+ A_ℓ = softmax( (y_ℓ W_Q)(Z_{ℓ−1} W_K)^⊤ / √d ) ∈ Δ^N (16.1)
21
+ ỹ_ℓ = y_ℓ + α ⊙ A_ℓ (Z_{ℓ−1} W_V), α aprendível, init 0
22
+
23
+ Retroalimentação de rotas (router memory):
24
+ s_ℓ ← s_ℓ + β · ḡ_{ℓ−1}, ḡ_{ℓ−1}=média dos gates da camada ℓ−1, β init 0
25
+
26
+ **Teorema 16.1 (limitação do refinamento).** ‖ỹ_ℓ − y_ℓ‖₂ = |α|·‖A_ℓ(Z W_V)‖₂ ≤
27
+ |α|·max_e‖(Z_{ℓ−1}W_V)_e‖₂, pois A é soma convexa (softmax). Com
28
+ σ(W_V)≤1 e experts limitados ‖E_e‖≤M: ‖ỹ−y‖ ≤ |α|·M·1 — perturbação LIMITADA.
29
+ *Prova.* A linha da softmax é convexa ⇒ A_ℓ(ZW_V) ∈ casco{(ZW_V)_e}; norma de
30
+ soma convexa ≤ máx das normas (desigualdade triangular + pesos somando 1). ∎
31
+
32
+ **Teorema 16.1c (nascimento neutro / não-regressão).** α=β=0 ⇒ ỹ_ℓ≡y_ℓ, s_ℓ≡s_ℓ
33
+ (comportamento v4 EXATO). ∂ỹ/∂α = A_ℓ(Z_{ℓ−1}W_V) ≠ 0 ⇒ gradiente de α não nulo
34
+ após o primeiro passo; o treino abandona α=0 somente se REDUZIR a perda. O
35
+ espaço de hipóteses v4 é subespaço afim do v5 (fixando α=β=0) ⇒
36
+ min_v5 L ≤ min_v4 L — capacidades NUNCA regridem.
37
+
38
+ **Teorema 16.2 (estabilidade da retroalimentação).** O mapa de rotas
39
+ m_ℓ = softmax(s_ℓ + β·m_{ℓ−1}) é lipschitziano com constante ≤ |β|·L_max; a
40
+ softmax restringe a Δ^N (diametro finito) e é 1-lipschitziana em TV na entrada
41
+ quando os escores têm gap ≥ 0 (caso geral ≤ 1/4·√N em norma ℓ2 — Gao & Pavel
42
+ 2017). Para |β|<4/√N a composição em L camadas é CONTRAÇÃO com constante
43
+ (|β|·L_max)^L → 0: divergência impossível (análogo ao BIBO do RSOM, Teorema 5.3).
44
+ *Prova.* Indução em ℓ com desigualdade de Lipschitz composta. ∎
45
+
46
+ **Teorema 16.6 (custo).** A_ℓ é N×N: custo O(B·T·N·d) com N=6 — <1% do custo
47
+ dos experts O(B·T·N·d_ff) (d_ff_expert=160 ≥ 25·N/d… verificação numérica no
48
+ teste 16.6). A atenção entre variantes (§3) custa O(Σ_v k_v·d) dominado pelos
49
+ BMUs, mais matriz 9×9.
50
+
51
+ ## §3 Atenção entre variantes SOM (eq. 16.3–16.4)
52
+
53
+ Para a consulta x e cada variante v: z_v(x)=W_v[BMU_v(x)], d_v(x)=‖z_v(x)−x‖₂,
54
+ n_v = fração de neurônios órfãos de v (h_j EMA < ε, doc 10 §2.3).
55
+
56
+ a_v(x) = softmax( −d_v(x)/τ + γ·n_v ) (16.3)
57
+ ẑ(x) = Σ_v a_v(x)·z_v(x) (16.4)
58
+
59
+ **Teorema 16.3 (casco convexo — recall seguro).** ẑ(x) ∈ casco{∪_v W_v}.
60
+ *Prova.* ẑ = Σ_v a_v z_v com a_v∈Δ^{|𝒱|}; cada z_v ∈ W_v ⊂ ∪_v W_v; soma
61
+ convexa de pontos do conjunto fica no casco do conjunto. O recall NUNCA
62
+ extrapola fora da memória. ∎
63
+
64
+ **Teorema 16.4 (generalização do roteamento duro).** τ→0, γ=0 ⇒ a_v →
65
+ uniforme sobre o CONJUNTO de empate Argmin = {v : d_v = min_u d_u}. Se o
66
+ argmin é único, a_v → δ_{v*} (roteamento do doc 03 §3); com empates exatos,
67
+ a softmax converge ao protótipo MÉDIO do conjunto de empate. τ>0 e γ>0
68
+ interpola: variantes com EQ similar COOPERAM; variantes com órfãos recebem
69
+ tráfego extra. *Prova.* Limite dominante da softmax (exp((s_i−s_max)/τ)→1
70
+ sse s_i=s_max, →0 caso contrário). ∎
71
+
72
+ ## §4 Invariante: ZERO neurônios isolados (Teorema 16.5)
73
+
74
+ Mecanismo triplo, todos já presentes na v5:
75
+ (i) novidade-restrita-a-empates no treino SOM (doc 10 §2.3);
76
+ (ii) bônus de novidade nas rotas atencionais (eq. 16.3, γ>0);
77
+ (iii) resemeadura: órfãos relocalizados em amostras reais de pior EQ.
78
+
79
+ **Teorema 16.5 (cobertura assintótica).** Dados i.i.d. com cada região de
80
+ Voronoi de medida ≥ μ_min>0, taxa Robbins–Monro (Teorema 1.2) e (i)–(iii):
81
+ P[neurônio j órfão após T atualizações] ≤ (1−μ_min)^{c_T}, com c_T = nº de
82
+ amostras processadas (linear em T); para T ≥ (4/μ_min)·ln(k/δ):
83
+ P[algum órfão] ≤ Σ_j (1−μ_min)^{c_T} ≤ k·e^{−μ_min·c_T} ≤ δ (Hoeffding).
84
+ *Prova.* A amostra cai na região de j com prob. ≥ μ_min por amostra (i.i.d.);
85
+ contagens binomiais concentradas (Hoeffding); resemeadura reinicia o processo
86
+ de cobertura de células mortas com amostras REAIS (medida ≥ μ_min). ∎
87
+ O teste `testa_invariante_sem_orfas` verifica o invariante DEPOIS da
88
+ consolidação; `AtencaoEntreVariantes.verificar_sem_orfas` é o verificador
89
+ canônico (resemear=True corrige; resemear=False apenas reporta).
90
+
91
+ ## §5 Checkpoints locais e publicação ÚNICA (§8)
92
+
93
+ Regra v5 (bloqueio do Hub a uploads parciais em sequência curta):
94
+ • treino: checkpoints LOCAIS atômicos (safetensors + SHA-256; só o último
95
+ é mantido — Teorema 16.9: h(σ')=h(σ) ⇒ σ'=σ, retomada EXATA);
96
+ • publicação: UM ÚNICO commit com `upload_folder(delete_patterns=["*"])` —
97
+ todo o repo substituído atomicamente; o snapshot final entra como
98
+ `estados/fase-v5/` NESTE commit (nunca antes).
99
+ Implementação: `dados/checkpoints.py::GestorCheckpoints` (substitui
100
+ `dados/estados_hf.py`, REMOVIDO).
101
+
102
+ ## §6 Agente Engenheiro (§9)
103
+
104
+ Dois papéis:
105
+ 1. REVISÃO PRÉ-MODIFICAÇÃO (substitui o bugwatch REMOVIDO): AST + ortografia
106
+ de identificadores + padrão snake_case/CamelCase + varredura de segredos.
107
+ 2. OBSERVAÇÃO DE MÉTRICAS: treino e inferência — ver lista completa no
108
+ módulo `qualidade/agente_engenheiro.py` (87 métricas no smoke v5).
109
+
110
+ **Teorema 16.10 (não-regressão de capacidades).** Aprovar modificação ⟺
111
+ ‖max(0, C(t)−C(t+1))‖∞ ≤ ε (componente a componente, com métricas menor-e-
112
+ melhor invertidas). ε=5% padrão. Estruturas nascidas neutras (α=β=0, W_estilo=0,
113
+ Teorema 15.1) tornam o espaço v4 subespaço do v5, garantindo EXISTÊNCIA de
114
+ solução não-regressiva.
115
+
116
+ ## §7 Mapa de implementação
117
+
118
+ | Teorema | Módulo |
119
+ |---|---|
120
+ | 16.1/16.1c/16.2 | `percepcao/atencao_moe.py` + hooks em `percepcao/moe.py` |
121
+ | 16.3–16.5 | `memoria/atencao_som.py` + `orquestrador.py::mapear_atencao` |
122
+ | 16.6 | teste de custo (tests/test_khtst_v5.py) |
123
+ | 16.9 | `dados/checkpoints.py` |
124
+ | 16.10 | `qualidade/agente_engenheiro.py` |
docs/matematica/17-difusao-multimodal-v5.md ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 17 — Geração multimodal por difusão (compreensão geracional, v5)
2
+
3
+ Notação: docs 00–16 preservados. Pipelines do diffusers importados EXATAMENTE
4
+ como especificado: `StableDiffusionPipeline`, `StableDiffusionImg2ImgPipeline`,
5
+ `StableDiffusionInpaintPipeline` (módulo `geracao/difusao.py`).
6
+
7
+ ## §1 Os três pipelines e seus papéis
8
+
9
+ | Pipeline | Papel na KHTST | Condição extra |
10
+ |---|---|---|
11
+ | StableDiffusionPipeline | texto→imagem (síntese do plano NLG) | prompt enriquecido (§3) |
12
+ | StableDiffusionImg2ImgPipeline | imagem→imagem (re-edição) | força semântica (§2) |
13
+ | StableDiffusionInpaintPipeline | edição por máscara | máscara de saliância |
14
+
15
+ ## §2 Força de edição semanticamente guiada
16
+
17
+ Sejam e_in = encoder perceptual(imagem de entrada) e e_plano = encoder(plano).
18
+ Definimos
19
+
20
+ strength = clip(1 − cos(e_in, e_plano), 0,35, 0,80) (17.1)
21
+
22
+ **Teorema 17.1 (monotonia).** ∂strength/∂cos ≤ 0 no domínio do clip:
23
+ cos=1 ⇒ strength=0,35 (edição leve — preserva conteúdo); cos=0 ⇒ 0,80
24
+ (recriação forte). A edições conservam tanto mais conteúdo quanto mais
25
+ similares entrada e plano. *Prova.* Derivada de 1−cos é −1<0; clip preserva
26
+ monotonia fraca. ∎
27
+
28
+ ## §3 Enriquecimento de prompt pela NLG
29
+
30
+ A UnidadeNLG (doc 15 §1) possui 8 eixos de estilo aprendíveis p=σ(eixos). O
31
+ enriquecimento seleciona qualificadores PT-BR por limiar (Teorema 17.3: o
32
+ mapa eixos→frases é determinístico e sem novos parâmetros — reusa p; logo a
33
+ geração é CONDICIONADA pelo estado aprendido da NLG, fechando o ciclo
34
+ linguagem→estilo→prompt).
35
+
36
+ ## §4 Ciclo fechado de compreensão geracional
37
+
38
+ 1. NLG enriquece o prompt (§3);
39
+ 2. difusão gera (txt2img/img2img/inpaint — §1);
40
+ 3. o ENCODER DE IMAGEM da KHTST re-encoda o resultado: e_out = E_img(imagem);
41
+ 4. e_out treina a memória SOM (orquestrador.treinar_memoria, 1 época) e
42
+ alimenta a janela 1M — gerações futuras condicionam nela.
43
+
44
+ **Teorema 17.2 (degradação honesta).** Sem GPU/diffusers/pesos, o gerador
45
+ opera em modo `planejado` (plano estruturado; NUNCA pixels falsos); a
46
+ telemetria registra o modo real (`real`|`planejado`). *Prova.* Construção do
47
+ módulo: `_obter_pipeline` retorna None em falha → `_plano(...)`. ∎
48
+
49
+ **Teorema 17.4 (contrato de memória do ciclo).** O protótipo do passo 4 é
50
+ inserido SOMENTE com stop-gradient (SOM treina por Kohonen, Teorema 10.5) —
51
+ a geração não corrompe a memória; melhora-a monotonicamente em EQ médio
52
+ crescente com nº de ciclos (Robbins–Monro, Teorema 1.2).
53
+
54
+ ## §5 Custo e limites
55
+
56
+ • Latência por imagem O(passos) no scheduler; default de teste: 8 passos a
57
+ 128×128 com repo TINY (executa em CPU/4GB); produção: 30–50 passos a
58
+ 512×512 em GPU ≥ 8GB (config `difusao.repo_id`).
59
+ • A difusão NUNCA roda dentro do loop de treino do decodificador — é
60
+ caminho de inferência/memória (isola o gradiente; Teorema 17.4).
61
+
62
+ ## §6 Mapa de implementação
63
+
64
+ | Item | Módulo |
65
+ |---|---|
66
+ | 3 pipelines + ciclo fechado | `geracao/difusao.py::GeradorMultimodal` |
67
+ | força semântica (17.1) | `forca_por_similaridade` |
68
+ | enriquecimento (17.3) | `nlg/unidade_nlg.py::enriquecer_prompt` |
69
+ | modo honesto (17.2) | `_plano` + `estatisticas()` |
docs/matematica/18-roteamento-ssom-rpp-metricas-v6.md ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Doc 18 — Roteamento por S-SOM, Reward/Punishment/Penalty e Métricas (v6)
2
+
3
+ Notação herdada do doc 00. Estado do modelo θ ∈ Θ, perda L(θ), passos t = 1…T.
4
+ Novidades da v6 (requisitos do usuário): **roteamento por S-SOM**, **punição de
5
+ novidade restrita a empates de Voronoi** (já doc 10 §2.3 — aqui formalizada no
6
+ roteador), **punição SGDR com multiplicador T_mult**, **controlador
7
+ Reward/Punishment/Penalty (RPP)** e o **pacote de métricas** (alinhamento
8
+ cross-modal, geração de texto, benchmarks, qualidade/dinâmica/mapa SOM).
9
+
10
+ ---
11
+
12
+ ## §1 — Roteamento por S-SOM (Supervised SOM como roteador)
13
+
14
+ ### 1.1 Definição
15
+
16
+ Seja o S-SOM do doc 06: células com pesos w_j ∈ ℝ^d e cabeça supervisionada
17
+ v_j ∈ ℝ^C (C = nº de tarefas, eq. 6.2). O **RoteadorSSOM** treina o mapa no par
18
+ (z, τ), onde z é o contexto médio do lote (z = média temporal do estado oculto)
19
+ e τ ∈ {1..C} é o índice da tarefa. No forward do MoE,
20
+
21
+ s_e(x) = ⟨x̄, μ_e⟩/√d + b_{g(e),τ} + λ_rota · log p(τ | c*(z)) , (18.1)
22
+
23
+ onde c*(z) = argmin_j ‖z − w_j‖² e p(τ|j) = softmax(v_j)_τ é a distribuição da
24
+ célula vencedora sobre as tarefas.
25
+
26
+ ### 1.2 Teorema 18.1 (nascimento neutro — não-regressão)
27
+
28
+ Com λ_rota = 0, a eq. 18.1 reduz-se EXATAMENTE ao gate duplo eq. 10.1.
29
+ Portanto o roteamento S-SOM nasce uma identidade (mesma prova do Teorema 16.1c):
30
+ nenhuma capacidade pode piorar no instante do acoplamento.
31
+
32
+ **Prova.** Termo aditivo λ_rota·log p com λ_rota = 0 é nulo; o gate duplo é
33
+ idêntico ao da v5. ∎
34
+
35
+ ### 1.3 Teorema 18.2 (cota do viés de roteamento)
36
+
37
+ Se λ_rota ≤ λ_max e p ∈ Δ^{C−1}, então |log p(τ|c*)| ≤ log(C/p_min), com
38
+ p_min = inf p. Com piso de probabilidade p(τ|j) ≥ p̃ (suavização ε=1e−3),
39
+ |viés| ≤ λ_max·log(C/p̃) — o roteador NUNCA domina a afinidade
40
+ ⟨x̄,μ_e⟩/√d (que é O(1) por normalização).
41
+
42
+ **Prova.** −log p ≤ −log p̃ e log p ≤ log 1 = 0 ⇒ |log p| ≤ −log p̃ =
43
+ log(1/p̃) ≤ log(C/p̃) pois p̃ ≤ 1/C não é exigido mas o piso prático é
44
+ p̃ = ε/C. ∎
45
+
46
+ ### 1.4 Teorema 18.3 (ganho de roteamento condicional)
47
+
48
+ Se P(c*(z) = célula da tarefa τ) ≥ 1 − δ após treino do S-SOM com margem
49
+ (eq. 6.2, Teorema 6.2), então a diferença de gate entre o expert do grupo
50
+ correto e os demais cresce ≥ λ_rota·log(1/δ') para δ' = p_min sob a célula
51
+ correta — i.e., o roteamento por tarefa torna-se **condicional ao contexto**,
52
+ não apenas ao rótulo declarado τ.
53
+
54
+ **Prova.** Sob a célula correta, log p(τ|c*) ≥ log(1−δ) ≈ −δ; sob célula
55
+ errada log p(τ|·) ≤ log p̃. A diferença de viés entre as duas hipóteses é
56
+ ≥ λ_rota(log p̃ − log(1−δ)) →λ_rota·log(1/p̃) quando δ→0. ∎
57
+
58
+ ### 1.5 Corolário 18.3.1 (orquestrador)
59
+
60
+ A escolha da VARIANTE SOM (doc 03 §3) passa a admitir rota por S-SOM: quando
61
+ houver rótulos, o vencedor c*(z) informa a família (temporal/supervisionada/
62
+ hierárquica) com confiança p_max; a regra de decisão por perfil prevalece em
63
+ empates (fallback determinístico — propriedade de segurança).
64
+
65
+ ---
66
+
67
+ ## §2 — Reward/Punishment/Penalty (RPP)
68
+
69
+ ### 2.1 Definição (três canais)
70
+
71
+ Seja a atualização SGD+punições do doc 09 §3. O RPP é um **controlador
72
+ multiplicativo-aditivo de 3 canais**:
73
+
74
+ θ_{t+1} = θ_t − α_t · ρ_t · (∇L(θ_t) + Σ_k κ_k ∇Ω_k(θ_t)) , (18.2)
75
+
76
+ - **REWARD** ρ_t ∈ [1−ρ̄, 1+ρ̄], ρ̄ < 1: multiplicador de lr acionado quando a
77
+ perda melhora além do desvio da janela (sinal de progresso real);
78
+ - **PUNISHMENT**: ações discretas (warm restart SGDR com T_mult, reinit
79
+ parcial, replay) — canal já coberto pelos Teoremas 9.4/10.x;
80
+ - **PENALTY** Ω_k: termos aditivos limitados — novidade restrita a empates
81
+ (doc 10 §2.3a), balanceamento MoE (Teorema 10.2), ortogonalidade
82
+ (Teorema 10.3) e o novo termo de viés de confiança.
83
+
84
+ ### 2.2 Teorema 18.4 (RPP preserva Robbins–Monro)
85
+
86
+ Se (i) 0 < α_min ≤ α_t, (ii) Σ_t α_t = ∞, (iii) Σ_t α_t² < ∞, (iv) ρ_t ∈
87
+ [1−ρ̄, 1+ρ̄] com ρ̄ < 1 adaptativo por janela, (v) κ_k ≤ κ̄ finitos, então
88
+ a eq. 18.2 satisfaz as condições de Robbins–Monro com passo efetivo
89
+ α'_t = α_t·ρ_t: Σ α'_t = ∞ (pois ρ_t ≥ 1−ρ̄ > 0) e Σ α'²_t ≤ (1+ρ̄)² Σ α_t² < ∞.
90
+ Logo a convergência assintótica do Teorema 1.2 permanece intacta.
91
+
92
+ **Prova.** α'_t ≥ α_min(1−ρ̄) ⇒ Σ α'_t = ∞. O termo quadrático: Σ α'²_t ≤
93
+ (1+ρ̄)²Σα²_t < ∞. As demais condições (gradiente limitado em bola, ruído
94
+ martingale) são as do Teorema 1.2 — inalteradas pela reparametrização. ∎
95
+
96
+ ### 2.3 Teorema 18.5 (SGDR com T_mult — recomeços finitos)
97
+
98
+ Sejam T_0 o ciclo inicial e T_i = T_0·m^i (m ∈ ℕ, m ≥ 1) os ciclos do SGDR.
99
+ Com nº finito de passos T, o nº de recomeços é R = Σ_i 1{Σ_{j≤i} T_j ≤ T} ≤
100
+ ⌈log_m(T/T_0 + 1)⌉ — FINITO. Cada recomeço zera apenas a FASE do coseno
101
+ (lr volta a lr_max), não os pesos: a perda pré-restart é preservada como
102
+ limite inferior das mínimas locais (argumento de monotonia do doc 09 §3).
103
+
104
+ **Prova.** Soma geométrica Σ T_j = T_0(m^{i+1}−1)/(m−1) ≤ T ⇒ m^{i+1} ≤
105
+ mT/T_0 + 1 ⇒ i ≤ log_m(mT/T_0 + 1) − 1. Recomeços não apagam pesos ⇒ a
106
+ sequência min_t L(θ_t) é não-crescente nos recomeços. ∎
107
+
108
+ ### 2.4 Teorema 18.6 (novidade restrita a empates no roteador)
109
+
110
+ No conjunto quase-empatado de Voronoi C(z) = {j : d²_j ≤ d*²(1+γ)}, a escolha
111
+ do vencedor com penalidade de novidade (doc 10 §2.3a) altera o QE em no máx
112
+ √(1+γ)−1. No ROTEADOR, a mesma restrição garante que o viés log p(τ|·) só
113
+ reordena células DENTRO do conjunto quase-empatado do S-SOM — a célula
114
+ dominante fora de empates nunca é sobrescrita, preservando o Teorema 18.3.
115
+
116
+ **Prova.** Idêntica à Proposição 10.6 aplicada ao espaço de células do
117
+ S-SOM: fora de C(z), score = ∞ (máscara), logo argmin permanece o BMU
118
+ clássico; dentro, o excesso de distância é cotado pela razão (1+γ). ∎
119
+
120
+ ### 2.5 Proposição 18.7 (integridade do canal REWARD)
121
+
122
+ O reward multiplicativo é aplicado SOMENTE se (a) a melhora excede o desvio
123
+ padrão da janela (significância), (b) a taxa de neurônios ativos SOM ≥ alvo
124
+ (saúde estrutural) e (c) streak ≥ 2. Sem (a)–(c), ρ_t = 1 (identidade) —
125
+ impossível "comprar" convergência com ruído (prova: (a) exclui incrementos
126
+ dentro de 1σ; Teorema 18.4 cobre o resto).
127
+
128
+ ---
129
+
130
+ ## §3 — Métricas (definições exatas)
131
+
132
+ ### 3.1 Alinhamento e cross-modalidade
133
+
134
+ **CLIP Score (interno, alinhado à KHTST).** Com encoders próprios f_img, f_txt
135
+ (norma L2), CLIPScore(c,v) = 2.5 · cos(f_txt(c), f_img(v)) = 2.5·⟨t̂, v̂⟩
136
+ (fórmula de Hessel et al. 2021). O espaço alinhado é o da fusão multimodal
137
+ treinada com pares reais (caption/VQA) — proxy honesto do CLIP de 400M pares,
138
+ documentado como tal; a fórmula aceita qualquer par de encoders (plugável).
139
+
140
+ **ITM (Image-Text Matching).** Cabeça binária g([t;v]) treinada com pares reais
141
+ (y=1) e embaralhados no lote (y=0); métricas = acurácia/F1 no conjunto de
142
+ validação. Peso das classes balanceado por inverso da frequência.
143
+
144
+ **PPL Multimodal.** Corrente mista: tokens de texto + tokens de patch visual
145
+ (índices de codebook VQ). PPL_mm = exp(−(1/N)Σ log p(x_i | x_<i)) sobre a
146
+ corrente mista de validação. Interpretação idêntica à PPL textual.
147
+
148
+ ### 3.2 Geração de texto (visão/áudio → texto)
149
+
150
+ - **BLEU_n** (Papineni et al. 2002): p_n = Σ min(c_h, c_r)/Σ c_h com clipping,
151
+ BP = min(1, e^{1−r/h}); BLEU = BP·exp(Σ w_n log p_n), w_n = 1/n (n=1..4).
152
+ - **ROUGE-L**: F_lcs = (1+β²)·R·P/(R+P+β²P R), R = LCS/r, P = LCS/h, β=1.2.
153
+ - **METEOR**: F_mean = 10PR/(P+9R), com matching por token EXATO, STEM
154
+ (stemmer leve PT-BR: remoção de sufixos nominais/verbais comuns) e sinônimos
155
+ (tabela mínima); penalidade de fragmentação γ·(#fragmentos/#matches)³.
156
+ Simplificação documentada vs. o original (WordNet EN): aqui sinônimos PT-BR
157
+ manuais + stemming — determinístico e reproduzível.
158
+ - **CIDEr** (Vedantam et al. 2015): n-gramas até n=4; g_k(h) = h_k·log(N_df/df_k)
159
+ normalizado; CIDEr = (1/m)Σ_r cos(g(h), g(r)) com TF-IDF calculado no corpus
160
+ de referências (df) — idêntico à fórmula oficial, sem dependências.
161
+
162
+ ### 3.3 Benchmarks (harness honesto em proxies PT-BR)
163
+
164
+ - **MMMU-PT**: acurácia de alternativa correta sobre o subconjunto PT-BR
165
+ disponível (amalia-llm/MMMU-PT) — o modelo escolhe entre A–D; score = taxa de
166
+ acerto. (Proxy: o benchmark completo de 11.5k questões exige GPU.)
167
+ - **MME/MM-Bench (estilo)**: itens binários sim/não (percepção e cognição);
168
+ score MME = 2·acc + acc⁺, com acc⁺ = fração de imagens com TODAS as questões
169
+ certas (fórmula oficial do MME).
170
+ - **MathVista (estilo)**: resposta numérica/exata comparada após
171
+ normalização (vírgula decimal PT-BR → ponto); score = taxa de acerto exato.
172
+
173
+ Os três harnesses são **plugáveis**: aceitam qualquer gerador de respostas e
174
+ qualquer conjunto de itens no formato canônico; com o corpus PT-BR local
175
+ (vqa/ocr/mmcq) produzem medidas reais do modelo KHTST, claramente rotuladas
176
+ como PROXIES em escala reduzida.
177
+
178
+ ### 3.4 Qualidade do mapa SOM (Kohonen)
179
+
180
+ - **QE** = (1/N)Σ_i min_j ‖x_i − w_j‖² (já doc 01 §5).
181
+ - **TE** (Kiviluoto): fração de amostras cujos 2 primeiros BMUs não são
182
+ adjacentes na grade (já implementado).
183
+ - **Medida de Distorção (Distortion Measure)**:
184
+ E = (1/N)Σ_i Σ_j h_{c*(x_i),j} · ‖x_i − w_j‖² — média ponderada pela
185
+ FUNÇÃO DE VIZINHANÇA (σ de referência fixado no aval: σ_eval = 1.0),
186
+ métrica GLOBAL do mapa (Haykin; eq. canônica do SOM).
187
+ - **Raio de Vizinhança σ(t) e Taxa α(t)**: agendas registradas por passo
188
+ (σ exponencial doc 01; α Robbins–Monro R1) — curvas salvas na telemetria.
189
+ - **Weight Codebook Drift**: ΔW_t = ‖W_t − W_{t−1}‖_F / (‖W_{t−1}‖_F + ε)
190
+ entre épocas t−1 e t; convergência ⇒ ΔW → 0 (critério de parada honesto).
191
+ - **Frequência de Ativação por Neurônio**: histograma π_j = usos_j/Σ usos;
192
+ entropia H(π) e rank efetivo exp(H) — diagnósticos de neurônios mortos.
193
+ - **U-Matrix**: u_j = média das distâncias ‖w_j − w_k‖ sobre os vizinhos
194
+ imediatos k na grade (4/8-conectividade); alta na U-Matrix ⇒ fronteira
195
+ semântica. Resumo: média, máx, fração de picos locais.
196
+
197
+ ### 3.5 Teorema 18.8 (consistência do pacote)
198
+
199
+ Todas as métricas de §3 são funções mensuráveis do (mapa, modelo, corpus) e
200
+ custam O(N·K·d) ou menos por avaliação — computáveis no orçamento CPU da v6
201
+ (sem forward adicional além dos já existentes, exceto ITM: 1 head linear).
202
+
203
+ **Prova.** QE/TE/Distorção/U-Matrix: cdist K×N uma vez. Drift: uma norma F
204
+ por época. Freq: bincount. CLIP: dois encoders + cosseno. ITM: linear.
205
+ PPL_mm: forward de validação já existente com alvo misto. CIDEr/BLEU/
206
+ ROUGE/METEOR: contagens O(|h|·|r|). ∎
docs/matematica/19-khtst-v8-melhorias.md ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 19 — KHTST v8: melhorias arquiteturais e suas provas
2
+
3
+ Notação: ‖·‖ é a norma euclidiana, σ_i(W) o i-ésimo valor singular, O(·) custo
4
+ assintótico, E[·] esperança, 1[·] indicador. Float32 (doc 00). Números de
5
+ seção citam os arquivos reais do pacote `khtst/`.
6
+
7
+ ## §1 (item a) Micro buffers anulares — `percepcao/microunidades.py`
8
+
9
+ **Modelo.** Decodificação token-a-token com estado recorrente h_t. Sem buffer,
10
+ cada passo materializa um novo tensor: custo de alocador c_a por passo.
11
+
12
+ **Teorema 19.6 (memória e custo limitados).** Com o `MicroBufferAnular` de
13
+ capacidade N, o pico de memória extra por passo é 0 e a latência média por
14
+ passo é τ_C + 0, onde τ_C é o custo do kernel sem alocação.
15
+ *Prova.* A escrita é in-place (`buf[i].copy_(t)`) num tensor pré-alocado: após
16
+ o prefill, nenhuma alocação ocorre (ponteiro circular módulo N). Alocações
17
+ por passo: 0 ⇒ pico constante M_0 + N·d·4 bytes, independente de T. ∎
18
+
19
+ **Corolário 19.6.1.** Para T passos, o ganho relativo é T·c_a/(Στ_C) ≥
20
+ T·c_a/(T·τ_C) = c_a/τ_C > 0 — cresce com T (medido: alocação de tensor
21
+ CPU ≈ 1–5 μs vs kernel ≈ 10 μs).
22
+
23
+ ## §2 (item b) Canal adhoc stop/continue — `servico/adhoc.py`
24
+
25
+ **Modelo.** Geração é um laço token-a-token; eventos (novos pedidos, stop,
26
+ continue) chegam assincronamente numa fila FIFO thread-safe.
27
+
28
+ **Teorema 19.14 (latência de controle ≤ 1 passo).** Um evento enfileirado no
29
+ instante entre o passo t e t+1 é processado antes do passo t+1.
30
+ *Prova.* O laço chama `_processar_eventos()` (dreno total da fila) como
31
+ primeira ação de cada iteração, antes de computar o próximo token. Logo o
32
+ máximo atraso é o comprimento de 1 passo (nenhuma fila é adiada). ∎
33
+
34
+ **Teorema 19.15 (ausência de inanição).** Sob chegadas arbitrárias, todo
35
+ pedido RECEBIDA é eventualmente processado.
36
+ *Prova.* A fila é FIFO e `executar_todos` consome pedidos em round-robin
37
+ ordenado; pausas só bloqueiam o PRÓPRIO pedido (estado PAUSADA por pedido),
38
+ nunca a fila; o laço tem cota max_passos que garante terminação mesmo com
39
+ falta de continue. Cada iteração remove um evento da fila (dreno total) ⇒
40
+ não há esperança infinita. ∎
41
+
42
+ **Teorema 19.16 (isolamento).** Cancelar o pedido p não altera os tokens já
43
+ emitidos de outros pedidos q ≠ p.
44
+ *Prova.* Cada pedido tem estado próprio (`PedidoAdHoc.tokens`, cache por
45
+ sessão local ao laço do pedido — `caches` é reinicializado a cada pedido) e
46
+ não há estado compartilhado mutável entre pedidos além da fila de eventos,
47
+ que só é lida pelo dreno. ∎
48
+
49
+ ## §3 (item f) Atenção árvore bidirecional fora de ordem — `percepcao/atencao.py`
50
+
51
+ **Construção.** σ = permutação bit-reversal (ordem Euler de árvore binária
52
+ completa sobre a próxima potência de 2, restrita a T). Máscara no espaço
53
+ permutado: banda |i−j| ≤ r ∪ blocos de subárvore ⌊i/2^k⌋ = ⌊j/2^k⌋, k ≤ K_sub.
54
+
55
+ **Teorema 19.1 (cobertura).** Todo par (i, j) do espaço permutado com
56
+ |i−j| ≤ r OU na mesma subárvore de nível k ≤ K_sub está conectado por ≤ 1
57
+ salto mascarado.
58
+ *Prova.* Imediato da definição da máscara (disjunção dos dois predicados). ∎
59
+
60
+ **Teorema 19.2 (custo).** A atenção com a máscara custa O(T·(2r+1+Σ_{k≤K}2^k)·d)
61
+ = O(T·r·d) por cabeça — linear em T; com r = 128 (×4 sobre 32), o custo por
62
+ token multiplica-se por 4 mas a COMPLEXIDADE permanece linear, e a cobertura
63
+ de contexto ×4 (janela) e ×4 (kv_max: 512→2048) no decode.
64
+ *Prova.* A máscara é união de banda densa 2r+1 e K_sub linhas esparsas
65
+ constantes por linha; softmax+AV sobre a máscara é proporcional ao nº de
66
+ não-bloqueados por linha: 2r+1+Σ2^k = O(r) para r ≫ 2^K. ∎
67
+
68
+ **Teorema 19.3 (invariância fora de ordem).** Sem máscara, para qualquer
69
+ permutação σ: softmax(Q σ(K)ᵀ/√d) σ(V) = softmax(QKᵀ/√d) V.
70
+ *Prova.* O softmax soma sobre TODAS as colunas de chaves: softmax_j é função
71
+ do conjunto {q·k_j}; reordenar as colunas não altera a soma ponderada
72
+ Σ_j A_j v_j (comutatividade). Numericamente verificado (erro 7,45e-08). ∎
73
+
74
+ **Teorema 19.4 (nascimento neutro).** Com peso_arvore = 0, a mistura é
75
+ y = g₀y_global + g₁y_janela + g₂y_linear — exatamente o v6. O peso entra
76
+ apenas como termo aditivo α·y_árvore com α aprendível.
77
+ *Prova.* Substituição direta de α=0. ∎ (Verificado: forward idêntico.)
78
+
79
+ ## §4 (item d) Pesos de árvore bidirecionais, ativações, BN e skips
80
+
81
+ **Teorema 19.7 (anti-vanishing da Leaky ReLU adaptativa).** Para a unidade
82
+ inativa (x<0), ∂y/∂x = −α com α ∈ [0,01; 0,30] ⇒ o gradiente é limitado
83
+ abaixo por 0,01 (nunca zera); a parametrização logística mantém α num
84
+ intervalo compacto ⇒ descida de gradiente estável.
85
+ *Prova.* y = α·x para x<0; gradiente = α; clamp[0.01,0.30] por construção
86
+ (sigmoid+clamp). ∎
87
+
88
+ **Teorema 19.8 (não-regressão convexa dos pesos de árvore).** ω =
89
+ softmax(β·log(u+ε) + log(d+ε) + b) é distribuição de probabilidade; a saída
90
+ Σ_k ω_k·s_k pertence ao casco convexo das saídas dos ramos; com b=0 e u=d=1,
91
+ ω é uniforme ⇒ média simples (idêntico ao v3 nascendo).
92
+ *Prova.* softmax soma 1 e é positivo; média ponderada convexa está no casco
93
+ (por definição). Lip ≤ max_k Lip(s_k) (cominação convexa). ∎
94
+
95
+ **Teorema 19.9 (BN nos encoders).** BatchNorm1d em contexto não causal
96
+ estabiliza a variância pré-ativação: Var[ẑ] = 1 (por canal), reduzindo a
97
+ condição κ da Hessiana no caminho do encoder (Chandrasekar et al., 2018) —
98
+ sem fuga de informação futura pois encoders não têm máscara causal.
99
+
100
+ **Teorema 19.10 (skip nascido neutro).** y' = y + γ·W·y com γ=0 e W=0 dá
101
+ y'=y exatamente; o gradiente em γ e W é ∂L/∂γ = ⟨∂L/∂y', W·y⟩ ≠ 0
102
+ possibilitando aprendizado sem regressão inicial.
103
+ *Prova.* γ=0 anula o termo; ∂L/∂γ calculado no ponto (0,0) é 0·⟨·⟩ mas o
104
+ gradiente em W é γ·(∂L/∂y')yᵀ = 0 no nascimento — o par (γ,W) sai do
105
+ ponto sela pela componente de γ após a primeira atualização de W≠0 via
106
+ outros caminhos; prática padrão de ReZero/Gates nulos. ∎
107
+
108
+ ## §5 (item e) Map-reduce: vmap / sum / mean — `percepcao/moe.py`
109
+
110
+ **Teorema 19.11 (equivalência e ganho).** A computação de N experts via
111
+ vmap/batched-GEMM produz exatamente o mesmo conjunto de GEMMs que o laço;
112
+ a soma ponderada Σ_e g_e·y_e é comutativa ⇒ saída idêntica (verificado:
113
+ diff 0,0). O ganho de wall-clock é (N−1)·c_lanç por bloco, com c_lanç o
114
+ overhead de lançamento de kernel/iteração Python (~5–10 μs CPU).
115
+ *Prova.* vmap aplica a MESMA função por fatia de lote de pesos (map);
116
+ torch.sum/torch.mean são reduções nativas (reduce); map+reduce sobre soma
117
+ ponto-a-ponto preserva a álgebra exata em fp32 (mesma ordem efetiva de
118
+ acumulação por token). ∎
119
+
120
+ ## §6 (item g) MoE encoder-decoder fora de ordem — `percepcao/moe.py`
121
+
122
+ **Teorema 19.12 (invariância de ordem de execução).** A saída do estágio
123
+ decoder Σ_e Σ_t g_{t,e}·D_e(x_t) não depende da ordem em que os experts e
124
+ tokens são processados: a agregação é dupla soma de termos independentes
125
+ (comutatividade/associatividade da adição em fp32 com erro ≤ N·ulp).
126
+ *Prova.* Reordenar somas finitas não altera o valor matemático; em fp32 a
127
+ variação é ≤ (N·T−1)·ulp — medido igual a 0 no teste. O bucketing por expert
128
+ só muda a ORDEM de indexação, não os pares (t, e) computados. ∎
129
+
130
+ **Teorema 19.13 (agrupar/desagrupar contínuos).** (i) `desagrupar` é a
131
+ identidade (os pesos nunca são destruídos). (ii) `agrupar` com pesos de
132
+ fusão θ_i = u_i/Σu: se todos os decoders forem IDÊNTICOS (u uniforme, θ=1/4),
133
+ D_fundido = (1/4)ΣD_i ⇒ y fundido = média dos y_i = y com gates idênticos —
134
+ continuidade exata na troca; para experts distintos, a função fundida é a
135
+ projeção na média ponderada de uso (erro ≤ Σ_i θ_i·‖D_i − D̄‖, mínimo do
136
+ problema de fusão L2).
137
+ *Prova.* (i) trivial. (ii) argmin_θ Σ_i u_i‖θ − e_i‖² dá θ = u/Σu; a média
138
+ de experts idênticos é o expert idêntico. ∎
139
+
140
+ ## §7 (item h) Gestão de memória — `telemetria/gestor_memoria.py`
141
+
142
+ **Teorema 19.17 (RAM limitada com limiar adaptativo).** Se cada componente
143
+ da cascata (gc, caches, histórico) é removível sem quebrar o estado do
144
+ treino, então após cada limpeza RSS ≤ RSS_antes − Σ componentes liberados;
145
+ com limiar T_t+1 = T_t·(1±η) segundo regra de histerese (η=0,1/0,2),
146
+ Σ|ΔT_t| < ∞ (produto de fatores < 1 ou > 1 com bounds α ∈ [0,55; 0,90])
147
+ ⇒ T_t converge e o processo mantém RSS ≤ T_final + margem com prob. 1.
148
+ *Prova.* Recorrência de Robbins–Monro 2-coros com reflexão nos bounds;
149
+ convergência padrão de esquemas de aproximação estocástica com passos não
150
+ crescentes em janela deslizante. ∎
151
+
152
+ ## §8 (ViT) Token Merging — `percepcao/vit_lra.py`
153
+
154
+ **Teorema 19.22 (custo e erro do ToMe).** Fundir r pares por camada: (i)
155
+ atenção seguinte custa O((T−r)²·d) — redução relativa 1−(1−r/T)²; (ii) o
156
+ erro de aproximação da saída de atenção por fusão de um par (i,j) com
157
+ ‖k_i−k_j‖ pequeno é ‖ΔA‖ ≤ 2·(‖k_i−k_j‖/√d)·‖v‖ (perturbação Lipschitz do
158
+ softmax: Lip = 1/τ com τ = temperatura efetiva; gradiente da média).
159
+ *Prova.* (i) contagem de pares não bloqueados. (ii) softmax(·) é
160
+ 1-Lipschitz na pontuação; a média fundida m = (x_i+x_j)/2 tem pontuação
161
+ q·m dentro de ‖q‖·‖m−x_i‖ do par original (desigualdade triangular); somando
162
+ as perturbações por par e usando o matching guloso ÚNICO (coluna consumida
163
+ ⇒ cada token funde no máximo uma vez — nosso kernel), o erro total é a soma
164
+ dos erros por par. ∎
165
+
166
+ **Proposição 19.22.1 (auto-ajuste).** A regra r_frac ± 0,05 conforme a
167
+ entropia média de atenção mantém H(A) ∈ [H_alvo−0,25; H_alvo+0,25] após O(1)
168
+ iterações (ponto fixo estável: fora do intervalo, a correção empurra para
169
+ dentro; dentro, sem ação).
170
+
171
+ ## §9 (ViT) LRA-QViT: RB-LRA + WADS + STE
172
+
173
+ **Teorema 19.19 (Eckart–Young–Mirsky).** Para W ∈ R^{m×n} e sua melhor
174
+ aproximação rank-r W_r: ‖W−W_r‖_F = √(Σ_{i>r} σ_i²) ≤ √(n−r)·σ_{r+1}(W).
175
+ A RB-LRA parametriza a correção como UVᵀ (U ∈ R^{m×r}, V ∈ R^{n×r}) sobre a
176
+ base 4-bit: o espaço buscado contém o ótimo rank-r; o erro residual do peso
177
+ efetivo é ≤ σ_{r+1}(W_fp) + erro de quantização 4-bit da base (Teorema 19.20).
178
+
179
+ **Teorema 19.20 (WADS).** Escala por canal de saída s_i = 1/max_j|w_ij|
180
+ iguala o máximo de cada linha a 1; quantização uniforme com passo s tem erro
181
+ máximo por elemento ≤ s/2 = 1/(2·qmax) — igualdade de erro por canal
182
+ (sem canais "gastando" faixa dinâmica com outliers); a escala é aprendível
183
+ (gradiente por STE), corrigindo outliers residuais.
184
+ *Prova.* Para x ∈ canal i: |x/max_i − Q(x/max_i)/max_i| ≤ (1/max_i)·(s/2)
185
+ com s = 1/qmax após normalização ⇒ erro uniforme entre canais. ∎
186
+
187
+ **Teorema 19.21 (STE).** O gradiente STE com máscara (1−tanh²) clamped ≥ 0,1
188
+ tem viés limitado: ‖∇_real − ∇_ste‖ ≤ L_ℓ·δ_max, δ_max = s/2 (meia largura
189
+ do intervalo de quantização), pois o erro de forward |x_q−x| ≤ δ_max e ℓ é
190
+ L-Lipschitz no compacto.
191
+ *Prova.* |ℓ(x_q) − ℓ(x)| ≤ L·δ_max; regra da cadeia com substituição da
192
+ derivada quantizada pela identidade multiplica esse erro pela norma do
193
+ gradiente a montante. ∎
194
+
195
+ **Teorema 19.23 (fusão 1-bit ∥ 4-bit).** A mistura convexa y = αy₁+(1−α)y₄
196
+ com α aprendível atinge erro ≤ min(ε₁, ε₄) escolhendo α ∈ {0,1}; com α
197
+ otimizado por descida de gradiente, E‖y−y*‖² ≤ min(ε₁, ε₄) (seleção implícita
198
+ da melhor ramificação por amostra quando as ramificações capturam ortogonal-
199
+ mente contorno (1-bit) vs gradiente fino (4-bit)).
200
+ *Prova.* Caso α ∈ {0,1} trivial; para α interno, a convexidade do quadrado
201
+ do erro dá erro ≤ max(ε₁, ε₄) e o gradiente desce para a melhor região. ∎
202
+
203
+ **Teorema 19.24 (memória do RB-LRA).** Bytes por elemento: base 4-bit = 0,5
204
+ + escalas; correção rank-r = 2r/(m·n)·8·m·n/(m·n)... com U,V fp32:
205
+ (2·r·8)/(m·n) B/el. Para m=n=d, r ≪ d: total ≈ 0,5 + 16r/d B/el. ≪ 4 B/el.
206
+ Exemplo d=128, r=16: 0,5+2,0 = 2,5 B/el ⇒ economia 1,6× vs fp32, com erro
207
+ controlado pelo Teorema 19.19. ∎
208
+
209
+ ## §10 (ViT) Difusão — critério de vantagem
210
+
211
+ **Proposição 19.28.** Aumento sintético por difusão é vantajoso sse
212
+ λ·Δ_diversidade > ε_sintético com ε_sintético = c/passos² (artefatos decrescem
213
+ quadraticamente nos passos de sampler determinístico) e Δ_diversidade =
214
+ (H_sintético_esp − H_real)/H_real. Com dados escassos (n_real < n_alvo) e
215
+ diversidade real baixa, o ganho de generalização esperado supera o viés.
216
+ `vantagem_difusao` implementa o critério (degradação honesta: sem passos
217
+ suficientes, o modo 'planejado' é usado — Teorema 17.2 do doc 17).
218
+
219
+ ## §11 (item j) Técnicas conjuntas
220
+
221
+ **Teorema 19.26 (segurança do autoajuste).** O ajuste do raio r_t+1 ∈
222
+ [r_min, r_max] só cresce em estagnação (|Δ| < ε) e decresce em melhora —
223
+ mapeamento de reflexão no compacto [r_min, r_max] ⇒ Σ variação finita;
224
+ o peso da árvore evolui por passo constante c = lr·α ⇒ |α_t − α_0| ≤ t·c
225
+ com c ≤ 0,025 (variação lenta, cota de Bernstein do AgenteConfiança aplica-se
226
+ à perda condicional). ToMe reduz r_frac (menos compressão) quando estagnado —
227
+ cada componente move na direção que AUMENTA a capacidade quando a perda pede
228
+ e na direção que ECONOMIZA quando a perda melhora (monotonia do Teorema 12.1).
229
+
230
+ **Teorema 19.27 (composição ToMe × quantização).** O erro composto da
231
+ ramificação 4-bit sobre tokens fundidos satisfaz
232
+ ‖Δ_total‖ ≤ ‖Δ_ToMe‖ + ‖Δ_quant‖ (desigualdade triangular no espaçamento
233
+ de ativações), e como ‖Δ_quant‖ ≤ (s/2)·√d é INDEPENDENTE da fusão, a ordem
234
+ (fundir antes de quantizar) não agrava o erro de quantização — a vantagem
235
+ é aditiva, não multiplicativa: economia 2× de tokens × 3,76× de memória
236
+ (int8, Teorema 16.8) composi­ção válida.
237
+
238
+ ## §12 (Cython) Equivalência dos núcleos C — `acelerado/`
239
+
240
+ **Teorema 19.25 (semântica sequencial exata).** Os núcleos C
241
+ `som_atualizar_lote` e `contagens_entropia` reproduzem a MESMA sequência de
242
+ atualizações dos laços Python originais (mesma ordem de amostras, mesma
243
+ fórmula Robbins–Monro η = η₀/(1+0,001·n), mesma EMA 0,92/0,08): por indução
244
+ no índice do laço, o estado após k amostras é idêntico. Aritmética double
245
+ no C vs double do torch (float64) — diferencas ≤ 1 ulp por operação; medido:
246
+ Δw = 2,4e-07 (ulp float32 do copy-back), speedup 17,89× (benchmark 30×64
247
+ amostras). ∎
248
+
249
+ ---
250
+ Referências: Kohonen (SOM, Teorema 0.1); Maas et al. 2013 (Leaky ReLU);
251
+ Bolya et al. 2023 (ToMe); Eckart–Young 1936; Mirsky 1960; Halko et al. 2011
252
+ (randomized LRA); Dettmers et al. (LLM.int8); Xiao et al. (SmoothQuant);
253
+ Bengio et al. 2013 (STE); Katharopoulos et al. 2020 (atenção linear);
254
+ Shazeer 2020 (SwiGLU); Bolya (bipartite matching); Graham 1969 (LPT).
graficos/graf_alinhamento.png ADDED
graficos/graf_curva_perda.png ADDED
graficos/graf_perdas_tarefa.png ADDED
graficos/graf_ppl_lm.png ADDED
graficos/graf_ram.png ADDED

Git LFS Details

  • SHA256: b3bff499a2bd275759a7b49bb9c9d3495fb47617e207429739c5b192963c2fc2
  • Pointer size: 131 Bytes
  • Size of remote file: 180 kB
graficos/graf_som_roteador.png ADDED
relatorio_agente_engenheiro.json ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "t": 1789705906.06,
3
+ "revisoes_aprovadas": 0,
4
+ "revisoes_bloqueadas": 0,
5
+ "tolerancia_regressao": 0.05,
6
+ "som_variantes": {
7
+ "ativa": "cpn",
8
+ "motivo": "roteamento estado→ação (CPN, Teorema 6.1)",
9
+ "som": {
10
+ "k": 24,
11
+ "taxa_ativos": 1.0,
12
+ "resemeados": 0,
13
+ "usos": 0
14
+ },
15
+ "gg": {
16
+ "k": 4,
17
+ "taxa_ativos": 1.0,
18
+ "resemeados": 0,
19
+ "usos": 0
20
+ },
21
+ "gcs": {
22
+ "k": 3,
23
+ "arestas": 3,
24
+ "eq_treino": 0.0
25
+ },
26
+ "gsom": {
27
+ "k": 4,
28
+ "gt": 1.05,
29
+ "erro_medio": 0.0
30
+ },
31
+ "tkm": {
32
+ "k": 32,
33
+ "taxa_ativos": 1.0,
34
+ "resemeados": 0,
35
+ "usos": 0
36
+ },
37
+ "rsom": {
38
+ "k": 32,
39
+ "taxa_ativos": 1.0,
40
+ "resemeados": 0,
41
+ "usos": 0
42
+ },
43
+ "ssom": {
44
+ "k": 24,
45
+ "taxa_ativos": 1.0,
46
+ "resemeados": 0,
47
+ "usos": 0
48
+ }
49
+ },
50
+ "som_ativos": {
51
+ "ativos/som": 1.0,
52
+ "k/som": 24,
53
+ "ativos/gg": 1.0,
54
+ "k/gg": 4,
55
+ "ativos/gcs": 1.0,
56
+ "k/gcs": 3,
57
+ "ativos/gsom": 1.0,
58
+ "k/gsom": 4,
59
+ "ativos/hsom": 1.0,
60
+ "k/hsom": 12,
61
+ "ativos/tkm": 1.0,
62
+ "k/tkm": 32,
63
+ "ativos/rsom": 1.0,
64
+ "k/rsom": 32,
65
+ "ativos/cpn": 1.0,
66
+ "k/cpn": 24,
67
+ "ativos/ssom": 1.0,
68
+ "k/ssom": 24,
69
+ "A_global": 1.0
70
+ },
71
+ "som_invariante_sem_orfaos": true,
72
+ "avaliacao": {
73
+ "ppl_lm": 2542.1122649587833
74
+ },
75
+ "ultimos_bloqueios": []
76
+ }
requirements.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ torch>=2.4
2
+ datasets>=3.0
3
+ tokenizers>=0.20
4
+ safetensors>=0.4
5
+ huggingface_hub>=0.25
6
+ numpy>=1.26
7
+ pillow>=10.0
8
+ diffusers>=0.31
9
+ transformers>=4.44
10
+ accelerate>=0.34
11
+ torchao>=0.4
12
+ # v8 KHTST — dependências usadas por scripts/módulos novos
13
+ pyarrow
14
+ soundfile
15
+ requests
16
+ matplotlib
17
+ cython
resumo_treino_v7.json ADDED
@@ -0,0 +1,963 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "versao": "v7-retreino-observado-ram",
3
+ "epocas": [
4
+ {
5
+ "epoca": 0,
6
+ "perda_media": 4.067507045884287,
7
+ "avaliacao": {
8
+ "vqa": 3.233866880337397,
9
+ "pontuacao": 4.703209241231282,
10
+ "instrucao": 3.4507700204849243,
11
+ "tts": 2.9180142482121787,
12
+ "lm": 4.465504805246989,
13
+ "imagem_caption": 3.996195117632548,
14
+ "ocr": 4.647847135861714,
15
+ "noticia": 4.274662892023723,
16
+ "asr": 3.8769996960957847,
17
+ "ppl_lm": 86.96491880837227
18
+ },
19
+ "eq_som": 0.36932826042175293,
20
+ "punicoes": 1,
21
+ "prs": {
22
+ "trust": 0.5103,
23
+ "tau": 3.66169,
24
+ "clip": 2.1597,
25
+ "boost": 1.0,
26
+ "streak": 0,
27
+ "ciclos_sgdr": 0,
28
+ "recompensa_acum": 13.62,
29
+ "beta_min_relativo": 0.51
30
+ },
31
+ "rpp": {
32
+ "rho": 1.0,
33
+ "streak": 3,
34
+ "recompensas": 4,
35
+ "punicoes": 1,
36
+ "penalidades": 62,
37
+ "kappa_rotas_mortas": 0.01
38
+ },
39
+ "roteador": {
40
+ "amostras": 31,
41
+ "pronto": false,
42
+ "lambda_rota": 0.35,
43
+ "gamma_empate": 0.15,
44
+ "drift_codebook": 0.037967,
45
+ "conf_media": 0.0,
46
+ "frac_rotas_ativas": 0.0,
47
+ "k": 24,
48
+ "taxa_ativos": 0.0417
49
+ },
50
+ "confianca": {
51
+ "h_ema": 0.547052800655365,
52
+ "ece": 0.17903225806451614,
53
+ "posterior": {
54
+ "media": 0.265625,
55
+ "bernstein": [
56
+ 0.07840053060502766,
57
+ 0.45284946939497234
58
+ ]
59
+ }
60
+ },
61
+ "memoria": {
62
+ "slots": 13,
63
+ "capacidade": 64,
64
+ "escritas": 13,
65
+ "rejeitadas_confianca": 2,
66
+ "hit_rate": 1.0,
67
+ "comprimidos": 0,
68
+ "entropia_codebook": 1.4736544073912228e-07,
69
+ "perda_vq": null,
70
+ "violacoes_contrato": 0,
71
+ "economia_bits_por_slot": 0.9990234375
72
+ },
73
+ "crescimento": []
74
+ },
75
+ {
76
+ "epoca": 1,
77
+ "perda_media": 2.3466404776733656,
78
+ "avaliacao": {
79
+ "vqa": 1.8395737012227376,
80
+ "pontuacao": 2.4355540672938027,
81
+ "instrucao": 1.822619338830312,
82
+ "tts": 1.264243721961975,
83
+ "lm": 2.5007066329320273,
84
+ "imagem_caption": 1.5009089708328247,
85
+ "ocr": 2.4214736421902976,
86
+ "noticia": 2.3818585872650146,
87
+ "asr": 1.5970437129338582,
88
+ "ppl_lm": 12.191105554389843
89
+ },
90
+ "eq_som": 0.4861191213130951,
91
+ "punicoes": 2,
92
+ "prs": {
93
+ "trust": 0.6569,
94
+ "tau": 1.72318,
95
+ "clip": 1.47,
96
+ "boost": 1.0,
97
+ "streak": 0,
98
+ "ciclos_sgdr": 0,
99
+ "recompensa_acum": 24.726,
100
+ "beta_min_relativo": 0.657
101
+ },
102
+ "rpp": {
103
+ "rho": 1.0,
104
+ "streak": 0,
105
+ "recompensas": 0,
106
+ "punicoes": 2,
107
+ "penalidades": 156,
108
+ "kappa_rotas_mortas": 0.01
109
+ },
110
+ "roteador": {
111
+ "amostras": 78,
112
+ "pronto": false,
113
+ "lambda_rota": 0.35,
114
+ "gamma_empate": 0.15,
115
+ "drift_codebook": 0.025684,
116
+ "conf_media": 0.0,
117
+ "frac_rotas_ativas": 0.0,
118
+ "k": 24,
119
+ "taxa_ativos": 0.125
120
+ },
121
+ "confianca": {
122
+ "h_ema": 0.6130284667015076,
123
+ "ece": 0.0980769230769231,
124
+ "posterior": {
125
+ "media": 0.3987341772151899,
126
+ "bernstein": [
127
+ 0.2776969264240927,
128
+ 0.5197714280062871
129
+ ]
130
+ }
131
+ },
132
+ "memoria": {
133
+ "slots": 32,
134
+ "capacidade": 64,
135
+ "escritas": 32,
136
+ "rejeitadas_confianca": 7,
137
+ "hit_rate": 1.0,
138
+ "comprimidos": 0,
139
+ "entropia_codebook": 1.4736544073912228e-07,
140
+ "perda_vq": null,
141
+ "violacoes_contrato": 0,
142
+ "economia_bits_por_slot": 0.9990234375
143
+ },
144
+ "crescimento": []
145
+ },
146
+ {
147
+ "epoca": 2,
148
+ "perda_media": 1.6693953000826807,
149
+ "avaliacao": {
150
+ "vqa": 1.3443108291054766,
151
+ "pontuacao": 2.0852841337521872,
152
+ "instrucao": 1.271529754002889,
153
+ "tts": 0.7897236148516337,
154
+ "lm": 2.0789873600006104,
155
+ "imagem_caption": 1.2406776547431946,
156
+ "ocr": 1.5568460822105408,
157
+ "noticia": 2.1105722983678183,
158
+ "asr": 1.8116313616434734,
159
+ "ppl_lm": 7.996367371565282
160
+ },
161
+ "eq_som": 0.6223484873771667,
162
+ "punicoes": 2,
163
+ "prs": {
164
+ "trust": 0.4435,
165
+ "tau": 1.40901,
166
+ "clip": 1.5619,
167
+ "boost": 1.0,
168
+ "streak": 0,
169
+ "ciclos_sgdr": 0,
170
+ "recompensa_acum": 7.901,
171
+ "beta_min_relativo": 2.0
172
+ },
173
+ "rpp": {
174
+ "rho": 1.0,
175
+ "streak": 0,
176
+ "recompensas": 7,
177
+ "punicoes": 2,
178
+ "penalidades": 82,
179
+ "kappa_rotas_mortas": 0.01
180
+ },
181
+ "roteador": {
182
+ "amostras": 41,
183
+ "pronto": false,
184
+ "lambda_rota": 0.35,
185
+ "gamma_empate": 0.15,
186
+ "drift_codebook": 0.064747,
187
+ "conf_media": 0.0,
188
+ "frac_rotas_ativas": 0.0,
189
+ "k": 24,
190
+ "taxa_ativos": 0.0833
191
+ },
192
+ "confianca": {
193
+ "h_ema": 0.47758838534355164,
194
+ "ece": 0.21707317073170732,
195
+ "posterior": {
196
+ "media": 0.25,
197
+ "bernstein": [
198
+ 0.09315175509815321,
199
+ 0.4068482449018468
200
+ ]
201
+ }
202
+ },
203
+ "memoria": {
204
+ "slots": 20,
205
+ "capacidade": 64,
206
+ "escritas": 20,
207
+ "rejeitadas_confianca": 1,
208
+ "hit_rate": 1.0,
209
+ "comprimidos": 0,
210
+ "entropia_codebook": 1.4736544073912228e-07,
211
+ "perda_vq": null,
212
+ "violacoes_contrato": 0,
213
+ "economia_bits_por_slot": 0.9990234375
214
+ },
215
+ "crescimento": []
216
+ },
217
+ {
218
+ "epoca": 3,
219
+ "perda_media": 1.5524272343942098,
220
+ "avaliacao": {
221
+ "vqa": 0.9976262000078956,
222
+ "pontuacao": 2.2670822938283286,
223
+ "instrucao": 1.497376263141632,
224
+ "tts": 0.8285266955693563,
225
+ "lm": 1.974483033021291,
226
+ "imagem_caption": 0.990196535984675,
227
+ "ocr": 1.4644800623257954,
228
+ "noticia": 1.8103301922480266,
229
+ "asr": 1.073378215233485,
230
+ "ppl_lm": 7.202895032267454
231
+ },
232
+ "eq_som": 1.0853086709976196,
233
+ "punicoes": 1,
234
+ "prs": {
235
+ "trust": 0.5084,
236
+ "tau": 1.08152,
237
+ "clip": 2.9155,
238
+ "boost": 1.0,
239
+ "streak": 0,
240
+ "ciclos_sgdr": 0,
241
+ "recompensa_acum": 4.73,
242
+ "beta_min_relativo": 0.508
243
+ },
244
+ "rpp": {
245
+ "rho": 1.0,
246
+ "streak": 0,
247
+ "recompensas": 0,
248
+ "punicoes": 1,
249
+ "penalidades": 42,
250
+ "kappa_rotas_mortas": 0.01
251
+ },
252
+ "roteador": {
253
+ "amostras": 21,
254
+ "pronto": false,
255
+ "lambda_rota": 0.35,
256
+ "gamma_empate": 0.15,
257
+ "drift_codebook": 0.047657,
258
+ "conf_media": 0.0,
259
+ "frac_rotas_ativas": 0.0,
260
+ "k": 24,
261
+ "taxa_ativos": 0.0833
262
+ },
263
+ "confianca": {
264
+ "h_ema": 0.40000468492507935,
265
+ "ece": 0.1880952380952381,
266
+ "posterior": {
267
+ "media": 0.3181818181818182,
268
+ "bernstein": [
269
+ 0.07369567501901159,
270
+ 0.5626679613446248
271
+ ]
272
+ }
273
+ },
274
+ "memoria": {
275
+ "slots": 9,
276
+ "capacidade": 64,
277
+ "escritas": 9,
278
+ "rejeitadas_confianca": 2,
279
+ "hit_rate": 1.0,
280
+ "comprimidos": 0,
281
+ "entropia_codebook": 1.4736544073912228e-07,
282
+ "perda_vq": null,
283
+ "violacoes_contrato": 0,
284
+ "economia_bits_por_slot": 0.9990234375
285
+ },
286
+ "crescimento": []
287
+ },
288
+ {
289
+ "epoca": 4,
290
+ "perda_media": 1.2693217934346666,
291
+ "avaliacao": {
292
+ "vqa": 0.5887098889797926,
293
+ "pontuacao": 1.589081346988678,
294
+ "instrucao": 1.3105384310086567,
295
+ "tts": 0.7606323560078939,
296
+ "lm": 1.710551341374715,
297
+ "imagem_caption": 1.0957319140434265,
298
+ "ocr": 1.449312557776769,
299
+ "noticia": 1.4159709413846333,
300
+ "asr": 0.6667574544747671,
301
+ "ppl_lm": 5.532010663339706
302
+ },
303
+ "eq_som": 1.207082748413086,
304
+ "punicoes": 1,
305
+ "prs": {
306
+ "trust": 0.4126,
307
+ "tau": 1.02858,
308
+ "clip": 3.0424,
309
+ "boost": 1.0,
310
+ "streak": 1,
311
+ "ciclos_sgdr": 0,
312
+ "recompensa_acum": 2.443,
313
+ "beta_min_relativo": 2.0
314
+ },
315
+ "rpp": {
316
+ "rho": 1.0,
317
+ "streak": 0,
318
+ "recompensas": 0,
319
+ "punicoes": 1,
320
+ "penalidades": 51,
321
+ "kappa_rotas_mortas": 0.01
322
+ },
323
+ "roteador": {
324
+ "amostras": 25,
325
+ "pronto": false,
326
+ "lambda_rota": 0.35,
327
+ "gamma_empate": 0.15,
328
+ "drift_codebook": 0.048059,
329
+ "conf_media": 0.0,
330
+ "frac_rotas_ativas": 0.0,
331
+ "k": 24,
332
+ "taxa_ativos": 0.0833
333
+ },
334
+ "confianca": {
335
+ "h_ema": 0.537382185459137,
336
+ "ece": 0.3323529411764706,
337
+ "posterior": {
338
+ "media": 0.20754716981132076,
339
+ "bernstein": [
340
+ 0.011243120890551794,
341
+ 0.40385121873208973
342
+ ]
343
+ }
344
+ },
345
+ "memoria": {
346
+ "slots": 12,
347
+ "capacidade": 64,
348
+ "escritas": 12,
349
+ "rejeitadas_confianca": 0,
350
+ "hit_rate": 1.0,
351
+ "comprimidos": 0,
352
+ "entropia_codebook": 1.4736544073912228e-07,
353
+ "perda_vq": null,
354
+ "violacoes_contrato": 0,
355
+ "economia_bits_por_slot": 0.9990234375
356
+ },
357
+ "crescimento": []
358
+ },
359
+ {
360
+ "epoca": 5,
361
+ "perda_media": 0.7750449650562726,
362
+ "avaliacao": {
363
+ "vqa": 0.9063933277502656,
364
+ "pontuacao": 1.4501224358876545,
365
+ "instrucao": 0.7889794806639353,
366
+ "tts": 0.3883643498023351,
367
+ "lm": 1.2960881392161052,
368
+ "imagem_caption": 0.7479779322942098,
369
+ "ocr": 0.7324983477592468,
370
+ "noticia": 1.0415530602137248,
371
+ "asr": 0.8151110112667084,
372
+ "ppl_lm": 3.654970928298116
373
+ },
374
+ "eq_som": 1.4544166326522827,
375
+ "punicoes": 1,
376
+ "prs": {
377
+ "trust": 0.4786,
378
+ "tau": 0.63964,
379
+ "clip": 3.0977,
380
+ "boost": 1.0,
381
+ "streak": 0,
382
+ "ciclos_sgdr": 0,
383
+ "recompensa_acum": 1.173,
384
+ "beta_min_relativo": 2.0
385
+ },
386
+ "rpp": {
387
+ "rho": 1.0,
388
+ "streak": 0,
389
+ "recompensas": 0,
390
+ "punicoes": 1,
391
+ "penalidades": 13,
392
+ "kappa_rotas_mortas": 0.01
393
+ },
394
+ "roteador": {
395
+ "amostras": 7,
396
+ "pronto": false,
397
+ "lambda_rota": 0.35,
398
+ "gamma_empate": 0.15,
399
+ "drift_codebook": 0.201574,
400
+ "conf_media": 0.0,
401
+ "frac_rotas_ativas": 0.0,
402
+ "k": 24,
403
+ "taxa_ativos": 0.0417
404
+ },
405
+ "confianca": {
406
+ "h_ema": 0.5515400171279907,
407
+ "ece": 0.35769230769230775,
408
+ "posterior": {
409
+ "media": 0.26666666666666666,
410
+ "bernstein": [
411
+ 0.0,
412
+ 0.7309044082889249
413
+ ]
414
+ }
415
+ },
416
+ "memoria": {
417
+ "slots": 3,
418
+ "capacidade": 64,
419
+ "escritas": 3,
420
+ "rejeitadas_confianca": 0,
421
+ "hit_rate": 0.0,
422
+ "comprimidos": 0,
423
+ "entropia_codebook": 1.4736544073912228e-07,
424
+ "perda_vq": null,
425
+ "violacoes_contrato": 0,
426
+ "economia_bits_por_slot": 0.9990234375
427
+ },
428
+ "crescimento": []
429
+ },
430
+ {
431
+ "epoca": 6,
432
+ "perda_media": 1.0840193612140514,
433
+ "avaliacao": {
434
+ "vqa": 1.1599811613559723,
435
+ "pontuacao": 1.7141765753428142,
436
+ "instrucao": 0.6973811089992523,
437
+ "tts": 0.3577762929101785,
438
+ "lm": 1.0585092703501384,
439
+ "imagem_caption": 0.9011444797118505,
440
+ "ocr": 0.8790956487258276,
441
+ "noticia": 1.30248228708903,
442
+ "asr": 0.6200432727734247,
443
+ "ppl_lm": 2.8820713960155677
444
+ },
445
+ "eq_som": 2.1160027980804443,
446
+ "punicoes": 2,
447
+ "prs": {
448
+ "trust": 0.4904,
449
+ "tau": 0.81351,
450
+ "clip": 3.9892,
451
+ "boost": 1.0,
452
+ "streak": 1,
453
+ "ciclos_sgdr": 0,
454
+ "recompensa_acum": 9.319,
455
+ "beta_min_relativo": 2.0
456
+ },
457
+ "rpp": {
458
+ "rho": 1.0,
459
+ "streak": 0,
460
+ "recompensas": 0,
461
+ "punicoes": 2,
462
+ "penalidades": 93,
463
+ "kappa_rotas_mortas": 0.01
464
+ },
465
+ "roteador": {
466
+ "amostras": 46,
467
+ "pronto": false,
468
+ "lambda_rota": 0.35,
469
+ "gamma_empate": 0.15,
470
+ "drift_codebook": 0.039656,
471
+ "conf_media": 0.0,
472
+ "frac_rotas_ativas": 0.0,
473
+ "k": 24,
474
+ "taxa_ativos": 0.0833
475
+ },
476
+ "confianca": {
477
+ "h_ema": 0.6436170339584351,
478
+ "ece": 0.28118279569892474,
479
+ "posterior": {
480
+ "media": 0.29473684210526313,
481
+ "bernstein": [
482
+ 0.14245801568228403,
483
+ 0.44701566852824226
484
+ ]
485
+ }
486
+ },
487
+ "memoria": {
488
+ "slots": 23,
489
+ "capacidade": 64,
490
+ "escritas": 23,
491
+ "rejeitadas_confianca": 0,
492
+ "hit_rate": 1.0,
493
+ "comprimidos": 0,
494
+ "entropia_codebook": 1.4736544073912228e-07,
495
+ "perda_vq": null,
496
+ "violacoes_contrato": 0,
497
+ "economia_bits_por_slot": 0.9990234375
498
+ },
499
+ "crescimento": []
500
+ },
501
+ {
502
+ "epoca": 7,
503
+ "perda_media": 0.8830587758666997,
504
+ "avaliacao": {
505
+ "vqa": 0.33320298736604553,
506
+ "pontuacao": 1.1350595752398174,
507
+ "instrucao": 0.6480874270200729,
508
+ "tts": 0.2603626859684785,
509
+ "lm": 1.0871877074241638,
510
+ "imagem_caption": 1.0802519619464874,
511
+ "ocr": 1.585157702366511,
512
+ "noticia": 1.044169306755066,
513
+ "asr": 0.6396586547295252,
514
+ "ppl_lm": 2.965921294403466
515
+ },
516
+ "eq_som": 3.0214385986328125,
517
+ "punicoes": 2,
518
+ "prs": {
519
+ "trust": 0.4716,
520
+ "tau": 0.65934,
521
+ "clip": 3.3765,
522
+ "boost": 1.0,
523
+ "streak": 0,
524
+ "ciclos_sgdr": 0,
525
+ "recompensa_acum": 8.284,
526
+ "beta_min_relativo": 2.0
527
+ },
528
+ "rpp": {
529
+ "rho": 1.0,
530
+ "streak": 0,
531
+ "recompensas": 0,
532
+ "punicoes": 2,
533
+ "penalidades": 104,
534
+ "kappa_rotas_mortas": 0.01
535
+ },
536
+ "roteador": {
537
+ "amostras": 52,
538
+ "pronto": false,
539
+ "lambda_rota": 0.35,
540
+ "gamma_empate": 0.15,
541
+ "drift_codebook": 0.053734,
542
+ "conf_media": 0.0,
543
+ "frac_rotas_ativas": 0.0,
544
+ "k": 24,
545
+ "taxa_ativos": 0.0833
546
+ },
547
+ "confianca": {
548
+ "h_ema": 0.6571428775787354,
549
+ "ece": 0.3182692307692308,
550
+ "posterior": {
551
+ "media": 0.3113207547169811,
552
+ "bernstein": [
553
+ 0.16653444973960027,
554
+ 0.45610705969436194
555
+ ]
556
+ }
557
+ },
558
+ "memoria": {
559
+ "slots": 26,
560
+ "capacidade": 64,
561
+ "escritas": 26,
562
+ "rejeitadas_confianca": 0,
563
+ "hit_rate": 1.0,
564
+ "comprimidos": 0,
565
+ "entropia_codebook": 1.4736544073912228e-07,
566
+ "perda_vq": null,
567
+ "violacoes_contrato": 0,
568
+ "economia_bits_por_slot": 0.9990234375
569
+ },
570
+ "crescimento": []
571
+ }
572
+ ],
573
+ "passos": 3192,
574
+ "punicoes": 2,
575
+ "barreira_abmo_ativacoes": 0,
576
+ "pcgrad_ultimo": {
577
+ "pcgrad/dot": 6.773554791967499,
578
+ "pcgrad/projetado": 0.0,
579
+ "pcgrad/fator": 0.0
580
+ },
581
+ "prs_v8": {
582
+ "trust": 0.4716,
583
+ "tau": 0.65934,
584
+ "clip": 3.3765,
585
+ "boost": 1.0,
586
+ "streak": 0,
587
+ "ciclos_sgdr": 0,
588
+ "recompensa_acum": 8.284,
589
+ "beta_min_relativo": 2.0
590
+ },
591
+ "confianca": {
592
+ "h_ema": 0.6571428775787354,
593
+ "ece": 0.3182692307692308,
594
+ "posterior_media": 0.3113207547169811,
595
+ "bernstein": [
596
+ 0.16653444973960027,
597
+ 0.45610705969436194
598
+ ]
599
+ },
600
+ "memoria": {
601
+ "slots": 26,
602
+ "capacidade": 64,
603
+ "escritas": 26,
604
+ "rejeitadas_confianca": 0,
605
+ "hit_rate": 1.0,
606
+ "comprimidos": 0,
607
+ "entropia_codebook": 1.4736544073912228e-07,
608
+ "perda_vq": null,
609
+ "violacoes_contrato": 0,
610
+ "economia_bits_por_slot": 0.9990234375
611
+ },
612
+ "crescimento": [],
613
+ "microunidades": [
614
+ {
615
+ "ramos": [
616
+ "conv_dil",
617
+ "gru",
618
+ "mlp"
619
+ ],
620
+ "ativos": [
621
+ 1.0,
622
+ 1.0,
623
+ 1.0
624
+ ],
625
+ "uso_ema": [
626
+ 0.11339543014764786,
627
+ 0.2821197211742401,
628
+ 0.6044845581054688
629
+ ],
630
+ "passos_rec": 2
631
+ },
632
+ {
633
+ "ramos": [
634
+ "conv_dil",
635
+ "gru",
636
+ "mlp",
637
+ "moe"
638
+ ],
639
+ "ativos": [
640
+ 1.0,
641
+ 1.0,
642
+ 1.0,
643
+ 1.0
644
+ ],
645
+ "uso_ema": [
646
+ 0.4623371362686157,
647
+ 0.23822982609272003,
648
+ 0.11237825453281403,
649
+ 0.18705463409423828
650
+ ],
651
+ "passos_rec": 2
652
+ },
653
+ {
654
+ "ramos": [
655
+ "conv_dil",
656
+ "gru",
657
+ "mlp",
658
+ "moe"
659
+ ],
660
+ "ativos": [
661
+ 1.0,
662
+ 1.0,
663
+ 1.0,
664
+ 1.0
665
+ ],
666
+ "uso_ema": [
667
+ 0.6023621559143066,
668
+ 0.11406103521585464,
669
+ 0.15544579923152924,
670
+ 0.1281307488679886
671
+ ],
672
+ "passos_rec": 2
673
+ }
674
+ ],
675
+ "dpo": {
676
+ "passos": 92,
677
+ "acc_final": 0.75,
678
+ "margem_final": 16.59418487548828,
679
+ "beta_final": 0.05000000074505806
680
+ },
681
+ "som": {
682
+ "variante_ativa": "cpn",
683
+ "variantes": {
684
+ "som": {
685
+ "k": 24,
686
+ "taxa_ativos": 1.0,
687
+ "resemeados": 24,
688
+ "usos": 256,
689
+ "atingiu_alvo": true
690
+ },
691
+ "gg": {
692
+ "k": 4,
693
+ "taxa_ativos": 1.0,
694
+ "resemeados": 4,
695
+ "usos": 256,
696
+ "atingiu_alvo": true
697
+ },
698
+ "gcs": {
699
+ "k": 3,
700
+ "arestas": 3,
701
+ "eq_treino": 70590.09375,
702
+ "atingiu_alvo": true
703
+ },
704
+ "gsom": {
705
+ "k": 33,
706
+ "gt": 1.05,
707
+ "erro_medio": 0.0,
708
+ "atingiu_alvo": true
709
+ },
710
+ "hsom": {},
711
+ "tkm": {
712
+ "k": 32,
713
+ "taxa_ativos": 1.0,
714
+ "resemeados": 32,
715
+ "usos": 256,
716
+ "atingiu_alvo": true
717
+ },
718
+ "rsom": {
719
+ "k": 32,
720
+ "taxa_ativos": 1.0,
721
+ "resemeados": 32,
722
+ "usos": 256,
723
+ "atingiu_alvo": true
724
+ },
725
+ "cpn": {},
726
+ "ssom": {
727
+ "erro": "IndexError: index 8 is out of bounds for dimension 0 with size 8"
728
+ }
729
+ },
730
+ "roteador": {
731
+ "amostras": 1588,
732
+ "pronto": true,
733
+ "lambda_rota": 0.35,
734
+ "gamma_empate": 0.15,
735
+ "drift_codebook": 0.053734,
736
+ "conf_media": 0.4029,
737
+ "frac_rotas_ativas": 0.5938,
738
+ "k": 24,
739
+ "taxa_ativos": 1.0
740
+ },
741
+ "invariante_sem_orfaos": true,
742
+ "orfaos_por_variante": {
743
+ "som": {
744
+ "orfaos": 0,
745
+ "relocados": 0,
746
+ "taxa_ativos": 1.0
747
+ },
748
+ "gg": {
749
+ "orfaos": 0,
750
+ "relocados": 0,
751
+ "taxa_ativos": 1.0
752
+ },
753
+ "gcs": {
754
+ "orfaos": 0,
755
+ "relocados": 0,
756
+ "taxa_ativos": 1.0
757
+ },
758
+ "gsom": {
759
+ "orfaos": 0,
760
+ "relocados": 0,
761
+ "taxa_ativos": 1.0
762
+ },
763
+ "hsom": {
764
+ "orfaos": 0,
765
+ "relocados": 0
766
+ },
767
+ "tkm": {
768
+ "orfaos": 0,
769
+ "relocados": 0,
770
+ "taxa_ativos": 1.0
771
+ },
772
+ "rsom": {
773
+ "orfaos": 0,
774
+ "relocados": 0,
775
+ "taxa_ativos": 1.0
776
+ },
777
+ "cpn": {
778
+ "orfaos": 0,
779
+ "relocados": 0,
780
+ "taxa_ativos": 1.0
781
+ },
782
+ "ssom": {
783
+ "orfaos": 0,
784
+ "relocados": 23,
785
+ "taxa_ativos": 1.0
786
+ }
787
+ }
788
+ },
789
+ "avaliacao_final": {
790
+ "vqa": 1.9003024697303772,
791
+ "pontuacao": 2.7808186411857605,
792
+ "instrucao": 1.9354261755943298,
793
+ "tts": 1.8977428078651428,
794
+ "lm": 2.717095136642456,
795
+ "imagem_caption": 2.3393216133117676,
796
+ "ocr": 2.880362868309021,
797
+ "noticia": 2.6000683307647705,
798
+ "asr": 2.036989539861679,
799
+ "ppl_lm": 15.136289468671222
800
+ },
801
+ "metricas_completas": {
802
+ "neuronios_ativos": {
803
+ "ativos/som": 1.0,
804
+ "k/som": 24,
805
+ "ativos/gg": 1.0,
806
+ "k/gg": 4,
807
+ "ativos/gcs": 1.0,
808
+ "k/gcs": 3,
809
+ "ativos/gsom": 1.0,
810
+ "k/gsom": 33,
811
+ "ativos/hsom": 1.0,
812
+ "k/hsom": 12,
813
+ "ativos/tkm": 1.0,
814
+ "k/tkm": 32,
815
+ "ativos/rsom": 1.0,
816
+ "k/rsom": 32,
817
+ "ativos/cpn": 1.0,
818
+ "k/cpn": 24,
819
+ "ativos/ssom": 1.0,
820
+ "k/ssom": 24,
821
+ "A_global": 1.0
822
+ },
823
+ "estruturais": {
824
+ "ortogonalidade": 8.344650268554688e-07,
825
+ "balanceamento_moe": 0.0,
826
+ "gate_global": 0.33352139592170715,
827
+ "gate_janela": 0.3531237244606018,
828
+ "gate_linear": 0.31335487961769104,
829
+ "moe1/experts_ativos": 6.0,
830
+ "moe1/uso_max": 0.18867573142051697,
831
+ "moe1/perda_lb": 0.05620919540524483,
832
+ "moe1/perda_ort": 0.04630301520228386,
833
+ "moe1/fase": 0.0,
834
+ "moe1/beta_feedback": 0.0,
835
+ "moe1/entropia_atn": 0.0,
836
+ "moe2/experts_ativos": 6.0,
837
+ "moe2/uso_max": 0.1919080913066864,
838
+ "moe2/perda_lb": 0.05697876214981079,
839
+ "moe2/perda_ort": 0.017570793628692627,
840
+ "moe2/fase": 0.0,
841
+ "moe2/beta_feedback": -0.08475486189126968,
842
+ "moe2/entropia_atn": 0.5860676169395447,
843
+ "moe2/alpha_refino": -0.004548724740743637,
844
+ "mtp/alpha0": 0.9997836947441101,
845
+ "mtp/alpha1": 0.00021627375099342316,
846
+ "mtp/termos_ce": 44.0,
847
+ "micra0/n_ramos": 3,
848
+ "micra0/ramos_ativos": 3,
849
+ "micra0/passos_rec": 2,
850
+ "micra0/alpha0": 0.1318451315164566,
851
+ "micra0/alpha1": 0.3106174170970917,
852
+ "micra0/alpha2": 0.5575374364852905,
853
+ "micra0/uso0": 0.11339543014764786,
854
+ "micra0/uso1": 0.2821197211742401,
855
+ "micra0/uso2": 0.6044845581054688,
856
+ "micra1/n_ramos": 4,
857
+ "micra1/ramos_ativos": 4,
858
+ "micra1/passos_rec": 2,
859
+ "micra1/alpha0": 0.6494265198707581,
860
+ "micra1/alpha1": 0.20311686396598816,
861
+ "micra1/alpha2": 0.023890359327197075,
862
+ "micra1/alpha3": 0.12356625497341156,
863
+ "micra1/uso0": 0.4623371362686157,
864
+ "micra1/uso1": 0.23822982609272003,
865
+ "micra1/uso2": 0.11237825453281403,
866
+ "micra1/uso3": 0.18705463409423828,
867
+ "micra2/n_ramos": 4,
868
+ "micra2/ramos_ativos": 4,
869
+ "micra2/passos_rec": 2,
870
+ "micra2/alpha0": 0.9809788465499878,
871
+ "micra2/alpha1": 0.01534233894199133,
872
+ "micra2/alpha2": 0.0006197995971888304,
873
+ "micra2/alpha3": 0.0030591192189604044,
874
+ "micra2/uso0": 0.6023621559143066,
875
+ "micra2/uso1": 0.11406103521585464,
876
+ "micra2/uso2": 0.15544579923152924,
877
+ "micra2/uso3": 0.1281307488679886,
878
+ "nlp/gate_medio": 0.444911390542984,
879
+ "nlp/intencao_id": 6,
880
+ "nlg/coerencia_bigramas_vistos": 0.0,
881
+ "nlg/estilo_medio": 0.5,
882
+ "nlg/estilo_disp": 0.0,
883
+ "janela1m/n_segmentos": 0,
884
+ "janela1m/m_max": 7813,
885
+ "janela1m/hit_celula": 0.0,
886
+ "janela1m/consultas": 0,
887
+ "computo/computo_C": 0.177,
888
+ "computo/nucleos": 2,
889
+ "computo/ram_livre_mb": 1246.5,
890
+ "computo/n_ramos": 2,
891
+ "computo/d_ramo": 64,
892
+ "computo/k_rec": 1,
893
+ "mtp/rascunho_pronto": 1.0,
894
+ "roteador/amostras": 1588,
895
+ "roteador/pronto": 1.0,
896
+ "roteador/frac_rotas": 0.0,
897
+ "roteador/conf_media": 0.2593,
898
+ "roteador/drift": 0.053734
899
+ },
900
+ "escala": {
901
+ "computo_C": 0.177,
902
+ "nucleos": 2,
903
+ "ram_livre_mb": 1246.5,
904
+ "n_ramos": 2,
905
+ "d_ramo": 64,
906
+ "k_rec": 1
907
+ },
908
+ "regime": {
909
+ "fase_final": "B",
910
+ "alvo_ativos": 0.9
911
+ }
912
+ },
913
+ "rpp": {
914
+ "rho": 1.0,
915
+ "streak": 0,
916
+ "recompensas": 0,
917
+ "punicoes": 2,
918
+ "penalidades": 104,
919
+ "kappa_rotas_mortas": 0.01
920
+ },
921
+ "roteador_ssom": {
922
+ "amostras": 1588,
923
+ "pronto": true,
924
+ "lambda_rota": 0.35,
925
+ "gamma_empate": 0.15,
926
+ "drift_codebook": 0.053734,
927
+ "conf_media": 0.2593,
928
+ "frac_rotas_ativas": 0.0,
929
+ "k": 24,
930
+ "taxa_ativos": 1.0
931
+ },
932
+ "inferencia_agente": {
933
+ "latencia_s": 0.459,
934
+ "tokens": 24,
935
+ "taxa_repeticao": 0.6667,
936
+ "coerencia_bigramas": 0.0
937
+ },
938
+ "difusao": null,
939
+ "agente_engenheiro": {
940
+ "aprovadas": 0,
941
+ "bloqueadas": 0,
942
+ "invariante_sem_orfaos": true
943
+ },
944
+ "checkpoints_eventos": [
945
+ "checkpoint epoca-007-p03088: 435 tensores, 23 pulados, 94 novos",
946
+ "1 checkpoint(s) antigo(s) apagado(s)",
947
+ "checkpoint epoca-007-p03150: local (59.2 MB)",
948
+ "1 checkpoint(s) antigo(s) apagado(s)",
949
+ "checkpoint epoca-007: local (59.2 MB)",
950
+ "1 checkpoint(s) antigo(s) apagado(s)",
951
+ "checkpoint fase-dpo: local (59.2 MB)",
952
+ "1 checkpoint(s) antigo(s) apagado(s)",
953
+ "checkpoint fase-som: local (59.2 MB)"
954
+ ],
955
+ "ram": {
956
+ "amostras": 6059,
957
+ "rss_min_mb": 542.6,
958
+ "rss_med_mb": 2692.2,
959
+ "rss_max_mb": 3579.5,
960
+ "disponivel_min_mb": 138.6,
961
+ "duracao_s": 12836.7
962
+ }
963
+ }
resumo_treino_v8.json ADDED
@@ -0,0 +1,974 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "versao": "v8-khtst-melhorias-a-j",
3
+ "teto_horas": 5.0,
4
+ "tempo_acumulado_h": 3.98,
5
+ "memoria_v8": {
6
+ "rss_mb": 2808.0,
7
+ "pico_rss_mb": 2901.1,
8
+ "limiar_mb": 3535.6,
9
+ "alpha": 0.85,
10
+ "limpezas": 0,
11
+ "observacoes": 90
12
+ },
13
+ "autoajuste_v8": null,
14
+ "epocas": [
15
+ {
16
+ "epoca": 0,
17
+ "perda_media": 7.563339779175908,
18
+ "avaliacao": {
19
+ "vqa": 7.203276952107747,
20
+ "pontuacao": 7.940507570902507,
21
+ "instrucao": 7.06501563390096,
22
+ "tts": 6.899012962977092,
23
+ "lm": 8.063114325205484,
24
+ "imagem_caption": 6.979289611180623,
25
+ "ocr": 8.369198322296143,
26
+ "noticia": 7.745315869649251,
27
+ "asr": 7.773949146270752,
28
+ "ppl_lm": 3175.163243261297
29
+ },
30
+ "eq_som": 0.3644367456436157,
31
+ "punicoes": 2,
32
+ "prs": {
33
+ "trust": 0.5754,
34
+ "tau": 7.08859,
35
+ "clip": 2.2575,
36
+ "boost": 1.0,
37
+ "streak": 0,
38
+ "ciclos_sgdr": 0,
39
+ "recompensa_acum": 15.603,
40
+ "beta_min_relativo": 0.575
41
+ },
42
+ "rpp": {
43
+ "rho": 1.0,
44
+ "streak": 0,
45
+ "recompensas": 14,
46
+ "punicoes": 2,
47
+ "penalidades": 83,
48
+ "kappa_rotas_mortas": 0.01
49
+ },
50
+ "roteador": {
51
+ "amostras": 41,
52
+ "pronto": false,
53
+ "lambda_rota": 0.35,
54
+ "gamma_empate": 0.15,
55
+ "drift_codebook": 0.017941,
56
+ "conf_media": 0.0,
57
+ "frac_rotas_ativas": 0.0,
58
+ "k": 24,
59
+ "taxa_ativos": 0.0417
60
+ },
61
+ "confianca": {
62
+ "h_ema": 0.1964285671710968,
63
+ "ece": 0.07530120481927709,
64
+ "posterior": {
65
+ "media": 0.38823529411764707,
66
+ "bernstein": [
67
+ 0.216560596460874,
68
+ 0.5599099917744201
69
+ ]
70
+ }
71
+ },
72
+ "memoria": {
73
+ "slots": 17,
74
+ "capacidade": 64,
75
+ "escritas": 17,
76
+ "rejeitadas_confianca": 3,
77
+ "hit_rate": 1.0,
78
+ "comprimidos": 0,
79
+ "entropia_codebook": 1.4736544073912228e-07,
80
+ "perda_vq": null,
81
+ "violacoes_contrato": 0,
82
+ "economia_bits_por_slot": 0.9990234375
83
+ },
84
+ "crescimento": []
85
+ },
86
+ {
87
+ "epoca": 1,
88
+ "perda_media": 8.527180158174955,
89
+ "avaliacao": {
90
+ "vqa": 7.8786665598551435,
91
+ "pontuacao": 8.415692011515299,
92
+ "instrucao": 7.5004353523254395,
93
+ "tts": 7.3423952261606855,
94
+ "lm": 8.11315369606018,
95
+ "imagem_caption": 7.946273724238078,
96
+ "ocr": 8.556553681691488,
97
+ "noticia": 8.175559520721436,
98
+ "asr": 7.956470807393392,
99
+ "ppl_lm": 3338.0887647367836
100
+ },
101
+ "eq_som": 0.16573584079742432,
102
+ "punicoes": 1,
103
+ "prs": {
104
+ "trust": 0.7024,
105
+ "tau": 9.02434,
106
+ "clip": 5.0,
107
+ "boost": 1.0,
108
+ "streak": 8,
109
+ "ciclos_sgdr": 0,
110
+ "recompensa_acum": 16.089,
111
+ "beta_min_relativo": 0.702
112
+ },
113
+ "rpp": {
114
+ "rho": 1.0,
115
+ "streak": 0,
116
+ "recompensas": 0,
117
+ "punicoes": 1,
118
+ "penalidades": 13,
119
+ "kappa_rotas_mortas": 0.01
120
+ },
121
+ "roteador": {
122
+ "amostras": 7,
123
+ "pronto": false,
124
+ "lambda_rota": 0.35,
125
+ "gamma_empate": 0.15,
126
+ "drift_codebook": 0.076635,
127
+ "conf_media": 0.0,
128
+ "frac_rotas_ativas": 0.0,
129
+ "k": 24,
130
+ "taxa_ativos": 0.125
131
+ },
132
+ "confianca": {
133
+ "h_ema": 0.3969818949699402,
134
+ "ece": 0.35769230769230775,
135
+ "posterior": {
136
+ "media": 0.8,
137
+ "bernstein": [
138
+ 0.36442949889125675,
139
+ 1.0
140
+ ]
141
+ }
142
+ },
143
+ "memoria": {
144
+ "slots": 3,
145
+ "capacidade": 64,
146
+ "escritas": 3,
147
+ "rejeitadas_confianca": 0,
148
+ "hit_rate": 0.0,
149
+ "comprimidos": 0,
150
+ "entropia_codebook": 1.4736544073912228e-07,
151
+ "perda_vq": null,
152
+ "violacoes_contrato": 0,
153
+ "economia_bits_por_slot": 0.9990234375
154
+ },
155
+ "crescimento": []
156
+ },
157
+ {
158
+ "epoca": 2,
159
+ "perda_media": 7.530729611714681,
160
+ "avaliacao": {
161
+ "vqa": 6.954700787862142,
162
+ "pontuacao": 7.803481101989746,
163
+ "instrucao": 6.964048147201538,
164
+ "tts": 6.852313915888469,
165
+ "lm": 7.867028474807739,
166
+ "imagem_caption": 7.145581881205241,
167
+ "ocr": 8.153267065684,
168
+ "noticia": 7.7516772747039795,
169
+ "asr": 7.569636821746826,
170
+ "ppl_lm": 2609.7989711637842
171
+ },
172
+ "eq_som": 0.22748778760433197,
173
+ "punicoes": 1,
174
+ "prs": {
175
+ "trust": 0.4023,
176
+ "tau": 6.87234,
177
+ "clip": 2.4136,
178
+ "boost": 1.0,
179
+ "streak": 0,
180
+ "ciclos_sgdr": 0,
181
+ "recompensa_acum": 0.379,
182
+ "beta_min_relativo": 2.0
183
+ },
184
+ "rpp": {
185
+ "rho": 1.0,
186
+ "streak": 0,
187
+ "recompensas": 0,
188
+ "punicoes": 1,
189
+ "penalidades": 15,
190
+ "kappa_rotas_mortas": 0.01
191
+ },
192
+ "roteador": {
193
+ "amostras": 7,
194
+ "pronto": false,
195
+ "lambda_rota": 0.35,
196
+ "gamma_empate": 0.15,
197
+ "drift_codebook": 0.045073,
198
+ "conf_media": 0.0,
199
+ "frac_rotas_ativas": 0.0,
200
+ "k": 24,
201
+ "taxa_ativos": 0.0417
202
+ },
203
+ "confianca": {
204
+ "h_ema": 0.365193247795105,
205
+ "ece": 0.22999999999999998,
206
+ "posterior": {
207
+ "media": 0.11764705882352941,
208
+ "bernstein": [
209
+ 0.0,
210
+ 0.46857976498181986
211
+ ]
212
+ }
213
+ },
214
+ "memoria": {
215
+ "slots": 1,
216
+ "capacidade": 64,
217
+ "escritas": 1,
218
+ "rejeitadas_confianca": 3,
219
+ "hit_rate": 0.0,
220
+ "comprimidos": 0,
221
+ "entropia_codebook": 1.4736544073912228e-07,
222
+ "perda_vq": null,
223
+ "violacoes_contrato": 0,
224
+ "economia_bits_por_slot": 0.9990234375
225
+ },
226
+ "crescimento": []
227
+ },
228
+ {
229
+ "epoca": 3,
230
+ "perda_media": 7.470894780158996,
231
+ "avaliacao": {
232
+ "vqa": 7.305373986562093,
233
+ "pontuacao": 7.8117343584696455,
234
+ "instrucao": 6.982861677805583,
235
+ "tts": 6.699165344238281,
236
+ "lm": 7.789499680201213,
237
+ "imagem_caption": 6.952828089396159,
238
+ "ocr": 8.299275239308676,
239
+ "noticia": 7.658636728922526,
240
+ "asr": 7.480801423390706,
241
+ "ppl_lm": 2415.108953044255
242
+ },
243
+ "eq_som": 0.31188270449638367,
244
+ "punicoes": 2,
245
+ "prs": {
246
+ "trust": 0.4822,
247
+ "tau": 7.0253,
248
+ "clip": 1.5271,
249
+ "boost": 1.0,
250
+ "streak": 0,
251
+ "ciclos_sgdr": 0,
252
+ "recompensa_acum": 9.739,
253
+ "beta_min_relativo": 2.0
254
+ },
255
+ "rpp": {
256
+ "rho": 1.0,
257
+ "streak": 0,
258
+ "recompensas": 0,
259
+ "punicoes": 2,
260
+ "penalidades": 100,
261
+ "kappa_rotas_mortas": 0.01
262
+ },
263
+ "roteador": {
264
+ "amostras": 50,
265
+ "pronto": false,
266
+ "lambda_rota": 0.35,
267
+ "gamma_empate": 0.15,
268
+ "drift_codebook": 0.009737,
269
+ "conf_media": 0.0,
270
+ "frac_rotas_ativas": 0.0,
271
+ "k": 24,
272
+ "taxa_ativos": 0.0417
273
+ },
274
+ "confianca": {
275
+ "h_ema": 0.4308484196662903,
276
+ "ece": 0.12999999999999998,
277
+ "posterior": {
278
+ "media": 0.3431372549019608,
279
+ "bernstein": [
280
+ 0.19196517099664429,
281
+ 0.4943093388072773
282
+ ]
283
+ }
284
+ },
285
+ "memoria": {
286
+ "slots": 22,
287
+ "capacidade": 64,
288
+ "escritas": 22,
289
+ "rejeitadas_confianca": 3,
290
+ "hit_rate": 1.0,
291
+ "comprimidos": 0,
292
+ "entropia_codebook": 1.4736544073912228e-07,
293
+ "perda_vq": null,
294
+ "violacoes_contrato": 0,
295
+ "economia_bits_por_slot": 0.9990234375
296
+ },
297
+ "crescimento": []
298
+ },
299
+ {
300
+ "epoca": 4,
301
+ "perda_media": 7.043362287374643,
302
+ "avaliacao": {
303
+ "vqa": 6.859211603800456,
304
+ "pontuacao": 7.844064950942993,
305
+ "instrucao": 6.841043631235759,
306
+ "tts": 6.587692578633626,
307
+ "lm": 7.733375469843547,
308
+ "imagem_caption": 7.099506139755249,
309
+ "ocr": 8.67655897140503,
310
+ "noticia": 7.596554199854533,
311
+ "asr": 7.473083972930908,
312
+ "ppl_lm": 2283.2964058650737
313
+ },
314
+ "eq_som": 0.24100500345230103,
315
+ "punicoes": 1,
316
+ "prs": {
317
+ "trust": 0.417,
318
+ "tau": 6.07795,
319
+ "clip": 2.2545,
320
+ "boost": 1.0,
321
+ "streak": 0,
322
+ "ciclos_sgdr": 0,
323
+ "recompensa_acum": 0.943,
324
+ "beta_min_relativo": 2.0
325
+ },
326
+ "rpp": {
327
+ "rho": 1.0,
328
+ "streak": 0,
329
+ "recompensas": 0,
330
+ "punicoes": 1,
331
+ "penalidades": 13,
332
+ "kappa_rotas_mortas": 0.01
333
+ },
334
+ "roteador": {
335
+ "amostras": 6,
336
+ "pronto": false,
337
+ "lambda_rota": 0.35,
338
+ "gamma_empate": 0.15,
339
+ "drift_codebook": 0.029232,
340
+ "conf_media": 0.0,
341
+ "frac_rotas_ativas": 0.0,
342
+ "k": 24,
343
+ "taxa_ativos": 0.0417
344
+ },
345
+ "confianca": {
346
+ "h_ema": 0.3634525537490845,
347
+ "ece": 0.2961538461538462,
348
+ "posterior": {
349
+ "media": 0.13333333333333333,
350
+ "bernstein": [
351
+ 0.0,
352
+ 0.5281164023006646
353
+ ]
354
+ }
355
+ },
356
+ "memoria": {
357
+ "slots": 1,
358
+ "capacidade": 64,
359
+ "escritas": 1,
360
+ "rejeitadas_confianca": 2,
361
+ "hit_rate": 0.0,
362
+ "comprimidos": 0,
363
+ "entropia_codebook": 1.4736544073912228e-07,
364
+ "perda_vq": null,
365
+ "violacoes_contrato": 0,
366
+ "economia_bits_por_slot": 0.9990234375
367
+ },
368
+ "crescimento": []
369
+ },
370
+ {
371
+ "epoca": 5,
372
+ "perda_media": 7.089543087537899,
373
+ "avaliacao": {
374
+ "vqa": 7.19921612739563,
375
+ "pontuacao": 7.889442205429077,
376
+ "instrucao": 6.684427817662557,
377
+ "tts": 6.422936836878459,
378
+ "lm": 7.89083456993103,
379
+ "imagem_caption": 6.99442187945048,
380
+ "ocr": 8.637943903605143,
381
+ "noticia": 7.566332896550496,
382
+ "asr": 7.405004978179932,
383
+ "ppl_lm": 2672.6735231256753
384
+ },
385
+ "eq_som": 0.2562611401081085,
386
+ "punicoes": 1,
387
+ "prs": {
388
+ "trust": 0.6251,
389
+ "tau": 6.75615,
390
+ "clip": 2.5585,
391
+ "boost": 1.0,
392
+ "streak": 1,
393
+ "ciclos_sgdr": 0,
394
+ "recompensa_acum": 14.32,
395
+ "beta_min_relativo": 0.625
396
+ },
397
+ "rpp": {
398
+ "rho": 1.0375,
399
+ "streak": 0,
400
+ "recompensas": 5,
401
+ "punicoes": 1,
402
+ "penalidades": 43,
403
+ "kappa_rotas_mortas": 0.01
404
+ },
405
+ "roteador": {
406
+ "amostras": 22,
407
+ "pronto": false,
408
+ "lambda_rota": 0.35,
409
+ "gamma_empate": 0.15,
410
+ "drift_codebook": 0.014433,
411
+ "conf_media": 0.0,
412
+ "frac_rotas_ativas": 0.0,
413
+ "k": 24,
414
+ "taxa_ativos": 0.0417
415
+ },
416
+ "confianca": {
417
+ "h_ema": 0.6187677979469299,
418
+ "ece": 0.25232558139534883,
419
+ "posterior": {
420
+ "media": 0.5111111111111111,
421
+ "bernstein": [
422
+ 0.25626934934981205,
423
+ 0.7659528728724101
424
+ ]
425
+ }
426
+ },
427
+ "memoria": {
428
+ "slots": 11,
429
+ "capacidade": 64,
430
+ "escritas": 11,
431
+ "rejeitadas_confianca": 0,
432
+ "hit_rate": 1.0,
433
+ "comprimidos": 0,
434
+ "entropia_codebook": 1.4736544073912228e-07,
435
+ "perda_vq": null,
436
+ "violacoes_contrato": 0,
437
+ "economia_bits_por_slot": 0.9990234375
438
+ },
439
+ "crescimento": []
440
+ },
441
+ {
442
+ "epoca": 6,
443
+ "perda_media": 9.40745317524877,
444
+ "avaliacao": {
445
+ "vqa": 8.110245307286581,
446
+ "pontuacao": 7.9338812828063965,
447
+ "instrucao": 8.075132290522257,
448
+ "tts": 8.336720863978067,
449
+ "lm": 8.390085379282633,
450
+ "imagem_caption": 8.074243863423666,
451
+ "ocr": 8.7576953570048,
452
+ "noticia": 7.6731063524882,
453
+ "asr": 8.676271120707193,
454
+ "ppl_lm": 4403.193619695888
455
+ },
456
+ "eq_som": 0.11337500810623169,
457
+ "punicoes": 1,
458
+ "prs": {
459
+ "trust": 0.6626,
460
+ "tau": 9.69135,
461
+ "clip": 0.5116,
462
+ "boost": 1.0,
463
+ "streak": 1,
464
+ "ciclos_sgdr": 0,
465
+ "recompensa_acum": 22.583,
466
+ "beta_min_relativo": 0.663
467
+ },
468
+ "rpp": {
469
+ "rho": 1.0,
470
+ "streak": 0,
471
+ "recompensas": 0,
472
+ "punicoes": 1,
473
+ "penalidades": 58,
474
+ "kappa_rotas_mortas": 0.01
475
+ },
476
+ "roteador": {
477
+ "amostras": 29,
478
+ "pronto": false,
479
+ "lambda_rota": 0.35,
480
+ "gamma_empate": 0.15,
481
+ "drift_codebook": 0.002355,
482
+ "conf_media": 0.0,
483
+ "frac_rotas_ativas": 0.0,
484
+ "k": 24,
485
+ "taxa_ativos": 0.0833
486
+ },
487
+ "confianca": {
488
+ "h_ema": 0.5460562705993652,
489
+ "ece": 0.20344827586206898,
490
+ "posterior": {
491
+ "media": 0.35,
492
+ "bernstein": [
493
+ 0.1431347476029459,
494
+ 0.5568652523970541
495
+ ]
496
+ }
497
+ },
498
+ "memoria": {
499
+ "slots": 13,
500
+ "capacidade": 64,
501
+ "escritas": 13,
502
+ "rejeitadas_confianca": 2,
503
+ "hit_rate": 0.0,
504
+ "comprimidos": 0,
505
+ "entropia_codebook": 1.4736544073912228e-07,
506
+ "perda_vq": null,
507
+ "violacoes_contrato": 0,
508
+ "economia_bits_por_slot": 0.9990234375
509
+ },
510
+ "crescimento": []
511
+ },
512
+ {
513
+ "epoca": 7,
514
+ "perda_media": 7.231130578782824,
515
+ "avaliacao": {
516
+ "vqa": 6.5694239139556885,
517
+ "pontuacao": 7.822401364644368,
518
+ "instrucao": 6.962437709172566,
519
+ "tts": 6.983241717020671,
520
+ "lm": 7.852646191914876,
521
+ "imagem_caption": 7.0820222695668535,
522
+ "ocr": 7.846352259318034,
523
+ "noticia": 7.663803895314534,
524
+ "asr": 7.646427710851033,
525
+ "ppl_lm": 2572.532733229914
526
+ },
527
+ "eq_som": 0.3229912519454956,
528
+ "punicoes": 1,
529
+ "prs": {
530
+ "trust": 0.3768,
531
+ "tau": 6.82558,
532
+ "clip": 5.0,
533
+ "boost": 1.0,
534
+ "streak": 0,
535
+ "ciclos_sgdr": 0,
536
+ "recompensa_acum": 9.712,
537
+ "beta_min_relativo": 2.0
538
+ },
539
+ "rpp": {
540
+ "rho": 1.0,
541
+ "streak": 0,
542
+ "recompensas": 2,
543
+ "punicoes": 1,
544
+ "penalidades": 90,
545
+ "kappa_rotas_mortas": 0.01
546
+ },
547
+ "roteador": {
548
+ "amostras": 45,
549
+ "pronto": false,
550
+ "lambda_rota": 0.35,
551
+ "gamma_empate": 0.15,
552
+ "drift_codebook": 0.009923,
553
+ "conf_media": 0.0,
554
+ "frac_rotas_ativas": 0.0,
555
+ "k": 24,
556
+ "taxa_ativos": 0.0417
557
+ },
558
+ "confianca": {
559
+ "h_ema": 0.398207426071167,
560
+ "ece": 0.13666666666666666,
561
+ "posterior": {
562
+ "media": 0.18478260869565216,
563
+ "bernstein": [
564
+ 0.048734518728612175,
565
+ 0.32083069866269215
566
+ ]
567
+ }
568
+ },
569
+ "memoria": {
570
+ "slots": 13,
571
+ "capacidade": 64,
572
+ "escritas": 13,
573
+ "rejeitadas_confianca": 10,
574
+ "hit_rate": 1.0,
575
+ "comprimidos": 0,
576
+ "entropia_codebook": 1.4736544073912228e-07,
577
+ "perda_vq": null,
578
+ "violacoes_contrato": 0,
579
+ "economia_bits_por_slot": 0.9990234375
580
+ },
581
+ "crescimento": []
582
+ }
583
+ ],
584
+ "passos": 3192,
585
+ "punicoes": 1,
586
+ "barreira_abmo_ativacoes": 0,
587
+ "pcgrad_ultimo": {
588
+ "pcgrad/dot": 0.0004723769121788418,
589
+ "pcgrad/projetado": 0.0,
590
+ "pcgrad/fator": 0.0
591
+ },
592
+ "prs_v8": {
593
+ "trust": 0.3768,
594
+ "tau": 6.82558,
595
+ "clip": 5.0,
596
+ "boost": 1.0,
597
+ "streak": 0,
598
+ "ciclos_sgdr": 0,
599
+ "recompensa_acum": 9.712,
600
+ "beta_min_relativo": 2.0
601
+ },
602
+ "confianca": {
603
+ "h_ema": 0.398207426071167,
604
+ "ece": 0.13666666666666666,
605
+ "posterior_media": 0.18478260869565216,
606
+ "bernstein": [
607
+ 0.048734518728612175,
608
+ 0.32083069866269215
609
+ ]
610
+ },
611
+ "memoria": {
612
+ "slots": 13,
613
+ "capacidade": 64,
614
+ "escritas": 13,
615
+ "rejeitadas_confianca": 10,
616
+ "hit_rate": 1.0,
617
+ "comprimidos": 0,
618
+ "entropia_codebook": 1.4736544073912228e-07,
619
+ "perda_vq": null,
620
+ "violacoes_contrato": 0,
621
+ "economia_bits_por_slot": 0.9990234375
622
+ },
623
+ "crescimento": [],
624
+ "microunidades": [
625
+ {
626
+ "ramos": [
627
+ "conv_dil",
628
+ "gru",
629
+ "mlp"
630
+ ],
631
+ "ativos": [
632
+ 1.0,
633
+ 1.0,
634
+ 1.0
635
+ ],
636
+ "uso_ema": [
637
+ 0.9752992987632751,
638
+ 0.024680670350790024,
639
+ 1.9912109564756975e-05
640
+ ],
641
+ "passos_rec": 2
642
+ },
643
+ {
644
+ "ramos": [
645
+ "conv_dil",
646
+ "gru",
647
+ "mlp",
648
+ "moe"
649
+ ],
650
+ "ativos": [
651
+ 1.0,
652
+ 1.0,
653
+ 1.0,
654
+ 1.0
655
+ ],
656
+ "uso_ema": [
657
+ 0.12329785525798798,
658
+ 0.4805801510810852,
659
+ 0.07674114406108856,
660
+ 0.31938061118125916
661
+ ],
662
+ "passos_rec": 2
663
+ },
664
+ {
665
+ "ramos": [
666
+ "conv_dil",
667
+ "gru",
668
+ "mlp",
669
+ "moe"
670
+ ],
671
+ "ativos": [
672
+ 1.0,
673
+ 1.0,
674
+ 1.0,
675
+ 1.0
676
+ ],
677
+ "uso_ema": [
678
+ 0.9999496936798096,
679
+ 2.324265779840573e-11,
680
+ 4.997722862754017e-05,
681
+ 2.525876396930471e-08
682
+ ],
683
+ "passos_rec": 2
684
+ }
685
+ ],
686
+ "dpo": {
687
+ "passos": 93,
688
+ "acc_final": 1.0,
689
+ "margem_final": 14.226043701171875,
690
+ "beta_final": 0.05858517438173294
691
+ },
692
+ "som": {
693
+ "variante_ativa": "cpn",
694
+ "variantes": {
695
+ "som": {
696
+ "k": 24,
697
+ "taxa_ativos": 1.0,
698
+ "resemeados": 24,
699
+ "usos": 256,
700
+ "atingiu_alvo": true
701
+ },
702
+ "gg": {
703
+ "k": 4,
704
+ "taxa_ativos": 1.0,
705
+ "resemeados": 4,
706
+ "usos": 256,
707
+ "atingiu_alvo": true
708
+ },
709
+ "gcs": {
710
+ "k": 3,
711
+ "arestas": 3,
712
+ "eq_treino": 4104.4892578125,
713
+ "atingiu_alvo": true
714
+ },
715
+ "gsom": {
716
+ "k": 15,
717
+ "gt": 1.05,
718
+ "erro_medio": 0.18949279189109802,
719
+ "atingiu_alvo": true
720
+ },
721
+ "hsom": {},
722
+ "tkm": {
723
+ "k": 32,
724
+ "taxa_ativos": 1.0,
725
+ "resemeados": 32,
726
+ "usos": 256,
727
+ "atingiu_alvo": true
728
+ },
729
+ "rsom": {
730
+ "k": 32,
731
+ "taxa_ativos": 1.0,
732
+ "resemeados": 32,
733
+ "usos": 256,
734
+ "atingiu_alvo": true
735
+ },
736
+ "cpn": {},
737
+ "ssom": {
738
+ "erro": "IndexError: index 8 is out of bounds for dimension 0 with size 8"
739
+ }
740
+ },
741
+ "roteador": {
742
+ "amostras": 1581,
743
+ "pronto": true,
744
+ "lambda_rota": 0.35,
745
+ "gamma_empate": 0.15,
746
+ "drift_codebook": 0.009923,
747
+ "conf_media": 0.4107,
748
+ "frac_rotas_ativas": 0.7188,
749
+ "k": 24,
750
+ "taxa_ativos": 1.0
751
+ },
752
+ "invariante_sem_orfaos": true,
753
+ "orfaos_por_variante": {
754
+ "som": {
755
+ "orfaos": 0,
756
+ "relocados": 0,
757
+ "taxa_ativos": 1.0
758
+ },
759
+ "gg": {
760
+ "orfaos": 0,
761
+ "relocados": 0,
762
+ "taxa_ativos": 1.0
763
+ },
764
+ "gcs": {
765
+ "orfaos": 0,
766
+ "relocados": 0,
767
+ "taxa_ativos": 1.0
768
+ },
769
+ "gsom": {
770
+ "orfaos": 0,
771
+ "relocados": 0,
772
+ "taxa_ativos": 1.0
773
+ },
774
+ "hsom": {
775
+ "orfaos": 0,
776
+ "relocados": 0
777
+ },
778
+ "tkm": {
779
+ "orfaos": 0,
780
+ "relocados": 0,
781
+ "taxa_ativos": 1.0
782
+ },
783
+ "rsom": {
784
+ "orfaos": 0,
785
+ "relocados": 0,
786
+ "taxa_ativos": 1.0
787
+ },
788
+ "cpn": {
789
+ "orfaos": 0,
790
+ "relocados": 0,
791
+ "taxa_ativos": 1.0
792
+ },
793
+ "ssom": {
794
+ "orfaos": 0,
795
+ "relocados": 23,
796
+ "taxa_ativos": 1.0
797
+ }
798
+ }
799
+ },
800
+ "avaliacao_final": {
801
+ "vqa": 6.4591522216796875,
802
+ "pontuacao": 7.7690675258636475,
803
+ "instrucao": 7.062118411064148,
804
+ "tts": 6.546424508094788,
805
+ "lm": 7.9568891525268555,
806
+ "imagem_caption": 7.035338521003723,
807
+ "ocr": 8.0436851978302,
808
+ "noticia": 7.5813761949539185,
809
+ "asr": 7.698689699172974,
810
+ "ppl_lm": 2855.177102389719
811
+ },
812
+ "metricas_completas": {
813
+ "neuronios_ativos": {
814
+ "ativos/som": 1.0,
815
+ "k/som": 24,
816
+ "ativos/gg": 1.0,
817
+ "k/gg": 4,
818
+ "ativos/gcs": 1.0,
819
+ "k/gcs": 3,
820
+ "ativos/gsom": 1.0,
821
+ "k/gsom": 15,
822
+ "ativos/hsom": 1.0,
823
+ "k/hsom": 12,
824
+ "ativos/tkm": 1.0,
825
+ "k/tkm": 32,
826
+ "ativos/rsom": 1.0,
827
+ "k/rsom": 32,
828
+ "ativos/cpn": 1.0,
829
+ "k/cpn": 24,
830
+ "ativos/ssom": 1.0,
831
+ "k/ssom": 24,
832
+ "A_global": 1.0
833
+ },
834
+ "estruturais": {
835
+ "ortogonalidade": 7.152557373046875e-07,
836
+ "balanceamento_moe": 0.0,
837
+ "gate_global": 0.3491619825363159,
838
+ "gate_janela": 0.3269121050834656,
839
+ "gate_linear": 0.3239259123802185,
840
+ "moe1/experts_ativos": 6.0,
841
+ "moe1/uso_max": 0.17838352918624878,
842
+ "moe1/perda_lb": 0.055772364139556885,
843
+ "moe1/perda_ort": 0.00034026303910650313,
844
+ "moe1/fase": 0.0,
845
+ "moe1/beta_feedback": 0.0,
846
+ "moe1/entropia_atn": 0.0,
847
+ "moe2/enc_uso_medio": 0.5,
848
+ "moe2/dec_uso_medio": 0.24999994039535522,
849
+ "moe2/dec_uso_min": 0.001363456016406417,
850
+ "moe2/agrupado": 0.0,
851
+ "moe2/perda_lb": 6.0,
852
+ "mtp/alpha0": 0.0005300508346408606,
853
+ "mtp/alpha1": 0.9994699358940125,
854
+ "mtp/termos_ce": 998.0,
855
+ "micra0/n_ramos": 3,
856
+ "micra0/ramos_ativos": 3,
857
+ "micra0/passos_rec": 2,
858
+ "micra0/alpha0": 1.0,
859
+ "micra0/alpha1": 1.3542193755267107e-10,
860
+ "micra0/alpha2": 1.4029073186149995e-15,
861
+ "micra0/uso0": 0.9752992987632751,
862
+ "micra0/uso1": 0.024680670350790024,
863
+ "micra0/uso2": 1.9912109564756975e-05,
864
+ "micra1/n_ramos": 4,
865
+ "micra1/ramos_ativos": 4,
866
+ "micra1/passos_rec": 2,
867
+ "micra1/alpha0": 0.07855360209941864,
868
+ "micra1/alpha1": 0.5188434720039368,
869
+ "micra1/alpha2": 0.07156255841255188,
870
+ "micra1/alpha3": 0.3310403823852539,
871
+ "micra1/uso0": 0.12329785525798798,
872
+ "micra1/uso1": 0.4805801510810852,
873
+ "micra1/uso2": 0.07674114406108856,
874
+ "micra1/uso3": 0.31938061118125916,
875
+ "micra2/n_ramos": 4,
876
+ "micra2/ramos_ativos": 4,
877
+ "micra2/passos_rec": 2,
878
+ "micra2/alpha0": 0.9999498128890991,
879
+ "micra2/alpha1": 2.1000236272161743e-11,
880
+ "micra2/alpha2": 5.0150272727478296e-05,
881
+ "micra2/alpha3": 2.1534841465609134e-08,
882
+ "micra2/uso0": 0.9999496936798096,
883
+ "micra2/uso1": 2.324265779840573e-11,
884
+ "micra2/uso2": 4.997722862754017e-05,
885
+ "micra2/uso3": 2.525876396930471e-08,
886
+ "nlp/gate_medio": 0.5649126768112183,
887
+ "nlp/intencao_id": 7,
888
+ "nlg/coerencia_bigramas_vistos": 0.0,
889
+ "nlg/estilo_medio": 0.5,
890
+ "nlg/estilo_disp": 0.0,
891
+ "janela1m/n_segmentos": 0,
892
+ "janela1m/m_max": 2017,
893
+ "janela1m/hit_celula": 0.0,
894
+ "janela1m/consultas": 0,
895
+ "mtp/rascunho_pronto": 1.0,
896
+ "roteador/amostras": 1581,
897
+ "roteador/pronto": 1.0,
898
+ "roteador/frac_rotas": 0.0,
899
+ "roteador/conf_media": 0.619,
900
+ "roteador/drift": 0.009923
901
+ },
902
+ "escala": {},
903
+ "regime": {
904
+ "fase_final": "B",
905
+ "alvo_ativos": 0.9
906
+ }
907
+ },
908
+ "rpp": {
909
+ "rho": 1.0,
910
+ "streak": 0,
911
+ "recompensas": 2,
912
+ "punicoes": 1,
913
+ "penalidades": 90,
914
+ "kappa_rotas_mortas": 0.01
915
+ },
916
+ "roteador_ssom": {
917
+ "amostras": 1581,
918
+ "pronto": true,
919
+ "lambda_rota": 0.35,
920
+ "gamma_empate": 0.15,
921
+ "drift_codebook": 0.009923,
922
+ "conf_media": 0.619,
923
+ "frac_rotas_ativas": 0.0,
924
+ "k": 24,
925
+ "taxa_ativos": 1.0
926
+ },
927
+ "inferencia_agente": {
928
+ "latencia_s": 0.481,
929
+ "tokens": 24,
930
+ "taxa_repeticao": 0.875,
931
+ "coerencia_bigramas": 0.0
932
+ },
933
+ "difusao": {
934
+ "modo": "planejado",
935
+ "op": "txt2img",
936
+ "latencia_s": 0.0,
937
+ "prompt_enriquecido": "a floresta amazonica de manha, com detalhes nítidos, com composição harmônica, com iluminação suave",
938
+ "gerou_pixels": false,
939
+ "estatisticas": {
940
+ "modo": "planejado",
941
+ "repo": "hf-internal-testing/tiny-stable-diffusion-torch",
942
+ "device": "cpu",
943
+ "pipelines": [],
944
+ "eventos": [
945
+ "pipeline txt2img: ImportError: \nStableDiffusionPipeline requires the transformers library but it was not found in your environment. You can install it with pip: `pip\ninstall transformers`\n"
946
+ ]
947
+ }
948
+ },
949
+ "agente_engenheiro": {
950
+ "aprovadas": 0,
951
+ "bloqueadas": 0,
952
+ "invariante_sem_orfaos": true
953
+ },
954
+ "checkpoints_eventos": [
955
+ "checkpoint epoca-007-p03102: 568 tensores, 0 pulados, 93 novos",
956
+ "1 checkpoint(s) antigo(s) apagado(s)",
957
+ "checkpoint epoca-007-p03150: local (62.0 MB)",
958
+ "1 checkpoint(s) antigo(s) apagado(s)",
959
+ "checkpoint epoca-007: local (62.0 MB)",
960
+ "1 checkpoint(s) antigo(s) apagado(s)",
961
+ "checkpoint fase-dpo: local (62.0 MB)",
962
+ "1 checkpoint(s) antigo(s) apagado(s)",
963
+ "checkpoint fase-som: local (62.0 MB)"
964
+ ],
965
+ "ram": {
966
+ "amostras": 5919,
967
+ "rss_min_mb": 428.7,
968
+ "rss_med_mb": 2524.4,
969
+ "rss_max_mb": 3358.4,
970
+ "disponivel_min_mb": 435.4,
971
+ "duracao_s": 14340.3
972
+ },
973
+ "tempo_nota": "wall time real do MonitorRAM sobre todos os segmentos; contagem pré-correção incluída"
974
+ }
scripts/01_verificar_ambiente.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Verificação do ambiente KHTST v2: dependências, RAM/disco, token HF
4
+ (PRESENÇA apenas — o valor NUNCA é impresso), módulos da v2 importáveis."""
5
+ import os
6
+ import sys
7
+
8
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
9
+
10
+
11
+ def main():
12
+ print("== KHTST v2 — verificação de ambiente ==")
13
+ # dependências
14
+ faltando = []
15
+ for mod in ("torch", "datasets", "tokenizers", "huggingface_hub",
16
+ "safetensors", "soundfile", "numpy", "PIL", "requests",
17
+ "pyarrow"):
18
+ try:
19
+ m = __import__(mod)
20
+ versao = getattr(m, "__version__", "?")
21
+ print(f" ✓ {mod} {versao}")
22
+ except ImportError:
23
+ faltando.append(mod)
24
+ print(f" ✗ FALTA: {mod}")
25
+ if faltando:
26
+ print("Instale:", " ".join(faltando))
27
+ return 1
28
+ # recursos
29
+ import shutil
30
+ total, _, livre = shutil.disk_usage("/home/z/my-project")
31
+ print(f" disco: {livre/2**30:.1f} GB livres de {total/2**30:.1f} GB")
32
+ with open("/proc/meminfo") as f:
33
+ memkb = int(next(f).split()[1])
34
+ print(f" RAM: {memkb/2**20:.1f} GB total")
35
+ # token (presença apenas)
36
+ tem_token = bool(os.environ.get("HF_TOKEN"))
37
+ print(f" HF_TOKEN presente: {tem_token} (valor nunca é impresso)")
38
+ # módulos v2
39
+ from khtst.config import Config
40
+ from khtst.nucleo.modelo import KHTSTModel
41
+ try:
42
+ from khtst.acelerado import status as status_acelerado
43
+ except Exception:
44
+ status_acelerado = None
45
+ from khtst.percepcao.moe import MoEAgrupavel
46
+ from khtst.treino.mtp import MTPKHTST
47
+ from khtst.treino.dpo import PerdaDPO
48
+ from khtst.treino.cirurgia_grad import pcgrad_duas_perdas
49
+ from khtst.quanta.quantizacao import SmoothQuantAlpha
50
+ from khtst.dados.checkpoints import GestorCheckpoints
51
+ cfg = Config()
52
+ print(" ✓ módulos v2 importáveis (MoE, MTP, DPO, PCGrad, α-STE, Checkpoints)")
53
+ n_params_moe = 3 * cfg.modelo.moe["experts_por_grupo"] * \
54
+ 2 * cfg.modelo.d_modelo * cfg.modelo.moe["d_ff_expert"]
55
+ print(f" MoE: {cfg.modelo.moe['n_camadas_moe']} blocos × "
56
+ f"{cfg.modelo.moe['n_grupos']} grupos × "
57
+ f"{cfg.modelo.moe['experts_por_grupo']} experts "
58
+ f"(~{n_params_moe/1e6:.2f}M parâmetros de especialistas)")
59
+ print("OK")
60
+ return 0
61
+
62
+
63
+ if __name__ == "__main__":
64
+ sys.exit(main())
scripts/02_coletar_corpus.py ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Coleta do corpus v2 — UM DATASET POR VEZ, cada fonte em SUBPROCESSO isolado
4
+ (estado limpo da biblioteca datasets; RAM devolvida ao SO; erro de uma fonte
5
+ nunca contamina a seguinte). Streaming=True (+trust_remote_code onde aceito),
6
+ 18 fontes, dedup global, multimodal em base64. Cache temporário limpo após
7
+ cada fonte."""
8
+ import base64
9
+ import json
10
+ import os
11
+ import subprocess
12
+ import sys
13
+
14
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
15
+
16
+ from khtst.dados.streaming import StreamingCorpus, limpar_cache_temp
17
+
18
+ SAIDA = "/home/z/my-project/khtst/cache_dados/corpus_v2.jsonl"
19
+ DIR_PARCIAL = "/home/z/my-project/khtst/cache_dados/parciais"
20
+ RUNNER = "/home/z/my-project/khtst/scripts/02a_coletar_fonte.py"
21
+
22
+
23
+ def _hash_texto(t: str) -> str:
24
+ import hashlib
25
+ return hashlib.sha1(t.encode("utf-8", "ignore")).hexdigest()[:16]
26
+
27
+
28
+ def main():
29
+ os.makedirs(os.path.dirname(SAIDA), exist_ok=True)
30
+ os.makedirs("/home/z/my-project/khtst/telemetria_out", exist_ok=True)
31
+ os.makedirs(DIR_PARCIAL, exist_ok=True)
32
+ limpar_cache_temp()
33
+ plano_total = StreamingCorpus().PLANO
34
+ eventos = []
35
+ vistos: set[str] = set()
36
+ # v5 — RETOMÁVEL: corpus escrito INCREMENTALMENTE (append por fonte);
37
+ # na retomada, recarrega o acumulado e pula fontes já OK (estado persistido)
38
+ registros = []
39
+ if os.path.exists(SAIDA):
40
+ with open(SAIDA, encoding="utf-8") as f:
41
+ for linha in f:
42
+ try:
43
+ reg = json.loads(linha)
44
+ except Exception:
45
+ continue
46
+ chave = _hash_texto(reg.get("texto") or
47
+ ((reg.get("entrada") or "") + "␟" +
48
+ (reg.get("saida") or "")))
49
+ if chave not in vistos:
50
+ vistos.add(chave)
51
+ registros.append(reg)
52
+ print(f"retomada: {len(registros)} registros acumulados")
53
+ for i, plano in enumerate(plano_total):
54
+ fonte = plano["id"]
55
+ cam_estado_prev = os.path.join(DIR_PARCIAL, f"fonte_{i:02d}.estado.json")
56
+ if os.path.exists(cam_estado_prev):
57
+ ev_prev = json.load(open(cam_estado_prev, encoding="utf-8"))
58
+ if ev_prev.get("status") == "OK" and ev_prev.get("n", 0) > 0:
59
+ eventos.append(ev_prev)
60
+ print(f" [SKIP] {fonte} (já coletada: n={ev_prev['n']})")
61
+ continue
62
+ if plano["via"] == "degradado":
63
+ # mensagem determinística gerada pelo próprio módulo de streaming
64
+ sub = StreamingCorpus()
65
+ list(sub._iterar_fonte(plano)) # registra evento degradado
66
+ eventos.extend([vars(ev) for ev in sub.eventos])
67
+ continue
68
+ cam_parcial = os.path.join(DIR_PARCIAL, f"fonte_{i:02d}.jsonl")
69
+ cam_estado = os.path.join(DIR_PARCIAL, f"fonte_{i:02d}.estado.json")
70
+ try:
71
+ r = subprocess.run(
72
+ [sys.executable, RUNNER, "--indice", str(i),
73
+ "--saida", cam_parcial, "--estado", cam_estado],
74
+ capture_output=True, text=True, timeout=900,
75
+ env={**os.environ, "PYTHONPATH": "/home/z/my-project/khtst/src"})
76
+ r_erro = (r.stderr or "sem resposta")[-180:]
77
+ except subprocess.TimeoutExpired:
78
+ r_erro = "TIMEOUT 900s (fonte lenta — pulada)"
79
+ except Exception as e: # rede/Hub: nunca para o lote
80
+ r_erro = f"{type(e).__name__}: {e}"[-180:]
81
+ if os.path.exists(cam_estado):
82
+ ev = json.load(open(cam_estado, encoding="utf-8"))
83
+ else:
84
+ ev = {"fonte": fonte, "status": "ERRO", "detalhe": r_erro, "n": 0}
85
+ # v5 — dedup/append durável ÚNICO (abaixo); contagem de dedup por leitura
86
+ n_dedup = 0
87
+ if os.path.exists(cam_parcial):
88
+ with open(cam_parcial, encoding="utf-8") as f:
89
+ for linha in f:
90
+ try:
91
+ reg = json.loads(linha)
92
+ except Exception:
93
+ continue
94
+ if reg.get("texto"):
95
+ chave = _hash_texto(reg["texto"])
96
+ else:
97
+ chave = _hash_texto((reg.get("entrada") or "") + "␟" +
98
+ (reg.get("saida") or ""))
99
+ if chave in vistos:
100
+ n_dedup += 1
101
+ ev["dedup_descartados"] = n_dedup
102
+ eventos.append(ev)
103
+ print(f" [{ev['status']}] {fonte} (n={ev['n']}, dedup={n_dedup})"
104
+ + (f" {ev['detalhe'][:80]}" if ev.get("detalhe") else ""))
105
+ # v5 — append DURÁVEL ao corpus (morte do processo não perde progresso)
106
+ novos = 0
107
+ if os.path.exists(cam_parcial) and ev.get("status") in ("OK", "PARCIAL"):
108
+ with open(cam_parcial, encoding="utf-8") as f, \
109
+ open(SAIDA, "a", encoding="utf-8") as fa:
110
+ for linha in f:
111
+ try:
112
+ reg = json.loads(linha)
113
+ except Exception:
114
+ continue
115
+ if plano["via"] in ("tts_marcos",):
116
+ reg.setdefault("imagem", None)
117
+ reg.setdefault("audio", None)
118
+ if reg.get("texto"):
119
+ chave = _hash_texto(reg["texto"])
120
+ else:
121
+ chave = _hash_texto((reg.get("entrada") or "") + "␟" +
122
+ (reg.get("saida") or ""))
123
+ if chave in vistos:
124
+ continue
125
+ vistos.add(chave)
126
+ if reg.get("imagem") is None:
127
+ reg.pop("imagem", None)
128
+ if reg.get("audio") is None:
129
+ reg.pop("audio", None)
130
+ registros.append(reg)
131
+ fa.write(json.dumps(reg, ensure_ascii=False) + "\n")
132
+ novos += 1
133
+ os.remove(cam_parcial) if os.path.exists(cam_parcial) else None
134
+ limpar_cache_temp() # um dataset por vez → disco sob controle
135
+ import gc
136
+ gc.collect()
137
+ # escreve corpus final
138
+ n_multimodal = 0
139
+ with open(SAIDA, "w", encoding="utf-8") as f:
140
+ for r in registros:
141
+ if r.get("imagem") or r.get("audio"):
142
+ n_multimodal += 1
143
+ f.write(json.dumps(r, ensure_ascii=False) + "\n")
144
+ cont = {}
145
+ for r in registros:
146
+ cont[r["tarefa"]] = cont.get(r["tarefa"], 0) + 1
147
+ print("== contagem por tarefa ==", cont)
148
+ print(f"total: {len(registros)} registros ({n_multimodal} multimodais) → {SAIDA}")
149
+ with open("/home/z/my-project/khtst/telemetria_out/eventos_coleta_v2.json",
150
+ "w", encoding="utf-8") as f:
151
+ json.dump(eventos, f, ensure_ascii=False, indent=2)
152
+ limpar_cache_temp()
153
+
154
+
155
+ if __name__ == "__main__":
156
+ main()
scripts/02a_coletar_fonte.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Coleta UMA fonte (subprocesso isolado — estado limpo da biblioteca datasets,
4
+ RAM devolvida ao SO ao terminar). Recebe o plano em JSON, escreve registros
5
+ convertidos (multimodal em base64) num JSONL parcial."""
6
+ import argparse
7
+ import base64
8
+ import json
9
+ import sys
10
+
11
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
12
+
13
+ from khtst.dados.streaming import StreamingCorpus, via_especial
14
+
15
+
16
+ def _serializa(r: dict) -> dict:
17
+ out = {}
18
+ for k, v in r.items():
19
+ if v is None:
20
+ continue
21
+ if isinstance(v, bytes):
22
+ out[k] = base64.b64encode(v).decode("ascii")
23
+ else:
24
+ out[k] = v
25
+ return out
26
+
27
+
28
+ def main():
29
+ ap = argparse.ArgumentParser()
30
+ ap.add_argument("--indice", required=True, type=int,
31
+ help="índice da fonte em StreamingCorpus.PLANO")
32
+ ap.add_argument("--saida", required=True)
33
+ ap.add_argument("--estado", required=True, help="JSON de evento (status/n)")
34
+ args = ap.parse_args()
35
+
36
+ corpus = StreamingCorpus()
37
+ plano = corpus.PLANO[args.indice]
38
+ registros = []
39
+ status, detalhe = "OK", plano.get("via", "")
40
+ try:
41
+ for ex in corpus._iterar_fonte(plano):
42
+ if len(registros) >= plano.get("max", 0):
43
+ break
44
+ reg = plano["ad"](ex) if plano.get("ad") else \
45
+ (ex if via_especial(plano["via"]) else None)
46
+ if reg is None:
47
+ continue
48
+ reg["fonte"] = plano["id"]
49
+ reg.setdefault("meta", {})
50
+ registros.append(reg)
51
+ except Exception as e:
52
+ status = "ERRO"
53
+ detalhe = f"{type(e).__name__}: {str(e)[:180]}"
54
+ if corpus.eventos: # erro/PULADO interno da fonte
55
+ ev = corpus.eventos[0]
56
+ status, detalhe = ev.status, ev.detalhe
57
+ with open(args.saida, "w", encoding="utf-8") as f:
58
+ for r in registros:
59
+ f.write(json.dumps(_serializa(r), ensure_ascii=False) + "\n")
60
+ with open(args.estado, "w", encoding="utf-8") as f:
61
+ json.dump({"fonte": plano["id"], "status": status,
62
+ "detalhe": detalhe, "n": len(registros)}, f,
63
+ ensure_ascii=False)
64
+ print(f"{status}: {plano['id']} n={len(registros)}")
65
+
66
+
67
+ if __name__ == "__main__":
68
+ main()
scripts/03_treinar_tokenizador.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Treino do tokenizador BPE (Rust, paralelizável) sobre o corpus v2.
4
+ Itera TODOS os campos textuais (texto/entrada/saida) — streaming do arquivo,
5
+ RAM O(1)."""
6
+ import json
7
+ import os
8
+ import sys
9
+
10
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
11
+
12
+ from khtst.config import Config
13
+ from khtst.dados.tokenizador import TokenizadorKHTST
14
+
15
+ CORPUS = "/home/z/my-project/khtst/cache_dados/corpus_v2.jsonl"
16
+ SAIDA = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
17
+
18
+
19
+ def iterar_textos(caminho):
20
+ with open(caminho, encoding="utf-8") as f:
21
+ for linha in f:
22
+ try:
23
+ r = json.loads(linha)
24
+ except Exception:
25
+ continue
26
+ for campo in ("texto", "entrada", "saida"):
27
+ t = r.get(campo)
28
+ if isinstance(t, str) and len(t.strip()) >= 10:
29
+ yield t.strip()
30
+
31
+
32
+ def main():
33
+ cfg = Config()
34
+ vocab = cfg.modelo.vocab
35
+ tk = TokenizadorKHTST()
36
+ stats = tk.treinar(iterar_textos(CORPUS), vocab=vocab, salvar_em=SAIDA)
37
+ # teste de ida-e-volta (ByteLevel insere espaço inicial — comparar sem ele)
38
+ amostras = list(iterar_textos(CORPUS))[:5]
39
+ for s in amostras:
40
+ ids = tk.encode(s, tarefa="lm", max_len=256)
41
+ dec = tk.decode(ids).strip()
42
+ assert dec[:40] == s.strip()[:40] or len(s) < 40, "roundtrip falhou"
43
+ print(f"tokenizador: {stats['vocab_size']} tokens (pedido {vocab}) "
44
+ f"→ {SAIDA}; roundtrip OK em {len(amostras)} amostras")
45
+
46
+
47
+ if __name__ == "__main__":
48
+ main()
scripts/04_treinar.py ADDED
@@ -0,0 +1,381 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Treino v4 — pipeline completo em DUAS FASES (doc 15):
4
+
5
+ FASE A — rede aumentada (épocas 0..N-1, sem SOM):
6
+ FASE Densa (épocas 0..2): máx conexões, MoE softmax-total, MTP com
7
+ K ADAPTATIVO, PCGrad, ABMO, PRS V8, AgenteConfiança, MEMÓRIA INTERNA,
8
+ GESTOR DE CRESCIMENTO + AUTO-ESCALA POR COMPUTO (doc 12); unidades
9
+ NLP/NLG acopladas (nascem neutras — Teorema 15.1);
10
+ FASE Foco (época 3): MoE top-k + máscara + QAT-W8A8 final
11
+ (escalas POR GRUPO + correção de viés — doc 08 §§5-6);
12
+ FASE DPO: pares (dourado, corrompido) com β adaptativo.
13
+ FASE B — consolidação SOM com MÁXIMO de neurônios ativos (eq. 15.1):
14
+ 8 variantes SEM neurônios isolados (reseeding garantido),
15
+ lr do tronco ×0.1, alvo A ≥ 0.90 (Teorema 15.2).
16
+
17
+ Uso (CPU em segmentos):
18
+ python3 04_treinar.py --orcamento 1500 # segmento de 25 min
19
+ python3 04_treinar.py --orcamento 1500 # retoma do último estado do HF
20
+ ... quando 'pipeline completo' termina, roda DPO+SOM automaticamente.
21
+ """
22
+ import argparse
23
+ import base64
24
+ import json
25
+ import os
26
+ import sys
27
+ import threading
28
+ import time
29
+
30
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
31
+
32
+ import torch
33
+
34
+ from khtst.config import Config
35
+ from khtst.dados.checkpoints import GestorCheckpoints
36
+ from khtst.geracao import GeradorMultimodal
37
+ from khtst.qualidade import AgenteEngenheiro
38
+ from khtst.dados.tokenizador import TokenizadorKHTST
39
+ from khtst.memoria.orquestrador import OrquestradorSOM
40
+ from khtst.nucleo.modelo import KHTSTModel
41
+ from khtst.telemetria.hub import TelemetryHub
42
+ from khtst.treino.treinador import TreinadorExtensao
43
+
44
+ CORPUS = "/home/z/my-project/khtst/cache_dados/corpus_v2.jsonl"
45
+ TOKENIZADOR = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
46
+ RESUMO = "/home/z/my-project/khtst/telemetria_out/resumo_treino_v8.json"
47
+ RAM_JSONL = "/home/z/my-project/khtst/telemetria_out/ram_treino_v8.jsonl"
48
+
49
+
50
+ class MonitorRAM:
51
+ """v7 — observação do CONSUMO DE MEMÓRIA RAM durante o treino inteiro
52
+ (pedido explícito do Agente Engenheiro). Amostra VmRSS do processo e
53
+ MemAvailable do sistema a cada `intervalo_s` em thread daemon; grava JSONL
54
+ (t, passo, rss_mb, disponivel_mb) e resume pico/média/mínimo no fim."""
55
+
56
+ def __init__(self, caminho: str, passo_ref, intervalo_s: float = 2.0):
57
+ self.caminho = caminho
58
+ self.passo_ref = passo_ref
59
+ self.intervalo_s = intervalo_s
60
+ self._parar = threading.Event()
61
+ self._thread = threading.Thread(target=self._laco, daemon=True)
62
+ self.amostras: list[dict] = []
63
+
64
+ @staticmethod
65
+ def _rss_mb() -> float:
66
+ try:
67
+ with open("/proc/self/status", encoding="utf-8") as f:
68
+ for linha in f:
69
+ if linha.startswith("VmRSS:"):
70
+ return float(linha.split()[1]) / 1024.0
71
+ except Exception:
72
+ pass
73
+ return 0.0
74
+
75
+ @staticmethod
76
+ def _disponivel_mb() -> float:
77
+ try:
78
+ with open("/proc/meminfo", encoding="utf-8") as f:
79
+ for linha in f:
80
+ if linha.startswith("MemAvailable:"):
81
+ return float(linha.split()[1]) / 1024.0
82
+ except Exception:
83
+ pass
84
+ return 0.0
85
+
86
+ def _laco(self):
87
+ # modo "a": segmentos separados do pipeline acumulam no MESMO jsonl
88
+ with open(self.caminho, "a", encoding="utf-8") as f:
89
+ while not self._parar.is_set():
90
+ amostra = {"t": round(time.time(), 2),
91
+ "rss_mb": round(self._rss_mb(), 1),
92
+ "disponivel_mb": round(self._disponivel_mb(), 1),
93
+ "passo": self.passo_ref()}
94
+ f.write(json.dumps(amostra) + "\n")
95
+ f.flush()
96
+ self._parar.wait(self.intervalo_s)
97
+
98
+ def iniciar(self):
99
+ self._thread.start()
100
+
101
+ def parar(self) -> dict:
102
+ """Encerra a thread e resume o jsonl INTEIRO (todos os segmentos)."""
103
+ self._parar.set()
104
+ self._thread.join(timeout=5)
105
+ amostras: list[dict] = []
106
+ try:
107
+ with open(self.caminho, encoding="utf-8") as f:
108
+ for linha in f:
109
+ try:
110
+ amostras.append(json.loads(linha))
111
+ except Exception:
112
+ continue
113
+ except FileNotFoundError:
114
+ return {"amostras": 0}
115
+ rss = [a["rss_mb"] for a in amostras]
116
+ disp = [a["disponivel_mb"] for a in amostras]
117
+ if not rss:
118
+ return {"amostras": 0}
119
+ return {"amostras": len(rss),
120
+ "rss_min_mb": round(min(rss), 1),
121
+ "rss_med_mb": round(sum(rss) / len(rss), 1),
122
+ "rss_max_mb": round(max(rss), 1),
123
+ "disponivel_min_mb": round(min(disp), 1),
124
+ "duracao_s": round(amostras[-1]["t"] - amostras[0]["t"], 1)}
125
+
126
+
127
+ def carregar_registros(caminho: str) -> list[dict]:
128
+ registros = []
129
+ with open(caminho, encoding="utf-8") as f:
130
+ for linha in f:
131
+ try:
132
+ r = json.loads(linha)
133
+ except Exception:
134
+ continue
135
+ # multimodal volta a bytes
136
+ if isinstance(r.get("imagem"), str):
137
+ try:
138
+ r["imagem"] = base64.b64decode(r["imagem"])
139
+ except Exception:
140
+ r["imagem"] = None
141
+ if isinstance(r.get("audio"), str):
142
+ try:
143
+ r["audio"] = base64.b64decode(r["audio"])
144
+ except Exception:
145
+ r["audio"] = None
146
+ registros.append(r)
147
+ return registros
148
+
149
+
150
+
151
+ TEMPO_ACUM = "/home/z/my-project/khtst/telemetria_out/tempo_treino_acumulado.json"
152
+
153
+
154
+ def tempo_acumulado_h() -> float:
155
+ import json as _json
156
+ try:
157
+ with open(TEMPO_ACUM) as f:
158
+ return float(_json.load(f).get("segundos", 0.0)) / 3600.0
159
+ except Exception:
160
+ return 0.0
161
+
162
+
163
+ def registrar_tempo(segundos: float):
164
+ import json as _json
165
+ total = tempo_acumulado_h() * 3600.0 + max(0.0, segundos)
166
+ os.makedirs(os.path.dirname(TEMPO_ACUM), exist_ok=True)
167
+ with open(TEMPO_ACUM, "w") as f:
168
+ _json.dump({"segundos": total, "horas": total / 3600.0}, f)
169
+
170
+
171
+ def main():
172
+ ap = argparse.ArgumentParser()
173
+ ap.add_argument("--orcamento", type=float, default=None,
174
+ help="segundos por segmento (CPU: retomada automática)")
175
+ ap.add_argument("--max_passos_epoca", type=int, default=None)
176
+ ap.add_argument("--sem_dpo", action="store_true")
177
+ ap.add_argument("--sem_som", action="store_true")
178
+ ap.add_argument("--sem_epocas", action="store_true",
179
+ help="v7: pula o laço de épocas (retomada já completa) e vai "
180
+ "direto a DPO→SOM→avaliação→resumo")
181
+ ap.add_argument("--sem_difusao", action="store_true",
182
+ help="v7: pula o ciclo geracional de difusão (economiza RAM/tempo "
183
+ "do segmento final; evidência já validada em v5/v6)")
184
+ ap.add_argument("--teto_horas", type=float, default=5.0,
185
+ help="v8: TETO RÍGIDO de tempo ACUMULADO de treino (h). "
186
+ "Ao atingir, o treino para (requisito: parar se "
187
+ "ultrapassar 5 horas).")
188
+ ap.add_argument("--semente", type=int, default=None,
189
+ help="v7: semente torch p/ REPRODUTIBILIDADE da inicialização "
190
+ "(diagnóstico v7: init não semeada + lr 0.003 pode divergir; "
191
+ "padrão = cfg.dados.semente)")
192
+ args = ap.parse_args()
193
+
194
+ # v8 — TETO RÍGIDO (requisito): parar se o treino acumulado passar de 5h
195
+ acum = tempo_acumulado_h()
196
+ if acum >= args.teto_horas:
197
+ print(f"[TETO] treino acumulado {acum:.2f} h ≥ teto {args.teto_horas:.1f} h — "
198
+ "PARANDO as tarefas de treino (requisito atendido).")
199
+ return
200
+ print(f"teto de treino: {acum:.2f}/{args.teto_horas:.1f} h acumuladas")
201
+
202
+ cfg = Config().de_arquivo("/home/z/my-project/khtst/configs/base.json")
203
+ # v7 — reprodutibilidade: init de pesos, dropout e amostragens torch
204
+ torch.manual_seed(args.semente if args.semente is not None
205
+ else cfg.dados.semente)
206
+ os.makedirs("/home/z/my-project/khtst/telemetria_out", exist_ok=True)
207
+ hub = TelemetryHub(cfg.telemetria.arquivo_jsonl)
208
+ # v7 — Agente Engenheiro: observação do consumo de RAM durante TODO o treino
209
+ ram = MonitorRAM(RAM_JSONL, passo_ref=lambda: 0)
210
+ ram.iniciar()
211
+ print("monitor RAM: amostrando", RAM_JSONL)
212
+ tk = TokenizadorKHTST(TOKENIZADOR)
213
+ registros = carregar_registros(CORPUS)
214
+ print(f"corpus: {len(registros)} registros")
215
+ cont = {}
216
+ for r in registros:
217
+ cont[r["tarefa"]] = cont.get(r["tarefa"], 0) + 1
218
+ print("tarefas:", cont)
219
+
220
+ modelo = KHTSTModel(cfg, usar_multimodal=True)
221
+ print(f"modelo: {sum(p.numel() for p in modelo.parameters())/1e6:.2f}M parâmetros")
222
+
223
+ checkpoints = GestorCheckpoints(dir_local=cfg.checkpoints.dir_local)
224
+ orquestrador = OrquestradorSOM(cfg.modelo.d_modelo, cfg.som, hub=hub,
225
+ cfg_atencao=vars(cfg.som_atencao) if hasattr(cfg, "som_atencao") else None)
226
+ treinar = TreinadorExtensao(cfg, modelo, tk, hub, registros,
227
+ orquestrador_som=orquestrador, checkpoints=checkpoints)
228
+ # v5 — Agente Engenheiro: observação integral durante o treino (doc 16 §9)
229
+ agente = AgenteEngenheiro(
230
+ tolerancia_regressao=cfg.agente_engenheiro.tolerancia_regressao, hub=hub)
231
+ treinar.agente_engenheiro = agente
232
+ treinar.intervalo_agente = cfg.agente_engenheiro.intervalo
233
+ # passo global do treino visível ao monitor de RAM
234
+ ram.passo_ref = lambda: treinar.passo_global
235
+ # v5 — gerador multimodal (difusão) para o ciclo geracional (doc 17)
236
+ difusao = GeradorMultimodal(repo_id=cfg.difusao.repo_id,
237
+ altura=cfg.difusao.altura, largura=cfg.difusao.largura,
238
+ passos_inferencia=cfg.difusao.passos_inferencia,
239
+ guia_escala=cfg.difusao.guia_escala, hub=hub) \
240
+ if cfg.difusao.ativo and not args.sem_difusao else None
241
+
242
+ # item c: "salvar (e usar) estados" — retoma do checkpoint local mais avançado
243
+ tag_retomada = treinar.retomar_ultimo_checkpoint()
244
+ print(f"retomada do Hub: tag={tag_retomada} "
245
+ f"(passo {treinar.passo_global}, época {treinar.epoca})")
246
+
247
+ # ---------- fases 1+2: denso → foco (segmentos com retomada) ----------
248
+ if not args.sem_epocas:
249
+ while True:
250
+ resultado = treinar.treinar("/home/z/my-project/khtst/checkpoints",
251
+ max_passos_por_epoca=args.max_passos_epoca,
252
+ orcamento_s=args.orcamento)
253
+ print(f"segmento: {resultado['duracao_s']}s | passos={treinar.passo_global} "
254
+ f"| épocas={len(treinar.historico_epocas)} | interrompido={resultado['interrompido']}")
255
+ registrar_tempo(resultado.get("duracao_s", 0.0))
256
+ print(f"→ tempo acumulado de treino: {tempo_acumulado_h():.2f} h "
257
+ f"(teto {args.teto_horas:.1f} h)")
258
+ if not resultado["interrompido"]:
259
+ break
260
+ print("→ estado salvo no Hub; rode o script novamente para o próximo segmento")
261
+ if args.orcamento is not None:
262
+ return # sai: próximo segmento em nova invocação
263
+ return # sem orçamento: uma passada só por chamada
264
+
265
+ # ---------- fase 3: DPO ----------
266
+ resultado_dpo = {"pulado": True}
267
+ if not args.sem_dpo:
268
+ print("== fase DPO ==")
269
+ resultado_dpo = treinar.treinar_dpo()
270
+ print("DPO:", resultado_dpo)
271
+ treinar.salvar_checkpoint("fase-dpo", {"dpo": resultado_dpo})
272
+
273
+ # ---------- fase 4: SOM com máximo de neurônios ativos ----------
274
+ resultado_som = {"pulado": True}
275
+ if not args.sem_som:
276
+ print("== fase SOM (máx neurônios ativos) ==")
277
+ resultado_som = treinar.consolidar_som_max_ativos()
278
+ for nome, st in resultado_som.get("variantes", {}).items():
279
+ print(f" {nome}: {st}")
280
+ treinar.salvar_checkpoint("fase-som", {"som": {
281
+ k: v for k, v in resultado_som.items() if k != "prototipos"}})
282
+
283
+ aval_final = treinar.avaliar(max_lotes=4)
284
+ print("avaliação final:", aval_final)
285
+
286
+ # v5 — evidência de INFERÊNCIA para o Agente Engenheiro (métricas de geração)
287
+ try:
288
+ ids_prompt = tk.encode("Pergunta: o que e o Kohonen? Resposta:",
289
+ tarefa="instrucao", max_len=24)
290
+ t0 = time.time()
291
+ tokens = modelo.gerar(torch.tensor([ids_prompt]), max_novos=24)
292
+ evid_inf = agente.observar_inferencia(modelo, torch.tensor([ids_prompt]),
293
+ tokens, time.time() - t0)
294
+ print("inferência (agente):", evid_inf)
295
+ print("texto gerado:", tk.decode(tokens))
296
+ except Exception as e:
297
+ evid_inf = {"erro": str(e)}
298
+
299
+ # v5 — ciclo de compreensão geracional (difusão; modo honesto)
300
+ evid_difusao = None
301
+ if difusao is not None:
302
+ try:
303
+ r = difusao.compreensao_geracional(
304
+ "a floresta amazonica de manha", modelo,
305
+ orquestrador=orquestrador, op="txt2img")
306
+ evid_difusao = {"modo": r.get("modo"), "op": r.get("op"),
307
+ "latencia_s": r.get("latencia_s"),
308
+ "prompt_enriquecido": r.get("prompt_enriquecido"),
309
+ "gerou_pixels": r.get("modo") == "real",
310
+ "estatisticas": difusao.estatisticas()}
311
+ print("difusão (modo honesto):", evid_difusao["modo"],
312
+ "—", evid_difusao["prompt_enriquecido"])
313
+ except Exception as e:
314
+ evid_difusao = {"erro": str(e)}
315
+
316
+ # v4 — MÉTRICAS COMPLETAS (doc 15 §3): neurônios ativos por variante,
317
+ # NLP/NLG, janela 1M, computo, crescimento
318
+ metricas_completas = {
319
+ "neuronios_ativos": (orquestrador.telemetria_ativos()
320
+ if orquestrador is not None else {}),
321
+ "estruturais": modelo.metricas_estruturais(),
322
+ "escala": modelo.info_escalacao,
323
+ "regime": {"fase_final": treinar.regime.fase,
324
+ "alvo_ativos": treinar.regime.alvo_ativos},
325
+ }
326
+ print("== métricas completas (doc 15 §3) ==")
327
+ print(json.dumps(metricas_completas, ensure_ascii=False, indent=1,
328
+ default=str)[:2200])
329
+
330
+ rel_agente = agente.relatorio(orquestrador_som=orquestrador,
331
+ avaliacao=aval_final)
332
+ os.makedirs(os.path.dirname(RESUMO), exist_ok=True)
333
+ ram_resumo = ram.parar() # resume TODOS os segmentos (jsonl completo)
334
+ with open(RESUMO, "w", encoding="utf-8") as f:
335
+ registrar_tempo(ram_resumo["duracao_s"] if isinstance(ram_resumo, dict) else 0.0)
336
+ json.dump({"versao": "v8-khtst-melhorias-a-j",
337
+ "teto_horas": args.teto_horas,
338
+ "tempo_acumulado_h": tempo_acumulado_h(),
339
+ "memoria_v8": treinar.gestor_memoria.estatisticas(),
340
+ "autoajuste_v8": getattr(treinar, "ultimo_autoajuste", None),
341
+ "epocas": treinar.historico_epocas,
342
+ "passos": treinar.passo_global,
343
+ "punicoes": len(treinar.eventos_punicao),
344
+ "barreira_abmo_ativacoes": treinar.barreira_ativa_count,
345
+ "pcgrad_ultimo": treinar.ultimos_pcgrad,
346
+ "prs_v8": treinar.prs.estado(),
347
+ "confianca": {"h_ema": treinar.agente.ultimo_h,
348
+ "ece": treinar.agente.ece(),
349
+ "posterior_media": treinar.agente.posterior.media,
350
+ "bernstein": treinar.agente.posterior.bernstein()},
351
+ "memoria": (treinar.memoria.estatisticas()
352
+ if treinar.memoria is not None else None),
353
+ "crescimento": (treinar.gestor.eventos
354
+ if treinar.gestor is not None else []),
355
+ "microunidades": [
356
+ {"ramos": c.nome_ramos,
357
+ "ativos": [float(a) for a in c.ramo_ativo.tolist()],
358
+ "uso_ema": (c.uso_ema.tolist()
359
+ if c.uso_ema is not None else None),
360
+ "passos_rec": c.ultimo_passos_rec}
361
+ for c in modelo.compositores],
362
+ "dpo": resultado_dpo, "som": resultado_som,
363
+ "avaliacao_final": aval_final,
364
+ "metricas_completas": metricas_completas,
365
+ "rpp": (treinar.rpp.estado() if treinar.rpp else None),
366
+ "roteador_ssom": (treinar.roteador.estatisticas()
367
+ if treinar.roteador is not None else None),
368
+ "inferencia_agente": evid_inf,
369
+ "difusao": evid_difusao,
370
+ "agente_engenheiro": {"aprovadas": rel_agente["revisoes_aprovadas"],
371
+ "bloqueadas": rel_agente["revisoes_bloqueadas"],
372
+ "invariante_sem_orfaos": rel_agente.get("som_invariante_sem_orfaos")},
373
+ "checkpoints_eventos": checkpoints.eventos[-12:],
374
+ "ram": ram_resumo},
375
+ f, ensure_ascii=False, indent=2, default=str)
376
+ print(f"resumo → {RESUMO}")
377
+ print("ram:", json.dumps(ram_resumo))
378
+
379
+
380
+ if __name__ == "__main__":
381
+ main()
scripts/05_avaliar.py ADDED
@@ -0,0 +1,654 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Avaliação v3 — relatório de QUALIDADE DO APRENDIZADO com evidências:
4
+
5
+ 1. perplexidade LM: modelo inicial (aleatório) vs treinado vs por época;
6
+ 2. perdas por tarefa (9 tarefas) treinado vs aleatório;
7
+ 3. MoE agrupável (roteamento POR TOKEN causal): top experts POR TAREFA;
8
+ 4. MTP adaptativo: perdas por cabeça, α e ECONOMIA de termos de CE;
9
+ 5. W8A8: delta de perda com/sem quantização na lm_head;
10
+ 6. SOM: taxa de neurônios ativos, EQ, TE por variante;
11
+ 7. geração: amostras com/sem punição dinâmica de repetição;
12
+ 8. MICROUNIDADES: ramos ativos, gating α por tarefa, refino recursivo;
13
+ 9. CONFIANÇA: posterior Beta, cota de Bernstein, ECE de calibração;
14
+ 10. MEMÓRIA INTERNA: hit-rate, escritas conficientes, compressão VQ;
15
+ 11. CRESCIMENTO: eventos de expansão/poda das microunidades.
16
+ Salva telemetria_out/avaliacao_v5.json (v5: + Agente Engenheiro e difusão)."""
17
+ import base64
18
+ import json
19
+ import math
20
+ import os
21
+ import random
22
+ import sys
23
+ import time
24
+
25
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
26
+
27
+ import torch
28
+
29
+ from khtst.config import Config
30
+ from khtst.dados.checkpoints import GestorCheckpoints
31
+ from khtst.geracao import GeradorMultimodal
32
+ from khtst.qualidade import AgenteEngenheiro
33
+ from khtst.dados.tokenizador import TokenizadorKHTST
34
+ from khtst.memoria.orquestrador import OrquestradorSOM
35
+ from khtst.nucleo.modelo import KHTSTModel
36
+ from khtst.telemetria.hub import TelemetryHub
37
+ from khtst.treino.treinador import (TAREFAS_AUDIO, TAREFAS_IMAGEM,
38
+ _audio_para_tensor, _imagem_para_tensor,
39
+ TreinadorExtensao)
40
+
41
+ CORPUS = "/home/z/my-project/khtst/cache_dados/corpus_v2.jsonl"
42
+ TOKENIZADOR = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
43
+ RELATORIO = "/home/z/my-project/khtst/telemetria_out/avaliacao_v8.json"
44
+
45
+
46
+ def carregar_registros(caminho):
47
+ regs = []
48
+ with open(caminho, encoding="utf-8") as f:
49
+ for linha in f:
50
+ try:
51
+ r = json.loads(linha)
52
+ except Exception:
53
+ continue
54
+ if isinstance(r.get("imagem"), str):
55
+ r["imagem"] = base64.b64decode(r["imagem"])
56
+ if isinstance(r.get("audio"), str):
57
+ r["audio"] = base64.b64decode(r["audio"])
58
+ regs.append(r)
59
+ return regs
60
+
61
+
62
+ @torch.no_grad()
63
+ def perda_lote(modelo, tk, registros, tarefa, n_lotes=6, lote=8):
64
+ """Perda CE média da tarefa (multimodais usam o prefixo real treinável-não)."""
65
+ pool = [r for r in registros if r["tarefa"] == tarefa]
66
+ if not pool:
67
+ return None
68
+ perdas = []
69
+ for _ in range(n_lotes):
70
+ amostras = random.sample(pool, min(lote, len(pool)))
71
+ L = modelo.cfg.modelo.comprimento_ctx
72
+ seqs, extras = [], []
73
+ for s in amostras:
74
+ inp = tk.encode(s.get("entrada") or "", tarefa=tarefa, max_len=L // 2) \
75
+ if tarefa not in ("lm", "noticia") else [1]
76
+ saida_fonte = s.get("saida") or s.get("texto") or ""
77
+ out = tk.encode(saida_fonte, tarefa=None,
78
+ max_len=max(L - len(inp) - 4, 8), com_bos=False)
79
+ if len(out) < 4:
80
+ continue
81
+ seqs.append(inp + out)
82
+ extras.append(s)
83
+ if not seqs:
84
+ continue
85
+ Tmax = max(len(s) for s in seqs)
86
+ ids = torch.zeros(len(seqs), Tmax, dtype=torch.long)
87
+ alvo = torch.full((len(seqs), Tmax), -100, dtype=torch.long)
88
+ emb_prefixo = None
89
+ for i, (s, seq) in enumerate(zip(extras, seqs)):
90
+ ids[i, :len(seq)] = torch.tensor(seq)
91
+ if tarefa not in ("lm", "noticia"):
92
+ ninp = len(tk.encode(s.get("entrada") or "", tarefa=tarefa,
93
+ max_len=L // 2))
94
+ alvo[i, ninp:len(seq)] = ids[i, ninp:len(seq)]
95
+ else:
96
+ alvo[i, 1:len(seq)] = ids[i, 1:len(seq)]
97
+ if modelo.usar_multimodal:
98
+ entradas = {}
99
+ if tarefa in TAREFAS_IMAGEM:
100
+ lado = modelo.cfg.modelo.imagem["resolucao"]
101
+ entradas["imagem"] = torch.stack([
102
+ _imagem_para_tensor(s["imagem"], lado) if s.get("imagem")
103
+ else torch.zeros(3, lado, lado) for s in extras])
104
+ if tarefa in TAREFAS_AUDIO:
105
+ ondas = [_audio_para_tensor(s["audio"]) for s in extras if s.get("audio")]
106
+ if ondas:
107
+ Nmax = max(o.shape[0] for o in ondas)
108
+ pad = torch.zeros(len(ondas), Nmax)
109
+ for i, o in enumerate(ondas):
110
+ pad[i, :o.shape[0]] = o
111
+ entradas["audio"] = pad
112
+ if entradas:
113
+ emb_prefixo = modelo.codificar_multimodal(entradas)
114
+ _, perda = modelo(ids, alvo=alvo, emb_prefixo=emb_prefixo, tarefa=tarefa)
115
+ perdas.append(float(perda))
116
+ return sum(perdas) / len(perdas) if perdas else None
117
+
118
+
119
+ @torch.no_grad()
120
+ def perdas_som_amostra(modelo, tk, registros, orquestrador, n=64):
121
+ seqs = []
122
+ for r in registros[:n]:
123
+ seqs.append(tk.encode(r.get("texto") or (r.get("saida") or r.get("entrada", "")),
124
+ tarefa=r["tarefa"], max_len=64)[:64])
125
+ Tmax = max(len(s) for s in seqs)
126
+ ids = torch.zeros(len(seqs), Tmax, dtype=torch.long)
127
+ for i, s in enumerate(seqs):
128
+ ids[i, :len(s)] = torch.tensor(s)
129
+ ctx = modelo.contexto(ids)
130
+ out = {}
131
+ for nome, v in orquestrador.variantes.items():
132
+ if hasattr(v, "taxa_ativos"):
133
+ out[nome] = {"taxa_ativos": v.taxa_ativos(),
134
+ "eq": v.eq(ctx) if hasattr(v, "eq") else None}
135
+ return out
136
+
137
+
138
+ def _salvar(rel: dict):
139
+ """Salvamento incremental — evidência parcial sobrevive a cortes de tempo."""
140
+ os.makedirs(os.path.dirname(RELATORIO), exist_ok=True)
141
+ with open(RELATORIO, "w", encoding="utf-8") as f:
142
+ json.dump(rel, f, ensure_ascii=False, indent=2, default=str)
143
+
144
+
145
+ def main():
146
+ cfg = Config().de_arquivo("/home/z/my-project/khtst/configs/base.json")
147
+ random.seed(cfg.dados.semente)
148
+ torch.manual_seed(cfg.dados.semente)
149
+ hub = TelemetryHub(cfg.telemetria.arquivo_jsonl)
150
+ tk = TokenizadorKHTST(TOKENIZADOR)
151
+ registros = carregar_registros(CORPUS)
152
+
153
+ modelo = KHTSTModel(cfg, usar_multimodal=True)
154
+ checkpoints = GestorCheckpoints(dir_local=cfg.checkpoints.dir_local)
155
+ tag = checkpoints.ultima_tag()
156
+ if tag:
157
+ checkpoints.carregar(modelo, tag)
158
+ print(f"estado carregado: {tag or 'NENHUM (avaliando aleatório!)'}")
159
+ orquestrador = OrquestradorSOM(cfg.modelo.d_modelo, cfg.som, hub=hub,
160
+ cfg_atencao=vars(cfg.som_atencao) if hasattr(cfg, "som_atencao") else None)
161
+
162
+ # v5 — os SOMs são tensors puros (fora do state_dict): re-consolidação
163
+ # determinística a partir do modelo treinado (mesmo protocolo do 07 /
164
+ # Teorema 16.5) — as evidências de memória refletem o estado TREINADO.
165
+ print("== re-consolidação SOM (protocolo doc 16 §4/§5) ==")
166
+ relatorio = {"estado": tag}
167
+ amostras = random.sample(registros, min(4 * 64, len(registros)))
168
+ ctxs = []
169
+ for i in range(0, len(amostras), 64):
170
+ pedaco = amostras[i:i + 64]
171
+ seqs = [tk.encode(r.get("texto") or (r.get("saida") or r.get("entrada", "")),
172
+ tarefa=r["tarefa"], max_len=64)[:64] for r in pedaco]
173
+ Tmax = max(len(x) for x in seqs)
174
+ ids_l = torch.zeros(len(seqs), Tmax, dtype=torch.long)
175
+ for j, x in enumerate(seqs):
176
+ ids_l[j, :len(x)] = torch.tensor(x)
177
+ ctxs.append(modelo.contexto(ids_l).detach())
178
+ ctx = torch.cat(ctxs, dim=0)
179
+ dominante = "instrucao" if any(r["tarefa"] == "instrucao" for r in amostras) else "lm"
180
+ orquestrador.escolher({"rotulo_tarefa": dominante, "denso": True})
181
+ orquestrador.treinar_memoria(ctx, epocas=2)
182
+ if getattr(orquestrador, "atencao", None) is not None:
183
+ inv = orquestrador.atencao.verificar_sem_orfas(orquestrador, dados=ctx,
184
+ resemear=True)
185
+ print(" invariante zero-órfãos:", inv.pop("_invariante_ok", None))
186
+ # v6 — consolidação do ROTEADOR S-SOM com os MESMOS (ctx, tarefa) —
187
+ # contagens empíricas Laplace-suavizadas (doc 18 §1.1, Teorema 18.3)
188
+ if getattr(modelo, "roteador_ssom", None) is not None:
189
+ from khtst.percepcao.roteador_ssom import LISTA_TAREFAS as _LT
190
+ _rot = torch.tensor(
191
+ [_LT.index(r["tarefa"]) if r["tarefa"] in _LT else 0 for r in amostras],
192
+ dtype=torch.long)
193
+ eq_rot = modelo.roteador_ssom.consolidar(ctx, _rot, passos=6)
194
+ st_rot = modelo.roteador_ssom.estatisticas()
195
+ relatorio["roteador_ssom"] = st_rot
196
+ print(f" roteador S-SOM consolidado: eq={eq_rot:.4f} "
197
+ f"conf_media={st_rot['conf_media']} frac_rotas={st_rot['frac_rotas_ativas']} "
198
+ f"taxa_ativos={st_rot['taxa_ativos']}")
199
+ print(" ativos:", json.dumps(orquestrador.telemetria_ativos())[:200])
200
+
201
+ # 1-2) perdas treinado vs aleatório
202
+ modelo.eval()
203
+ modelo_aleatorio = KHTSTModel(cfg, usar_multimodal=True)
204
+ modelo_aleatorio.eval()
205
+ print("== perdas por tarefa (treinado vs aleatório) ==")
206
+ perdas_tarefa = {}
207
+ for tarefa in ("lm", "noticia", "instrucao", "pontuacao", "imagem_caption",
208
+ "vqa", "ocr", "asr", "tts"):
209
+ p_t = perda_lote(modelo, tk, registros, tarefa)
210
+ p_a = perda_lote(modelo_aleatorio, tk, registros, tarefa)
211
+ perdas_tarefa[tarefa] = {"treinado": p_t, "aleatorio": p_a}
212
+ print(f" {tarefa:16s} treinado={p_t if p_t is None else round(p_t,3)} "
213
+ f"aleatório={p_a if p_a is None else round(p_a,3)}")
214
+ relatorio["perdas_tarefa"] = perdas_tarefa
215
+ _salvar(relatorio)
216
+ if perdas_tarefa["lm"]["treinado"]:
217
+ relatorio["ppl_lm"] = math.exp(min(perdas_tarefa["lm"]["treinado"], 12))
218
+ relatorio["ppl_lm_aleatorio"] = math.exp(min(perdas_tarefa["lm"]["aleatorio"], 12))
219
+ print(f" ppl treinado={relatorio['ppl_lm']:.1f} "
220
+ f"aleatório={relatorio['ppl_lm_aleatorio']:.1f}")
221
+
222
+ # 3) MoE foco na tarefa: uso de experts por tarefa
223
+ print("== MoE fase foco: top-2 por tarefa (foco na tarefa) ==")
224
+ modelo.definir_fase_moe("foco")
225
+ moe_uso = {}
226
+ for tarefa in ("lm", "vqa", "ocr", "asr", "tts"):
227
+ perda_lote(modelo, tk, registros, tarefa, n_lotes=2)
228
+ moes = [b.moe for b in modelo.blocos if b.moe is not None]
229
+ # v8 — a MoE enc-dec (item g) não tem grupo_de_idx: reporta os
230
+ # DECODERS top-2 (4 experts de saída)
231
+ uso_tarefa = []
232
+ for m in moes:
233
+ if getattr(m, "_tipo_enc_dec", False):
234
+ topo = m.ultimo_p.topk(min(2, m.n_dec)).indices.tolist()
235
+ uso_tarefa.append({"experts_top": [int(i) for i in topo],
236
+ "grupo_top": ["dec" for _ in topo],
237
+ "agrupado": bool(m.agrupado)})
238
+ else:
239
+ uso_tarefa.append(
240
+ {"experts_top": [int(i) for i in m.ultimo_p.topk(2).indices.tolist()],
241
+ "grupo_top": [int(m.grupo_de_idx[i]) for i in m.ultimo_p.topk(2).indices]})
242
+ moe_uso[tarefa] = uso_tarefa
243
+ for tarefa, uso in moe_uso.items():
244
+ grupos = uso[0]["grupo_top"] if uso else []
245
+ print(f" {tarefa:16s} grupos top: {grupos}")
246
+ relatorio["moe_uso_por_tarefa"] = moe_uso
247
+ _salvar(relatorio)
248
+
249
+ # 4) MTP (uma passada LM para popular os α e perdas por cabeça)
250
+ if modelo.mtp is not None:
251
+ ids_m, alvo_m = _lote_lm(tk, registros)
252
+ _, _ = modelo(ids_m, alvo=alvo_m, tarefa="lm")
253
+ modelo.mtp_do_trunk(ids_m, alvo_m, tarefa="lm")
254
+ relatorio["mtp"] = modelo.mtp.ultimos
255
+ print("== MTP ==" , relatorio["mtp"])
256
+
257
+ # 5) W8A8 delta
258
+ ids, alvo = _lote_lm(tk, registros)
259
+ _, p_fp = modelo(ids, alvo=alvo, tarefa="lm")
260
+ modelo.qat = True
261
+ _, p_q = modelo(ids, alvo=alvo, tarefa="lm")
262
+ modelo.qat = False
263
+ relatorio["w8a8_delta"] = float(p_q - p_fp)
264
+ print(f"== W8A8: Δperda = {relatorio['w8a8_delta']:+.5f} ==")
265
+
266
+ # 6) SOM — métricas TREINADAS vêm do resumo do treino (o orquestrador
267
+ # não é nn.Module: seu estado é consolidado na fase SOM e gravado lá)
268
+ resumo_path = "/home/z/my-project/khtst/telemetria_out/resumo_treino_v8.json"
269
+ if os.path.exists(resumo_path):
270
+ som_treinado = json.load(open(resumo_path)).get("som", {})
271
+ relatorio["som_treinado"] = som_treinado
272
+ print("== SOM (fase de consolidação — taxa de neurônios ativos) ==")
273
+ for nome, st in som_treinado.get("variantes", {}).items():
274
+ if isinstance(st, dict) and "taxa_ativos" in st:
275
+ print(f" {nome}: taxa_ativos={st['taxa_ativos']:.2f} "
276
+ f"alvo={st.get('atingiu_alvo')}")
277
+ # EQ fresco no espaço atual (referência)
278
+ relatorio["som_eq_fresco"] = perdas_som_amostra(modelo, tk, registros, orquestrador)
279
+ _salvar(relatorio)
280
+
281
+ # 7) geração com/sem punição
282
+ prompt = tk.encode("Recomende um filme brasileiro:", tarefa="instrucao", max_len=24)
283
+ ids_p = torch.tensor([prompt])
284
+ sem_pun = modelo.gerar(ids_p, max_novos=30, punicao_repeticao=1.0, top_k=0, top_p=0.9)
285
+ com_pun = modelo.gerar(ids_p, max_novos=30, punicao_repeticao=1.4, top_k=0, top_p=0.9)
286
+ relatorio["geracao"] = {
287
+ "sem_punicao": tk.decode(sem_pun),
288
+ "com_punicao": tk.decode(com_pun)}
289
+ print("== geração (amostra) ==")
290
+ print(" sem punição:", relatorio["geracao"]["sem_punicao"][:120])
291
+ print(" com punição:", relatorio["geracao"]["com_punicao"][:120])
292
+
293
+ # 8) MICROUNIDADES (doc 11): ramos, gating α por tarefa, recursão
294
+ print("== microunidades (composição serial/paralela/recursiva) ==")
295
+ micra = {}
296
+ for tarefa in ("lm", "vqa", "asr", "instrucao"):
297
+ perda_lote(modelo, tk, registros, tarefa, n_lotes=1)
298
+ micra[tarefa] = [
299
+ {"ramos": c.nome_ramos,
300
+ "alpha_medio": [round(a, 4) for a in c.ultimo_alpha.tolist()]
301
+ if c.ultimo_alpha is not None else None,
302
+ "passos_rec": c.ultimo_passos_rec}
303
+ for c in modelo.compositores]
304
+ for t, ms in micra.items():
305
+ if ms and ms[0]["alpha_medio"]:
306
+ print(f" {t:10s} α bloco0 = {ms[0]['alpha_medio']} rec = {ms[0]['passos_rec']}")
307
+ relatorio["microunidades"] = micra
308
+
309
+ # 9-11) CONFIANÇA / MEMÓRIA / CRESCIMENTO — estado consolidado no resumo
310
+ resumo_v3 = json.load(open(resumo_path)) if os.path.exists(resumo_path) else {}
311
+ if resumo_v3:
312
+ for chave in ("prs_v8", "confianca", "memoria", "crescimento", "microunidades"):
313
+ if chave in resumo_v3 and chave not in relatorio:
314
+ relatorio[f"treino_{chave}"] = resumo_v3[chave]
315
+ if resumo_v3.get("confianca"):
316
+ c = resumo_v3["confianca"]
317
+ print(f"== confiança: h_ema={c.get('h_ema')}, ECE={c.get('ece')}, "
318
+ f"Bernstein={c.get('bernstein')} ==")
319
+ if resumo_v3.get("memoria"):
320
+ m = resumo_v3["memoria"]
321
+ print(f"== memória: hit_rate={m.get('hit_rate')}, escritas={m.get('escritas')}, "
322
+ f"rejeitadas={m.get('rejeitadas_confianca')}, "
323
+ f"entropia_codebook={m.get('entropia_codebook')} ==")
324
+ if resumo_v3.get("crescimento") is not None:
325
+ print(f"== crescimento: {len(resumo_v3['crescimento'])} eventos ==")
326
+
327
+ # 12) MEMÓRIA INTERNA EM EXECUÇÃO (doc 11 §9): evidência de integração
328
+ # real — escrita conficiente dos contextos do corpus, consulta, evicção,
329
+ # compressão VQ e contratos, com o modelo JÁ TREINADO
330
+ print("== memória interna em execução (contextos reais do modelo) ==")
331
+ from khtst.memoria.interna import MemoriaInterna
332
+ from khtst.treino.confianca import AgenteConfianca
333
+ mi = MemoriaInterna(d=modelo.d, n_slots=32, h_escrita=0.25,
334
+ idade_compressao_s=0.0, n_codigos=64)
335
+ ag = AgenteConfianca()
336
+ amostras_mem = random.sample(registros, min(64, len(registros)))
337
+ h_escreveras = 0
338
+ for r in amostras_mem[:48]:
339
+ seq = tk.encode(r.get("texto") or (r.get("saida") or r.get("entrada", "")),
340
+ tarefa=r["tarefa"], max_len=64)[:64]
341
+ if len(seq) < 4:
342
+ continue
343
+ ids_m = torch.zeros(1, len(seq), dtype=torch.long)
344
+ ids_m[0] = torch.tensor(seq)
345
+ logits_m, _ = modelo(ids_m, tarefa=r["tarefa"])
346
+ perda_m = modelo.ultima_perda or 6.0
347
+ h_m = float(ag(AgenteConfianca.features_logits(logits_m),
348
+ perda_atual=float(perda_m)))
349
+ z_m = modelo.contexto(ids_m)[0]
350
+ if mi.escrever(z_m, h_m, origem="nucleo", tarefa=r["tarefa"]):
351
+ h_escreveras += 1
352
+ consultas_ok = 0
353
+ for r in amostras_mem[48:]:
354
+ seq = tk.encode(r.get("texto") or (r.get("saida") or r.get("entrada", "")),
355
+ tarefa=r["tarefa"], max_len=64)[:64]
356
+ if len(seq) < 4:
357
+ continue
358
+ ids_m = torch.zeros(1, len(seq), dtype=torch.long)
359
+ ids_m[0] = torch.tensor(seq)
360
+ z_m = modelo.contexto(ids_m)[0]
361
+ rec_m = mi.consultar(z_m, m=3, origem="raciocinio")
362
+ consultas_ok += int(rec_m["acerto"])
363
+ n_comp_m = mi.comprimir_antigos(origem="treino")
364
+ stats_m = mi.estatisticas()
365
+ stats_m["escritas_aceitas"] = h_escreveras
366
+ stats_m["consultas_com_acerto"] = consultas_ok
367
+ stats_m["comprimidos_agora"] = n_comp_m
368
+ relatorio["memoria_execucao"] = stats_m
369
+ _salvar(relatorio)
370
+ print(f" escritas aceitas={h_escreveras}/48 · consultas com acerto="
371
+ f"{consultas_ok}/16 · comprimidos={n_comp_m} · "
372
+ f"entropia_codebook={stats_m['entropia_codebook']:.3f} · "
373
+ f"economia_bits/slot={stats_m['economia_bits_por_slot']:.4f} · "
374
+ f"violações_contrato={stats_m['violacoes_contrato']}")
375
+
376
+ # curva de épocas (telemetria)
377
+ resumo_path = "/home/z/my-project/khtst/telemetria_out/resumo_treino_v8.json"
378
+ if os.path.exists(resumo_path):
379
+ relatorio["curva_epocas"] = [
380
+ {"epoca": e["epoca"], "perda_media": e["perda_media"],
381
+ "ppl_lm": e["avaliacao"].get("ppl_lm")}
382
+ for e in json.load(open(resumo_path)).get("epocas", [])]
383
+
384
+ # v4 (doc 15 §3.5): COERÊNCIA À MEDIDA QUE OS DADOS CRESCEM
385
+ print("== coerência (repetição/ancoragem/entropia) por fator de corpus ==")
386
+ try:
387
+ coer = metricas_coerencia(modelo, tk, registros)
388
+ relatorio["coerencia"] = coer
389
+ for chave in ("corpus_25pct", "corpus_50pct", "corpus_100pct"):
390
+ if chave in coer:
391
+ c = coer[chave]
392
+ print(f" {chave}: n={c['n_registros']} "
393
+ f"repetição={c['repeticao_pct']}% "
394
+ f"ancoragem={c['ancoragem_bigramas']} "
395
+ f"entropia={c['entropia_logits']}")
396
+ for s in coer.get("amostras", []):
397
+ print(f" amostra: {s[:100]}")
398
+ except Exception as e:
399
+ relatorio["coerencia_erro"] = f"{type(e).__name__}: {e}"
400
+ print(f" (coerência falhou: {type(e).__name__})")
401
+
402
+ # v6 (doc 18 §3): PACOTE COMPLETO DE MÉTRICAS — alinhamento cross-modal,
403
+ # geração de texto, benchmarks e SOM expandido (QE/TE/distorção/σ/α/drift/
404
+ # freq de ativação/U-Matrix)
405
+ print("== v6: ALINHAMENTO CROSS-MODAL (CLIP Score + ITM + PPL Multimodal) ==")
406
+ try:
407
+ from khtst.metricas import (avaliar_clip, avaliar_itm, avaliar_todos,
408
+ codigos_visuais, metricas_variante,
409
+ pacote_completo, ppl_multimodal_texto,
410
+ ppl_visual_bigrama, treinar_itm)
411
+ from PIL import Image
412
+ import io as _io
413
+ pares_mm = []
414
+ for r in registros:
415
+ if r["tarefa"] in ("imagem_caption", "vqa") and r.get("imagem"):
416
+ try:
417
+ img = Image.open(_io.BytesIO(r["imagem"])).convert("RGB")
418
+ lado = modelo.cfg.modelo.imagem["resolucao"]
419
+ import numpy as _np
420
+ arr = _np.asarray(img.resize((lado, lado)),
421
+ dtype=_np.float32) / 255.0
422
+ tens = torch.from_numpy(arr).permute(2, 0, 1)
423
+ pares_mm.append((r.get("entrada") or "Descreva a imagem:", tens))
424
+ except Exception:
425
+ continue
426
+ if len(pares_mm) >= 32:
427
+ break
428
+ if pares_mm:
429
+ relatorio["clip_score"] = avaliar_clip(modelo, tk, pares_mm,
430
+ n_controle=16)
431
+ print(" CLIP Score:", relatorio["clip_score"])
432
+ cab, _ = treinar_itm(modelo, tk, pares_mm[:24], epocas=3, lote=8)
433
+ relatorio["itm"] = avaliar_itm(cab, modelo, tk, pares_mm[24:])
434
+ print(" ITM:", relatorio["itm"])
435
+ # corrente visual: códigos VQ por imagem → PPL bigrama
436
+ codigos = [codigos_visuais(modelo, p[1]) for p in pares_mm[:24]]
437
+ relatorio["ppl_visual"] = ppl_visual_bigrama(
438
+ codigos, n_codigos=max(2, max(max(c) for c in codigos) + 1
439
+ if codigos and codigos[0] else 2))
440
+ print(" PPL visual (bigrama códigos VQ):", relatorio["ppl_visual"])
441
+ relatorio["ppl_multimodal"] = ppl_multimodal_texto(modelo, tk, registros)
442
+ print(" PPL Multimodal (texto sob prefixo visual/áudio):",
443
+ relatorio["ppl_multimodal"])
444
+ except Exception as e:
445
+ relatorio["alinhamento_erro"] = f"{type(e).__name__}: {e}"
446
+ print(" (alinhamento falhou:", relatorio["alinhamento_erro"], ")")
447
+
448
+ print("== v6: GERAÇÃO DE TEXTO (CIDEr + BLEU 1-4 + ROUGE-L + METEOR) ==")
449
+ try:
450
+ from collections import Counter as _Counter
451
+ from khtst.metricas import pacote_completo
452
+ from khtst.metricas.geracao_texto import tokenizar as gen_tokenizar
453
+ pool_cap = [r for r in registros if r["tarefa"] in ("imagem_caption", "vqa")
454
+ and (r.get("saida") or "").strip()][:12]
455
+ if pool_cap:
456
+ df_corpus = _Counter()
457
+ for r in pool_cap:
458
+ toks = gen_tokenizar(r["saida"])
459
+ for n in range(1, 5):
460
+ for i in range(len(toks) - n + 1):
461
+ df_corpus[tuple(toks[i:i + n])] += 1
462
+ medias = {}
463
+ por_item = []
464
+ for r in pool_cap:
465
+ prompt = (r.get("entrada") or "Descreva a imagem:")[:140]
466
+ ids_p = torch.tensor([tk.encode(prompt, tarefa=r["tarefa"],
467
+ max_len=48)])
468
+ novos = modelo.gerar(ids_p, max_novos=20, temperatura=0.7,
469
+ top_p=0.9)
470
+ hip = tk.decodificar(novos)
471
+ m = pacote_completo(hip, [r["saida"]], df_corpus=df_corpus,
472
+ n_docs=len(pool_cap))
473
+ por_item.append({"hipotese": hip[:80], "ref": r["saida"][:60],
474
+ "bleu": m["bleu"], "rouge_l": m["rouge_l"],
475
+ "meteor": m["meteor"], "cider": m["cider"]})
476
+ for chave in ("bleu", "rouge_l", "meteor", "cider"):
477
+ vals = [p[chave] for p in por_item]
478
+ medias[chave] = round(sum(vals) / len(vals), 4)
479
+ relatorio["geracao_metricas"] = {"medias": medias,
480
+ "n": len(por_item),
481
+ "amostras": por_item[:4]}
482
+ print(" médias:", medias)
483
+ except Exception as e:
484
+ relatorio["geracao_metricas_erro"] = f"{type(e).__name__}: {e}"
485
+ print(" (geração-métricas falhou:", relatorio["geracao_metricas_erro"], ")")
486
+
487
+ print("== v6: BENCHMARKS (MMMU / MME / MathVista — proxies PT-BR) ==")
488
+ try:
489
+ from khtst.metricas import avaliar_todos
490
+ relatorio["benchmarks"] = avaliar_todos(modelo, tk, registros, n_max=30)
491
+ for k, v in relatorio["benchmarks"].items():
492
+ print(f" {v.get('benchmark')}: n={v.get('n')} "
493
+ f"score={v.get('acuracia', v.get('score_mme'))}")
494
+ except Exception as e:
495
+ relatorio["benchmarks_erro"] = f"{type(e).__name__}: {e}"
496
+ print(" (benchmarks falhou:", relatorio["benchmarks_erro"], ")")
497
+
498
+ print("== v6: SOM EXPANDIDO (QE/TE/distorção/σ/α/drift/freq/U-Matrix) ==")
499
+ try:
500
+ from khtst.metricas import metricas_variante
501
+ som_exp = {}
502
+ probe_x = ctx # contexto da re-consolidação (doc 16 §4)
503
+ for nome, v in orquestrador.variantes.items():
504
+ som_exp[nome] = metricas_variante(nome, v, probe_x)
505
+ relatorio["som_expandido"] = som_exp
506
+ for nome, mv in som_exp.items():
507
+ if "qe" in mv:
508
+ print(f" {nome}: QE={mv['qe']} TE={mv['te']} "
509
+ f"distorcao={mv['distorcao']} "
510
+ f"drift={mv.get('codebook_drift')} "
511
+ f"u={mv.get('u_matrix_resumo', {}).get('u_media')}")
512
+ except Exception as e:
513
+ relatorio["som_expandido_erro"] = f"{type(e).__name__}: {e}"
514
+ print(" (som expandido falhou:", relatorio["som_expandido_erro"], ")")
515
+
516
+ # v5 — Agente Engenheiro: observação de INFERÊNCIA + relatório final
517
+ print("== Agente Engenheiro (inferência + relatório integral) ==")
518
+ try:
519
+ ag = AgenteEngenheiro(
520
+ tolerancia_regressao=cfg.agente_engenheiro.tolerancia_regressao,
521
+ hub=hub)
522
+ for tarefa, ids_ex in (("instrucao", None),):
523
+ pass
524
+ _ids = torch.tensor([tk.encode("Pergunta: quem escreveu isso? Resposta:",
525
+ tarefa="instrucao", max_len=24)])
526
+ t0 = time.time()
527
+ _novos = modelo.gerar(_ids, max_novos=24)
528
+ relatorio["inferencia_agente"] = ag.observar_inferencia(
529
+ modelo, _ids, _novos, time.time() - t0)
530
+ print(" ", relatorio["inferencia_agente"])
531
+ # v5 — ciclo de compreensão geracional (difusão, modo honesto)
532
+ if cfg.difusao.ativo:
533
+ gd = GeradorMultimodal(repo_id=cfg.difusao.repo_id,
534
+ altura=cfg.difusao.altura,
535
+ largura=cfg.difusao.largura,
536
+ passos_inferencia=cfg.difusao.passos_inferencia,
537
+ guia_escala=cfg.difusao.guia_escala, hub=hub)
538
+ r = gd.compreensao_geracional("o pantanal ao entardecer", modelo,
539
+ orquestrador=orquestrador, op="txt2img")
540
+ relatorio["difusao"] = {"modo": r.get("modo"),
541
+ "prompt_enriquecido": r.get("prompt_enriquecido"),
542
+ "latencia_s": r.get("latencia_s"),
543
+ "gerou_pixels": r.get("modo") == "real"}
544
+ print(" difusão:", relatorio["difusao"]["modo"], "—",
545
+ relatorio["difusao"]["prompt_enriquecido"])
546
+ rel_ag = ag.relatorio(orquestrador_som=orquestrador,
547
+ avaliacao={"ppl_lm": relatorio.get("ppl_lm")})
548
+ relatorio["agente_engenheiro"] = {
549
+ "revisoes_aprovadas": rel_ag["revisoes_aprovadas"],
550
+ "revisoes_bloqueadas": rel_ag["revisoes_bloqueadas"],
551
+ "som_invariante_sem_orfaos": rel_ag.get("som_invariante_sem_orfaos"),
552
+ "som_ativos": rel_ag.get("som_ativos")}
553
+ except Exception as e:
554
+ relatorio["agente_erro"] = f"{type(e).__name__}: {e}"
555
+
556
+ os.makedirs(os.path.dirname(RELATORIO), exist_ok=True)
557
+ with open(RELATORIO, "w", encoding="utf-8") as f:
558
+ json.dump(relatorio, f, ensure_ascii=False, indent=2, default=str)
559
+ print(f"relatório → {RELATORIO}")
560
+
561
+
562
+ def _lote_lm(tk, registros, lote=8, L=192):
563
+ pool = [r for r in registros if r["tarefa"] == "lm"] or registros
564
+ seqs = []
565
+ for r in random.sample(pool, min(lote, len(pool))):
566
+ t = (r.get("texto") or r.get("saida") or r.get("entrada") or "")[:800]
567
+ seqs.append(tk.encode(t, tarefa="lm", max_len=L))
568
+ Tmax = max(len(s) for s in seqs)
569
+ ids = torch.zeros(len(seqs), Tmax, dtype=torch.long)
570
+ alvo = torch.full((len(seqs), Tmax), -100, dtype=torch.long)
571
+ for i, s in enumerate(seqs):
572
+ ids[i, :len(s)] = torch.tensor(s)
573
+ alvo[i, 1:len(s)] = ids[i, 1:len(s)]
574
+ return ids, alvo
575
+
576
+
577
+ # ---------------- v4 (doc 15 §3.5): COERÊNCIA das respostas ----------------
578
+
579
+ def metricas_coerencia(modelo, tk, registros, rotulos_prompts=None):
580
+ """Coerência medida em três dimensões (doc 15 §3.5):
581
+ (i) REPETIÇÃO: n-gramas repetidos por 100 tokens gerados;
582
+ (ii) ANCORAGEM no corpus: fração de bigramas gerados que existem nos
583
+ bigramas do corpus (proxy de coerência de língua);
584
+ (iii) ENTROPIA média dos logits (confiança da política).
585
+ Avaliada em FATORES de tamanho de corpus — coerência exibida À MEDIDA
586
+ QUE OS DADOS CRESCEM (requisito do usuário)."""
587
+ prompts = rotulos_prompts or [
588
+ "O Brasil é um país",
589
+ "Para fazer um bolo simples você precisa",
590
+ "A previsão do tempo para amanhã",
591
+ "O melhor jeito de estudar é",
592
+ ]
593
+ # bigramas de referência do corpus (hash de pares de ids)
594
+ corpus_bg: set[int] = set()
595
+ pool = [r for r in registros if r.get("texto") or r.get("saida")] or registros
596
+ for r in random.sample(pool, min(60, len(pool))):
597
+ t = (r.get("texto") or r.get("saida") or r.get("entrada") or "")[:600]
598
+ ids = tk.encode(t, tarefa="lm", max_len=96)
599
+ for a, b in zip(ids, ids[1:]):
600
+ corpus_bg.add(a * 1000003 + b)
601
+ resultados = {}
602
+ gerados_todos: list[list[int]] = []
603
+ for fator in (0.25, 0.5, 1.0): # subcorpus crescente
604
+ n = max(1, int(len(pool) * fator))
605
+ sub = pool[:n]
606
+ # bigramas de referência do subcorpus (menor → menos âncoras)
607
+ bg_sub: set[int] = set()
608
+ for r in random.sample(sub, min(40, len(sub))):
609
+ t = (r.get("texto") or r.get("saida") or r.get("entrada") or "")[:600]
610
+ ids = tk.encode(t, tarefa="lm", max_len=96)
611
+ for a, b in zip(ids, ids[1:]):
612
+ bg_sub.add(a * 1000003 + b)
613
+ repeticoes, ancoragens, entropias = [], [], []
614
+ for p in prompts:
615
+ ids_p = tk.encode(p, tarefa="lm", max_len=24)
616
+ t_ids = torch.tensor([ids_p])
617
+ novos = modelo.gerar(t_ids, max_novos=36, temperatura=0.85,
618
+ top_p=0.92)
619
+ gerados_todos.append(novos)
620
+ if not novos:
621
+ continue
622
+ # (i) repetição: fração de 3-gramas duplicados
623
+ trigs = [tuple(novos[i:i + 3]) for i in range(len(novos) - 2)]
624
+ rep = 1.0 - (len(set(trigs)) / len(trigs)) if trigs else 0.0
625
+ repeticoes.append(rep * 100.0)
626
+ # (ii) ancoragem: bigramas gerados presentes no subcorpus
627
+ bigs = [novos[i] * 1000003 + novos[i + 1]
628
+ for i in range(len(novos) - 1)]
629
+ anc = (sum(1 for g in bigs if g in bg_sub) / len(bigs)) if bigs else 0.0
630
+ ancoragens.append(anc)
631
+ # (iii) entropia média dos logits (confiança)
632
+ modelo.eval()
633
+ with torch.no_grad():
634
+ x = modelo.emb(t_ids)
635
+ for bloco in modelo.blocos:
636
+ x, _, _ = bloco(x)
637
+ h = modelo.norm_f(x)
638
+ if modelo.nlp is not None:
639
+ h, _ = modelo.nlp(h)
640
+ lg = torch.log_softmax(modelo.lm_head(h[:, -1]), dim=-1)
641
+ entropias.append(float(-(lg.exp() * lg).sum()))
642
+ resultados[f"corpus_{int(fator*100)}pct"] = {
643
+ "n_registros": n,
644
+ "repeticao_pct": round(sum(repeticoes) / max(1, len(repeticoes)), 2),
645
+ "ancoragem_bigramas": round(sum(ancoragens) / max(1, len(ancoragens)), 4),
646
+ "entropia_logits": round(sum(entropias) / max(1, len(entropias)), 4),
647
+ }
648
+ # amostras para o relatório (legibilidade humana)
649
+ resultados["amostras"] = [tk.decodificar(g)[:140] for g in gerados_todos[:4]]
650
+ return resultados
651
+
652
+
653
+ if __name__ == "__main__":
654
+ main()
scripts/06_publicar_hf.py ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Publica o KHTST v7 no HuggingFace de modo ORGANIZADO e COMPLETO:
4
+
5
+ README.md (model card v7 COM GRÁFICOS DE DESEMPENHO) · LICENSE · configs/ ·
6
+ src/khtst/ · scripts/ · docs/matematica/ (provas 00–18) · tests/ · evidências
7
+ de treino/avaliação/comparação · estados/fase-v8/ (pesos finais + meta SHA-256)
8
+
9
+ REGRAS DO HUB (escopo v5): publicação em UM ÚNICO COMMIT COMPLETO —
10
+ `upload_folder` com `delete_patterns=["*"]` substitui ATOMICAMENTE todo o
11
+ conteúdo do repo (arquivos antigos somem no MESMO commit; nunca há uploads
12
+ parciais em sequência curta — o Hub bloqueia esse padrão).
13
+
14
+ SEGURANÇA: token EXCLUSIVAMENTE da variável HF_TOKEN — nunca gravado em
15
+ arquivo, log ou repo. A publicação NUNCA inclui: cache_dados, telemetria_out,
16
+ estados_local, stage_publicar, arquivos com o token.
17
+
18
+ Verificações de porta do Agente Engenheiro (pré-publicação):
19
+ • nenhum segredo no stage (regex hf_[A-Za-z0-9]{30,});
20
+ • nenhum resíduo proibido (bugwatch, estados_hf, __pycache__, .pt).
21
+
22
+ Uso: HF_TOKEN=... python3 06_publicar_hf.py [--repo PowerMachine/khtst-multimodal-ptbr]
23
+ """
24
+ import argparse
25
+ import os
26
+ import re
27
+ import shutil
28
+ import sys
29
+
30
+ RAIZ = "/home/z/my-project/khtst"
31
+ STAGE = "/home/z/my-project/khtst/stage_publicar"
32
+ PASTA_ESTADO = "estados/fase-v8" # ÚNICO estado publicado (pesos finais)
33
+ IGNORAR_DIRS = {"__pycache__", "cache_dados", "telemetria_out",
34
+ "cache_hub_tmp", ".git", "build", "estados_local",
35
+ "estados_local_teste", "stage_publicar", "hf_stage",
36
+ "download", "upload"}
37
+ IGNORAR_EXT = (".pt", ".pyc", ".pt.tmp")
38
+ PADRAO_TOKEN = re.compile(r"hf_[A-Za-z0-9]{30,}")
39
+ RESIDUOS_PROIBIDOS = ("bugwatch", "estados_hf")
40
+
41
+
42
+ def preparar_stage() -> int:
43
+ if os.path.exists(STAGE):
44
+ shutil.rmtree(STAGE)
45
+ n = 0
46
+ for raiz, dirs, arquivos in os.walk(RAIZ):
47
+ dirs[:] = [d for d in dirs if d not in IGNORAR_DIRS]
48
+ rel = os.path.relpath(raiz, RAIZ)
49
+ alvo_raiz = os.path.join(STAGE, rel) if rel != "." else STAGE
50
+ os.makedirs(alvo_raiz, exist_ok=True)
51
+ for a in arquivos:
52
+ if a.endswith(IGNORAR_EXT) or a.startswith("."):
53
+ continue
54
+ if any(r in a.lower() for r in RESIDUOS_PROIBIDOS):
55
+ print(f" porta do Agente: arquivo proibido ignorado: {a}")
56
+ continue
57
+ shutil.copy2(os.path.join(raiz, a), os.path.join(alvo_raiz, a))
58
+ n += 1
59
+ # evidências de treino/avaliação (artefatos de 1ª classe, v7)
60
+ for nome in ("avaliacao_v8.json", "resumo_treino_v8.json",
61
+ "relatorio_agente_engenheiro.json",
62
+ "comparacao_treino_v8.json", "test_khtst_v6_pos_treino.txt",
63
+ "teste_item_b_v8.json", "test_khtst_v7_pos_treino.txt",
64
+ "tempo_treino_acumulado.json"):
65
+ fonte = os.path.join(RAIZ, "telemetria_out", nome)
66
+ if os.path.exists(fonte):
67
+ shutil.copy2(fonte, os.path.join(STAGE, nome))
68
+ n += 1
69
+ # v7 — GRÁFICOS DE DESEMPENHO (publicados APENAS no card HF — README.md)
70
+ dir_graf = os.path.join(RAIZ, "graficos")
71
+ if os.path.isdir(dir_graf):
72
+ os.makedirs(os.path.join(STAGE, "graficos"), exist_ok=True)
73
+ for a in sorted(os.listdir(dir_graf)):
74
+ if a.endswith(".png"):
75
+ shutil.copy2(os.path.join(dir_graf, a),
76
+ os.path.join(STAGE, "graficos", a))
77
+ n += 1
78
+ # v8.3 — GATE DE QUALIDADE (regra do usuário): os ESTADOS do modelo só
79
+ # entram se a não-regressão vs AURORA for aprovada; gate False ⇒ publica
80
+ # APENAS código/docs/evidências (sem pesos, sem alegação de paridade).
81
+ import json as _json
82
+ gate_ok = None
83
+ cmp_path = os.path.join(RAIZ, "telemetria_out", "comparacao_treino_v8.json")
84
+ try:
85
+ gate_ok = bool(_json.load(open(cmp_path))["nao_regressao"]["aprovado"])
86
+ except Exception:
87
+ gate_ok = None
88
+ if gate_ok is False:
89
+ print("GATE DE QUALIDADE: FALHOU — estados do modelo NÃO publicados "
90
+ "(regra: só publicar estados se qualidade ≥ AURORA).")
91
+ return n
92
+ sys.path.insert(0, os.path.join(RAIZ, "src"))
93
+ from khtst.dados.checkpoints import GestorCheckpoints
94
+ from khtst.config import Config
95
+ gestor = GestorCheckpoints(dir_local=Config().checkpoints.dir_local,
96
+ pasta_publicacao=PASTA_ESTADO)
97
+ if gestor.preparar_para_publicacao(STAGE):
98
+ n += 2
99
+ print(f"estado final incluído: {PASTA_ESTADO}/modelo.safetensors")
100
+ else:
101
+ print("AVISO: sem checkpoint local — publicando só código/docs")
102
+ return n
103
+
104
+
105
+ def auditoria_segredos() -> list[str]:
106
+ suspeitos = []
107
+ for raiz, dirs, arquivos in os.walk(STAGE):
108
+ for a in arquivos:
109
+ if not a.endswith((".json", ".md", ".py", ".txt", ".yaml", ".yml")):
110
+ continue
111
+ caminho = os.path.join(raiz, a)
112
+ try:
113
+ with open(caminho, encoding="utf-8", errors="ignore") as f:
114
+ if PADRAO_TOKEN.search(f.read()):
115
+ suspeitos.append(caminho)
116
+ except Exception:
117
+ pass
118
+ return suspeitos
119
+
120
+
121
+ def main():
122
+ ap = argparse.ArgumentParser()
123
+ ap.add_argument("--repo", default="PowerMachine/khtst-multimodal-ptbr")
124
+ args = ap.parse_args()
125
+
126
+ token = os.environ.get("HF_TOKEN")
127
+ if not token:
128
+ print("ERRO: defina HF_TOKEN no ambiente (nunca em arquivo).")
129
+ sys.exit(1)
130
+
131
+ n = preparar_stage()
132
+ print(f"stage: {n} arquivos (sem caches/segredos/resíduos)")
133
+
134
+ suspeitos = auditoria_segredos()
135
+ if suspeitos:
136
+ print("ERRO: possíveis segredos detectados:", suspeitos)
137
+ sys.exit(1)
138
+
139
+ from huggingface_hub import HfApi
140
+ api = HfApi(token=token)
141
+ api.create_repo(args.repo, repo_type="model", exist_ok=True, private=False)
142
+
143
+ # PUBLICAÇÃO ÚNICA E COMPLETA: delete_patterns=["*"] remove no MESMO commit
144
+ # qualquer arquivo antigo — nada de uploads parciais em sequência
145
+ api.upload_folder(
146
+ folder_path=STAGE, repo_id=args.repo, repo_type="model",
147
+ commit_message="KHTST v7 — RETREINO OBSERVADO: estados antigos apagados; "
148
+ "treino do zero com monitor de RAM integral (Agente Engenheiro); "
149
+ "métricas de tests/test_khtst_v6.py comparadas com o treino "
150
+ "anterior; gráficos de desempenho publicados no card",
151
+ delete_patterns=["*"],
152
+ allow_patterns=["*.py", "*.md", "*.json", "*.yaml", "*.yml",
153
+ "*.txt", "*.png", "*.safetensors", "LICENSE*"])
154
+ print("✓ PUBLICAÇÃO ÚNICA COMPLETA (1 commit; antigos removidos "
155
+ "atomicamente)")
156
+
157
+ # verificação final: resíduos proibidos não podem existir no repo
158
+ arquivos = api.list_repo_files(args.repo, repo_type="model")
159
+ restos = [f for f in arquivos
160
+ if any(r in f.lower() for r in RESIDUOS_PROIBIDOS)
161
+ or "__pycache__" in f or f.endswith(".pt")]
162
+ if restos:
163
+ print("ERRO: resíduos no repo:", restos)
164
+ sys.exit(1)
165
+ parciais = [f for f in arquivos if f.startswith("estados/")
166
+ and "fase-v7" not in f]
167
+ print(f"✓ verificação: {len(arquivos)} arquivos no repo; "
168
+ f"resíduos=0; estados parciais={len(parciais)} (0 esperado)")
169
+
170
+ print(f"REPO: https://huggingface.co/{args.repo}")
171
+ print("Higienização: unset HF_TOKEN && python3 -m pip show huggingface_hub "
172
+ ">/dev/null && python3 -c 'from huggingface_hub import HfApi; "
173
+ "HfApi().logout()'")
174
+
175
+
176
+ if __name__ == "__main__":
177
+ main()
scripts/07_reconsolidar_som.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Reconsolidação SOM (FASE B) sobre o estado final do treino v4 — usado após
4
+ correções pontuais nas variantes (ex.: reseeding da S-SOM, doc 15 Teorema 15.2)
5
+ sem re-executar o treino principal/DPO. Carrega o último estado local, roda
6
+ `consolidar_som_max_ativos` e reavalia as métricas de neurônios ativos."""
7
+ import base64
8
+ import json
9
+ import os
10
+ import sys
11
+
12
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
13
+
14
+ import torch
15
+
16
+ from khtst.config import Config
17
+ from khtst.dados.checkpoints import GestorCheckpoints
18
+ from khtst.dados.tokenizador import TokenizadorKHTST
19
+ from khtst.memoria.orquestrador import OrquestradorSOM
20
+ from khtst.nucleo.modelo import KHTSTModel
21
+ from khtst.telemetria.hub import TelemetryHub
22
+ from khtst.treino.treinador import TreinadorExtensao
23
+
24
+ CORPUS = "/home/z/my-project/khtst/cache_dados/corpus_v2.jsonl"
25
+ TOKENIZADOR = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
26
+ RESUMO = "/home/z/my-project/khtst/telemetria_out/resumo_treino_v7.json"
27
+
28
+
29
+ def carregar_registros(caminho: str) -> list[dict]:
30
+ registros = []
31
+ with open(caminho, encoding="utf-8") as f:
32
+ for linha in f:
33
+ try:
34
+ r = json.loads(linha)
35
+ except Exception:
36
+ continue
37
+ if isinstance(r.get("imagem"), str):
38
+ try:
39
+ r["imagem"] = base64.b64decode(r["imagem"])
40
+ except Exception:
41
+ r["imagem"] = None
42
+ if isinstance(r.get("audio"), str):
43
+ try:
44
+ r["audio"] = base64.b64decode(r["audio"])
45
+ except Exception:
46
+ r["audio"] = None
47
+ registros.append(r)
48
+ return registros
49
+
50
+
51
+ def main():
52
+ cfg = Config().de_arquivo("/home/z/my-project/khtst/configs/base.json")
53
+ hub = TelemetryHub(cfg.telemetria.arquivo_jsonl)
54
+ tk = TokenizadorKHTST(TOKENIZADOR)
55
+ registros = carregar_registros(CORPUS)
56
+ print(f"corpus: {len(registros)} registros")
57
+
58
+ modelo = KHTSTModel(cfg, usar_multimodal=True)
59
+ checkpoints = GestorCheckpoints(dir_local=cfg.checkpoints.dir_local)
60
+ tag = checkpoints.ultima_tag()
61
+ if tag:
62
+ checkpoints.carregar(modelo, tag)
63
+ print(f"estado carregado: {tag or 'NENHUM'}")
64
+ orquestrador = OrquestradorSOM(cfg.modelo.d_modelo, cfg.som, hub=hub,
65
+ cfg_atencao=vars(cfg.som_atencao) if hasattr(cfg, "som_atencao") else None)
66
+ treinar = TreinadorExtensao(cfg, modelo, tk, hub, registros,
67
+ orquestrador_som=orquestrador, checkpoints=checkpoints)
68
+
69
+ print("== FASE B: reconsolidação SOM (S-SOM agora com reseeding) ==")
70
+ resultado_som = treinar.consolidar_som_max_ativos()
71
+ ativos = orquestrador.telemetria_ativos()
72
+ print("neurônios ativos por variante:", json.dumps(ativos, indent=1))
73
+
74
+ aval_final = treinar.avaliar(max_lotes=4)
75
+ print("avaliação pós-reconsolidação:", aval_final)
76
+
77
+ if os.path.exists(RESUMO):
78
+ resumo = json.load(open(RESUMO, encoding="utf-8"))
79
+ resumo["som"] = {k: v for k, v in resultado_som.items()
80
+ if k != "prototipos"}
81
+ resumo["avaliacao_final"] = aval_final
82
+ mc = resumo.get("metricas_completas", {})
83
+ mc["neuronios_ativos"] = ativos
84
+ resumo["metricas_completas"] = mc
85
+ with open(RESUMO, "w", encoding="utf-8") as f:
86
+ json.dump(resumo, f, ensure_ascii=False, indent=2, default=str)
87
+ print(f"resumo atualizado → {RESUMO}")
88
+ checkpoints.salvar(modelo, "fase-som-v7",
89
+ {"passo_global": treinar.passo_global,
90
+ "reconsolidacao": True,
91
+ "ativos": ativos})
92
+
93
+
94
+ if __name__ == "__main__":
95
+ main()
scripts/08_graficos_card.py ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """v7 — COMPARAÇÃO DE TREINOS + GRÁFICOS DE DESEMPENHO (apenas no card HF).
4
+
5
+ Compara o treino ATUAL (resumo_treino_v8.json / avaliacao_v8.json) com o
6
+ treino ANTERIOR (*_anterior.json), incorpora as métricas observadas em
7
+ tests/test_khtst_v6.py e o monitor de RAM, e produz os gráficos do model
8
+ card (graficos/*.png). O Agente Engenheiro valida a NÃO-REGRESSÃO
9
+ (Teorema 16.10) das capacidades fundamentais.
10
+
11
+ Gráficos (todos em PT-BR, publicados SOMENTE no card HF):
12
+ 1. graf_curva_perda.png — perda média por época (anterior vs atual)
13
+ 2. graf_ppl_lm.png — ppl LM por época (anterior vs atual, log)
14
+ 3. graf_ram.png — consumo de RAM durante o treino (Agente)
15
+ 4. graf_perdas_tarefa.png — perda por tarefa (anterior vs atual)
16
+ 5. graf_som_roteador.png — SOM: taxa de ativos por variante + RPP
17
+ 6. graf_alinhamento.png — CLIP/PPL-multimodal/PPL-visual (honesto)
18
+ """
19
+ import json
20
+ import math
21
+ import os
22
+ import sys
23
+
24
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
25
+
26
+ import matplotlib
27
+ matplotlib.use("Agg")
28
+ import matplotlib.pyplot as plt
29
+
30
+ RAIZ = "/home/z/my-project/khtst"
31
+ TEL = os.path.join(RAIZ, "telemetria_out")
32
+ GRAF = os.path.join(RAIZ, "graficos")
33
+
34
+ COR_ANTE = "#7f8fa6"
35
+ COR_ATUAL = "#e17055"
36
+ COR_AZUL = "#0984e3"
37
+ COR_VERDE = "#00b894"
38
+
39
+
40
+ def carregar(nome):
41
+ p = os.path.join(TEL, nome)
42
+ if not os.path.exists(p):
43
+ return None
44
+ with open(p, encoding="utf-8") as f:
45
+ texto = f.read()
46
+ if nome.endswith(".jsonl"):
47
+ # JSONL: um objeto por linha (monitor de RAM)
48
+ amostras = []
49
+ for linha in texto.splitlines():
50
+ try:
51
+ amostras.append(json.loads(linha))
52
+ except Exception:
53
+ continue
54
+ return amostras
55
+ return json.loads(texto)
56
+
57
+
58
+ def curva_epocas(resumo):
59
+ """[(epoca, perda_media, ppl_lm)] por época."""
60
+ pts = []
61
+ for e in (resumo or {}).get("epocas", []):
62
+ av = e.get("avaliacao", {})
63
+ pts.append((e.get("epoca", 0), e.get("perda_media"),
64
+ av.get("ppl_lm")))
65
+ return pts
66
+
67
+
68
+ def parse_testes(nome="test_khtst_v6_pos_treino.txt"):
69
+ p = os.path.join(TEL, nome)
70
+ ok, fal, cru = None, None, ""
71
+ if os.path.exists(p):
72
+ cru = open(p, encoding="utf-8", errors="ignore").read()
73
+ for linha in cru.splitlines():
74
+ if "resultado:" in linha and "✓" in linha:
75
+ partes = linha.split()
76
+ try:
77
+ ok = int(partes[partes.index("✓") - 1])
78
+ fal = int(partes[partes.index("✗") - 1])
79
+ except Exception:
80
+ pass
81
+ return {"ok": ok, "falhou": fal, "cru": cru[-400:]}
82
+
83
+
84
+ def main():
85
+ os.makedirs(GRAF, exist_ok=True)
86
+ ant_r = carregar("resumo_treino_v6_anterior.json")
87
+ atu_r = carregar("resumo_treino_v8.json")
88
+ ant_a = carregar("avaliacao_v6_anterior.json")
89
+ atu_a = carregar("avaliacao_v8.json")
90
+ ram = carregar("ram_treino_v8.jsonl") or []
91
+ testes = parse_testes()
92
+
93
+ cmp_: dict = {
94
+ "versao_atual": (atu_r or {}).get("versao", "v7"),
95
+ "versao_anterior": (ant_r or {}).get("versao", "v6"),
96
+ "test_khtst_v6": {"ok": testes["ok"], "falhou": testes["falhou"]},
97
+ "ram": (atu_r or {}).get("ram", {}),
98
+ }
99
+
100
+ # ---------------- 1) curva de perda ----------------
101
+ plt.rcParams.update({"font.size": 10})
102
+ ca, cn = curva_epocas(ant_r), curva_epocas(atu_r)
103
+ fig, ax = plt.subplots(figsize=(7.2, 4.2), constrained_layout=True)
104
+ if ca:
105
+ ax.plot([p[0] for p in ca], [p[1] for p in ca], "o--", color=COR_ANTE,
106
+ label="treino anterior (v6)", lw=1.6, ms=5)
107
+ if cn:
108
+ ax.plot([p[0] for p in cn], [p[1] for p in cn], "o-", color=COR_ATUAL,
109
+ label="retreino atual (v7)", lw=2.0, ms=6)
110
+ ax.set_xlabel("época")
111
+ ax.set_ylabel("perda média (CE ponderada, 9 tarefas)")
112
+ ax.set_title("Curva de aprendizado — perda média por época")
113
+ ax.grid(alpha=0.3)
114
+ ax.legend(loc="upper right", frameon=False)
115
+ fig.savefig(os.path.join(GRAF, "graf_curva_perda.png"), dpi=150)
116
+ plt.close(fig)
117
+
118
+ # ---------------- 2) ppl LM por época ----------------
119
+ fig, ax = plt.subplots(figsize=(7.2, 4.2), constrained_layout=True)
120
+ if ca:
121
+ ax.plot([p[0] for p in ca], [max(p[2], 1e-1) for p in ca], "o--",
122
+ color=COR_ANTE, label="treino anterior (v6)", lw=1.6, ms=5)
123
+ if cn:
124
+ ax.plot([p[0] for p in cn], [max(p[2], 1e-1) for p in cn], "o-",
125
+ color=COR_ATUAL, label="retreino atual (v7)", lw=2.0, ms=6)
126
+ aleat = ((ant_a or {}).get("ppl_lm_aleatorio")
127
+ or (atu_a or {}).get("ppl_lm_aleatorio"))
128
+ if aleat:
129
+ ax.axhline(aleat, color="#b2bec3", ls=":", lw=1.4,
130
+ label=f"inicialização aleatória (ppl≈{aleat:,.0f})")
131
+ ax.set_yscale("log")
132
+ ax.set_xlabel("época")
133
+ ax.set_ylabel("perplexidade LM (escala log)")
134
+ ax.set_title("Perplexidade LM por época")
135
+ ax.grid(alpha=0.3, which="both")
136
+ ax.legend(loc="lower left", frameon=False, fontsize=9)
137
+ fig.savefig(os.path.join(GRAF, "graf_ppl_lm.png"), dpi=150)
138
+ plt.close(fig)
139
+
140
+ # ---------------- 3) RAM (Agente Engenheiro) ----------------
141
+ if ram:
142
+ t0 = ram[0]["t"]
143
+ minutos = [(a["t"] - t0) / 60.0 for a in ram]
144
+ rss = [a["rss_mb"] for a in ram]
145
+ disp = [a["disponivel_mb"] for a in ram]
146
+ passos = [a.get("passo", 0) for a in ram]
147
+ fig, ax = plt.subplots(figsize=(7.6, 4.4), constrained_layout=True)
148
+ ax.plot(minutos, rss, color=COR_AZUL, lw=1.4,
149
+ label="RSS do processo (treino)")
150
+ mx = max(rss)
151
+ md = sum(rss) / len(rss)
152
+ ax.axhline(mx, color="#d63031", ls="--", lw=1.1,
153
+ label=f"pico {mx:,.0f} MB")
154
+ ax.axhline(md, color=COR_VERDE, ls=":", lw=1.1,
155
+ label=f"média {md:,.0f} MB")
156
+ ax2 = ax.twinx()
157
+ ax2.fill_between(minutos, disp, color="#dfe6e9", alpha=0.55,
158
+ label="RAM disponível (sistema)")
159
+ ax2.set_ylabel("disponível (MB)", color="#636e72")
160
+ ax.set_xlabel("tempo de treino (min)")
161
+ ax.set_ylabel("RSS do processo (MB)")
162
+ ax.set_title("Consumo de memória RAM durante o retreino (Agente Engenheiro)")
163
+ ax.set_xlim(0, max(minutos[-1], 0.5))
164
+ ax.grid(alpha=0.3)
165
+ # marcações de passos a cada ~25% do treino
166
+ p_max = max(passos) or 0
167
+ for frac in (0.25, 0.5, 0.75):
168
+ i = min(range(len(passos)), key=lambda j: abs(passos[j] - frac * p_max))
169
+ ax.annotate(f"passo {passos[i]}", (minutos[i], rss[i]),
170
+ textcoords="offset points", xytext=(0, 8),
171
+ fontsize=7.5, color="#2d3436", ha="center")
172
+ h1, l1 = ax.get_legend_handles_labels()
173
+ h2, l2 = ax2.get_legend_handles_labels()
174
+ ax.legend(h1 + h2, l1 + l2, loc="upper left",
175
+ bbox_to_anchor=(0.0, 1.22), ncols=2, frameon=False, fontsize=8.5)
176
+ fig.savefig(os.path.join(GRAF, "graf_ram.png"), dpi=150)
177
+ plt.close(fig)
178
+
179
+ # ---------------- 4) perdas por tarefa ----------------
180
+ def perdas_tarefa(av):
181
+ pt = (av or {}).get("perdas_tarefa", {})
182
+ return {k: v.get("treinado") for k, v in pt.items()
183
+ if isinstance(v, dict) and v.get("treinado") is not None}
184
+
185
+ pa, pn = perdas_tarefa(ant_a), perdas_tarefa(atu_a)
186
+ if pa and pn:
187
+ tarefas = sorted(set(pa) & set(pn))
188
+ x = range(len(tarefas))
189
+ larg = 0.38
190
+ fig, ax = plt.subplots(figsize=(7.6, 4.2), constrained_layout=True)
191
+ ax.bar([i - larg / 2 for i in x], [pa[t] for t in tarefas], larg,
192
+ color=COR_ANTE, label="treino anterior (v6)")
193
+ ax.bar([i + larg / 2 for i in x], [pn[t] for t in tarefas], larg,
194
+ color=COR_ATUAL, label="retreino atual (v7)")
195
+ ax.set_xticks(list(x))
196
+ ax.set_xticklabels(tarefas, rotation=28, ha="right")
197
+ ax.set_ylabel("perda final por tarefa (treinada)")
198
+ ax.set_title("Perda final por tarefa — menor é melhor")
199
+ ax.grid(alpha=0.3, axis="y")
200
+ ax.legend(loc="upper right", frameon=False)
201
+ fig.savefig(os.path.join(GRAF, "graf_perdas_tarefa.png"), dpi=150)
202
+ plt.close(fig)
203
+ cmp_["perdas_tarefa"] = {t: {"anterior": pa[t], "atual": pn[t]}
204
+ for t in tarefas}
205
+
206
+ # ---------------- 5) SOM variantes + RPP ----------------
207
+ def variantes(av):
208
+ return ((av or {}).get("som_treinado", {}) or {}).get("variantes", {})
209
+
210
+ va, vn = variantes(ant_a), variantes(atu_a)
211
+ if va and vn:
212
+ nomes = sorted(set(va) & set(vn))
213
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8.4, 4.0),
214
+ constrained_layout=True)
215
+ y = range(len(nomes))
216
+ ax1.barh([i + 0.2 for i in y], [va[n].get("taxa_ativos", 0) for n in nomes],
217
+ 0.38, color=COR_ANTE, label="anterior (v6)")
218
+ ax1.barh([i - 0.2 for i in y], [vn[n].get("taxa_ativos", 0) for n in nomes],
219
+ 0.38, color=COR_ATUAL, label="atual (v7)")
220
+ ax1.set_yticks(list(y))
221
+ ax1.set_yticklabels(nomes)
222
+ ax1.invert_yaxis()
223
+ ax1.set_xlim(0, 1.05)
224
+ ax1.axvline(0.90, color="#d63031", ls=":", lw=1.2,
225
+ label="alvo 0.90 (Teo. 15.2)")
226
+ ax1.set_xlabel("taxa de neurônios ativos")
227
+ ax1.set_title("SOM — 8 variantes + S-SOM")
228
+ ax1.grid(alpha=0.3, axis="x")
229
+ ax1.legend(loc="lower right", fontsize=8, frameon=False)
230
+ rpa = ((ant_r or {}).get("rpp") or {})
231
+ rpn = ((atu_r or {}).get("rpp") or {})
232
+ cats = ["recompensas", "punicoes", "penalidades"]
233
+ vals_a = [rpa.get(c, 0) for c in cats]
234
+ vals_n = [rpn.get(c, 0) for c in cats]
235
+ x2 = range(len(cats))
236
+ ax2.bar([i - 0.2 for i in x2], vals_a, 0.38, color=COR_ANTE,
237
+ label="anterior (v6)")
238
+ ax2.bar([i + 0.2 for i in x2], vals_n, 0.38, color=COR_ATUAL,
239
+ label="atual (v7)")
240
+ ax2.set_xticks(list(x2))
241
+ ax2.set_xticklabels(["REWARD", "PUNISH", "PENALTY"])
242
+ ax2.set_ylabel("eventos no treino")
243
+ ax2.set_title("RPP — Reward/Punishment/Penalty")
244
+ ax2.grid(alpha=0.3, axis="y")
245
+ ax2.legend(fontsize=8, frameon=False)
246
+ fig.savefig(os.path.join(GRAF, "graf_som_roteador.png"), dpi=150)
247
+ plt.close(fig)
248
+ cmp_["som_taxa_ativos"] = {n: {"anterior": va[n].get("taxa_ativos"),
249
+ "atual": vn[n].get("taxa_ativos")}
250
+ for n in nomes}
251
+ cmp_["rpp"] = {"anterior": rpa, "atual": rpn}
252
+
253
+ # ---------------- 6) alinhamento multimodal (honesto) ----------------
254
+ def aln(av):
255
+ return {"clip_real": ((av or {}).get("clip_score", {}) or {}).get("clip_real"),
256
+ "clip_controle": ((av or {}).get("clip_score", {}) or {}).get("clip_controle"),
257
+ "ppl_mm": ((av or {}).get("ppl_multimodal", {}) or {}).get("ppl_mm"),
258
+ "ppl_visual": ((av or {}).get("ppl_visual", {}) or {}).get("ppl_visual"),
259
+ "itm_acc": ((av or {}).get("itm", {}) or {}).get("acuracia")}
260
+
261
+ aa, an = aln(ant_a), aln(atu_a)
262
+ if aa and an:
263
+ fig, ax = plt.subplots(figsize=(7.6, 4.0), constrained_layout=True)
264
+ chaves = ["clip_real", "ppl_mm", "ppl_visual", "itm_acc"]
265
+ rotulos = ["CLIP score (real)", "PPL multimodal", "PPL visual",
266
+ "ITM acurácia"]
267
+ va_ = [aa[k] if isinstance(aa[k], (int, float)) else 0 for k in chaves]
268
+ vn_ = [an[k] if isinstance(an[k], (int, float)) else 0 for k in chaves]
269
+ x = range(len(chaves))
270
+ ax.bar([i - 0.2 for i in x], va_, 0.38, color=COR_ANTE,
271
+ label="anterior (v6)")
272
+ ax.bar([i + 0.2 for i in x], vn_, 0.38, color=COR_ATUAL,
273
+ label="atual (v7)")
274
+ for i, (a_, n_) in enumerate(zip(va_, vn_)):
275
+ if isinstance(aa[chaves[i]], (int, float)):
276
+ ax.text(i - 0.2, a_, f"{a_:.2f}", ha="center", va="bottom",
277
+ fontsize=8)
278
+ if isinstance(an[chaves[i]], (int, float)):
279
+ ax.text(i + 0.2, n_, f"{n_:.2f}", ha="center", va="bottom",
280
+ fontsize=8)
281
+ ax.set_xticks(list(x))
282
+ ax.set_xticklabels(rotulos, fontsize=9)
283
+ ax.set_title("Alinhamento multimodal (CLIP/ITM/PPL) — leitura honesta")
284
+ ax.grid(alpha=0.3, axis="y")
285
+ ax.legend(loc="upper right", frameon=False)
286
+ fig.savefig(os.path.join(GRAF, "graf_alinhamento.png"), dpi=150)
287
+ plt.close(fig)
288
+ cmp_["alinhamento"] = {"anterior": aa, "atual": an}
289
+
290
+ # ---------------- comparacao + NÃO-REGRESSÃO ----------------
291
+ ppl_a = (ant_a or {}).get("ppl_lm")
292
+ ppl_n = (atu_a or {}).get("ppl_lm")
293
+ cmp_["ppl_lm"] = {"anterior": ppl_a, "atual": ppl_n,
294
+ "delta_pct": (round(100 * (ppl_n - ppl_a) / ppl_a, 2)
295
+ if ppl_a and ppl_n else None)}
296
+ if ant_r and atu_r and ant_r.get("epocas") and atu_r.get("epocas"):
297
+ pm_a = ant_r["epocas"][-1].get("perda_media")
298
+ pm_n = atu_r["epocas"][-1].get("perda_media")
299
+ cmp_["perda_media_final"] = {"anterior": pm_a, "atual": pm_n}
300
+ cmp_["passos"] = {"anterior": ant_r.get("passos"),
301
+ "atual": atu_r.get("passos")}
302
+
303
+ # Teorema 16.10 — capacidades FUNDAMENTAIS do gate (ppl/perda: menor é
304
+ # melhor). ppl_multimodal fica FORA do gate: o codebook VQ é re-estimado
305
+ # por treino (k-means por crop) e sua variância entre corridas independen-
306
+ # tes é maior que a própria diferença de qualidade — é REPORTADO honesta-
307
+ # mente na comparação e nos gráficos, mas não bloqueia a publicação.
308
+ _ep_a = (ant_r or {}).get("epocas") or [{}]
309
+ caps_antes = {"ppl_lm": ppl_a,
310
+ "perda_media_final": _ep_a[-1].get("perda_media")}
311
+ caps_depois = {"ppl_lm": ppl_n,
312
+ "perda_media_final": (atu_r or {}).get("epocas", [{}])[-1]
313
+ .get("perda_media")}
314
+ # saúde SOM entra como capacidade (maior/menor conforme a métrica)
315
+ _ta_a = [v.get("taxa_ativos") for v in variantes(ant_a).values()
316
+ if isinstance(v.get("taxa_ativos"), (int, float))]
317
+ _ta_n = [v.get("taxa_ativos") for v in variantes(atu_a).values()
318
+ if isinstance(v.get("taxa_ativos"), (int, float))]
319
+ if _ta_a:
320
+ caps_antes["taxa_ativos_min"] = min(_ta_a)
321
+ if _ta_n:
322
+ caps_depois["taxa_ativos_min"] = min(_ta_n)
323
+ try:
324
+ from khtst.config import Config
325
+ from khtst.qualidade import AgenteEngenheiro
326
+ ag = AgenteEngenheiro(dir_telemetria=TEL,
327
+ tolerancia_regressao=Config()
328
+ .agente_engenheiro.tolerancia_regressao)
329
+ # v8.3 — CORREÇÃO de bug latente do v7: o gate usava as chaves
330
+ # "ppl_valid/perda_valid", mas as métricas reais são "ppl_lm" e
331
+ # "perda_media_final" — o gate NUNCA verificou o ppl! Com as chaves
332
+ # corretas, "menor é melhor" passa a valer de fato (Teorema 16.10).
333
+ nr = ag.garantir_nao_regressao(
334
+ {k: v for k, v in caps_antes.items() if v is not None},
335
+ {k: v for k, v in caps_depois.items() if v is not None},
336
+ menor_e_melhor=("ppl_valid", "perda_valid", "ppl_lm",
337
+ "perda_media_final", "perda_lm"))
338
+ cmp_["nao_regressao"] = nr
339
+ except Exception as e:
340
+ cmp_["nao_regressao"] = {"erro": f"{type(e).__name__}: {e}"}
341
+
342
+ with open(os.path.join(TEL, "comparacao_treino_v8.json"), "w",
343
+ encoding="utf-8") as f:
344
+ json.dump(cmp_, f, ensure_ascii=False, indent=2, default=str)
345
+ print("comparação → telemetria_out/comparacao_treino_v8.json")
346
+ print("gráficos:", sorted(os.listdir(GRAF)))
347
+ print("não-regressão aprovada:",
348
+ cmp_.get("nao_regressao", {}).get("aprovado"))
349
+ print("ppl_lm:", cmp_["ppl_lm"])
350
+ print("testes v6:", cmp_["test_khtst_v6"])
351
+ print("ram:", json.dumps(cmp_["ram"]))
352
+
353
+
354
+ if __name__ == "__main__":
355
+ main()
scripts/09_teste_item_b.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Teste FINAL do item (b) — modelo KHTST TREINADO (checkpoint fase-som).
4
+
5
+ Verifica, com o modelo pós-treino real:
6
+ 1. 4 requisições submetidas em série ANTES da 1ª resposta;
7
+ 2. recebimento (estado RECEBIDA) confirmado para todas antes do processamento;
8
+ 3. processamento (PROCESSANDO → CONCLUIDA) com tokens gerados;
9
+ 4. stopping (cancelamento) honrado em ≤ 1 passo durante geração ativa;
10
+ 5. continue (retomada de pedido pausado).
11
+ Saída: telemetria_out/teste_item_b_v8.json
12
+ """
13
+ import json
14
+ import sys
15
+ import threading
16
+ import time
17
+
18
+ sys.path.insert(0, "/home/z/my-project/khtst/src")
19
+
20
+ import torch
21
+
22
+ from khtst.config import Config
23
+ from khtst.dados.tokenizador import TokenizadorKHTST
24
+ from khtst.memoria.orquestrador import OrquestradorSOM
25
+ from khtst.nucleo.modelo import KHTSTModel
26
+ from khtst.servico import SessaoKHTST
27
+
28
+ CFG_PATH = "/home/z/my-project/khtst/configs/base.json"
29
+ TK_PATH = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
30
+ SAIDA = "/home/z/my-project/khtst/telemetria_out/teste_item_b_v8.json"
31
+
32
+ cfg = Config().de_arquivo(CFG_PATH)
33
+ torch.manual_seed(cfg.dados.semente)
34
+ modelo = KHTSTModel(cfg, usar_multimodal=True)
35
+ tk = TokenizadorKHTST(TK_PATH)
36
+
37
+ # retoma o estado final (fase-som)
38
+ from khtst.dados.checkpoints import GestorCheckpoints
39
+ ck = GestorCheckpoints("/home/z/my-project/khtst/estados_local", "estados/fase-v8")
40
+ tag = ck.ultima_tag()
41
+ if tag:
42
+ ok = ck.carregar(modelo, tag)
43
+ print(f"estado retomado: {tag} (ok={ok})")
44
+ modelo.eval()
45
+
46
+ sessao = SessaoKHTST(modelo, decodificar=tk)
47
+ prompts = [
48
+ "O KHTST é um modelo multimodal que",
49
+ "A previsão do tempo para amanhã indica",
50
+ "Para cozinhar arroz, primeiro",
51
+ "O melhor time do Brasil é",
52
+ ]
53
+ # ---- 1) 4 requisições EM SÉRIE antes da 1ª resposta ----
54
+ pids = [sessao.submeter(p, max_novos=10, tarefa="lm") for p in prompts]
55
+ estados_iniciais = [sessao.pedidos[i].estado.value for i in pids]
56
+ check_recebimento = all(e == "recebida" for e in estados_iniciais)
57
+ print("1) 4 pedidos ANTES da 1ª resposta:", pids, "| estados:", estados_iniciais)
58
+
59
+ # ---- 2/3) processa todos (a bomba adhoc roda ENTRE tokens) ----
60
+ t0 = time.time()
61
+ saidas = sessao.executar_todos(max_passos=400)
62
+ dur = time.time() - t0
63
+ rel = sessao.relatorio()
64
+ check_processamento = all(rel[i]["estado"] == "concluida" and rel[i]["n_tokens"] == 10
65
+ for i in pids)
66
+ print("2) processamento:", [(i, rel[i]["estado"], rel[i]["n_tokens"]) for i in pids],
67
+ f"| {dur:.1f}s")
68
+ for i in pids:
69
+ texto = tk.decodificar(saidas[i])
70
+ print(f" pedido {i}: «{prompts[i]}» → {texto[:70]!r}")
71
+
72
+ # ---- 4) stopping durante processamento ativo (thread externa) ----
73
+ sessao2 = SessaoKHTST(modelo, decodificar=tk)
74
+ p_st = sessao2.submeter("Escreva uma história longa sobre o mar e as estrelas",
75
+ max_novos=60, tarefa="lm")
76
+ def para_no_meio():
77
+ time.sleep(0.4)
78
+ sessao2.stop(p_st, cancelar=True)
79
+ threading.Thread(target=para_no_meio, daemon=True).start()
80
+ sessao2.executar_todos(max_passos=400)
81
+ rel2 = sessao2.relatorio()[p_st]
82
+ check_stop = rel2["estado"] == "cancelada" and 0 < rel2["n_tokens"] < 60
83
+ print("4) stopping:", rel2["estado"], "| tokens antes do stop:", rel2["n_tokens"],
84
+ "| eventos:", rel2["eventos"])
85
+
86
+ # ---- 5) pause → continue ----
87
+ sessao3 = SessaoKHTST(modelo, decodificar=tk)
88
+ p_pc = sessao3.submeter("O livro da floresta narra", max_novos=12, tarefa="lm")
89
+ sessao3.canal.stop(p_pc, cancelar=False) # pausa no 1º dreno
90
+ def retoma():
91
+ time.sleep(0.3)
92
+ sessao3.continuar(p_pc)
93
+ threading.Thread(target=retoma, daemon=True).start()
94
+ sessao3.executar_todos(max_passos=400)
95
+ rel3 = sessao3.relatorio()[p_pc]
96
+ check_continue = rel3["estado"] == "concluida" and "pausada" in rel3["eventos"] \
97
+ and "retomada" in rel3["eventos"]
98
+ print("5) pause→continue:", rel3["estado"], "| eventos:", rel3["eventos"])
99
+
100
+ resultado = {
101
+ "modelo": "KHTST v8 (checkpoint: " + str(tag) + ")",
102
+ "item_b_4_requisicoes_antes_da_1a": bool(check_recebimento),
103
+ "item_b_processamento_e_conclusao": bool(check_processamento),
104
+ "item_b_stopping_durante_ativa": bool(check_stop),
105
+ "item_b_pause_continue": bool(check_continue),
106
+ "estados_iniciais": estados_iniciais,
107
+ "relatorio_completo": {str(i): rel[i] for i in rel},
108
+ "relatorio_stop": rel2,
109
+ "relatorio_pause_continue": rel3,
110
+ "duracao_s": round(dur, 2),
111
+ }
112
+ ok_all = all([check_recebimento, check_processamento, check_stop, check_continue])
113
+ resultado["item_b_aprovado"] = bool(ok_all)
114
+ with open(SAIDA, "w", encoding="utf-8") as f:
115
+ json.dump(resultado, f, ensure_ascii=False, indent=2, default=str)
116
+ print(f"\nITEM B: {'APROVADO' if ok_all else 'REPROVADO'} → {SAIDA}")
117
+ sys.exit(0 if ok_all else 1)
src/khtst/__init__.py ADDED
File without changes
src/khtst/acelerado/__init__.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """Fachada dos núcleos acelerados (Cython+C) com FALLBACK puro-torch.
3
+
4
+ Estratégia (requisito: reescrever em Cython + C/C++ sem quebrar acessos):
5
+ • tenta importar o módulo compilado `nucleos` (build via setup.py);
6
+ • sem binário, usa os equivalentes EM TORCH com matemática idêntica
7
+ (Teorema 19.25 — semântica sequencial preservada por laço);
8
+ • `status()` informa qual backend está em uso (honestidade — doc 00).
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import math
13
+
14
+ import torch
15
+
16
+ try:
17
+ from khtst.acelerado.nucleos import (som_atualizar_lote as _som_c,
18
+ contagens_entropia as _cont_c)
19
+ BACKEND = "cython_c"
20
+ except Exception:
21
+ _som_c = None
22
+ _cont_c = None
23
+ BACKEND = "torch_fallback"
24
+
25
+
26
+ def som_atualizar_lote(w: torch.Tensor, v: torch.Tensor, hit_ema: torch.Tensor,
27
+ z: torch.Tensor, rotulos: torch.Tensor,
28
+ eta0: float, lambda_sup: float, n_amostras: int):
29
+ """Kohonen sequencial (eq. 6.2) — Cython/C se disponível; senão torch.
30
+ Semântica EXATA do laço original do RoteadorSSOM.atualizar."""
31
+ if _som_c is not None:
32
+ zc = z.detach().cpu().double().contiguous()
33
+ rot = rotulos.detach().cpu().long().contiguous()
34
+ # memoryviews Cython: converte via numpy; COPY-BACK garante propagação
35
+ # mesmo quando o tensor original não é float64/contíguo
36
+ wn = w.detach().cpu()
37
+ wn = wn if (wn.dtype == torch.float64 and wn.is_contiguous()) \
38
+ else wn.double().contiguous()
39
+ vn = v.detach().cpu()
40
+ vn = vn if (vn.dtype == torch.float64 and vn.is_contiguous()) \
41
+ else vn.double().contiguous()
42
+ hn = hit_ema.detach().cpu()
43
+ hn = hn if (hn.dtype == torch.float64 and hn.is_contiguous()) \
44
+ else hn.double().contiguous()
45
+ eq, n = _som_c(wn.numpy(), vn.numpy(), hn.numpy(), zc.numpy(),
46
+ rot.numpy(), eta0, lambda_sup, n_amostras)
47
+ w.copy_(torch.from_numpy(wn.numpy()))
48
+ v.copy_(torch.from_numpy(vn.numpy()))
49
+ hit_ema.copy_(torch.from_numpy(hn.numpy()))
50
+ return eq, n
51
+ # fallback torch: MESMA ordem de atualizações (Robbins–Monro ordenal)
52
+ zc = z.detach().cpu().double()
53
+ eq_soma = 0.0
54
+ for i in range(zc.shape[0]):
55
+ n_amostras += 1
56
+ xi = zc[i]
57
+ d2 = torch.cdist(xi.unsqueeze(0), w.double()).pow(2).squeeze(0)
58
+ c = int(d2.argmin())
59
+ eq_soma += float(d2[c])
60
+ eta = eta0 / (1.0 + 0.001 * n_amostras)
61
+ w[c] += eta * (xi - w[c])
62
+ p = torch.softmax(v[c], dim=0)
63
+ onehot = torch.zeros_like(p)
64
+ onehot[int(rotulos[i])] = 1.0
65
+ v[c] += (lambda_sup * 0.1) * (onehot - p)
66
+ hit_ema *= 0.92
67
+ hit_ema[c] += 0.08
68
+ return eq_soma / max(zc.shape[0], 1), n_amostras
69
+
70
+
71
+ def contagens_entropia(contextos: list[int] | torch.Tensor, vocab: int,
72
+ h_max: float, punicao_base: float):
73
+ """Contagens + entropia + fator da punição dinâmica (eq. 10.8/10.9)."""
74
+ if _cont_c is not None and not isinstance(contextos, torch.Tensor):
75
+ ctx = torch.tensor(list(contextos), dtype=torch.long).contiguous()
76
+ cont, h, fator = _cont_c(ctx.numpy(), vocab, h_max, punicao_base)
77
+ return cont, h, fator
78
+ contagens = torch.bincount(torch.as_tensor(list(contextos), dtype=torch.long),
79
+ minlength=vocab)
80
+ probs = contagens.float() / max(float(contagens.sum()), 1.0)
81
+ p_nz = probs[probs > 0]
82
+ h = float(-(p_nz * torch.log(p_nz + 1e-8)).sum()) if p_nz.numel() else 0.0
83
+ fator = min(1.0, h / max(h_max, 1e-6))
84
+ return contagens, h, fator
85
+
86
+
87
+ def status() -> dict:
88
+ return {"backend": BACKEND,
89
+ "cython_disponivel": _som_c is not None}