Coleta e Pré-Processamento de Dados
Deslize para mostrar o menu
O treinamento de modelos generativos exige não apenas boas arquiteturas e funções de perda, mas também dados limpos, bem estruturados e diversificados. Esta seção apresenta conjuntos de dados de alta qualidade nos domínios de visão, texto e áudio, fornece técnicas detalhadas de pré-processamento adequadas para pipelines generativos modernos e discute estratégias robustas de divisão de dados com ferramentas práticas.
Coleta de Dados
A coleta de dados para modelagem generativa depende do domínio, da disponibilidade das fontes, da escala e das licenças. Para dados de texto e visão computacional, fontes comuns incluem conjuntos de dados abertos, conteúdo extraído da web e repositórios estruturados (por exemplo, arquivos acadêmicos, redes sociais ou plataformas de comércio eletrônico).
Técnicas de Web Scraping
Quando conjuntos de dados não estão prontamente disponíveis, os dados podem ser coletados da web utilizando ferramentas de scraping. O web scraping permite extrair informações de páginas HTML de forma programática. É uma abordagem poderosa para coletar dados do mundo real e não estruturados quando APIs não estão disponíveis. No entanto, o scraping envolve responsabilidades técnicas e éticas.
Os métodos de scraping geralmente envolvem:
- Envio de requisições HTTP para recuperar páginas web. Isso possibilita o acesso ao conteúdo HTML bruto de uma página;
- Análise do conteúdo HTML para extrair dados estruturados. Ferramentas como BeautifulSoup convertem HTML não estruturado em tags e elementos acessíveis;
- Navegação em páginas dinâmicas usando automação de navegador. Sites com uso intenso de JavaScript exigem ferramentas como Selenium para renderizar completamente o conteúdo;
- Armazenamento dos dados extraídos em formatos utilizáveis como CSV ou JSON. Isso garante compatibilidade com etapas posteriores de pré-processamento e treinamento de modelos.
Abaixo estão duas estratégias comuns de scraping:
Extração de Texto com BeautifulSoup
BeautifulSoup é uma biblioteca Python utilizada para analisar páginas HTML estáticas.
1234567891011import requests from bs4 import BeautifulSoup url = "https://docs.python.org/3/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # Extract paragraphs paragraphs = [p.text for p in soup.find_all('p')] text = "\n".join(paragraphs) print(text)
Raspagem de imagens com Selenium
Selenium automatiza um navegador para coletar conteúdo de páginas renderizadas com JavaScript.
123456789101112131415161718# INSTALL SELENIUM # THIS CODE DOWNLOAD IMAGES (I NEED JUST VIZUALIZATION) from selenium import webdriver import time import urllib.request url = "https://example.com/gallery" driver = webdriver.Chrome() driver.get(url) time.sleep(2) images = driver.find_elements("tag name", "img") for idx, img in enumerate(images): src = img.get_attribute('src') if src: urllib.request.urlretrieve(src, f"image_{idx}.jpg") driver.quit()
Sempre revise os termos de serviço de um site antes de realizar scraping. Utilize taxas de requisição educadas e respeite o arquivo robots.txt. Scraping inadequado pode resultar em banimento de IP ou consequências legais.
Em contextos de GenAI, o web scraping é frequentemente um passo inicial para a construção de conjuntos de dados de pré-treinamento, especialmente para domínios específicos ou idiomas com poucos recursos. Ferramentas como Scrapy, playwright ou APIs browserless também são amplamente utilizadas para tarefas em larga escala.
Técnicas de Pré-processamento
O pré-processamento de dados deve ser adaptado à modalidade, ao tipo de modelo e às restrições de qualidade. Para modelagem generativa em nível de produção, os pipelines geralmente incluem transformações específicas do domínio, adaptação de resolução e filtragem baseada em conteúdo.
Pré-processamento de imagens
- Redimensionamento: ajustar a resolução do conjunto de dados à entrada do modelo (por exemplo, 64x64 para GANs iniciais, 512x512 para modelos de difusão);
from PIL import Image
img = Image.open("example.jpg")
resized = img.resize((256, 256))
resized.save("resized.jpg")
- Normalização: escala os valores dos pixels para um intervalo padrão, tipicamente [−1, 1] ou [0, 1];
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5]*3, std=[0.5]*3) # RGB to [-1, 1]
])
- Manipulação do Espaço de Cor: garante a consistência das cores — converte para RGB ou escala de cinza. Para geração condicional, mantém canais alfa se presentes;
from PIL import Image
img = Image.open("example.png").convert("RGB")
img.save("rgb_image.jpg")
- Aumento de dados: introduz variação durante o treinamento por meio de transformações.
import albumentations as A
from albumentations.pytorch import ToTensorV2
transform = A.Compose([
A.RandomResizedCrop(256, 256),
A.HorizontalFlip(),
A.ColorJitter(),
A.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)),
ToTensorV2(),
])
Pré-processamento de Texto
- Limpeza: remove caracteres especiais, espaços em branco extras e ruídos;
12345import re text = "Example text — with symbols!" cleaned = re.sub(r"[^\w\s]", "", text) cleaned = re.sub(r"\s+", " ", cleaned).strip() print(cleaned)
-
r"[^\w\s]":\w: corresponde a qualquer caractere alfanumérico (letras A-Z, a-z, dígitos 0-9) e sublinhado_;\s: corresponde a qualquer caractere de espaço em branco (espaços, tabulações, quebras de linha);[^...]: uma classe de caracteres negada—corresponde a qualquer coisa que não esteja listada dentro;- Significado: esse padrão corresponde a todos os caracteres exceto letras, dígitos, sublinhados e espaços em branco. Portanto, remove pontuação e símbolos (como
—,!, etc.).
-
r"\s+":\s: corresponde a qualquer caractere de espaço em branco;+: corresponde a um ou mais do token anterior;- Significado: isso substitui múltiplos espaços em branco consecutivos por um único espaço.
-
.strip(): remove espaços em branco no início e no final da string limpa.
Para mais informações sobre a sintaxe de RegEx, consulte a documentação.
- Conversão para minúsculas: padronização do texto para minúsculas visando consistência. Aplicação seletiva, pois modelos como BERT podem ser sensíveis a maiúsculas/minúsculas;
12text = "This Is A Sentence." print(text.lower())
- Tokenização: divisão do texto em tokens ou subpalavras para modelagem;
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") encodings = tokenizer(["Example text."], padding="max_length", truncation=True, max_length=128, return_tensors="pt")
- Stemming/Lematização: raro em pipelines de deep learning, mas utilizado em PLN tradicional ou filtros de pré-treinamento;
1234from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
- Preenchimento/Truncamento: veja o exemplo acima com
max_length.
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") inputs = tokenizer("Short text.", max_length=10, padding="max_length", truncation=True, return_tensors="pt")
Construção de pipelines modulares de pré-processamento com foco em reprodutibilidade. Utilização de DVC, wandb artifacts ou huggingface/datasets com streaming + cache.
Estratégias de Divisão de Dados
Dividir os dados de forma eficaz é essencial para a generalização, especialmente em modelagem generativa, onde o overfitting a modos ou memorização é comum.
Divisão Treinamento/Validação/Teste
- Proporções convencionais: 80/10/10 ou 70/15/15 dependendo do tamanho do conjunto de dados;
- Divisão sensível ao conteúdo: estratificar divisões por classe (visão), tópico (texto).
- Caso de uso:
- Treinamento: direciona a otimização do modelo;
- Validação: orienta checkpointing, early stopping e ajuste de métricas (por exemplo, FID);
- Teste: totalmente reservado até a avaliação final do modelo.
Exemplo usando train_test_split:
from sklearn.model_selection import train_test_split
# Example: splitting an image dataset (paths or features)
train_paths, val_paths = train_test_split(image_paths, test_size=0.1, random_state=42)
train_paths, test_paths = train_test_split(train_paths, test_size=0.111, random_state=42) # 0.111 to get ~10% test
Para Datasets do Hugging Face:
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
split_dataset = dataset["train"].train_test_split(test_size=0.2, seed=42)
train_val = split_dataset["train"].train_test_split(test_size=0.1, seed=42)
train_set = train_val["train"]
val_set = train_val["test"]
test_set = split_dataset["test"]
Validação Cruzada e Bootstrapping
- Para domínios com poucos recursos ou zero-shot, utilizar K-fold CV (por exemplo, K=5 ou 10);
- Em modelos de difusão, utilizar FID/LPIPS com bootstrap para avaliar a estabilidade da geração;
- Inspeção visual ou perceptual deve acompanhar a validação numérica.
Exemplo de configuração K-fold:
from sklearn.model_selection import KFold
import numpy as np
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(kf.split(data)):
print(f"Fold {fold}: Train indices {train_idx[:5]}, Val indices {val_idx[:5]}")
Conjuntos de Dados Comumente Utilizados
A escolha do conjunto de dados adequado depende da modalidade, escala dos dados, licenciamento e do objetivo generativo específico (por exemplo, geração incondicional, síntese condicional ou transferência de estilo).
Conjuntos de Dados para Visão Computacional
- CIFAR-10: 60.000 imagens RGB de baixa resolução 32×32 em 10 classes. Leve, ideal para prototipagem rápida, testes unitários e benchmarking de loops de treinamento para GANs de imagens;
- CelebA: mais de 200 mil rostos de celebridades alinhados e anotados com 40 atributos binários. Frequentemente utilizado em geração condicionada por atributos, edição de rosto preservando identidade e modelos encoder-decoder;
- LSUN: conjunto de dados de cenas em larga escala contendo milhões de imagens em categorias como quartos, igrejas e salas de jantar. Essencial para síntese em alta resolução e treinamento progressivo de GANs;
- ImageNet: mais de 14 milhões de imagens de alta qualidade rotuladas em 20 mil classes. Utilizado principalmente para transferência de aprendizado, pré-treinamento de modelos de difusão e como base para geração guiada por estilo.
Conjuntos de Dados de Texto
- WikiText: artigos limpos da Wikipedia (WikiText-2: 2M tokens, WikiText-103: 100M+). Valioso para avaliação de modelagem de linguagem e ajuste fino de modelos apenas de decodificador como GPT;
- BookCorpus: mais de 11.000 romances gratuitos. Fundamental para geração em estilo narrativo, transformadores de longo contexto e pré-treinamento de modelos fundamentais (por exemplo, BERT, GPT-2);
- Common Crawl / C4: dados multilíngues da web em escala de petabytes. C4 é uma variante deduplicada e filtrada, criada para treinamento de modelos de linguagem de alta qualidade (por exemplo, T5);
- The Pile: 825GB de dados diversos (livros, ArXiv, StackExchange, GitHub, etc.). Projetado para treinar modelos no estilo GPT de forma competitiva com os LLMs da OpenAI.
Resumo
- Seleção de conjuntos de dados baseada em qualidade, licenciamento, escala e alinhamento com os objetivos generativos;
- Aplicação de pipelines de pré-processamento adaptados a cada modalidade utilizando ferramentas robustas e de nível produtivo;
- Garantia de estratégias rigorosas de divisão para suportar reprodutibilidade, evitar vazamentos e possibilitar avaliação justa.
1. Por que a qualidade dos dados é mais importante do que a quantidade no treinamento de modelos generativos de IA?
2. Qual é um desafio comum ao coletar dados diversos para treinar modelos generativos?
3. Qual é o principal objetivo da aumentação de dados no contexto do treinamento de IA generativa?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo