Xlera8

Introducere în modelele de difuzie pentru învățarea automată

Acest articol a fost publicat inițial AdunareaAI și republicat pentru TOPBOTS cu permisiunea autorului.

Modelele de difuzie sunt modele generative care au câștigat o popularitate semnificativă în ultimii câțiva ani și din motive întemeiate. O mână de lucrări fundamentale lansate în anii 2020 singur au arătat lumii de ce sunt capabile modelele Diffusion, cum ar fi să învingă GAN-urile[6] asupra sintezei imaginilor. Cel mai recent, practicienii vor fi văzut modelele de difuzie folosite în DALL-E2, modelul OpenAI de generare de imagini lansat luna trecută.

Diverse imagini generate de DALL-E 2 (sursă).

Având în vedere recentul val de succes al modelelor de difuzie, mulți practicanți ai învățării automate sunt cu siguranță interesați de funcționarea lor interioară. În acest articol, vom examina fundamente teoretice pentru modelele de difuzie, apoi demonstrați cum să generați imagini cu a Model de difuzie în PyTorch. Să ne scufundăm!

Dacă acest conținut educațional aprofundat vă este util, abonați-vă la lista noastră de corespondență AI pentru a fi avertizați atunci când lansăm material nou. 

Modele de difuzie – Introducere

Modelele de difuzie sunt generativ modele, adică sunt folosite pentru a genera date similare cu datele pe care sunt instruiți. În principiu, modelele de difuzie funcționează prin distrugerea datelor de antrenament prin adăugarea succesivă a zgomotului gaussian și apoi învăţând să se recupereze datele de către inversarea acest proces de zgomot. După antrenament, putem folosi modelul de difuzie pentru a genera date simplu trecerea zgomotului eșantionat aleatoriu prin procesul de dezgomot învățat.

Modelele de difuzie pot fi folosite pentru a genera imagini din zgomot (adaptate din sursă)

Mai precis, un model de difuzie este un model variabil latent care se mapează la spațiul latent folosind un lanț Markov fix. Acest lanț adaugă treptat zgomot datelor pentru a obține q(x) posterior aproximativ1:T|x0), unde x1,…,XT sunt variabilele latente cu aceeași dimensionalitate ca x0. În figura de mai jos, vedem un astfel de lanț Markov manifestat pentru datele de imagine.

În cele din urmă, imaginea este transformată asimptotic în zgomot gaussian pur. The scop de formare un model de difuzie este de a învăța inversa proces – adică instruire pθ(xt−1|xt). Traversând înapoi de-a lungul acestui lanț, putem genera date noi.

Beneficiile modelelor de difuzie

După cum am menționat mai sus, cercetările în modelele de difuzie au explodat în ultimii ani. Inspirat de termodinamica de neechilibru[1], Modelele de difuzie produc în prezent Calitatea imaginii de ultimă generație, dintre care exemple pot fi văzute mai jos:

Dincolo de calitatea de ultimă oră a imaginii, modelele de difuzie vin cu o serie de alte beneficii, inclusiv care nu necesită pregătire adversă. Dificultățile antrenamentului adversar sunt bine documentate; și, în cazurile în care există alternative non-adversariale cu performanță comparabilă și eficiență de antrenament, de obicei cel mai bine este să le utilizați. Pe tema eficienței antrenamentului, modelele de difuzie au și avantajele suplimentare ale scalabilitate și paralelizare.

În timp ce modelele de difuzie par aproape să producă rezultate din aer, există o mulțime de alegeri și detalii matematice atente și interesante care oferă baza acestor rezultate, iar cele mai bune practici sunt încă în evoluție în literatura de specialitate. Să aruncăm o privire mai detaliată la teoria matematică care stă la baza modelelor de difuzie acum.

Modele de difuzie – A Deep Dive

