Datan Keruu ja Esikäsittely
Pyyhkäise näyttääksesi valikon
Generatiivisten mallien kouluttaminen vaatii paitsi hyvää arkkitehtuuria ja häviöfunktioita, myös puhdasta, hyvin jäsenneltyä ja monipuolista dataa. Tässä osiossa esitellään korkealaatuisia aineistoja kuva-, teksti- ja äänimuodoissa, tarjotaan yksityiskohtaisia esikäsittelymenetelmiä, jotka soveltuvat moderneihin generatiivisiin työnkulkuihin, sekä käsitellään vankkoja datan jakamisstrategioita käytännön työkalujen avulla.
Datan keruu
Datan kerääminen generatiivista mallinnusta varten riippuu sovellusalueesta, lähteiden saatavuudesta, mittakaavasta ja lisensoinnista. Teksti- ja kuvadatan osalta yleisiä lähteitä ovat avoimet tietoaineistot, kerätty sisältö sekä rakenteiset tietovarannot (esim. tieteelliset arkistot, sosiaalinen media tai verkkokauppa-alustat).
Verkkosivujen skrappausmenetelmät
Kun valmiita tietoaineistoja ei ole saatavilla, dataa voidaan kerätä verkosta skrappausvälineillä. Verkkosivujen skrappaus mahdollistaa tiedon ohjelmallisen poiminnan HTML-sivuilta. Tämä on tehokas tapa kerätä todellista, jäsentymätöntä dataa silloin, kun rajapintoja ei ole tarjolla. Skrappaukseen liittyy kuitenkin teknisiä ja eettisiä vastuita.
Skrappausmenetelmät sisältävät tyypillisesti:
- HTTP-pyyntöjen lähettäminen verkkosivujen hakemiseksi. Tämä mahdollistaa sivun raakamuotoisen HTML-sisällön saamisen;
- HTML-sisällön jäsentäminen rakenteisen datan poimimiseksi. Työkalut kuten BeautifulSoup muuntavat jäsentymättömän HTML:n helposti käsiteltäviksi tageiksi ja elementeiksi;
- Dynaamisten sivujen navigointi selainautomaation avulla. JavaScript-painotteiset sivustot vaativat työkaluja kuten Selenium sisällön täydelliseen renderöintiin;
- Poimitun datan tallentaminen käyttökelpoisiin muotoihin kuten CSV tai JSON. Tämä varmistaa yhteensopivuuden myöhempien esikäsittely- ja mallinnusvaiheiden kanssa.
Alla on kaksi yleistä skrappausstrategiaa:
Tekstin skrappaus BeautifulSoupilla
BeautifulSoup on Python-kirjasto, jota käytetään staattisten HTML-sivujen jäsentämiseen.
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)
Kuvien kerääminen Seleniumilla
Selenium automatisoi selaimen sisällön keräämiseksi JavaScriptillä renderöidyiltä sivuilta.
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()
Tarkista aina verkkosivuston käyttöehdot ennen tiedonkeruuta. Käytä kohteliaita pyyntötaajuuksia ja noudata robots.txt-tiedostoa. Virheellinen tiedonkeruu voi johtaa IP-osoitteen estoon tai oikeudellisiin seuraamuksiin.
GenAI-yhteyksissä verkkosivujen tiedonkeruu toimii usein esikäsittelyaineistojen rakentamisen lähtökohtana, erityisesti alakohtaisissa tai vähäresurssisissa kielissä. Työkaluja kuten Scrapy, playwright tai selainpohjaiset API:t käytetään usein laajamittaisiin tehtäviin.
Esikäsittelytekniikat
Datan esikäsittely tulee räätälöidä modaliteetin, mallityypin ja laatuvaatimusten mukaan. Tuotantotason generatiivisessa mallinnuksessa putket sisältävät usein alakohtaisia muunnoksia, resoluution sovittamista ja sisällön perusteella suodatusta.
Kuvan esikäsittely
- Koon muuttaminen: sovita aineiston resoluutio mallin syötteeseen (esim. 64x64 varhaisille GAN-malleille, 512x512 diffuusiomalleille);
from PIL import Image
img = Image.open("example.jpg")
resized = img.resize((256, 256))
resized.save("resized.jpg")
- Normalisointi: skaalaa pikseliarvot vakiovälille, tyypillisesti [−1, 1] tai [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]
])
- Väriavaruuden käsittely: varmistaa värien yhdenmukaisuuden — muuntaa RGB- tai harmaasävyksi. Ehdollisessa generoinnissa säilytä alfakanavat, jos niitä on;
from PIL import Image
img = Image.open("example.png").convert("RGB")
img.save("rgb_image.jpg")
- Datan augmentointi: tuo vaihtelua koulutuksen aikana muunnosten avulla.
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(),
])
Tekstin esikäsittely
- Puhdistus: poistaa erikoismerkit, ylimääräiset välilyönnit ja häiriötekijät;
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: vastaa mitä tahansa aakkosnumeerista merkkiä (kirjaimet A-Z, a-z, numerot 0-9) ja alaviivaa_;\s: vastaa mitä tahansa välilyöntimerkkiä (välilyönnit, sarkaimet, rivinvaihdot);[^...]: negatiivinen merkkiluokka—vastaa kaikkea, mitä ei ole lueteltu sisällä;- Merkitys: tämä kuvio vastaa kaikkia merkkejä paitsi kirjaimia, numeroita, alaviivoja ja välilyöntejä. Poistaa siis välimerkit ja symbolit (kuten
—,!, jne.).
-
r"\s+":\s: vastaa mitä tahansa välilyöntimerkkiä;+: vastaa yhtä tai useampaa edeltävää merkkiä;- Merkitys: korvaa useat peräkkäiset välilyönnit yhdellä välilyönnillä.
-
.strip(): poistaa alku- ja loppuvälilyönnit lopullisesta puhdistetusta merkkijonosta.
Lisätietoja RegEx-syntaksista löytyy dokumentaatiosta.
- Pieniksi kirjaimiksi muuttaminen: yhdenmukaistaa tekstin pieniksi kirjaimiksi johdonmukaisuuden vuoksi. Käytetään valikoivasti, koska jotkin mallit, kuten BERT, ovat kirjainkoon huomioivia/huomioimattomia;
12text = "This Is A Sentence." print(text.lower())
- Tokenisointi: jakaa tekstin tokenoihin tai osasanoihin mallinnusta varten;
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") encodings = tokenizer(["Example text."], padding="max_length", truncation=True, max_length=128, return_tensors="pt")
- Stemmaus/Lemmatisaatio: harvinaista syväoppimisen putkissa, mutta käytetään perinteisessä NLP:ssä tai esikoulutussuodattimissa;
1234from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
- Täydennys/katkaisu: katso yllä oleva esimerkki
max_length-parametrilla.
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") inputs = tokenizer("Short text.", max_length=10, padding="max_length", truncation=True, return_tensors="pt")
Rakenna modulaarisia esikäsittelyputkia toistettavuus huomioiden. Käytä DVC-, wandb artifacts- tai huggingface/datasets-ratkaisuja suoratoiston ja välimuistin kanssa.
Datan jakamisstrategiat
Tehokas datan jakaminen on olennaista yleistettävyyden kannalta, erityisesti generatiivisessa mallinnuksessa, jossa ylisovittaminen jakaumiin tai muistiin painaminen on yleistä.
Koulutus-/validointi-/testijako
- Tavanomaiset suhteet: 80/10/10 tai 70/15/15 riippuen aineiston koosta;
- Sisältötietoinen jako: jaottele luokan (kuva), aiheen (teksti) mukaan.
- Käyttötarkoitus:
- Koulutus: ohjaa mallin optimointia;
- Validointi: ohjaa checkpointingia, varhaista pysäytystä ja metriikan säätöä (esim. FID);
- Testi: pidetään kokonaan erillään lopullista mallin vertailua varten.
Esimerkki train_test_split-funktion käytöstä:
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 -aineistojen käyttö:
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"]
Ristiinvalidointi ja bootstrapping
- Vähäresurssisissa tai zero-shot -alueissa käytä K-kertaista ristiinvalidointia (esim. K=5 tai 10);
- Diffuusiomalleissa käytä bootstrappattua FID/LPIPS-arvoa generoinnin vakauden arviointiin;
- Visuaalinen tai havaintoperusteinen tarkastelu tulee yhdistää numeeriseen validointiin.
Esimerkki K-kertaisesta asetelmasta:
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]}")
Yleisesti käytetyt aineistot
Oikean aineiston valinta riippuu modaliteetista, datan määrästä, lisensoinnista sekä generatiivisesta tavoitteesta (esim. ehdoton generointi, ehdollinen synteesi tai tyylinsiirto).
Tietokonenäön aineistot
- CIFAR-10: 60 000 matalaresoluutioista 32×32 RGB-kuvaa 10 luokassa. Kevyt, soveltuu nopeaan prototyyppaukseen, yksikkötestaukseen ja GAN-mallien koulutusloopin vertailuun;
- CelebA: yli 200 000 kohdistettua julkkiskasvoa, joihin on liitetty 40 binääriattribuuttia. Käytetään usein attribuuttiohjatussa generoinnissa, identiteetin säilyttävässä kasvojen muokkauksessa ja enkooderi-dekooderi-malleissa;
- LSUN: laajamittainen kohtausaineisto, joka sisältää miljoonia kuvia kategorioissa kuten makuuhuoneet, kirkot ja ruokasalit. Keskeinen korkean resoluution synteesissä ja progressiivisten GAN-mallien koulutuksessa;
- ImageNet: yli 14 miljoonaa korkealaatuista kuvaa, jotka on luokiteltu 20 000 luokkaan. Käytetään pääasiassa siirtoloppuopetuksessa, diffuusiomallien esikoulutuksessa ja tyyliohjatun generoinnin pohja-aineistona.
Tekstidatastot
- WikiText: puhtaita Wikipedia-artikkeleita (WikiText-2: 2M tokenia, WikiText-103: yli 100M). Arvokas kielimallien arviointiin ja dekooderipohjaisten mallien, kuten GPT, hienosäätöön;
- BookCorpus: yli 11 000 ilmaista romaania. Keskeinen narratiivisen tekstin generoinnissa, pitkän kontekstin transformereissa ja perustavanlaatuisten mallien esikoulutuksessa (esim. BERT, GPT-2);
- Common Crawl / C4: petatavun kokoluokan monikielinen verkkodata. C4 on deduplikoitu, suodatettu versio, joka on kuratoitu korkealaatuiseen kielimallin koulutukseen (esim. T5);
- The Pile: 825GB monipuolista dataa (kirjoja, ArXiv, StackExchange, GitHub jne.). Suunniteltu GPT-tyyppisten mallien koulutukseen kilpailukykyisesti OpenAI:n LLM-mallien kanssa.
Yhteenveto
- Valitse datastot laadun, lisensoinnin, koon ja generatiivisten tavoitteiden mukaisesti;
- Käytä esikäsittelyputkia, jotka on räätälöity kullekin modaliteetille ja perustuvat vankkoihin, tuotantotason työkaluihin;
- Varmista huolelliset jakostrategiat toistettavuuden tukemiseksi, vuodon välttämiseksi ja oikeudenmukaisen arvioinnin mahdollistamiseksi.
1. Miksi datan laatu on määrää tärkeämpää generatiivisten tekoälymallien koulutuksessa?
2. Mikä on yksi yleinen haaste kerättäessä monipuolista dataa generatiivisten mallien koulutukseen?
3. Mikä on datan augmentoinnin ensisijainen tavoite generatiivisen tekoälyn koulutuksessa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme