Loading repository data…
Loading repository data…
JoaoHenriqueBarbosa / repository
Sistema educacional interativo para aprender sobre Perceptrons (redes neurais simples) através de experimentação prática. Desenhe padrões, treine modelos e descubra as limitações de classificadores lineares.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Sistema educacional progressivo de redes neurais, desde perceptrons simples até MLPs com Human-in-the-Loop (HITL).
Este projeto é uma jornada educacional completa através da evolução das redes neurais, implementada do zero com foco em compreensão e interatividade. Cada etapa do projeto representa um marco histórico na evolução das redes neurais.
Baseado no Perceptron de Rosenblatt
single-layer-perceptron/
O que foi implementado:
Limitações:
Exemplo de uso:
cd single-layer-perceptron/backend
./run.sh
Aprendizado:
Baseado em Rumelhart, Hinton e Williams
multi-layer-network/
O que foi implementado:
Arquitetura:
# Exemplo: 256 → 64 → 32 → 2
MLP(layer_sizes=[256, 64, 32, 2], learning_rate=0.3)
Melhorias sobre Single-Layer:
Dataset Balanceado:
Técnicas de Data Augmentation:
# Gera variações deslocando padrão pixel-by-pixel
# T de 5×5 → 144 posições (12×12 grid)
# T de 3×3 → 196 posições (14×14 grid)
# T de 7×7 → 100 posições (10×10 grid)
Baseado em RLHF (ChatGPT) e Active Learning
multi-layer-network-with-human-enforcement/
O que foi implementado:
Sistema pede feedback quando incerto (entropia > 30%)
def predict_with_uncertainty(self, X):
# Calcula entropia da distribuição de probabilidades
entropy = -Σ(p * log(p))
uncertainty = entropy / max_entropy
if uncertainty > threshold:
return "PEDIR FEEDBACK HUMANO"
Quando pedir feedback:
Ajusta pesos instantaneamente com correção humana
def learn_from_feedback(self, X, correct_label):
# 1. Forward propagation
prediction = self.predict(X)
# 2. Backpropagation com label correto
gradients = self.backprop(X, correct_label)
# 3. Update com learning rate MAIOR (0.5)
self.weights -= 0.5 * gradients
# 4. Salvar modelo atualizado
self.save_model()
Diferença do treinamento normal:
Sistema monitora evolução com feedback humano
# Estatísticas armazenadas
{
'total_feedback': 45,
'improvements': 38,
'improvement_rate': 0.844, # 84.4% das correções melhoraram
'feedback_by_label': {
'T': 22,
'No-T': 23
}
}
Interface Visual:
Backend:
Python 3.12
├── FastAPI (API REST)
├── NumPy (Computação numérica)
├── SQLite (Persistência)
└── Uvicorn (Servidor ASGI)
Frontend:
React 18 + TypeScript
├── Vite (Build tool)
├── TanStack Router (Roteamento)
└── CSS Modules (Estilização)
perceptrons/
│
├── single-layer-perceptron/
│ ├── backend/
│ │ ├── perceptron.py # Perceptron simples
│ │ ├── multi_perceptron.py # Codificação binária
│ │ ├── main.py # API FastAPI
│ │ └── patterns.db # Dataset
│ └── frontend/
│ └── src/
│ ├── pages/
│ │ ├── Dataset.tsx # Criar padrões
│ │ ├── Training.tsx # Treinar modelo
│ │ └── Test.tsx # Testar modelo
│ └── App.tsx
│
├── multi-layer-network/
│ ├── backend/
│ │ ├── mlp.py # MLP com backprop
│ │ ├── main.py # API REST
│ │ ├── patterns.db # Dataset balanceado (882)
│ │ ├── generate_variations.py # Data augmentation
│ │ ├── build_balanced_dataset.py
│ │ └── models/ # Modelos treinados
│ └── frontend/
│ └── src/
│ └── pages/
│ ├── Training.tsx # Config hiperparâmetros
│ └── Test.tsx
│
└── multi-layer-network-with-human-enforcement/
├── backend/
│ ├── mlp.py # MLP base
│ ├── mlp_hitl.py # MLP + HITL ⭐
│ ├── main.py # API com endpoints HITL
│ └── patterns.db # Dataset + feedback
└── frontend/
└── src/
└── pages/
└── TestHITL.tsx # Interface HITL ⭐
# Python 3.12+
python3 --version
# Node.js 18+
node --version
1. Clone o repositório:
git clone https://github.com/seu-usuario/perceptrons.git
cd perceptrons
2. Escolha qual versão rodar:
# Backend
cd single-layer-perceptron/backend
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
./run.sh # ou: uvicorn main:app --reload
# Frontend (novo terminal)
cd ../frontend
npm install
npm run dev
# Backend
cd multi-layer-network/backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
./run.sh
# Frontend
cd ../frontend
npm install
npm run dev
# Backend
cd multi-layer-network-with-human-enforcement/backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
./run.sh
# Frontend
cd ../frontend
npm install
npm run dev
3. Acesse:
Passo a passo:
Dataset (/dataset)
Training (/training)
Test (/test)
Dataset Balanceado (já incluído):
Treinamento:
# Hiperparâmetros recomendados
{
"hidden_layers": [64, 32], # 256→64→32→2
"learning_rate": 0.3, # LR alto converge rápido
"batch_size": 16, # Mini-batch
"epochs": 300 # Early stopping ativo
}
Resultados esperados:
Workflow:
Treinar modelo base (/training)
Testar com HITL (/test-hitl)
Fornecer Feedback
Métricas HITL:
{
"total_feedback": 50,
"improvements": 42,
"improvement_rate": 0.84, // 84% melhoraram
"feedback_by_label": {
"T": 25,
"No-T": 25
}
}
# Para cada exemplo (x, y):
prediction = sign(w·x + b)
if prediction != y:
w = w + η * y * x
b = b + η * y
# Forward pass
for layer in layers:
z = W @ a + b
a = sigmoid(z)
# Backward pass
δ_L = (a_L - y) ⊙ σ'(z_L)
for layer in reversed(layers):
∇W = a^T @ δ / m
∇b = sum(δ) / m
δ = (δ @ W^T) ⊙ σ'(a)
# Update
W = W - η * ∇W
b = b - η * ∇b
# Entropy-based uncertainty
H(p) = -Σ p_i * log(p_i)
uncertainty = H(p) / log(K) # Normalizado
if uncertainty > threshold:
request_human_feedback()
# Recebe correção humana
correct_label = human_input()
# Backprop com label correto
loss = cross_entropy(prediction, correct_label)
gradients = backward(loss)
# Update com LR maior
weights -= 0.5 * gradients # vs 0.1 normal
save_model()
| Técnica | Implementação | Benefício |
|---|---|---|
| Xavier Init | w ~ U[-√(6/(n_in+n_out)), +√(6/(n_in+n_out))] | Evita vanishing/exploding gradients |
| Gradient Clipping | if ‖∇w‖ > 5: ∇w = ∇w * (5/‖∇w‖) | Estabiliza treinamento |
| Early Stopping | Para se val_loss não melhora por 50 épocas | Previne overfitting |
| Mini-batch | Batch size 16-32 | Balança velocidade e estabilidade |
# Gera variações deslocando padrão
def generate_variations(pattern):
for row in range(max_positions_y):
for col in range(max_positions_x):
if (row, col) != original_position:
yield shift_pattern(pattern, row, col)
# Exemplo: T de 5×5
# Grid 16×16 permite posições: (16-5+1) × (16-5+1) = 12×12 = 144
# Menos posição original = 143 variações
Problema: Classificar "T" vs "No-T"
| Métrica | Valor |
|---|---|
| Dataset | 62 exemplos (manual) |
| Acurácia | ~70-80% |
| Limitação | Aprende apenas 1 feature (ex: "pixels no topo") |
Conclusão: Insuficiente para padrões complexos.
Mesmo problema com dataset balanceado
| Métrica | Valor |
|---|---|
| Dataset | 882 exemplos (balanceado 50/50) |
| Arquitetura | 256→64→32→2 |
| Acurácia | 95-100% ✅ |
| Loss final | 0.015-0.050 |
| Épocas | ~100-200 (early |