Vídeo em breve
Por enquanto, esta aula está disponível só em texto — o vídeo entra assim que ficar pronto.
Redes neurais e projeto
Redes neurais: do neurônio ao MLP
Como funciona um neurônio artificial, como camadas formam uma rede e como treinar um MLP com scikit-learn. · 18 min
As redes neurais estão por trás de reconhecimento de imagem, tradução automática e dos assistentes de IA. A ideia é bem mais simples do que a fama sugere: uma rede é um monte de contas pequenas encadeadas, e o “aprendizado” é ajustar os números dessas contas.
O neurônio artificial
Um neurônio recebe várias entradas, multiplica cada uma por um peso, soma tudo com um viés (bias) e passa o resultado por uma função de ativação, que decide a “força” da saída.
import numpy as np
def neuronio(entradas, pesos, vies):
soma = np.dot(entradas, pesos) + vies # soma ponderada
return 1 / (1 + np.exp(-soma)) # ativação sigmoide
saida = neuronio(np.array([0.5, 0.8]), np.array([0.4, -0.2]), 0.1)
print(saida) # cerca de 0.53
A sigmoide “espreme” qualquer número para o intervalo entre 0 e 1. Pesos positivos fazem a entrada empurrar a saída para cima, e pesos negativos para baixo. São os pesos e o viés que o treino ajusta.
Do neurônio à rede: camadas
Um neurônio sozinho só aprende relações simples. Empilhando neurônios em camadas, a rede aprende padrões complexos:
- Camada de entrada: recebe as features.
- Camadas ocultas: neurônios que combinam as entradas em padrões intermediários.
- Camada de saída: entrega a previsão.
Uma rede assim, com camadas totalmente conectadas, é um MLP (Multi-Layer Perceptron, ou perceptron multicamadas).
Como a rede aprende
O treino repete três passos, milhares de vezes:
- A rede faz uma previsão com os pesos atuais.
- Mede o erro entre a previsão e a resposta certa.
- Ajusta cada peso um pouquinho na direção que reduz o erro. Esse método é o gradiente descendente, e o cálculo de quanto ajustar cada peso se chama backpropagation.
Cada passada completa pelos dados é uma época. O tamanho de cada ajuste é a taxa de aprendizado (learning rate): pequena demais e o treino demora, grande demais e ele oscila sem convergir.
Treinando um MLP com scikit-learn
O scikit-learn tem um MLP pronto, que funciona bem para dados em tabela:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
X_treino, X_teste, y_treino, y_teste = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
modelo = make_pipeline(
StandardScaler(),
MLPClassifier(hidden_layer_sizes=(16, 8), max_iter=1000, random_state=42),
)
modelo.fit(X_treino, y_treino)
print(modelo.score(X_teste, y_teste))
hidden_layer_sizes=(16, 8) cria duas camadas ocultas, a primeira com 16
neurônios e a segunda com 8. max_iter limita o número de épocas.
Atenção
Redes neurais precisam de features padronizadas, por isso o
StandardScaler no pipeline. Sem ele, o treino fica lento ou nem
converge. Se aparecer um aviso ConvergenceWarning, aumente max_iter.
Dica
Para dados em tabela e conjuntos pequenos, modelos como árvores e KNN muitas vezes empatam com redes neurais, com bem menos trabalho. As redes brilham em imagens, áudio e texto, onde frameworks como PyTorch e TensorFlow entram. Isso fica para um curso futuro, mas os conceitos desta aula são exatamente os mesmos.
Exercícios
Exercício
1. Aquecimento. Mude os pesos e o viés da função neuronio e observe
como a saída muda. Encontre pesos que façam a saída ficar muito próxima
de 1 para a mesma entrada.
Exercício
2. Arquitetura. No dataset load_wine, treine MLPs com
hidden_layer_sizes de (4,), (16,) e (32, 16). Compare a acurácia
no teste. Uma rede maior é sempre melhor?
Exercício
3. Desafio. Escolha os pesos e o viés na mão para que um único
neurônio, com ativação de degrau (1 if soma > 0 else 0), se comporte
como a porta lógica E: saída 1 só quando as duas entradas são 1.
Teste as quatro combinações de entrada (0,0), (0,1), (1,0) e (1,1).