File size: 14,113 Bytes
04e5e76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# Análise Matemática — BiGRU_T_version (Refatoração GRU-RING v13.9.2)

## 1. Visão geral

A refatoração **BiGRU_T_version** preserva a filosofia cooperativa do GRU-RING v13.9.2
(4 camadas BiGRU + Transformer + Hypothesis Network + Trust Network), mas reorganiza
o cálculo em torno de **4 lemas formais** que tornam explícitos os mecanismos de
desacoplamento, cirurgia de gradiente, cancelamento de ruído de quantização e
auto-configuração.

### 1.1 Comparação estrutural com v13.9.2

| Aspecto | v13.9.2 (original) | BiGRU_T_version (refatorado) |
|---|---|---|
| Camadas BiGRU | 4 cooperativas (d_model=128) | 4 por BiGRU4 × 8 paralelas por u8cell_T |
| Módulos especialistas | 1 (single stack) | até `max_modules=64` u8cell_T |
| Seleção de módulos | implícita (Confidence Gate) | **softmax com temperatura α (Lema 1)** |
| Hipótese | 16 hipóteses com mapeamento LoRA | **HypT: delta correção sobre y_hat (Lema 3)** |
| Trust | TD-learning + softmax norm | **τ limiar + MetaConfigurator (Lema 4)** |
| Quantização | W8A8 QOperator (SmoothQuant) | **W8A8 fake-quant em Linear (Lema 3)** |
| Interação gradiente main/hyp | Punishment gate | **gradient surgery ortogonal (Lema 2)** |
| Multimodalidade | xavante/multimodal/* | mantida (image/audio/video/text encoders) |
| Otimizador | AdamW | AdamW + **HamiltonianWassersteinOptimizer opcional** |
| Tokenizer | BBPE 16K | BBPE 16K (reaproveitado) |
| Datasets | 9 base + 3 PT-BR finetune | mesmos (reaproveitados) |

---

## 2. Lema 1 — Desacoplamento via atenção hierárquica

**Enunciado.** Seja $\mathcal{M} = \{m_1, \ldots, m_K\}$ um conjunto de módulos
$u8cell_T$ e sejam $\mathbf{z} \in \mathbb{R}^K$ logits de seleção. Define-se

$$\alpha_k(T) = \frac{e^{z_k / T}}{\sum_{j=1}^K e^{z_j / T}}$$

A saída agregada é $H = \sum_{k=1}^K \alpha_k(T) \, h_k$, com $h_k = u8cell_T_k(x)$.

**Propriedade (especialização por entropia).** A entropia da distribuição
$H(\alpha) = -\sum_k \alpha_k \log \alpha_k$ é maximizada em $\log K$ quando
$T \to \infty$ (seleção uniforme) e minimizada em $0$ quando $T \to 0^+$
(seleção argmax). Minimizar $H(\alpha)$ indiretamente via regularização
$L_{\text{ent}} = \lambda_{\text{ent}} \cdot H(\alpha)$ força especialização:
aproximadamente um subconjunto $\mathcal{S} \subset \mathcal{M}$ com
$|\mathcal{S}| \ll K$ retém pesos significativos.

**Propriedade (redução da disputa de gradiente).** Seja $g_k = \nabla_{\theta_k} L$
o gradiente da perda em relação aos parâmetros do módulo $k$. Como
$\partial L / \partial \theta_k = \alpha_k \cdot \partial L / \partial h_k \cdot \partial h_k / \partial \theta_k$,
quando $\alpha_k \to 0$ o gradiente $\|g_k\| \to 0$. Logo, módulos inativos
não competem por capacidade de gradiente, reduzindo o produto interno
$\langle g_i, g_j \rangle$ para $i \neq j$ ativos.

**Implementação.** Em `model/module_selector.py`:
- `module_logits: nn.Parameter(torch.zeros(K))` — logits aprendíveis
- `alpha = F.softmax(module_logits / T, dim=0)` no forward
- `entropy_reg = -lambda_ent * (alpha * log(alpha + eps)).sum()` retornado como aux loss

**Meta-ajuste de T.** T é tratado como hiperparâmetro aprendível pelo
`MetaConfigurator` (Lema 4) via `T = exp(log_temperature)`.

---

## 3. Lema 2 — Gradiente cirúrgico

**Enunciado.** Sejam $L_{\text{main}}(\theta)$ e $L_{\text{hyp}}(\theta)$ duas perdas
compartilhando parâmetros $\theta$. Sejam
$g_{\text{main}} = \nabla_\theta L_{\text{main}}$ e
$g_{\text{hyp}} = \nabla_\theta L_{\text{hyp}}$.

**Projeção ortogonal.** Quando $\langle g_{\text{main}}, g_{\text{hyp}} \rangle < 0$
(gradientes conflitantes), projeta-se $g_{\text{hyp}}$ no complemento ortogonal
de $g_{\text{main}}$:

$$g_{\text{hyp}}^{\perp} = g_{\text{hyp}} - \frac{\langle g_{\text{main}}, g_{\text{hyp}} \rangle}{\|g_{\text{main}}\|^2 + \epsilon} \, g_{\text{main}}$$

O gradiente combinado é $g_{\text{total}} = g_{\text{main}} + g_{\text{hyp}}^{\perp}$.

**Propriedade (não-interferência).** Por construção,
$\langle g_{\text{total}}, g_{\text{main}} \rangle = \|g_{\text{main}}\|^2 + 0 = \|g_{\text{main}}\|^2 \geq 0$,
logo $g_{\text{total}}$ sempre reduz $L_{\text{main}}$. Adicionalmente,
$\langle g_{\text{total}}, g_{\text{hyp}} \rangle = \langle g_{\text{main}}, g_{\text{hyp}} \rangle + \|g_{\text{hyp}}^{\perp}\|^2$.
Como $\|g_{\text{hyp}}^{\perp}\|^2 = \|g_{\text{hyp}}\|^2 - \frac{\langle g_{\text{main}}, g_{\text{hyp}} \rangle^2}{\|g_{\text{main}}\|^2}$
e $\langle g_{\text{main}}, g_{\text{hyp}} \rangle < 0$, segue que
$\langle g_{\text{total}}, g_{\text{hyp}} \rangle > \langle g_{\text{main}}, g_{\text{hyp}} \rangle$,
ou seja, $g_{\text{total}}$ também não piora $L_{\text{hyp}}$ além do que
$g_{\text{main}}$ já pioraria.

**Quando $\langle g_{\text{main}}, g_{\text{hyp}} \rangle \geq 0$** (gradientes
alinhados), não há projeção: $g_{\text{total}} = g_{\text{main}} + g_{\text{hyp}}$.

**Implementação.** Em `training/gradient_surgery.py`:
- `orthogonalize_gradient(g_main, g_hyp)`: implementação vetorial da projeção
- `apply_gradient_surgery(model, loss_main, loss_hyp)`: calcula gradientes
  independentes via `torch.autograd.grad` (com `retain_graph=True` para main),
  aplica projeção e atribui `p.grad = g_total`

---

## 4. Lema 3 — Cancelamento de ruído de quantização

**Enunciado.** Seja $f_\theta: \mathcal{X} \to \mathbb{R}^V$ o modelo principal
e $Q_8(\cdot)$ a quantização W8A8 (pesos e ativações em 8 bits). A saída
quantizada é

$$\hat{y} = f_{Q_8(\theta)}(x) = f_\theta(x) + \eta(x)$$

onde $\eta(x)$ é o erro de quantização (viés + variância).

**Hipótese corretiva.** Define-se uma cabeça de hipótese $h_\phi: \mathbb{R}^d \to \mathbb{R}^V$
que produz uma correção $\delta = h_\phi(o)$ onde $o$ é a representação
agregada pelo orquestrador. A predição final é

$$y_{\text{final}} = \hat{y} + \delta = f_\theta(x) + \eta(x) + h_\phi(o)$$

**Objetivo.** Treinar $h_\phi$ para que $h_\phi(o) \approx -\eta(x)$, cancelando
o ruído de quantização. A perda é
$L_{\text{hyp}} = \ell(y_{\text{final}}, y^*)$ onde $y^*$ é o rótulo verdadeiro.

**Isolamento do sinal (stop_grad_hyp).** Para evitar que o gradiente de
$L_{\text{hyp}}$ contamine os parâmetros principais via $o$, a entrada $o$
de $h_\phi$ é destacada: $\delta = h_\phi(\text{sg}(o))$ onde $\text{sg}$ é
stop-gradient. Isso faz $\nabla_\theta L_{\text{hyp}}$ depender apenas dos
parâmetros compartilhados via $f_\theta$ (gerenciados pelo Lema 2).

**Ativação condicional.** A hipótese só é ativada quando $L_{\text{main}} > \tau$,
ou seja, quando a perda principal excede um limiar (indicando que a quantização
está prejudicando a predição). Caso contrário, $\delta = 0$ e o modelo usa
apenas $\hat{y}$.

**Implementação.** Em `model/hyp_t.py` e `quantization/quantized_linear.py`:
- `QuantizedLinear(nn.Linear)`: fake quant W8A8 no forward (STE backward)
- `HypT.forward(o, stop_grad=True)`: aplica `o.detach()` quando stop_grad
- No `UnifiedModel.forward`: se `use_hypothesis=True` e `loss_main > tau`,
  calcula `y_final = y_hat + delta` e retorna ambos

---

## 5. Lema 4 — Auto-configuração e suavização

**Enunciado.** Seja $\mathcal{L}_{\text{val}}(T, \tau; \theta)$ a perda de
validação como função dos hiperparâmetros temperatura $T$ e limiar $\tau$.
O MetaConfigurator mantém $T = \exp(\log T)$ e $\tau = \exp(\log \tau)$
(garantindo positividade) e os otimiza por gradiente descendente em um
meta-objetivo:

$$\mathcal{L}_{\text{meta}}(T, \tau) = \mathcal{L}_{\text{val}}(T, \tau; \theta^*) + \lambda_s \cdot S(\theta^*)$$

onde $\theta^* = \theta - \eta \nabla_\theta \mathcal{L}_{\text{train}}(T, \tau; \theta)$
é o parâmetro após um passo de treino (diferenciação implícita), e
$S(\theta) = \|\nabla_\theta \mathcal{L}\|^2$ é uma **proxy de agudeza**
(sharpness) — aproximação de baixo custo para o maior autovalor da Hessiana.

**Propriedade (mínimos planos).** Minimizar $S(\theta)$ empurra o modelo
para regiões de baixa curvatura, onde o ruído de gradiente (devido a
mini-batches e quantização W8A8) produz atualizações menores em magnitude,
reduzindo variância e melhorando generalização (Keskar et al., 2017;
Foret et al., 2021 — SAM).

**Controle implícito do número de módulos ativos.** Como $T$ controla a
entropia de $\alpha$ (Lema 1), minimizar $\mathcal{L}_{\text{meta}}$ ajusta
$T$ para o regime onde apenas os módulos necessários estão ativos. Não há
necessidade de regularização explícita de cardinalidade (embora
$L_{\text{ent}}$ possa ser adicionada se desejado).

**Implementação.** Em `training/meta_configurator.py`:
- `log_temperature: nn.Parameter` — aprendível, $T = \exp(\log T)$
- `log_tau: nn.Parameter` — aprendível, $\tau = \exp(\log \tau)$
- `forward_with_meta(x_val, y_val)`:
  1. Forward com $T$ atual → $\mathcal{L}_{\text{val}}$
  2. `grads = autograd.grad(L_val, model.parameters(), create_graph=True)`
  3. `sharpness = sum((g**2).sum() for g in grads)`
  4. `meta_loss = L_val + lambda_s * sharpness`
  5. `meta_optim.zero_grad(); meta_loss.backward(); meta_optim.step()`
  6. Atualiza `model.tau = exp(log_tau).detach()`

---

## 6. Análise de estabilidade e convergência

### 6.1 Estabilidade do gradiente combinado

Sob os Lemas 1–4, o gradiente efetivo em $\theta$ é

$$g_{\text{eff}} = \alpha_k(T) \cdot g_{\text{main}} + \mathbb{1}[L_{\text{main}} > \tau] \cdot g_{\text{hyp}}^\perp$$

Sob **assumir** (i) gradientes com norma limitada $\|g\| \leq G$, (ii)
$\alpha_k \in [0,1]$ com $\sum \alpha_k = 1$, (iii) projeção ortogonal
preserva norma $\|g_{\text{hyp}}^\perp\| \leq \|g_{\text{hyp}}\|$, então
$\|g_{\text{eff}}\| \leq G + G = 2G$. Logo, com clipping em $5.0$ (como no
script original), o gradiente é estável.

### 6.2 Convergência do meta-aprendizado

O MetaConfigurator usa Adam com $\eta_{\text{meta}} = 0.01$ em
$(\log T, \log \tau)$. Como a meta-perda é diferenciável em $(\log T, \log \tau)$
via `create_graph=True`, Adam converge para um mínimo local sob condições
padrão (Kingma & Ba, 2015). A proxy de agudeza $S(\theta)$ é não-negativa e
diferenciável, garantindo que o meta-objetivo é coercivo.

### 6.3 Não-divergência do modelo principal

Mesmo se $h_\phi$ divergir, $y_{\text{final}} = \hat{y} + \delta$ é limitado
pelo fato de que $L_{\text{hyp}}$ penaliza $\delta$ quando $y_{\text{final}}$
se afasta de $y^*$. Adicionalmente, o stop-gradient isola $\delta$ do caminho
principal, então $\hat{y}$ permanece estável.

---

## 7. Mapeamento de reaproveitamento (source → BiGRU_T_version)

| Componente | Source path | Target path | Reuso |
|---|---|---|---|
| BBPE Tokenizer | `flexnet/bbpe_tokenizer.py` | `src/bigru_t/tokenizer/bbpe_tokenizer.py` | Cópia fiel |
| Streaming datasets | `flexnet/streaming_datasets_v13_9.py` + `scripts/streaming_datasets_v13_9.py` | `src/bigru_t/data/streaming_datasets.py` | Merge (9 base + 3 PT-BR + format_template) |
| W8A8 QOperator | `flexnet/w8a8_qoperator.py` | `src/bigru_t/quantization/w8a8_qoperator.py` | Cópia + wrapper `QuantizedLinear` do Lema 3 |
| Hardware detector | `flexnet/hardware_detector.py` + `xavante/core/hardware_detector.py` | `src/bigru_t/utils/hardware_detector.py` | Cópia do flexnet (mais canônico) |
| Xeon runtime | `flexnet/xeon_runtime.py` | `src/bigru_t/utils/xeon_runtime.py` | Cópia fiel |
| OOM guard | `flexnet/oom_guard.py` | `src/bigru_t/utils/oom_guard.py` | Cópia fiel |
| Memory monitor | `flexnet/memory_monitor.py` | `src/bigru_t/utils/memory_monitor.py` | Cópia fiel |
| Tensor ops | `xavante/utils/tensor_ops.py` | `src/bigru_t/utils/tensor_ops.py` | Cópia fiel |
| Validators | `xavante/utils/validators.py` | `src/bigru_t/utils/validators.py` | Cópia fiel |
| Logging utils | `xavante/utils/logging_utils.py` | `src/bigru_t/utils/logging_utils.py` | Cópia fiel |
| Hamiltonian-Wasserstein optimizer | `flexnet/hamiltonian_wasserstein_optimizer.py` | `src/bigru_t/optim/hamiltonian_wasserstein.py` | Cópia (opcional em treino) |
| Multimodal: text encoder | `xavante/multimodal/text_encoder.py` | `src/bigru_t/multimodal/text_encoder.py` | Cópia fiel |
| Multimodal: image encoder | `xavante/multimodal/image_encoder.py` | `src/bigru_t/multimodal/image_encoder.py` | Cópia fiel |
| Multimodal: audio encoder | `xavante/multimodal/audio_encoder.py` | `src/bigru_t/multimodal/audio_encoder.py` | Cópia fiel |
| Multimodal: video encoder | `xavante/multimodal/video_encoder.py` | `src/bigru_t/multimodal/video_encoder.py` | Cópia fiel |
| Multimodal: modal router | `xavante/multimodal/modal_router.py` | `src/bigru_t/multimodal/modal_router.py` | Cópia fiel |

**Descartados (superseded)**:
- `flexnet/train_v13_9_minimal.py` — superseded by `flexnet/train_v13_9.py`
- `xavante/enhanced/enhanced_xavante_v1.py`, `v2.py` — superseded by `v3.py`
- `xavante/training/medusa_trainer.py` — superseded by `medusa_trainer_bpe.py`
- `flexnet/hf_dataset_streamer.py` — superseded by `streaming_datasets_v13_9.py`

---

## 8. Diferenças do treino (bug-detection run)

| Parâmetro | v13.9.2 original | BiGRU_T_version (bug-detection) |
|---|---|---|
| Epochs | 1 (effective, via max_steps) | **2** (fixo por especificação) |
| Datasets | 9 base + 3 PT-BR | mesmos |
| Max samples por dataset | 200-500 | 50 (bug-detection, reduzido) |
| Max optimizer steps | 40-200 | 30 (2 épocas × ~15 steps/época) |
| Grad accum | 16 | 8 |
| LR | 1e-5 a 2e-5 | 1e-3 (treino from-scratch, não fine-tune) |
| Monitor | loss, ppl, conf | loss, ppl, **RAM, disk, módulos ativos** |
| Kill-switch | punishment gate | **loss não diminui em N steps OU RAM > 90%** |

---

## 9. Conclusão

A refatoração BiGRU_T_version formaliza os mecanismos heurísticos do v13.9.2
em 4 lemas matemáticos verificáveis, mantendo a multimodalidade e o stack de
otimização original. O treino de bug-detection (2 épocas) valida o pipeline
end-to-end sem pretender produzir um modelo competitivo — o objetivo é
detectar erros de implementação nos 4 lemas e nos módulos reaproveitados.