Deep Learning
Notes: These are personal class notes, not necessarily cohesive, not necessarily structured, and β most importantly β not necessarily accurate! Please check the sources, and feel free to point out any errors via email!
Referencia: Bishop, D2L e MIT conforme a lista de aulas.
01. Introduction
Deep learning aprende representacoes em camadas:
A ideia central e ajustar parametros para minimizar uma perda:
Notas rapidas:
- Dados viram tensores.
- O modelo produz predicoes.
- A loss mede o erro.
- O otimizador altera os pesos para reduzir a loss.
- Generalizar significa ir bem em dados nao vistos, nao apenas memorizar treino.
import torch
x = torch.randn(32, 10) # batch com 32 exemplos e 10 atributos
y = torch.randint(0, 3, (32,))
print(x.shape, y.shape)02. Basics on Neural Networks
Um neuronio combina entrada, pesos e vies:
Depois aplica uma ativacao nao linear:
Sem nao linearidade, varias camadas viram apenas uma transformacao linear.
MLP:
Para classificacao multiclasse, usamos softmax:
Cross-entropy:
import torch
from torch import nn
model = nn.Sequential(
nn.Linear(10, 64),
nn.ReLU(),
nn.Linear(64, 3)
)
x = torch.randn(32, 10)
y = torch.randint(0, 3, (32,))
logits = model(x)
loss = nn.CrossEntropyLoss()(logits, y)
loss.backward()
print(loss.item())03. Convolutional Neural Networks + CNN Architectures
CNNs exploram estrutura espacial. Em vez de conectar tudo com tudo, filtros pequenos percorrem a imagem.
Convolucao 2D simplificada:
Intuicao:
- Filtros aprendem detectores locais: bordas, texturas, partes.
- O mesmo filtro e reutilizado em varias posicoes: compartilhamento de pesos.
- Isso reduz parametros e cria equivariancia a translacao.
Tamanho da saida em uma dimensao:
onde e entrada, padding, kernel e stride.
import torch
from torch import nn
cnn = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1, 1)),
nn.Flatten(),
nn.Linear(32, 10)
)
x = torch.randn(8, 3, 64, 64)
logits = cnn(x)
print(logits.shape) # torch.Size([8, 10])Arquiteturas importantes:
- LeNet: CNN classica pequena para digitos.
- AlexNet: ReLU, GPU, dropout; marco em ImageNet.
- VGG: muitos filtros , arquitetura simples e profunda.
- Inception/GoogLeNet: varios tamanhos de filtro em paralelo.
- ResNet: conexoes residuais facilitam redes muito profundas.
Bloco residual:
import torch
from torch import nn
class ResidualBlock(nn.Module):
def __init__(self, channels):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(channels, channels, 3, padding=1),
nn.BatchNorm2d(channels),
nn.ReLU(),
nn.Conv2d(channels, channels, 3, padding=1),
nn.BatchNorm2d(channels),
)
self.act = nn.ReLU()
def forward(self, x):
return self.act(self.net(x) + x)04. Training
Treinar e repetir:
- forward: calcular
- loss: medir
- backward: calcular gradientes
- update: alterar pesos
Atualizacao basica por gradiente descendente:
Mini-batch SGD aproxima o gradiente usando poucos exemplos:
Pontos praticos:
- Normalizar entradas ajuda a estabilizar treino.
- Inicializacao ruim pode matar gradientes.
- BatchNorm reduz sensibilidade a escala interna.
- Learning rate costuma importar mais que pequenos detalhes do modelo.
import torch
from torch import nn
model = nn.Sequential(nn.Linear(10, 64), nn.ReLU(), nn.Linear(64, 3))
opt = torch.optim.SGD(model.parameters(), lr=0.1)
loss_fn = nn.CrossEntropyLoss()
for step in range(100):
x = torch.randn(32, 10)
y = torch.randint(0, 3, (32,))
opt.zero_grad()
logits = model(x)
loss = loss_fn(logits, y)
loss.backward()
opt.step()05. Optimization & Generalization
Otimizacao pergunta: como reduzir a loss de treino?
Generalizacao pergunta: o modelo aprendeu padroes ou decorou?
Momentum suaviza atualizacoes:
Adam combina media de gradientes e de gradientes ao quadrado:
Regularizacao L2:
Dropout:
import torch
from torch import nn
model = nn.Sequential(
nn.Linear(100, 256),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(256, 10)
)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=50)Checklist mental:
- loss de treino alta: underfitting, modelo fraco, LR ruim ou poucos epochs.
- treino bom e validacao ruim: overfitting.
- treino instavel: LR alto, dados mal escalados, batch pequeno ou inicializacao ruim.
- validacao melhorando: continue.
- validacao parou de melhorar: early stopping ou reduzir LR.
06. Semantic Segmentation
Segmentacao semantica classifica cada pixel.
Entrada:
Saida:
onde e o numero de classes. Cada pixel recebe uma distribuicao sobre classes.
Loss por pixel:
IoU para uma classe:
Dice:
Arquiteturas comuns:
- FCN: troca camadas densas por convolucoes e gera mapa denso.
- U-Net: encoder comprime contexto, decoder recupera resolucao, skips preservam detalhe.
- DeepLab: convolucoes dilatadas aumentam campo receptivo sem perder tanta resolucao.
import torch
from torch import nn
class TinyUNet(nn.Module):
def __init__(self, classes):
super().__init__()
self.enc = nn.Sequential(
nn.Conv2d(3, 16, 3, padding=1),
nn.ReLU(),
nn.Conv2d(16, 16, 3, padding=1),
nn.ReLU(),
)
self.pool = nn.MaxPool2d(2)
self.dec = nn.Sequential(
nn.ConvTranspose2d(16, 16, 2, stride=2),
nn.ReLU(),
nn.Conv2d(16, classes, 1)
)
def forward(self, x):
h = self.enc(x)
z = self.pool(h)
return self.dec(z)
model = TinyUNet(classes=4)
x = torch.randn(2, 3, 128, 128)
y = torch.randint(0, 4, (2, 128, 128))
logits = model(x)
loss = nn.CrossEntropyLoss()(logits, y)
print(logits.shape, loss.item())Resumo final
Deep learning e a composicao de funcoes parametrizadas. Redes densas aprendem relacoes globais; CNNs exploram localidade e compartilhamento de pesos; treinamento ajusta parametros via gradientes; otimizacao busca reduzir a loss; generalizacao exige controlar overfitting; segmentacao leva classificacao do nivel da imagem para o nivel do pixel.