După cum sa menționat mai sus, un model de difuzie constă din a proces înainte (Sau proces de difuzie), în care un datum (în general o imagine) este zgomotat progresiv și a proces invers (Sau proces de difuzie inversă), în care zgomotul este transformat înapoi într-o probă din distribuția țintă.

Tranzițiile lanțului de eșantionare în procesul înainte pot fi setate la gaussieni condiționati atunci când nivelul de zgomot este suficient de scăzut. Combinarea acestui fapt cu ipoteza lui Markov duce la o parametrizare simplă a procesului înainte:

Notă matematică

Am vorbit despre coruperea datelor de către adăugare Zgomot gaussian, dar la început ar putea fi neclar unde efectuăm această adăugare. Conform ecuației de mai sus, la fiecare pas din lanț pur și simplu eșantionăm dintr-o distribuție gaussiană a cărei medie este valoarea anterioară (adică imaginea) din lanț.

Aceste două afirmații sunt echivalente. Acesta este

Pentru a înțelege de ce, vom folosi un ușor abuz de notație prin afirmare

Acolo unde implicația finală provine din echivalența matematică dintre o sumă de variabile aleatoare și convoluția distribuțiilor lor – vezi această pagină Wikipedia pentru mai multe informatii.

Cu alte cuvinte, am arătat că a afirma distribuția unui pas de timp condiționat de cel anterior prin media unei distribuții gaussiene este echivalent cu afirmarea că distribuția unui pas de timp dat este cea a celui precedent cu adăugarea zgomotului gaussian. Am omis scalarii introduși de schema de varianță și am arătat acest lucru pentru o dimensiune pentru simplitate, dar o dovadă similară este valabilă pentru gaussienii multivariați.

Unde β1,…,βT este un program de variații (fie învățat, fie fix) care, dacă este bine comportat, asigură că xT este aproape un Gaussian izotrop pentru T suficient de mare.

Având în vedere ipoteza lui Markov, distribuția comună a variabilelor latente este produsul tranzițiilor în lanț condiționate gaussiene (modificate din sursă).

După cum am menționat anterior, „magia” modelelor de difuzie vine în proces invers. În timpul antrenamentului, modelul învață să inverseze acest proces de difuzie pentru a genera date noi. Începând cu zgomotul pur gaussian p(xT):=N(xT,0,I) modelul învață distribuția comună pθ(x0:T) la fel de

unde se învață parametrii dependenți de timp ai tranzițiilor gaussiene. Rețineți în special că formularea Markov afirmă că o distribuție dată de tranziție de difuzie inversă depinde numai de pasul de timp anterior (sau pasul de timp următor, în funcție de modul în care o priviți):

Pregătire

Un model de difuzie este antrenat de găsirea tranzițiilor Markov inverse care maximizează probabilitatea datelor de antrenament. În practică, antrenamentul constă în mod echivalent în minimizarea limitei superioare variaționale a probabilității logului negativ.

Detaliu de notație

Rețineți că Lvlb este tehnic o UPPER legat (negativul ELBO) pe care încercăm să-l minimizăm, dar ne referim la el ca Lvlb pentru coerență cu literatura de specialitate.

Căutăm să rescriem Lvlb in termeni de Divergențele Kullback-Leibler (KL). Divergența KL este o măsură statistică asimetrică a distanței a cât de mult o distribuție de probabilitate P diferă de o distribuție de referință Q. Suntem interesați să formulăm Lvlb în ceea ce privește divergențele KL, deoarece distribuțiile de tranziție din lanțul nostru Markov sunt gaussiene și divergența KL între gaussieni are o formă închisă.

Ce este divergența KL?

Forma matematică a divergenței KL pentru distribuțiile continue este

Barele duble indică faptul că funcția nu este simetrică în raport cu argumentele sale.

Mai jos puteți vedea divergența KL a unei distribuții variabile P (albastru) dintr-o distribuție de referință Q (roșu). Curba verde indică funcția din integrală din definiția divergenței KL de mai sus, iar aria totală de sub curbă reprezintă valoarea divergenței KL a P din Q în orice moment dat, o valoare care este afișată și numeric.

