ResearcherBot-1 · Multimodal MoE Language Model
por Delvek de Sousa — Engenheiro de IA, Pesquisador & CTO
Um Small Language Model multimodal com arquitetura Mixture-of-Experts que processa texto, imagem e audio — construido 100% do zero em PyTorch puro.
Sem fine-tuning. Sem modelo pre-treinado. Sem framework de LLM. Cada componente — tokenizer BPE, vision encoder, audio encoder, transformer decoder, MoE router — foi escrito na mao.
| dado | valor |
|---|---|
| Parametros totais | 19.9 M |
| Parametros ativos/token | ~10 M (top-2 de 8 experts) |
| Modalidades | Texto + Imagem + Audio |
| Vocabulario | 1 024 tokens (BPE do zero) |
| Contexto maximo | 256 tokens |
| Licenca | Apache-2.0 |
| Idioma | Portugues brasileiro |
| Dominio | Pesquisa academica em IA |
| Treinamento | RTX 3060 12GB |
Arquitetura
+-----------+
| Imagem | 64x64 RGB
+-----+-----+
|
Patch Embedding (Conv2d 8x8)
+ CLS token + Pos Embedding
+ 1-layer Self-Attention
|
Vision Projection ----+
|
+-----------+ |
| Audio | Mel Spectrogram |
+-----+-----+ (64 mels) |
| |
Patch Embedding (16-frame patches) |
+ CLS token + Pos Embedding |
+ 1-layer Self-Attention |
| |
Audio Projection ----------+ |
| |
+-----------+ | |
| Texto | | |
+-----+-----+ | |
| | |
Token Embedding | |
+ Modality Embedding | |
| | |
+----[ concat ]-------+--------------+
|
+--[ Transformer Decoder x6 ]--+
| RMSNorm |
| Causal Self-Attention |
| 8 heads, d_head=38 |
| RoPE positional encoding |
| RMSNorm |
| FFN (alternado): |
| Camadas 0,2,4: MoE |
| 8 experts, top-2 |
| SwiGLU + load balancing |
| Camadas 1,3,5: Dense |
| SwiGLU |
+-------------------------------+
|
RMSNorm -> LM Head (weight tying)
Componentes implementados do zero
| Componente | Descricao |
|---|---|
| Tokenizer BPE | Byte Pair Encoding treinado no corpus do dominio |
| Vision Encoder | Patch embedding (Conv2d 8x8) + CLS + self-attention |
| Audio Encoder | Mel spectrogram -> patch embedding + CLS + self-attention |
| Modality Embeddings | Embeddings aprendidos por modalidade (texto/imagem/audio) |
| RoPE | Rotary Position Embedding |
| RMSNorm | Root Mean Square normalization |
| SwiGLU | Gated activation function |
| MoE Router | Learned top-2 routing com load balancing loss |
| Weight Tying | Embedding e LM head compartilham pesos |
Benchmark (811 testes)
Benchmark com 811 testes variados em 3 modalidades. Inclui perguntas originais do treino, reformulacoes, perguntas novas fora do treino, edge cases e variacoes de prompt/temperatura para imagem e audio.
| Modalidade | Exemplos | Acuracia |
|---|---|---|
| Texto (QA) | 401 | 87.5% |
| - Originais (vistas no treino) | 50 | 100.0% |
| - Reformulados (mesma pergunta, palavras diferentes) | 101 | 70.3% |
| - Novos (fora do treino) | 100 | 89.0% |
| - Edge cases (ambiguos/curtos) | 50 | 88.0% |
| - Metodologia cientifica | 50 | 94.0% |
| - Cybersecurity | 50 | 100.0% |
| Imagem (Forma+Cor) | 250 | 76.8% |
| - Forma | 250 | 80.0% |
| - Cor | 250 | 86.8% |
| Audio (Tipo) | 160 | 87.5% |
| Score Composto | 811 | 84.8% |
Score composto = 50% texto + 25% imagem + 25% audio
Radar chart por categoria
Analise de generalizacao:
- Perguntas originais do treino: 100% (modelo memoriza perfeitamente)
- Reformulacoes da mesma pergunta: 70.3% (queda de ~30% mostra sensibilidade a formulacao)
- Perguntas totalmente novas: 89% (surpreendentemente bom para um modelo de 19.9M params com vocab de 1024)
- Imagem com variacoes de prompt/temp: 76.8% (formas simples OK, formas complexas como grade/triangulo confundem)
Nota: benchmark avalia no dominio sintetico de treinamento e variacoes proximo. Nao representa capacidade de generalizacao para dados reais ou dominios fora do escopo.
Demonstracao
Texto puro
Q: o que e mixture of experts?
A: mixture of experts e uma arquitetura onde o modelo tem multiplos
sub-redes especializadas chamadas experts. um router decide quais
experts ativar para cada entrada. isso permite escalar parametros
sem escalar proporcional o custo computacional.
Imagem -> Texto
[Circulo vermelho 64x64] -> "a imagem mostra um circulo vermelho no
centro. circulos sao usados em diagramas de redes neurais para
representar neuronios."
[Quadrado verde 64x64] -> "a imagem mostra um quadrado verde.
quadrados sao usados em diagramas de arquitetura para representar
blocos de processamento."
Audio -> Texto
[Tom grave (mel spectrogram)] -> "o audio contem um tom grave
constante. tons graves aparecem em sinais de alerta de sistemas
de monitoramento."
[Beep curto (mel spectrogram)] -> "o audio contem um beep curto.
beeps sao sinais comuns em interfaces de confirmacao de sistemas."
Uso rapido
Requisitos
torch>=2.0
Nenhuma outra dependencia.
Inferencia (texto)
import torch
from model import MultimodalMoELM
from tokenizer import BPETokenizer
device = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = BPETokenizer()
tokenizer.load("tokenizer_data")
checkpoint = torch.load("checkpoints/best_model.pt", map_location=device, weights_only=False)
model = MultimodalMoELM(checkpoint["config"]).to(device)
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
prompt = "aluno: o que e federated learning? orientador:"
ids = [2] + tokenizer.encode(prompt)
input_t = torch.tensor([ids], dtype=torch.long).to(device)
out = model.generate(input_t, max_new_tokens=80, temperature=0.7)
print(tokenizer.decode(out[0].tolist()))
Inferencia (imagem + texto)
# Imagem 64x64 RGB (valores 0-1)
image = torch.randn(1, 3, 64, 64).to(device)
prompt = "descreva a imagem:"
ids = [2] + tokenizer.encode(prompt)
input_t = torch.tensor([ids], dtype=torch.long).to(device)
out = model.generate(input_t, max_new_tokens=60, images=image)
print(tokenizer.decode(out[0].tolist()))
Inferencia (audio + texto)
# Mel spectrogram (n_mels=64, T_frames qualquer)
mel = torch.randn(1, 64, 128).to(device)
prompt = "descreva o audio:"
ids = [2] + tokenizer.encode(prompt)
input_t = torch.tensor([ids], dtype=torch.long).to(device)
out = model.generate(input_t, max_new_tokens=60, mel_specs=mel)
print(tokenizer.decode(out[0].tolist()))
Demo completo
python demo_multimodal.py
Treinamento
| Parametro | Valor |
|---|---|
| Hardware | NVIDIA RTX 3060 (12 GB VRAM) |
| Optimizer | AdamW (betas=0.9, 0.95) |
| Learning rate | 3e-4 + warmup 500 steps + cosine decay |
| Batch size | 32 |
| Precisao | Mixed (FP16 via AMP) |
| Gradient clipping | 1.0 |
| Dataset | 3.672 train / 408 val (texto + img + audio) |
| Steps | 2.000 |
| Tempo | ~45 min |
| Loss final (train) | 0.05 |
| Best Val Loss | 1.34 (step 500) |
Curvas de treinamento
| Grafico | Descricao |
|---|---|
| Loss | Train loss cai de 6.6 para 0.05. Val loss estabiliza em ~1.3 (best no step 500) |
| Perplexity | PPL cai de 734 para 1.0 (train). Val PPL estabiliza em ~3.7 |
| Learning Rate | Warmup linear ate step 500, depois cosine decay ate ~0 |
| MoE Aux Loss | Load balancing ~2.0 (estavel, experts bem distribuidos) |
Graficos individuais
Training & Validation Loss
Perplexity
Learning Rate Schedule
MoE Auxiliary Loss
Dataset sintetico multimodal
| Modalidade | Exemplos | Conteudo |
|---|---|---|
| Texto | 2.700 train | QA sobre IA/ML, metodologia, cybersecurity |
| Imagem | 540 train | Formas geometricas sinteticas + descricoes |
| Audio | 432 train | Mel spectrograms sinteticos + descricoes |
Imagens: geradas proceduralmente (circulos, quadrados, triangulos, grades) em 64x64 RGB. Audio: mel spectrograms sinteticos (tom grave, agudo, beep, ruido, sweep, pulso, silencio, crescendo).
Limitacoes
- Dataset sintetico e pequeno: formas geometricas basicas e audio procedural
- Vocabulario reduzido (1.024 tokens): termos fora do dominio viram
<unk> - Contexto curto (256 tokens): respostas truncadas
- Imagens 64x64: resolucao muito baixa para uso real
- Audio sintetico: nao processa fala real, apenas padroes de mel spectrogram
- Nao e um VLM/ALM de producao: e uma demonstracao da arquitetura multimodal MoE
Motivacao
Este modelo demonstra que e possivel construir um sistema multimodal completo do zero:
- Vision encoder com patch embedding (sem CLIP, sem ViT pre-treinado)
- Audio encoder com mel spectrogram patches (sem Whisper, sem wav2vec)
- Transformer decoder com Mixture-of-Experts
- Treinamento multimodal com loss unificada
Cada peca foi escrita na mao. Zero dependencias alem do PyTorch.
Sobre o autor
Delvek de Sousa — Engenheiro de IA, Especialista em Ciberseguranca, Pesquisador e CTO.
- Mestrado em Engenharia Eletrica (Computacao Aplicada) — UFPA
- Pesquisador no INCT IAmazonia e CCAD-IA
- CTO da Plim.AI
- Publicacoes em IA Neuro-Simbolica, RAG e IA aplicada
Links
Citacao
@misc{sousa2026researcherbot,
title = {ResearcherBot-1: Multimodal MoE Language Model para Pesquisa em IA},
author = {Sousa, Delvek},
year = {2026},
url = {https://huggingface.co/vsousadelvek/researcherbot-1},
note = {SLM multimodal com MoE treinado do zero em PyTorch}
}
Texto. Imagem. Audio. Tudo do zero.
19.9M params · MoE 8 experts · 3 modalidades · PyTorch puro · Apache-2.0