- Je onderscheidt het voorspelde gemiddelde van de toegevoegde posteriorinnovatie.
- Je maakt nieuwe punten uit normale ruis zonder schoon doelpunt of bekende trainingsruis.
Een getrainde ruisvoorspeller geeft bij een verstoord punt een ruisschatting. Tijdens generatie heb je echter geen schoon beginpunt. Je start met nieuwe normale ruis en laat het model stap voor stap de richting van de omgekeerde overgangen bepalen; het bouwproject zal de benodigde training uitvoeren.
Denk aan teruglopen door een reeks steeds waziger kaarten. Je ziet alleen de huidige kaart en de tijdstap; de oorspronkelijke route is niet bewaard. Het model geeft een schatting en de sampler voegt, behalve bij de laatste stap, opnieuw gecontroleerde willekeur toe.
Een enkele omgekeerde stap hoeft dus niet het oorspronkelijke trainingsvoorbeeld terug te vinden. Het doel is uiteindelijk nieuwe voorbeelden uit een aangeleerde verdeling te trekken. Onze experimenten blijven beperkt tot de vier synthetische puntenwolken.
1. Gebruik de ruisschatting met de juiste schaal
De terugstap gebruikt het vaste schema uit de eerste les. Noem de voorspelde ruis E en definieer de correctiefactor c_t als β_t gedeeld door de wortel van 1−ᾱ_t. Het gemiddelde μ_t van de terugstap volgt door c_tE van het huidige punt af te trekken en door √α_t te delen.
Neem opnieuw β=[0,1;0,2], nu met huidig punt [1;2] en voorspelde ruis [0,5;−0,5] op index één. De correctiefactor is 0,2/√0,28. Zonder extra innovatie krijg je ongeveer [0,907;2,447].
point = np.array([[1.,2.]])
estimate = np.array([[0.5,-0.5]])
betas = np.array([0.1,0.2])
mean = reverse_diffusion_step(
point,estimate,1,betas,[[0.,0.]])
print(mean.round(3).tolist())
# [[0.907, 2.447]]
Een veelgemaakte fout is simpelweg E van x_t aftrekken. Dan verdwijnen de schemacoëfficiënten, terwijl de voorspeller juist op die ruisniveaus is getraind. Een andere fout is E verwarren met een direct voorspeld schoon punt.
2. Voeg de juiste variantieruis toe
De volledige terugstap telt √v_t z bij μ_t op. Hier is v_t de posteriorvariantie uit ons schema en z een nieuwe standaardnormale ruisvector. Variantie zelf is niet de amplitude: vermenigvuldigen met v_t in plaats van zijn wortel zou te weinig ruis toevoegen.
next_point = reverse_diffusion_step(
point,estimate,1,betas,[[1.,-1.]])
print(next_point.round(3).tolist())
# [[1.174, 2.18]]
De standaardafwijking van deze innovatie is √0,071428…, ongeveer 0,267. Bij index nul is de posteriorvariantie juist nul. Een willekeurige extra ruisvector verandert die laatste terugstap dus niet.
a = reverse_diffusion_step(
point,estimate,0,betas,[[0.,0.]])
b = reverse_diffusion_step(
point,estimate,0,betas,[[10.,-10.]])
print(np.array_equal(a,b))
# True
Maak reverse_diffusion_step voor deze gemiddelde- en variantieberekening, met behoud van alle invoer. De parameter index is één Python-int; de matrices hebben dezelfde vorm met twee coördinaten per punt. Gebruik de gegeven validators en het schema.
Begin met één rekenstap: huidig punt [1; 2], vaste ruisschatting [0,5; −0,5] en β=[0,1; 0,2]. Onderzoek daarna de echte getrainde sampler.
- Posteriorvariantie
- 0,071
- Nieuwe coördinaat 1
- 1,174
- Nieuwe coördinaat 2
- 2,18
De innovatie schaalt met de wortel van de posteriorvariantie, niet met de voorwaartse β.
- Nog uit te voeren stappen
- 32
- Nieuwe punten
- 96
De drie beelden horen bij dezelfde generatie met seed 97. Vier wolkjes herkennen is nog geen volledige kwaliteitstoets; het project meet ook balans en spreiding.
Het rekenvoorbeeld heeft twee stappen. De onderste snapshots komen uit een apart schema van 64 stappen met het getrainde model: start met normale ruis, zonder schoon doelpunt of bekende trainingsruis.
3. Verbind alle stappen met dezelfde voorspeller
Maak sample_diffusion: begin met count nieuwe standaardnormale punten uit een eigen generator met de opgegeven seed. Loop van de laatste index terug naar nul. Laat op iedere stap predict_noise de ruis schatten en voer daarna reverse_diffusion_step uit met nieuwe ruis.
parameters = initialize_denoiser(
hidden=1,seed=7)
samples = sample_diffusion(
parameters,betas,count=3,seed=5)
print(samples['points'].shape)
print(len(samples['snapshots']))
# (3, 2)
# 3
Bewaar drie zelfstandige snapshots: de startruis, de toestand na index T//2 en de uiteindelijke punten. De zojuist gebruikte parameters zijn alleen geïnitialiseerd; de uitvoer bewijst daarom nog geen geleerde verdeling. Het bouwproject traint eerst een netwerk en vergelijkt daarna de metingen.
Het startpunt bij normale ruis is bij een eindig schema een benadering. Ons 64-stappenschema heeft terminale ᾱ ongeveer 0,0061, dus de oorspronkelijke signaalbijdrage is klein maar niet exact nul. Dat hoort bij de interpretatie van de proef.
02Wat neem je mee?
- Een terugstap combineert een geschaalde ruisschatting met gecontroleerde innovatie.
- De laatste posteriorvariantie is nul; eerdere stappen mogen stochastisch zijn.
- Een sampler gebruikt nieuwe ruis en geleerde parameters, geen verborgen schoon voorbeeld.