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