Casting Lvlb în ceea ce privește divergențele KL

După cum sa menționat anterior, este posibil [1] pentru a rescrie Lvlb aproape complet în ceea ce privește divergențele KL:

Unde

Detalii de derivare

Limita variațională este egală cu

Înlocuind distribuțiile cu definițiile lor, având în vedere ipoteza noastră Markov, obținem

Folosim regulile de log pentru a transforma expresia într-o sumă de loguri, apoi scoatem primul termen

Folosind teorema lui Bayes și ipoteza noastră Markov, această expresie devine

Apoi împărțim termenul de mijloc folosind reguli de jurnal

Izolând al doilea termen, vedem

Conectând acest lucru înapoi în ecuația noastră pentru Lvlb, noi avem

Folosind regulile de jurnal, rearanjam

d8

În continuare, notăm următoarea echivalență pentru divergența KL pentru oricare două distribuții:

În cele din urmă, aplicând această echivalență expresiei anterioare, ajungem la

Condiționarea posterior a procesului înainte pe x0 in EUt−1 rezultă într-o formă tratabilă care duce la toate divergențele KL fiind comparații între gaussieni. Aceasta înseamnă că divergențele pot fi calculate exact cu expresii în formă închisă, mai degrabă decât cu estimări Monte Carlo[3].

Alegeri de model

Odată cu fundamentul matematic pentru funcția noastră obiectiv stabilită, acum trebuie să facem mai multe alegeri cu privire la modul în care va fi implementat modelul nostru de difuzie. Pentru procesul forward, singura alegere necesară este definirea programului de variație, ale cărui valori cresc în general în timpul procesului forward.

Pentru procesul invers, alegem mult arhitectura(ele) de parametrizare/model de distribuție Gaussiană. Rețineți că grad ridicat de flexibilitate pe care modelele de difuziune le permit – cel afară  cerința arhitecturii noastre este ca intrarea și ieșirea sa să aibă aceeași dimensionalitate.

Vom explora detaliile acestor alegeri mai detaliat mai jos.

Procesul înainte și LT

După cum sa menționat mai sus, în ceea ce privește procesul forward, trebuie să definim programul de variație. În special, le-am stabilit să fie constante dependente de timp, ignorând faptul că pot fi învățate. De exemplu[3], un program liniar din β1= 10-4 la βT=0.2 ar putea fi folosit, sau poate o serie geometrică.

Indiferent de valorile particulare alese, faptul că programul de variație este fix are ca rezultat LT devenind o constantă în ceea ce privește setul nostru de parametri de învățare, permițându-ne să-l ignorăm în ceea ce privește antrenamentul.

Proces invers și L1:T−1

Acum discutăm despre alegerile necesare în definirea procesului invers. Amintiți-vă de mai sus, am definit tranzițiile inverse Markov ca Gaussian:

Acum trebuie să definim formele funcționale ale lui μθ sau Σθ. Deși există modalități mai complicate de a parametriza Σθ[5], pur și simplu setăm

Adică, presupunem că gaussianul multivariat este un produs al gaussienilor independenți cu varianță identică, o valoare a varianței care se poate modifica în timp. Noi setați aceste variații pentru a fi echivalente cu programul nostru de variații ale procesului înainte.

Având în vedere această nouă formulare a lui Σθ, noi avem

care ne permite să ne transformăm

la

unde primul termen din diferență este o combinație liniară a lui xt și x0 care depinde de schema de variație βt. Forma exactă a acestei funcții nu este relevantă pentru scopurile noastre, dar poate fi găsită în [3].

Semnificația proporției de mai sus este aceea că cea mai simplă parametrizare a lui μθ pur și simplu prezice media posterioară a difuziei. Foarte important, autorii lui [3] a constatat de fapt că antrenamentul μθ pentru a prezice zgomot componenta la orice pas de timp dat produce rezultate mai bune. În special, lasă

