Збір і Попередня Обробка Даних
Свайпніть щоб показати меню
Навчання генеративних моделей вимагає не лише якісної архітектури та функцій втрат, а й чистих, добре структурованих і різноманітних даних. У цьому розділі представлено високоякісні набори даних для зображень, тексту та аудіо, наведено докладні методи попередньої обробки, що відповідають сучасним генеративним пайплайнам, а також розглянуто надійні стратегії розподілу даних із практичними інструментами.
Збір даних
Збір даних для генеративного моделювання залежить від домену, доступності джерел, масштабу та ліцензування. Для текстових і візуальних даних поширеними джерелами є відкриті набори даних, зібраний контент і структуровані репозиторії (наприклад, академічні архіви, соціальні мережі або платформи електронної комерції).
Техніки веб-скрапінгу
Коли набори даних недоступні у відкритому доступі, дані можна збирати з вебу за допомогою інструментів скрапінгу. Веб-скрапінг дозволяє програмно витягувати інформацію з HTML-сторінок. Це потужний підхід до збору реальних, неструктурованих даних, коли API недоступні. Однак скрапінг пов'язаний з технічними та етичними зобов'язаннями.
Типові методи скрапінгу включають:
- Відправлення HTTP-запитів для отримання веб-сторінок. Це забезпечує доступ до сирого HTML-вмісту сторінки;
- Парсинг HTML-вмісту для виділення структурованих даних. Інструменти на кшталт BeautifulSoup перетворюють неструктурований HTML у доступні теги та елементи;
- Навігацію динамічними сторінками за допомогою автоматизації браузера. Для сайтів із великою кількістю JavaScript потрібні інструменти на кшталт Selenium для повного відображення вмісту;
- Збереження витягнутих даних у зручних форматах, таких як CSV або JSON. Це забезпечує сумісність із подальніми етапами попередньої обробки та навчання моделей.
Нижче наведено дві поширені стратегії скрапінгу:
Скрапінг тексту з BeautifulSoup
BeautifulSoup — це бібліотека Python, яка використовується для парсингу статичних HTML-сторінок.
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)
Збір зображень за допомогою Selenium
Selenium автоматизує браузер для збору контенту зі сторінок, що рендеряться за допомогою 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()
Завжди перевіряйте умови використання вебсайту перед збором даних. Використовуйте коректну частоту запитів і дотримуйтеся вимог robots.txt. Некоректний збір даних може призвести до блокування IP-адреси або юридичних наслідків.
У контексті GenAI веб-скрапінг часто є попереднім етапом для створення датасетів попереднього навчання, особливо для доменно-специфічних або малоресурсних мов. Інструменти на кшталт Scrapy, playwright або browserless API також часто використовуються для задач великого масштабу.
Техніки попередньої обробки
Попередня обробка даних повинна враховувати модальність, тип моделі та вимоги до якості. Для генеративного моделювання промислового рівня пайплайни часто включають доменно-специфічні трансформації, адаптацію роздільної здатності та фільтрацію на основі контенту.
Попередня обробка зображень
- Зміна розміру: приведення роздільної здатності датасету до розміру, необхідного для моделі (наприклад, 64x64 для ранніх GAN, 512x512 для дифузійних моделей);
from PIL import Image
img = Image.open("example.jpg")
resized = img.resize((256, 256))
resized.save("resized.jpg")
- Нормалізація: масштабування значень пікселів до стандартного діапазону, зазвичай [−1, 1] або [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]
])
- Обробка колірного простору: забезпечення узгодженості кольорів — перетворення у RGB або відтінки сірого. Для умовної генерації зберігати альфа-канали, якщо вони присутні;
from PIL import Image
img = Image.open("example.png").convert("RGB")
img.save("rgb_image.jpg")
- Аугментація даних: вводить варіативність під час навчання за допомогою трансформацій.
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(),
])
Попередня обробка тексту
- Очищення: видаляє спеціальні символи, зайві пробіли та шум;
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: відповідає будь-якому алфавітно-цифровому символу (літери A-Z, a-z, цифри 0-9) та підкресленню_;\s: відповідає будь-якому пробільному символу (пробіли, табуляції, переведення рядка);[^...]: заперечений клас символів — відповідає всьому, що не вказано всередині;- Значення: цей шаблон відповідає всім символам, окрім літер, цифр, підкреслення та пробілів. Тобто, він видаляє пунктуацію та символи (наприклад,
—,!тощо).
-
r"\s+":\s: відповідає будь-якому пробільному символу;+: відповідає одному або більше попередньому токену;- Значення: замінює кілька послідовних пробільних символів на один пробіл.
-
.strip(): видаляє початкові та кінцеві пробіли з остаточно очищеного рядка.
Детальніше про синтаксис RegEx дивіться у документації.
- Перетворення в нижній регістр: стандартизує текст до нижнього регістру для послідовності. Застосовується вибірково, оскільки моделі, такі як BERT, можуть бути чутливими/нечутливими до регістру;
12text = "This Is A Sentence." print(text.lower())
- Токенізація: розділення тексту на токени або підслова для моделювання;
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") encodings = tokenizer(["Example text."], padding="max_length", truncation=True, max_length=128, return_tensors="pt")
- Стемінг/лематизація: рідко використовується в пайплайнах глибокого навчання, але застосовується у традиційній обробці природної мови або фільтрах для попереднього навчання;
1234from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
- Доповнення/Обрізання: див. приклад вище з
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")
Створення модульних конвеєрів попередньої обробки з урахуванням відтворюваності. Використовуйте DVC, wandb artifacts або huggingface/datasets зі стрімінгом і кешуванням.
Стратегії розподілу даних
Ефективний розподіл даних є ключовим для узагальнення, особливо в генеративному моделюванні, де часто спостерігається перенавчання на модах або запам'ятовування.
Розподіл на навчальну/валідаційну/тестову вибірки
- Звичайні пропорції: 80/10/10 або 70/15/15 залежно від розміру датасету;
- Контент-орієнтований розподіл: стратифікація за класом (зображення), темою (текст).
- Використання:
- Навчання: визначає оптимізацію моделі;
- Валідація: використовується для збереження чекпойнтів, ранньої зупинки та налаштування метрик (наприклад, FID);
- Тест: повністю відкладається до фінального бенчмаркінгу моделі.
Example using 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
Для 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"]
Крос-валідація та бутстрепінг
- Для доменів з обмеженими ресурсами або zero-shot використовується K-кратна крос-валідація (наприклад, K=5 або 10);
- У дифузійних моделях застосовується бутстрепінг FID/LPIPS для оцінки стабільності генерації;
- Візуальна або перцептивна перевірка повинна супроводжувати числову валідацію.
Приклад налаштування K-кратної крос-валідації:
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]}")
Поширені набори даних
Вибір відповідного набору даних залежить від модальності, масштабу даних, ліцензування та конкретної генеративної мети (наприклад, безумовна генерація, умовний синтез або перенесення стилю).
Набори даних для комп'ютерного зору
- CIFAR-10: 60 000 низькороздільних 32×32 RGB-зображень у 10 класах. Легкий, ідеально підходить для швидкого прототипування, юніт-тестування та бенчмаркінгу тренувальних циклів для GAN зображень;
- CelebA: понад 200 тис. вирівняних облич знаменитостей з анотацією 40 бінарних атрибутів. Часто використовується для генерації за атрибутами, редагування облич із збереженням ідентичності та моделей енкодер-декодер;
- LSUN: масштабний набір сцен із мільйонами зображень у категоріях, таких як спальні, церкви, їдальні. Необхідний для синтезу з високою роздільною здатністю та прогресивного навчання GAN;
- ImageNet: понад 14 млн якісних зображень, розмічених у 20 тис. класах. Використовується переважно для трансферного навчання, попереднього навчання дифузійних моделей та як базовий набір для генерації за стилем.
Набори текстових даних
- WikiText: чисті статті з Вікіпедії (WikiText-2: 2 млн токенів, WikiText-103: понад 100 млн). Корисний для оцінки мовного моделювання та донавчання моделей лише з декодером, таких як GPT;
- BookCorpus: понад 11 000 безкоштовних романів. Критично важливий для генерації наративного стилю, трансформерів із довгим контекстом і попереднього навчання базових моделей (наприклад, BERT, GPT-2);
- Common Crawl / C4: багатомовні веб-дані петабайтного масштабу. C4 — це дедуплікований, відфільтрований варіант, підготовлений для якісного навчання мовних моделей (наприклад, T5);
- The Pile: 825 ГБ різноманітних даних (книги, ArXiv, StackExchange, GitHub тощо). Створений для навчання моделей GPT-подібного типу на конкурентному рівні з LLM від OpenAI.
Підсумок
- Вибір наборів даних на основі якості, ліцензування, масштабу та відповідності генеративним цілям;
- Застосування конвеєрів попередньої обробки, адаптованих до кожної модальності, із використанням надійних, промислових інструментів;
- Забезпечення суворих стратегій розподілу для підтримки відтворюваності, уникнення витоку та забезпечення справедливої оцінки.
1. Чому якість даних важливіша за кількість при навчанні генеративних моделей ШІ?
2. Яка одна з поширених проблем при зборі різноманітних даних для навчання генеративних моделей?
3. Яка основна мета аугментації даних у контексті навчання генеративного ШІ?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат