|
Download docs/analysis.md from PowerMachine/BiGRU_T_version: direct link, hf CLI and curl.
- Browser
- Download file 14.1 kB
-
https://huggingface.co/PowerMachine/BiGRU_T_version/resolve/main/docs/analysis.md
- Command line
-
hf download hf://PowerMachine/BiGRU_T_version/docs/analysis.md
-
curl -L -o analysis.md https://huggingface.co/PowerMachine/BiGRU_T_version/resolve/main/docs/analysis.md
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. | |