Syntetisk data
Kunna generera och filtrera syntetisk träningsdata med en modell, och upptäcka modellkollaps.
Förkunskaper
Intuition
Syntetisk data är exempel genererade av en modell i stället för insamlade från verkligheten. Det används för att täcka fall som saknas, för att skala upp små dataset, och för att undvika personuppgifter.
Där det fungerar bra: när det finns ett verifierbart facit. Matematik (kontrollera svaret), kod (kör testerna), strukturerad extraktion (validera mot schema). Då kan du generera mycket och filtrera hårt — och filtret är det som skapar värdet.
Där det fungerar dåligt: öppen text utan facit. Då ärver datan modellens egna fel och stilmässiga egenheter, och förstärker dem.
Grundregeln: generera brett, filtrera hårt, behåll lite. Ett dataset där 90 % kastats är ofta bättre än ett där allt behölls.
Formellt
Modellkollaps (Shumailov m.fl. 2024): tränar man upprepade generationer av modeller på föregående generations utdata tappas först svansarna i fördelningen — sällsynta men giltiga mönster — och därefter smalnar fördelningen successivt. Modellen blir alltmer generisk och tappar variation.
Mekanismen är statistisk: varje generation samplar ur en skattad fördelning, och samplingsfel ackumuleras. Effekten uppstår redan efter några generationer i rena syntetiska loopar.
Motmedel:
- Blanda alltid in verklig data (den ursprungliga korpusen behålls).
- Verifiera syntetiska exempel mot ett externt facit där det finns.
- Mät diversitet i den genererade datan — n-gram-entropi, embeddingspridning, andel unika svar.
- Använd en starkare modell som generator än den som tränas (distillation), inte samma modell i loop.
Licens och upphovsrätt: många leverantörers villkor förbjuder att använda deras utdata för att träna konkurrerande modeller. Kontrollera villkoren innan ett syntetiskt dataset byggs — det är ett vanligt och kostsamt förbiseende.
Kod
import numpy as np
from collections import Counter
def generera_och_filtrera(llm, fro_exempel, n=5000, verifiera=None):
kandidater = [llm.generera_variant(rng_val(fro_exempel)) for _ in range(n)]
behallna, kastat = [], Counter()
sedda = set()
for k in kandidater:
nyckel = normalisera(k["instruktion"])
if nyckel in sedda: kastat["dubblett"] += 1; continue
if verifiera and not verifiera(k): kastat["verifiering"] += 1; continue
if len(k["svar"].split()) < 5: kastat["för_kort"] += 1; continue
sedda.add(nyckel); behallna.append(k)
return behallna, dict(kastat)
def diversitet(exempel, n=3):
"""Andel unika n-gram — sjunker den kraftigt jämfört med verklig data är fördelningen för smal."""
grams = [tuple(t[i:i+n]) for t in (e["svar"].split() for e in exempel)
for i in range(max(len(t) - n + 1, 0))]
return len(set(grams)) / max(len(grams), 1)
syn, statistik = generera_och_filtrera(llm, fro, n=5000, verifiera=kor_tester)
print(len(syn), statistik, round(diversitet(syn), 3), round(diversitet(verklig_data), 3))
# 1180 {'dubblett': 2310, 'verifiering': 1290, 'för_kort': 220} 0.41 0.63
# ↑ 76 % kastat ↑ lägre diversitet än verklig data
Diversitetsjämförelsen mot verklig data är den enklaste tidiga varningen för att den syntetiska datan är för smal.
Behärskning innebär
- Genererar och filtrerar syntetisk träningsdata
- Känner igen modellkollaps
- Vet när syntetisk data hjälper och när den skadar
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — AI models collapse when trained on recursively generated data — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Self-Instruct: Aligning Language Models with Self-Generated Instructions — arXiv (öppen åtkomst; licens per artikel)