Objetivo: tornar experimentos confiáveis, comparáveis e seguros
Em Deep Learning moderno, pequenas diferenças de execução (ordem de leitura dos dados, paralelismo, versões de bibliotecas, seeds, mudanças silenciosas no dataset) podem gerar variações reais nos resultados. Este capítulo organiza boas práticas como um checklist técnico, com justificativa, passos práticos e exemplos do que pode dar errado quando a prática é ignorada.
Checklist 1 — Reprodutibilidade (mesmo código, mesmo resultado dentro do esperado)
1. Fixar sementes aleatórias (e registrar quais foram usadas)
Conceito: Treino envolve aleatoriedade (inicialização, embaralhamento, dropout, augmentations, amostragem). Fixar seeds reduz variância e permite depurar mudanças reais.
Passo a passo prático:
- Defina uma seed global por experimento (ex.: 42) e registre-a no log.
- Fixe seeds de: linguagem (Python), NumPy, framework (PyTorch/TensorFlow) e do dataloader.
- Quando usar GPU, configure determinismo quando possível (ciente de custo/perda de performance).
- Se usar múltiplas GPUs/processos, garanta seeds por worker.
# Exemplo conceitual (PyTorch) — adapte ao seu projeto/versão
import os, random
import numpy as np
import torch
seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
# Determinismo (pode reduzir desempenho)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
# Para DataLoader, use generator e worker_init_fn
O que pode dar errado sem isso: você “melhora” 0,7% de acurácia e não sabe se foi mudança real ou sorte; um bug aparece e desaparece; uma regressão de performance passa despercebida.
2. Registrar configurações completas (hyperparams + ambiente)
Conceito: Reproduzir exige saber exatamente “o que foi rodado”: arquitetura, hiperparâmetros, pré-processamento, critérios de parada, versões de libs, GPU/driver.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Passo a passo prático:
- Salve um arquivo de configuração por execução (YAML/JSON) com: hiperparâmetros, caminhos/IDs de dados, transforms, seed, métricas, critérios de early stop, número de épocas, batch size, scheduler, etc.
- Logue o ambiente: versão do framework, CUDA/cuDNN, driver, tipo de GPU, commit do código.
- Salve também o “config efetivo” após merges de defaults/overrides (evita divergência entre o que você acha e o que rodou).
{
"run_id": "2026-01-25_15-30-12",
"seed": 42,
"model": {"name": "transformer_small", "d_model": 512, "layers": 6},
"train": {"batch_size": 64, "lr": 3e-4, "epochs": 30, "mixed_precision": true},
"data": {"dataset_version": "v3.1", "split": "split_2026_01", "preprocess_hash": "a91f..."},
"env": {"torch": "2.2.0", "cuda": "12.1", "gpu": "A100"}
}O que pode dar errado sem isso: você não consegue repetir um resultado publicado internamente; compara runs com preprocessamentos diferentes sem perceber; um “hotfix” muda o comportamento e ninguém sabe qual run usou qual versão.
3. Controle de versão de dados (e dos splits)
Conceito: Em ML, dados são parte do “código”. Mudanças pequenas no dataset ou nos splits alteram métricas e podem invalidar comparações.
Passo a passo prático:
- Versione o dataset (ID/semver) e registre no log.
- Versione os splits (train/val/test) como arquivos imutáveis (lista de IDs) ou hashes.
- Registre estatísticas do dataset por versão (contagens, classes, médias, tamanho, taxa de missing).
- Garanta que o conjunto de teste seja estável e protegido contra vazamento.
O que pode dar errado sem isso: “melhora” de métrica vem de mudança no teste; vazamento de dados por re-split; drift silencioso (ex.: remoção de exemplos difíceis) inflando resultados.
4. Versionamento de código e rastreabilidade do artefato
Conceito: O modelo treinado deve apontar para o código e dados que o geraram.
Passo a passo prático:
- Associe cada run a um commit hash do repositório.
- Salve checkpoints com metadados: commit, config, dataset_version, métricas, data/hora.
- Evite treinar em “working tree suja” (mudanças locais não commitadas) ou registre um diff.
O que pode dar errado sem isso: um checkpoint “bom” não pode ser refeito; auditoria falha; você não sabe qual alteração causou regressão.
Checklist 2 — Sanidade experimental (garantir que o pipeline faz sentido)
5. Baseline simples obrigatório (antes do modelo grande)
Conceito: Um baseline simples (heurística, regressão logística, modelo pequeno) valida se o problema é aprendível e se o pipeline está correto.
Passo a passo prático:
- Defina um baseline “barato” com poucas suposições.
- Compare com o modelo profundo: se o deep não supera o baseline, investigue dados, labels, features, vazamento, bugs.
- Use o baseline para estimar “ganho marginal” vs custo.
O que pode dar errado sem isso: você gasta dias treinando um modelo caro para descobrir que labels estão invertidas, que a métrica está errada ou que o dataset não contém sinal suficiente.
6. Teste com dados embaralhados (labels ou entradas)
Conceito: Se você embaralha os rótulos e o modelo ainda “aprende” (métrica alta), há vazamento ou bug de avaliação.
Passo a passo prático:
- Crie uma cópia do treino com labels embaralhados.
- Treine por poucas épocas: a performance em validação deve cair para o nível aleatório.
- Opcional: embaralhe as entradas mantendo labels para detectar dependência de artefatos.
O que pode dar errado sem isso: vazamento por features que codificam o label (ex.: nome do arquivo, timestamp, ID); avaliação usando dados de treino por engano; normalização calculada com dados de teste.
7. Overfit em um mini-lote (teste de capacidade + pipeline)
Conceito: Um modelo razoável deve conseguir overfitar um conjunto minúsculo (ex.: 32 exemplos). Se não consegue, há bug em loss, labels, arquitetura, taxa de aprendizado, ou no fluxo de dados.
Passo a passo prático:
- Selecione um pequeno subconjunto fixo do treino.
- Desative augmentations estocásticas e regularizações fortes (temporariamente).
- Treine até a loss ir quase a zero nesse subset.
O que pode dar errado sem isso: você ajusta hiperparâmetros por dias quando o problema é um bug (labels desalinhadas, shape errado, máscara incorreta, loss mal definida).
8. Checagens de distribuição e invariantes do dataset
Conceito: Mudanças de distribuição e inconsistências (ex.: classes faltando, escalas diferentes) quebram comparabilidade e podem causar “melhoras” falsas.
Passo a passo prático:
- Valide contagens por classe e por split.
- Verifique ranges/estatísticas (min, max, média, desvio) por feature/canal.
- Procure duplicatas entre treino e teste (hash/perceptual hash em imagens; IDs em texto).
O que pode dar errado sem isso: o modelo “memoriza” duplicatas; o teste fica mais fácil; normalização errada causa instabilidade e queda de performance em produção.
Checklist 3 — Monitoramento de overfitting e qualidade de generalização
9. Monitorar curvas e métricas certas (e não só a métrica final)
Conceito: Overfitting e instabilidade aparecem no comportamento ao longo do treino: divergência entre treino/val, oscilação, plateau.
Passo a passo prático:
- Logue por época/step: loss de treino, loss de validação, métrica principal e métricas auxiliares (ex.: precisão/recall, AUC, perplexidade).
- Guarde checkpoints por “melhor validação” e por “última época”.
- Se possível, avalie em múltiplos seeds e reporte média ± desvio.
O que pode dar errado sem isso: você escolhe um checkpoint ruim; confunde melhora temporária com tendência; não detecta colapso de treinamento ou degradação após certo ponto.
10. Critérios de parada seguros (quando encerrar sem perder o melhor modelo)
Conceito: Encerrar cedo economiza custo e reduz risco de overfitting, mas precisa ser feito com regras claras para não “matar” runs promissoras por ruído.
Passo a passo prático:
- Defina um orçamento (tempo, steps, custo) e um critério de early stopping com
patienceemin_delta. - Use “melhor checkpoint” baseado em validação, não em treino.
- Adote “parada por não-aprendizado”: se a loss não cai após N steps iniciais, revise LR, batch, dados.
- Para buscas de hiperparâmetros, use pruning/encerramento de runs claramente inferiores (com cuidado para não enviesar).
| Sinal observado | Ação segura | Risco se ignorar |
|---|---|---|
| Validação piora por várias épocas, treino melhora | Parar e manter melhor checkpoint | Overfitting e desperdício de GPU |
| Loss/gradientes explodem | Abortar run, salvar logs, reduzir LR/ajustar estabilidade | Horas perdidas e checkpoints inúteis |
| Métrica estagna cedo | Encerrar e testar hipótese (dados, LR, batch, arquitetura) | “Tuning” cego sem retorno |
Checklist 4 — Eficiência: precisão vs custo computacional (trade-offs práticos)
11. Batch size: custo, estabilidade e generalização
Conceito: Batch size afeta uso de memória, throughput e dinâmica do gradiente. Batches maiores tendem a ser mais eficientes em GPU, mas podem exigir ajuste de learning rate e podem alterar generalização.
Passo a passo prático:
- Comece com um batch que caiba confortavelmente na GPU (com margem para picos).
- Se aumentar batch, ajuste LR de forma controlada (ex.: teste em pequena grade) e monitore validação.
- Use gradient accumulation para simular batch grande quando a memória é limitada.
O que pode dar errado sem isso: OOM (out of memory), instabilidade por LR inadequado, comparação injusta entre runs (um run com batch maior pode parecer melhor/pior por dinâmica diferente, não por arquitetura).
12. Mixed precision (conceitual): quando usar e como não se enganar
Conceito: Mixed precision usa formatos numéricos menores (ex.: FP16/BF16) em partes do treino para acelerar e reduzir memória, mantendo estabilidade com técnicas como loss scaling.
Passo a passo prático:
- Ative mixed precision e compare: tempo/época, uso de memória, métricas finais.
- Monitore sinais de instabilidade numérica (NaNs, infs, loss errática).
- Se houver instabilidade, teste BF16 (quando disponível) ou ajuste loss scaling/otimizador.
O que pode dar errado sem isso: ganhos de velocidade vêm com degradação silenciosa de qualidade; NaNs aparecem tarde e invalidam o run; comparações ficam injustas se um run usa precisão diferente sem registro.
13. Medir eficiência corretamente (não só “épocas”)
Conceito: “30 épocas” não é uma unidade universal: datasets, batch e hardware mudam. Métricas de eficiência devem refletir custo real.
Passo a passo prático:
- Registre: tempo total, tempo por step, tokens/imagens por segundo, consumo de memória, custo estimado.
- Compare modelos por “qualidade por custo” (ex.: métrica vs horas de GPU).
O que pode dar errado sem isso: você escolhe um modelo 0,2% melhor que custa 5× mais; não percebe gargalo no dataloader; otimiza arquitetura quando o problema é I/O.
Checklist 5 — Segurança de resultados (evitar autoengano e vazamentos)
14. Separação rígida entre treino/val/test e prevenção de vazamento
Conceito: Qualquer informação do teste influenciando decisões de modelagem invalida a estimativa de generalização.
Passo a passo prático:
- Use validação para seleção de hiperparâmetros e teste apenas para avaliação final.
- Congele o teste (imutável) e restrinja acesso/execuções.
- Garanta que normalizações/estatísticas sejam calculadas apenas no treino (e aplicadas nos demais splits).
O que pode dar errado sem isso: “otimização no teste” (test set overfitting); métricas infladas; falha ao ir para produção.
15. Repetições e intervalos (quando a variância importa)
Conceito: Um único run pode ser enganoso. Reportar média e variância (ou ao menos múltiplas seeds) aumenta confiança.
Passo a passo prático:
- Para mudanças pequenas (ex.: +0,3%), rode 3–5 seeds e reporte média ± desvio.
- Use o mesmo conjunto de seeds para comparar abordagens (reduz ruído).
O que pode dar errado sem isso: você “persegue ruído” e escolhe uma configuração que só foi sorte; regressões passam como flutuação normal.
16. Checklist de auditoria antes de declarar um resultado
Conceito: Um resultado “pronto para ser usado” precisa passar por verificações mínimas de consistência.
- Config registrada? (inclui seed, versões, dataset_version, splits)
- Sanity checks passaram? (baseline simples, labels embaralhados, overfit mini-lote)
- Sem vazamento? (splits imutáveis, normalização no treino)
- Melhor checkpoint salvo? (critério claro)
- Repetição por seeds? (se ganho é pequeno)
- Custo medido? (tempo, memória, throughput)
O que pode dar errado sem isso: publicar internamente um número que não se sustenta; escolher um modelo caro sem necessidade; não conseguir explicar divergências em produção.