Implementação de um Perceptron do zero, sem frameworks de Machine Learning
Sobre • Motivação • Funcionalidades • Estrutura • Como Executar • Referências • Licença
Este projeto é uma implementação de um Perceptron em Rust, baseado nas aulas do canal Do Zero no YouTube, onde a implementação original é feita em C.
O objetivo principal é aprender os fundamentos de redes neurais construindo tudo do zero, sem depender de bibliotecas de Machine Learning como TensorFlow ou PyTorch. Aqui, optamos por reescrever o projeto em Rust para explorar as vantagens da linguagem em termos de segurança de memória e performance.
O perceptron implementado é capaz de aprender funções lineares com múltiplas entradas através do algoritmo de gradiente descendente:
- Inicialização: Pesos (um para cada entrada) e bias são inicializados com valores aleatórios
- Forward Pass: Calcula a saída do neurônio:
y = f(Σ(xᵢ × wᵢ) + bias) - Cálculo do Custo: Mede o erro usando MSE (Mean Squared Error)
- Cálculo do Gradiente: Usa diferenças finitas para aproximar a derivada parcial de cada parâmetro
- Atualização: Ajusta todos os pesos e o bias na direção que reduz o erro
Exemplo atual: O neurônio aprende a relação entre entradas e saídas a partir de um conjunto de dados de treinamento.
⚠️ Nota: Este é um projeto de estudo e não deve ser utilizado em produção. O foco está no aprendizado dos conceitos fundamentais de redes neurais artificiais.
- 📚 Aprendizado: Compreender os conceitos fundamentais de redes neurais na prática
- 🦀 Rust: Praticar a linguagem Rust em um contexto de Machine Learning
- 🔧 Do Zero: Implementar sem abstrações para entender "por baixo do capô"
- 🎥 Inspiração: Acompanhar e adaptar o conteúdo do canal Do Zero para Rust
- Estrutura básica do Neurônio (Perceptron)
- Suporte a múltiplas entradas (n conexões)
- Inicialização de pesos e bias aleatórios
- Funções de ativação (Identidade, Sigmoid)
- Computação de saída do neurônio
- Função de custo MSE (Mean Squared Error)
- Cálculo de gradiente por diferenças finitas
- Algoritmo de treinamento (Gradiente Descendente)
- Mais funções de ativação (ReLU, Tanh)
- Múltiplas camadas (MLP - Multi-Layer Perceptron)
perceptron/
├── Cargo.toml # Configuração do projeto e dependências
├── README.md # Documentação do projeto
└── src/
├── main.rs # Ponto de entrada e demonstração de treinamento
├── neuron.rs # Estrutura do neurônio e funções de inicialização
├── neuralnet.rs # Funções de treinamento e cálculo de custo
├── netmath.rs # Funções matemáticas (ativação, MSE)
└── utils.rs # Utilitários (geração de números aleatórios)
| Módulo | Descrição |
|---|---|
main.rs |
Ponto de entrada, define dados de treinamento e executa o loop de treinamento |
neuron.rs |
Define a estrutura Neuron e funções init_neuron() e compute_out() |
neuralnet.rs |
Implementa compute_cost(), compute_gradient() e train() |
netmath.rs |
Funções de ativação (ident, sigmoid) e custo (mse) |
utils.rs |
Função randomize() para gerar valores aleatórios |
| Componente | Módulo | Descrição |
|---|---|---|
Neuron |
neuron.rs |
Estrutura que representa um neurônio com pesos, bias e função de ativação |
init_neuron() |
neuron.rs |
Inicializa um neurônio com pesos e bias aleatórios |
compute_out() |
neuron.rs |
Calcula a saída do neurônio dado um vetor de entrada |
mse() |
netmath.rs |
Calcula o erro quadrático médio (Mean Squared Error) |
ident() |
netmath.rs |
Função de ativação identidade (f(x) = x) |
sigmoid() |
netmath.rs |
Função de ativação sigmoid (σ(x) = 1/(1 + e⁻ˣ)) |
compute_cost() |
neuralnet.rs |
Calcula o custo total do neurônio para um conjunto de amostras |
compute_gradient() |
neuralnet.rs |
Calcula o gradiente de um parâmetro usando diferenças finitas |
train() |
neuralnet.rs |
Treina o neurônio usando gradiente descendente |
randomize() |
utils.rs |
Gera valores aleatórios em um intervalo |
- Rust instalado (versão 1.70+)
- Cargo (gerenciador de pacotes do Rust)
# Clone o repositório
git clone https://github.com/strngrthnall/perceptron.git
# Entre no diretório
cd perceptron
# Compile o projeto
cargo build --release
# Execute
cargo runO programa treina um neurônio com 2 entradas para aprender a relação entre entradas e saídas:
***Antes do treinamento***
O custo do neurônio : 42.5 (valor varia conforme inicialização aleatória)
O valor do weight 1 : 0.42 (peso aleatório)
O valor do weight 2 : -0.31 (peso aleatório)
O valor do bias : -0.78 (bias aleatório)
***Depois do treinamento***
O custo do neurônio : ~0.01 (erro mínimo)
O valor do weight 1 : ~0.5 (peso ajustado)
O valor do weight 2 : ~0.1 (peso ajustado)
O valor do bias : ~0.8 (bias ajustado)
*** Testes ***
Entrada 1 5 - Saída ~3.2
Entrada 2 8 - Saída ~4.5
Entrada 4 6 - Saída ~5.0
Entrada 5 9 - Saída ~6.8
Entrada 9 8 - Saída ~8.2
Entrada 8 5 - Saída ~6.0
💡 Os valores iniciais são aleatórios, mas após 50.000 iterações de treinamento, o neurônio converge para parâmetros que minimizam o erro entre predições e valores esperados.
- 🎥 Canal Do Zero - YouTube
- Série de vídeos sobre implementação de redes neurais em C
- � Repositório Original (C) - GitHub
- Implementação original em C do canal Do Zero
- �📖 Documentação Rust - rust-lang.org
- 🧠 Perceptron - Wikipedia
| Tecnologia | Versão | Uso |
|---|---|---|
| Rust | 2024 Edition | Linguagem principal |
| rand | 0.8 | Geração de números aleatórios |
| num | 0.4.3 | Operações matemáticas |
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Contribuições são bem-vindas! Este é um projeto de estudo, então sinta-se à vontade para:
- Fazer um Fork do projeto
- Criar uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abrir um Pull Request
Feito com ❤️ para fins educacionais
Inspirado nas aulas do canal Do Zero