BiGRU_T_version / docs /analysis.md
PowerMachine's picture
Upload docs/analysis.md with huggingface_hub
04e5e76 verified
|
Raw
History Blame Contribute Delete
14.1 kB
# 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.