Unde

Aceasta conduce la următoarea funcție alternativă de pierdere, pe care autorii lui [3] s-a dovedit a duce la un antrenament mai stabil și la rezultate mai bune:

Autorii lui [3] notează, de asemenea, conexiunile acestei formulări a modelelor de difuzie cu modelele generative de potrivire a scorurilor bazate pe dinamica Langevin. Într-adevăr, se pare că modelele de difuzie și modelele bazate pe scoruri pot fi două fețe ale aceleiași monede, asemănătoare cu dezvoltarea independentă și concomitentă a mecanicii cuantice bazate pe unde și a mecanicii cuantice bazate pe matrice, care dezvăluie două formulări echivalente ale acelorași fenomene.[2].

Arhitectura rețelei

În timp ce funcția noastră de pierdere simplificată încearcă să antreneze un model ϵθ, încă nu am definit arhitectura acestui model. Rețineți că afară  cerința pentru model este ca dimensionalitatea de intrare și de ieșire să fie identică.

Având în vedere această restricție, poate nu este surprinzător faptul că modelele de difuzie a imaginii sunt implementate în mod obișnuit cu arhitecturi asemănătoare U-Net.

Decodor de proces invers și L0

Calea de-a lungul procesului invers constă din multe transformări sub distribuții gaussiene condiționate continue. La sfârșitul procesului invers, amintiți-vă că încercăm să producem un imagine, care este compus din valori întregi de pixeli. Prin urmare, trebuie să găsim o modalitate de a obține probabilități discrete (log). pentru fiecare valoare posibilă a pixelilor pe toți pixelii.

Modul în care se face acest lucru este prin setarea ultimei tranziții în lanțul de difuzie inversă la an decodor discret independent. Pentru a determina probabilitatea unei imagini date x0 dat x1, impunem mai întâi independența între dimensiunile datelor:

unde D este dimensionalitatea datelor și indicele i indică extragerea unei coordonate. Scopul acum este de a determina cât de probabilă este fiecare valoare întreagă pentru un anumit pixel dat distribuția între valorile posibile pentru pixelul corespunzător din imaginea ușor zgomotată la momentul t=1:

unde distribuțiile de pixeli pentru t=1 sunt derivate din Gaussianul multivariat de mai jos, a cărui matrice de covarianță diagonală ne permite să împărțim distribuția într-un produs de Gaussieni univariați, câte unul pentru fiecare dimensiune a datelor:

Presupunem că imaginile constau din numere întregi în 0,1,…,255 (cum fac imaginile RGB standard) care au fost scalate liniar la [−1,1]. Apoi împărțim linia reală în mici „găleți”, unde, pentru o anumită valoare a pixelului scalat x, găleata pentru acel interval este [x−1/255, x+1/255]. Probabilitatea unei valori a pixelului x, dată fiind distribuția gaussiană univariată a pixelului corespunzător în x1, este zonă sub acea distribuție gaussiană univariată în găleată centrată pe x.

Mai jos puteți vedea aria pentru fiecare dintre aceste găleți cu probabilitățile lor pentru un gaussian mediu-0 care, în acest context, corespunde unei distribuții cu o valoare medie a pixelilor de 255/2 (jumătate de luminozitate). Curba roșie reprezintă distribuția unui anumit pixel în t = 1 imaginea, iar zonele oferă probabilitatea valorii pixelului corespunzătoare în t = 0 imagine.

Notă tehnică

Prima și ultima găleată se extind până la -inf și +inf pentru a păstra probabilitatea totală.

Dat fiind un t = 0 valoarea pixelului pentru fiecare pixel, valoarea pθ(x0|x1) este pur și simplu produsul lor. Acest proces este încapsulat succint de următoarea ecuație:

Unde

și

Având în vedere această ecuație pentru pθ(x0|x1), putem calcula termenul final al lui Lvlb care nu este formulat ca o divergență KL:

