Збір та Попередня Обробка Даних
Свайпніть щоб показати меню
Навчання генеративних моделей вимагає не лише якісної архітектури та функцій втрат, а й чистих, добре структурованих і різноманітних даних. У цьому розділі представлено високоякісні набори даних для зображень, тексту та аудіо, наведено детальні методи попередньої обробки, що відповідають сучасним генеративним пайплайнам, а також розглянуто надійні стратегії розподілу даних із практичними інструментами.
Збір даних
Збір даних для генеративного моделювання залежить від домену, доступності джерел, масштабу та ліцензування. Для текстових і візуальних даних поширеними джерелами є відкриті набори даних, зібраний контент і структуровані репозиторії (наприклад, академічні архіви, соціальні мережі або платформи електронної комерції).
Техніки веб-скрапінгу
Коли набори даних недоступні у готовому вигляді, дані можна збирати з вебу за допомогою інструментів для скрапінгу. Веб-скрапінг дозволяє програмно витягувати інформацію з 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);
- Тест: повністю відкладений до фінального тестування моделі.
Приклад використання 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 класах. Легкий, ідеально підходить для швидкого прототипування, юніт-тестування та бенчмаркінгу тренувальних циклів для image GAN;
- CelebA: понад 200 тис. вирівняних зображень облич знаменитостей з анотацією 40 бінарних атрибутів. Часто використовується для генерації за атрибутами, редагування облич із збереженням ідентичності та моделей encoder-decoder;
- LSUN: масштабний набір сцен із мільйонами зображень у категоріях, таких як спальні, церкви та їдальні. Необхідний для високороздільної генерації та прогресивного навчання GAN;
- ImageNet: понад 14 млн високоякісних зображень із розміткою у 20 тис. класах. Використовується переважно для transfer learning, попереднього навчання дифузійних моделей та як базовий набір для генерації зі стилізацією.
Текстові датасети
- WikiText: очищені статті з Вікіпедії (WikiText-2: 2 млн токенів, WikiText-103: понад 100 млн). Корисний для оцінки мовного моделювання та донавчання моделей типу decoder-only, таких як GPT;
- BookCorpus: понад 11 000 безкоштовних романів. Важливий для генерації текстів у наративному стилі, трансформерів з довгим контекстом і попереднього навчання базових моделей (наприклад, BERT, GPT-2);
- Common Crawl / C4: багатомовні веб-дані петабайтного масштабу. C4 — це дедуплікований, відфільтрований варіант, підготовлений для якісного навчання мовних моделей (наприклад, T5);
- The Pile: 825 ГБ різноманітних даних (книги, ArXiv, StackExchange, GitHub тощо). Створений для навчання моделей GPT-рівня, конкурентних з LLM від OpenAI.
Підсумок
- Вибір датасетів за якістю, ліцензіями, масштабом і відповідністю генеративним цілям;
- Застосування пайплайнів попередньої обробки, адаптованих до кожної модальності, із використанням надійних інструментів промислового рівня;
- Забезпечення суворих стратегій розділення для підтримки відтворюваності, уникнення витоку даних і справедливої оцінки.
1. Чому якість даних важливіша за кількість при навчанні генеративних AI-моделей?
2. Яка одна з поширених проблем при зборі різноманітних даних для навчання генеративних моделей?
3. Яка основна мета аугментації даних у контексті навчання генеративного ШІ?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат