Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Збір та Попередня Обробка Даних | Побудова та навчання генеративних моделей
Глибокі генеративні моделі з Python

Збір та Попередня Обробка Даних

Свайпніть щоб показати меню

Навчання генеративних моделей вимагає не лише якісної архітектури та функцій втрат, а й чистих, добре структурованих і різноманітних даних. У цьому розділі представлено високоякісні набори даних для зображень, тексту та аудіо, наведено детальні методи попередньої обробки, що відповідають сучасним генеративним пайплайнам, а також розглянуто надійні стратегії розподілу даних із практичними інструментами.

Збір даних

Збір даних

Збір даних для генеративного моделювання залежить від домену, доступності джерел, масштабу та ліцензування. Для текстових і візуальних даних поширеними джерелами є відкриті набори даних, зібраний контент і структуровані репозиторії (наприклад, академічні архіви, соціальні мережі або платформи електронної комерції).

Техніки веб-скрапінгу

Коли набори даних недоступні у готовому вигляді, дані можна збирати з вебу за допомогою інструментів для скрапінгу. Веб-скрапінг дозволяє програмно витягувати інформацію з HTML-сторінок. Це потужний підхід до збору реальних, неструктурованих даних, коли API недоступні. Однак скрапінг супроводжується технічними та етичними зобов'язаннями.

Методи скрапінгу зазвичай включають:

  • Відправлення HTTP-запитів для отримання веб-сторінок. Це забезпечує доступ до сирого HTML-контенту сторінки;
  • Парсинг HTML-контенту для витягання структурованих даних. Інструменти на кшталт BeautifulSoup перетворюють неструктурований HTML у доступні теги та елементи;
  • Навігацію динамічними сторінками за допомогою автоматизації браузера. Для сайтів з великою кількістю JavaScript потрібні інструменти на кшталт Selenium для повного відображення контенту;
  • Збереження витягнутих даних у зручних форматах, таких як CSV або JSON. Це забезпечує сумісність із подальньою попередньою обробкою та навчанням моделей.

Нижче наведено дві поширені стратегії скрапінгу:

Скрапінг тексту з BeautifulSoup

BeautifulSoup — це бібліотека Python, яка використовується для парсингу статичних HTML-сторінок.

1234567891011
import 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()
Note
Примітка

Завжди перевіряйте умови використання вебсайту перед збором даних. Використовуйте ввічливі інтервали запитів і дотримуйтеся 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(),
])

Попередня обробка тексту

  • Очищення: видалення спеціальних символів, зайвих пробілів і шуму;
12345
import re text = "Example text — with symbols!" cleaned = re.sub(r"[^\w\s]", "", text) cleaned = re.sub(r"\s+", " ", cleaned).strip() print(cleaned)
  1. r"[^\w\s]":

    • \w: відповідає будь-якому алфавітно-цифровому символу (літери A-Z, a-z, цифри 0-9) та підкресленню _;
    • \s: відповідає будь-якому пробільному символу (пробіли, табуляції, переведення рядка);
    • [^...]: заперечений клас символів — відповідає всьому, що не входить до списку;
    • Значення: цей шаблон відповідає всім символам, окрім літер, цифр, підкреслення та пробілів. Тобто, він видаляє пунктуацію та символи (наприклад, , ! тощо).
  2. r"\s+":

    • \s: відповідає будь-якому пробільному символу;
    • +: відповідає одному або більше попередніх символів;
    • Значення: замінює кілька послідовних пробільних символів на один пробіл.
  3. .strip(): видаляє початкові та кінцеві пробіли з фінального очищеного рядка.

Детальніше про синтаксис RegEx дивіться у документації.

  • Перетворення в нижній регістр: стандартизація тексту до нижнього регістру для узгодженості. Застосовується вибірково, оскільки моделі, такі як BERT, можуть бути чутливими до регістру;
12
text = "This Is A Sentence." print(text.lower())
  • Токенізація: розбиття тексту на токени або підслова для моделювання;
1234
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") encodings = tokenizer(["Example text."], padding="max_length", truncation=True, max_length=128, return_tensors="pt")
  • Стемінг/Лематизація: рідко використовується в пайплайнах глибокого навчання, але застосовується в традиційній обробці природної мови або фільтрах для попереднього навчання;
1234
from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
  • Доповнення/Обрізання: див. приклад вище з max_length.
1234
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") inputs = tokenizer("Short text.", max_length=10, padding="max_length", truncation=True, return_tensors="pt")
Note
Примітка

Побудова модульних конвеєрів попередньої обробки з урахуванням відтворюваності. Використання 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. Яка основна мета аугментації даних у контексті навчання генеративного ШІ?

question mark

Чому якість даних важливіша за кількість при навчанні генеративних AI-моделей?

Виберіть правильну відповідь

question mark

Яка одна з поширених проблем при зборі різноманітних даних для навчання генеративних моделей?

Виберіть правильну відповідь

question mark

Яка основна мета аугментації даних у контексті навчання генеративного ШІ?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 1
some-alt