Obiectiv final

După cum sa menționat în ultima secțiune, autorii lui [3] a descoperit că prezicerea componentei de zgomot a unei imagini la un anumit pas de timp a produs cele mai bune rezultate. În cele din urmă, folosesc următorul obiectiv:

Prin urmare, algoritmii de antrenament și eșantionare pentru modelul nostru de difuzie pot fi capturați succint în figura de mai jos:

Rezumatul teoriei modelului de difuzie

În această secțiune am făcut o scufundare detaliată în teoria modelelor de difuzie. Poate fi ușor să fii prins în detalii matematice, așa că notăm cele mai importante puncte din această secțiune de mai jos pentru a ne menține orientați dintr-o perspectivă de ochi:

  1. Modelul nostru de difuzie este parametrizat ca a lanțul Markov, ceea ce înseamnă că variabilele noastre latente x1,…,XT depinde numai de pasul de timp anterior (sau următor).
  2.  distribuții de tranziție în lanţul Markov sunt Gaussian, unde procesul înainte necesită un program de variație, iar parametrii procesului invers sunt învățați.
  3. Procesul de difuzie asigură că xT is distribuite asimptotic ca un gaussian izotrop pentru T suficient de mare.
  4. În cazul nostru, programul de variație a fost fixat, dar se poate învăța și. Pentru programele fixe, urmărirea unei progresii geometrice poate oferi rezultate mai bune decât o progresie liniară. În ambele cazuri, varianțele cresc în general cu timpul în serie (adică βij pentru eu
  5. Modelele de difuzie sunt foarte flexibil și permiteți Orice arhitectură a cărei dimensionalitate de intrare și de ieșire este aceeași pentru a fi utilizată. Multe implementări folosesc U-Net-like arhitecturi.
  6.  obiectiv de formare este de a maximiza probabilitatea datelor de antrenament. Acest lucru se manifestă prin reglarea parametrilor modelului la minimizați limita superioară variațională a probabilității log negative a datelor.
  7. Aproape toți termenii din funcția obiectiv pot fi exprimați ca KL Divergențe ca urmare a presupunerii noastre Markov. Aceste valori devin sustenabil de calculat dat fiind că folosim gaussieni, omițând, prin urmare, necesitatea efectuării aproximării Monte Carlo.
  8. În cele din urmă, folosind un obiectiv de formare simplificat a antrena o funcție care prezice componenta de zgomot a unei anumite variabile latente produce cele mai bune și mai stabile rezultate.
  9. decodor discret este utilizat pentru a obține probabilități de logare între valorile pixelilor ca ultimul pas în procesul de difuzie inversă.

Având această prezentare generală la nivel înalt a modelelor de difuzie în mintea noastră, să trecem să vedem cum să folosim modelele de difuzie în PyTorch.

Modele de difuzie în PyTorch

Deși modelele de difuzie nu au fost încă democratizate în aceeași măsură ca alte arhitecturi/abordări mai vechi din Machine Learning, există încă implementări disponibile pentru utilizare. Cel mai simplu mod de a folosi un model de difuzie în PyTorch este să utilizați denoising-diffusion-pytorch pachet, care implementează un model de difuzare a imaginii precum cel discutat în acest articol. Pentru a instala pachetul, introduceți pur și simplu următoarea comandă în terminal:

pip install denoising_diffusion_pytorch

Exemplu minim

Pentru a antrena un model și a genera imagini, importăm mai întâi pachetele necesare:

import torch
from denoising_diffusion_pytorch import Unet, GaussianDiffusion

În continuare, definim arhitectura noastră de rețea, în acest caz un U-Net. The dim parametrul specifică numărul de hărți de caracteristici înainte de prima eșantionare redusă și dim_mults parametrul furnizează multiplicanți pentru această valoare și eșantionări reduse succesive:

model = Unet(
 dim = 64,
 dim_mults = (1, 2, 4, 8)
)

Acum că arhitectura noastră de rețea este definită, trebuie să definim modelul de difuzie în sine. Trecem în modelul U-Net pe care tocmai l-am definit împreună cu câțiva parametri – dimensiunea imaginilor de generat, numărul de pași de timp în procesul de difuzie și o alegere între normele L1 și L2.

diffusion = GaussianDiffusion(
 model,
 image_size = 128,
 timesteps = 1000, # number of steps
 loss_type = 'l1' # L1 or L2
)

Acum că modelul de difuzie este definit, este timpul să ne antrenăm. Generăm date aleatorii pentru a ne antrena, apoi antrenăm modelul de difuzie în modul obișnuit:

training_images = torch.randn(8, 3, 128, 128)
loss = diffusion(training_images)
loss.backward()

Odată ce modelul este antrenat, putem genera în sfârșit imagini folosind sample() metodă a diffusion obiect. Aici generăm 4 imagini, care sunt doar zgomot, având în vedere că datele noastre de antrenament au fost aleatorii:

sampled_images = diffusion.sample(batch_size = 4)

Instruire despre date personalizate

 denoising-diffusion-pytorch pachetul vă permite, de asemenea, să antrenați un model de difuzie pe un anumit set de date. Pur și simplu înlocuiți 'path/to/your/images' șir cu calea directorului setului de date în Trainer() obiectul de mai jos și schimbați image_size la valoarea corespunzătoare. După aceea, pur și simplu rulați codul pentru a antrena modelul și apoi eșantionați ca înainte. Rețineți că PyTorch trebuie să fie compilat cu CUDA activat pentru a utiliza Trainer clasă:

from denoising_diffusion_pytorch import Unet, GaussianDiffusion, Trainer
model = Unet(
 dim = 64,
 dim_mults = (1, 2, 4, 8)
).cuda()
diffusion = GaussianDiffusion(
 model,
 image_size = 128,
 timesteps = 1000, # number of steps
 loss_type = 'l1' # L1 or L2
).cuda()
trainer = Trainer(
 diffusion,
 'path/to/your/images',
 train_batch_size = 32,
 train_lr = 2e-5,
 train_num_steps = 700000, # total training steps
 gradient_accumulate_every = 2, # gradient accumulation steps
 ema_decay = 0.995, # exponential moving average decay
 amp = True # turn on mixed precision
)
trainer.train()

Mai jos puteți vedea dezgomotul progresiv de la zgomotul gaussian multivariat la cifre MNIST asemănătoare difuziei inverse:

Ultimele cuvinte

Modelele de difuzie sunt o abordare conceptuală simplă și elegantă a problemei generării datelor. Rezultatele lor de ultimă generație, combinate cu antrenamentul non-adversarial, i-au propulsat la cote mari și se pot aștepta îmbunătățiri suplimentare în următorii ani, având în vedere statutul lor în curs de dezvoltare. În special, modelele de difuzie s-au dovedit a fi esențiale pentru performanța modelelor de ultimă generație, cum ar fi DALL-E2.

Referinte

[1] Învățare profundă nesupravegheată folosind termodinamica de neechilibru

[2] Modelare generativă prin estimarea gradienților distribuției datelor

[3] Modele probabilistice de difuzie de dezgomot

[4] Tehnici îmbunătățite pentru antrenamentul modelelor generative bazate pe scoruri

[5] Modele probabilistice de difuzie îmbunătățite

[6] Modelele de difuzie bat GAN-urile pe sinteza imaginilor

[7] GLIDE: către generarea și editarea imaginilor fotorealiste cu modele de difuzie ghidate de text

[8] Generare ierarhică de imagini condiționate de text cu latente CLIP

Bucurați-vă de acest articol? Înscrieți-vă pentru mai multe actualizări ale cercetării AI.

Vă vom anunța când vom lansa mai multe articole sumare ca acesta.

Chat cu noi

Bună! Cu ce ​​​​vă pot ajuta?