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

αk(T)=ezk/Tj=1Kezj/T\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}}$:

ghyp=ghypgmain,ghypgmain2+ϵgmaing_{\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 é

y^=fQ8(θ)(x)=fθ(x)+η(x)\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 é

yfinal=y^+δ=fθ(x)+η(x)+hϕ(o)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:

Lmeta(T,τ)=Lval(T,τ;θ)+λsS(θ)\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$ é

geff=αk(T)gmain+1[Lmain>τ]ghypg_{\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.