Hoppa till innehållet
AI-grafen
F· AI engineeringdatahantering· ca 90 min· volatil — kontrolleras ofta· verifierad 2026-09-20

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

Alla källor och licenser