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.
|