Datenerfassung und -Vorverarbeitung
Swipe um das Menü anzuzeigen
Das Training generativer Modelle erfordert nicht nur eine geeignete Architektur und Verlustfunktionen, sondern auch saubere, gut strukturierte und vielfältige Daten. Dieser Abschnitt stellt hochwertige Datensätze aus den Bereichen Bild, Text und Audio vor, bietet detaillierte Vorverarbeitungstechniken für moderne generative Pipelines und behandelt robuste Strategien zur Datenaufteilung mit praxisnahen Werkzeugen.
Datensammlung
Das Sammeln von Daten für generative Modellierung hängt von Domäne, Verfügbarkeit der Quellen, Umfang und Lizenzierung ab. Für Text- und Bilddaten gehören offene Datensätze, gescrapte Inhalte und strukturierte Repositorien (z. B. akademische Archive, soziale Medien oder E-Commerce-Plattformen) zu den gängigen Quellen.
Web-Scraping-Techniken
Wenn Datensätze nicht direkt verfügbar sind, können Daten mithilfe von Scraping-Tools aus dem Web gesammelt werden. Web-Scraping ermöglicht das programmatische Extrahieren von Informationen aus HTML-Seiten. Es ist ein leistungsfähiger Ansatz zur Sammlung realer, unstrukturierter Daten, wenn keine APIs verfügbar sind. Allerdings sind beim Scraping technische und ethische Aspekte zu beachten.
Typische Scraping-Methoden umfassen:
- Senden von HTTP-Anfragen zum Abrufen von Webseiten. Dies ermöglicht den Zugriff auf den Roh-HTML-Inhalt einer Seite;
- Parsen von HTML-Inhalten zur Extraktion strukturierter Daten. Tools wie BeautifulSoup wandeln unstrukturierte HTML-Inhalte in zugängliche Tags und Elemente um;
- Navigation durch dynamische Seiten mittels Browser-Automatisierung. JavaScript-lastige Webseiten erfordern Tools wie Selenium, um den Inhalt vollständig darzustellen;
- Speichern der extrahierten Daten in nutzbaren Formaten wie CSV oder JSON. Dies gewährleistet die Kompatibilität mit späteren Schritten der Vorverarbeitung und des Modelltrainings.
Nachfolgend sind zwei gängige Scraping-Strategien aufgeführt:
Text-Scraping mit BeautifulSoup
BeautifulSoup ist eine Python-Bibliothek zum Parsen statischer HTML-Seiten.
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)
Bilder mit Selenium scrapen
Selenium automatisiert einen Browser, um Inhalte von Seiten zu extrahieren, die mit JavaScript gerendert werden.
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()
Vor dem Scrapen einer Website immer die Nutzungsbedingungen prüfen. Höfliche Anfrageraten verwenden und robots.txt respektieren. Unsachgemäßes Scraping kann zu IP-Sperren oder rechtlichen Konsequenzen führen.
Im GenAI-Kontext ist Web Scraping häufig ein erster Schritt beim Aufbau von Pretraining-Datensätzen, insbesondere für domänenspezifische oder ressourcenarme Sprachen. Werkzeuge wie Scrapy, playwright oder browserlose APIs werden ebenfalls häufig für groß angelegte Aufgaben eingesetzt.
Vorverarbeitungstechniken
Die Datenvorverarbeitung muss an Modalität, Modelltyp und Qualitätsanforderungen angepasst werden. Für produktionsreife generative Modellierung enthalten Pipelines häufig domänenspezifische Transformationen, Anpassung der Auflösung und inhaltsbasierte Filterung.
Bildvorverarbeitung
- Größenanpassung: Anpassung der Datensatzauflösung an den Modelleingang (z. B. 64x64 für frühe GANs, 512x512 für Diffusionsmodelle);
from PIL import Image
img = Image.open("example.jpg")
resized = img.resize((256, 256))
resized.save("resized.jpg")
- Normalisierung: skaliert Pixelwerte auf einen Standardbereich, typischerweise [−1, 1] oder [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]
])
- Farbraumverarbeitung: stellt Farbkonstanz sicher — Umwandlung in RGB oder Graustufen. Für bedingte Generierung Beibehaltung von Alphakanälen, falls vorhanden;
from PIL import Image
img = Image.open("example.png").convert("RGB")
img.save("rgb_image.jpg")
- Datenaugmentation: führt während des Trainings durch Transformationen Variationen ein.
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(),
])
Textvorverarbeitung
- Bereinigung: entfernt Sonderzeichen, überflüssige Leerzeichen und Störfaktoren;
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: entspricht jedem alphanumerischen Zeichen (Buchstaben A-Z, a-z, Ziffern 0-9) und Unterstrich_;\s: entspricht jedem Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche);[^...]: eine negierte Zeichenklasse—entspricht allem, was nicht innerhalb der Klammern steht;- Bedeutung: Dieses Muster entspricht allen Zeichen außer Buchstaben, Ziffern, Unterstrichen und Leerzeichen. Es entfernt also Satzzeichen und Symbole (wie
—,!usw.).
-
r"\s+":\s: entspricht jedem Leerzeichen;+: entspricht einem oder mehreren der vorherigen Zeichen;- Bedeutung: Ersetzt mehrere aufeinanderfolgende Leerzeichen durch ein einzelnes Leerzeichen.
-
.strip(): entfernt führende und nachfolgende Leerzeichen aus dem bereinigten String.
Weitere Informationen zur RegEx-Syntax finden sich in der Dokumentation.
- Kleinschreibung: Vereinheitlichung des Textes auf Kleinbuchstaben zur Konsistenz. Selektive Anwendung, da Modelle wie BERT zwischen Groß- und Kleinschreibung unterscheiden können;
12text = "This Is A Sentence." print(text.lower())
- Tokenisierung: Zerlegung des Textes in Token oder Subwörter für das Modellieren;
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/Lemmatisierung: selten in Deep-Learning-Pipelines, aber in traditionellen NLP- oder Pretraining-Filtern verwendet;
1234from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
- Auffüllen/Abschneiden: siehe Beispiel oben mit
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")
Modulare Vorverarbeitungspipelines mit Fokus auf Reproduzierbarkeit. Verwendung von DVC, wandb artifacts oder huggingface/datasets mit Streaming und Caching.
Strategien zur Datenaufteilung
Effiziente Datenaufteilung ist entscheidend für die Generalisierung, insbesondere im generativen Modellieren, wo Überanpassung an Modi oder Auswendiglernen häufig vorkommt.
Aufteilung in Training/Validierung/Test
- Konventionelle Verhältnisse: 80/10/10 oder 70/15/15, abhängig von der Datensatzgröße;
- Inhaltsbasierte Aufteilung: Aufteilung nach Klasse (Vision), Thema (Text) stratifizieren.
- Anwendungsfall:
- Training: steuert die Modelloptimierung;
- Validierung: unterstützt Checkpointing, Early Stopping und Metrikabstimmung (z. B. FID);
- Test: vollständig zurückgehalten bis zum abschließenden Modell-Benchmarking.
Beispiel mit 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
Für Hugging Face Datasets:
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"]
Kreuzvalidierung und Bootstrapping
- Für Domänen mit wenig oder keinen Ressourcen, Verwendung von K-facher Kreuzvalidierung (z. B. K=5 oder 10);
- In Diffusionsmodellen, Einsatz von bootstrapped FID/LPIPS zur Bewertung der Generierungsstabilität;
- Visuelle oder perzeptuelle Inspektion sollte die numerische Validierung ergänzen.
Beispiel für K-fache Kreuzvalidierung:
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]}")
Häufig verwendete Datensätze
Die Auswahl des passenden Datensatzes hängt von Modalität, Datenumfang, Lizenzierung und dem spezifischen generativen Ziel ab (z. B. unbedingte Generierung, bedingte Synthese oder Stiltransfer).
Computer-Vision-Datensätze
- CIFAR-10: 60.000 niedrig aufgelöste 32×32-RGB-Bilder in 10 Klassen. Leichtgewichtig, ideal für schnelles Prototyping, Unittests und Benchmarking von Trainingsschleifen für Bild-GANs;
- CelebA: Über 200.000 ausgerichtete Prominentengesichter, annotiert mit 40 binären Attributen. Häufig verwendet für attributbasierte Generierung, identitätsbewahrende Gesichtsmanipulation und Encoder-Decoder-Modelle;
- LSUN: Groß angelegter Szenen-Datensatz mit Millionen von Bildern in Kategorien wie Schlafzimmer, Kirchen und Speiseräume. Essenziell für hochauflösende Synthese und progressives GAN-Training;
- ImageNet: Über 14 Millionen hochwertige Bilder, klassifiziert in 20.000 Klassen. Hauptsächlich verwendet für Transferlernen, Diffusionsmodell-Vortraining und als Basisdatensatz für stilgesteuerte Generierung.
Textdatensätze
- WikiText: bereinigte Wikipedia-Artikel (WikiText-2: 2 Mio. Tokens, WikiText-103: 100 Mio.+). Wertvoll zur Bewertung von Sprachmodellierung und Feinabstimmung von Decoder-only-Modellen wie GPT;
- BookCorpus: über 11.000 kostenlose Romane. Wichtig für die Generierung von narrativen Texten, Long-Context-Transformer und das Pretraining von Grundmodellen (z. B. BERT, GPT-2);
- Common Crawl / C4: mehrsprachige Webdaten im Petabyte-Bereich. C4 ist eine deduplizierte, gefilterte Variante, die für hochwertiges Sprachmodelltraining (z. B. T5) kuratiert wurde;
- The Pile: 825 GB vielfältige Daten (Bücher, ArXiv, StackExchange, GitHub usw.). Entwickelt, um GPT-ähnliche Modelle auf Wettbewerbsniveau mit OpenAIs LLMs zu trainieren.
Zusammenfassung
- Auswahl von Datensätzen basierend auf Qualität, Lizenzierung, Umfang und Übereinstimmung mit den generativen Zielen;
- Anwendung von Preprocessing-Pipelines, die auf jede Modalität zugeschnitten sind, unter Verwendung robuster, produktionsreifer Tools;
- Sicherstellung rigoroser Splitting-Strategien zur Unterstützung der Reproduzierbarkeit, Vermeidung von Leakage und Ermöglichung fairer Bewertung.
1. Warum ist die Datenqualität beim Training generativer KI-Modelle wichtiger als die Quantität?
2. Was ist eine häufige Herausforderung bei der Sammlung vielfältiger Daten für das Training generativer Modelle?
3. Was ist das Hauptziel der Datenaugmentation im Kontext des Trainings generativer KI?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen