Back to Annotated Deep Learning Paper Implementations

විසරණ සම්භාවිතා ආකෘති නිරූපණය කිරීම (DDPM)

docs/si/diffusion/ddpm/index.html

latest10.9 KB
Original Source

homediffusionddpm

[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/diffusion/ddpm/ init.py)

#

විසරණ සම්භාවිතා ආකෘති නිරූපණය කිරීම (DDPM)

මෙය PyTorch ක්රියාත්මක කිරීම/නිබන්ධනයකි කඩදාසි Denoising Diffusion Probilistic ආකෘති.

සරළව කිවහොත්, අපි දත්ත වලින් රූපයක් ලබාගෙන පියවරෙන් පියවර ශබ්දය එක් කරමු. ඉන්පසු අපි සෑම පියවරකදීම එම ශබ්දය පුරෝකථනය කිරීමට ආකෘතියක් පුහුණු කර රූප ජනනය කිරීමට ආකෘතිය භාවිතා කරමු.

පහත දැක්වෙන අර්ථ දැක්වීම් සහ ව්යුත්පන්නයන් මෙය ක්රියාත්මක වන ආකාරය පෙන්වයි. විස්තර සඳහා කරුණාකර කඩදාසි වෙත යොමු වන්න.

ඉදිරි ක්රියාවලිය

ඉදිරි ක්රියාවලියT කාලසටහන සඳහා දත්තx0​∼q(x0​) වලට ශබ්දය එක් කරයි.

q(xt​∣xt−1​)=N(xt​;1−βt​​xt−1​,βt​I)q(x1:T​∣x0​)=t=1∏T​q(xt​∣xt−1​)​

විචලනය කාලසටහනβ1​,…,βT​ කොහේද?

අපට ඕනෑමxt​ වේලාවකt නියැදිය හැකිය,

q(xt​∣x0​)​=N(xt​;αt​ˉ​​x0​,(1−αt​ˉ​)I)​

αt​=1−βt​කොහේද සහαt​ˉ​=∏s=1t​αs​

ප්රතිලෝම ක්රියාවලිය

ප්රතිලෝම ක්රියාවලිය මඟින්T කාල පියවරp(xT​)=N(xT​;0,I) සඳහා ආරම්භ වන ශබ්දය ඉවත් කරයි.

pθ​(xt−1​∣xt​)pθ​(x0:T​)pθ​(x0​)​=N(xt−1​;μθ​(xt​,t),Σθ​(xt​,t))=pθ​(xT​)t=1∏T​pθ​(xt−1​∣xt​)=∫pθ​(x0:T​)dx1:T​​

θඅපි පුහුණු පරාමිතීන් වේ.

පාඩුව

ELBO (ජෙන්සන්ගේ අසමානතාවයෙන්) සෘණ ලොග් සම්භාවිතාව මත අපි ප්රශස්තිකරණය කරමු.

E[−logpθ​(x0​)]​≤Eq​[−logq(x1:T​∣x0​)pθ​(x0:T​)​]=L​

අලාභය පහත පරිදි නැවත ලිවිය හැකිය.

L​=Eq​[−logq(x1:T​∣x0​)pθ​(x0:T​)​]=Eq​[−logp(xT​)−t=1∑T​logq(xt​∣xt−1​)pθ​(xt−1​∣xt​)​]=Eq​[−logq(xT​∣x0​)p(xT​)​−t=2∑T​logq(xt−1​∣xt​,x0​)pθ​(xt−1​∣xt​)​−logpθ​(x0​∣x1​)]=Eq​[DKL​(q(xT​∣x0​)∥p(xT​))+t=2∑T​DKL​(q(xt−1​∣xt​,x0​)∥pθ​(xt−1​∣xt​))−logpθ​(x0​∣x1​)]​

DKL​(q(xT​∣x0​)∥p(xT​))අපි නියතව සිටින බැවින්β1​,…,βT​ නියත වේ.

පරිගණකකරණයLt−1​=DKL​(q(xt−1​∣xt​,x0​)∥pθ​(xt−1​∣xt​))

ඉදිරි ක්රියාවලිය posterior විසින් සමනයx0​ වේ,

q(xt−1​∣xt​,x0​)μ​t​(xt​,x0​)βt​​​=N(xt−1​;μ​t​(xt​,x0​),βt​​I)=1−αt​ˉ​αˉt−1​​βt​​x0​+1−αt​ˉ​αt​​(1−αˉt−1​)​xt​=1−αt​ˉ​1−αˉt−1​​βt​​

කඩදාසි නියතයන්ට සකසාσt2​ ඇතිΣθ​(xt​,t)=σt2​I තැන සකසයිβt​ හෝβt​~​.

එවිට,pθ​(xt−1​∣xt​)=N(xt−1​;μθ​(xt​,t),σt2​I)

ලබා දී ඇති ශබ්දයϵ∼N(0,I) සඳහාq(xt​∣x0​)

xt​(x0​,ϵ)x0​​=αt​ˉ​​x0​+1−αt​ˉ​​ϵ=αt​ˉ​​1​(xt​(x0​,ϵ)−1−αt​ˉ​​ϵ)​

මෙය ලබා දෙයි,

Lt−1​​=DKL​(q(xt−1​∣xt​,x0​)∥pθ​(xt−1​∣xt​))=Eq​[2σt2​1​∥∥​μ~​(xt​,x0​)−μθ​(xt​,t)∥∥​2]=Ex0​,ϵ​[2σt2​1​∥∥​αt​​1​(xt​(x0​,ϵ)−1−αt​ˉ​​βt​​ϵ)−μθ​(xt​(x0​,ϵ),t)∥∥​2]​

ශබ්දය පුරෝකථනය කිරීම සඳහා ආකෘතියක් සමඟ නැවත පරාමිතිකරණය කිරීම

μθ​(xt​,t)​=μ~​(xt​,αt​ˉ​​1​(xt​−1−αt​ˉ​​ϵθ​(xt​,t)))=αt​​1​(xt​−1−αt​ˉ​​βt​​ϵθ​(xt​,t))​

ϵලබා දීϵθ​ ඇති අනාවැකි පළ කරන උගත් ශ්රිතයක්(xt​,t) කොහේද?

මෙය ලබා දෙයි,

Lt−1​​=Ex0​,ϵ​[2σt2​αt​(1−αt​ˉ​)βt​2​∥∥​ϵ−ϵθ​(αt​ˉ​​x0​+1−αt​ˉ​​ϵ,t)∥∥​2]​

එනම්, අපි ශබ්දය පුරෝකථනය කිරීමට පුහුණු වෙමු.

සරල කළ අලාභය

Lsimple​(θ)=Et,x0​,ϵ​[∥∥​ϵ−ϵθ​(αt​ˉ​​x0​+1−αt​ˉ​​ϵ,t)∥∥​2]

බර කිරන−logpθ​(x0​∣x1​) විටt=1 සහt>1 ඉවතලීමLt−1​ සඳහා මෙය අවම කරයිLt−1​. බර2σt2​αt​(1−αt​ˉ​)βt​2​ ඉවතලීම ඉහළt (ඉහළ ශබ්ද මට්ටම් ඇති) ලබා දෙන බර වැඩි කරයි, එබැවින් නියැදියේ ගුණාත්මකභාවය වැඩි කරයි.

මෙම ගොනුව මඟින් පාඩු ගණනය කිරීම සහ පුහුණුව අතරතුර රූප ජනනය කිරීම සඳහා අප භාවිතා කරන මූලික නියැදි ක්රමයක් ක්රියාත්මක කරයි.

කේතය ලබා දෙනϵθ​(xt​,t) සහ පුහුණු කරන UNET ආකෘතිය මෙන්න. මෙම ගොනුවට පුහුණු ආකෘතියකින් සාම්පල සහ අන්තර්නිවේශනයන් ජනනය කළ හැකිය.

162fromtypingimportTuple,Optional163164importtorch165importtorch.nn.functionalasF166importtorch.utils.data167fromtorchimportnn168169fromlabml\_nn.diffusion.ddpm.utilsimportgather

#

ඩෙනොයිස්විසරණය

172classDenoiseDiffusion:

#

  • eps_modelϵθ​(xt​,t) ආකෘතිය වේ

  • n_steps වේ t

  • device නියතයන් මත තැබීමට උපාංගය වේ

177def\_\_init\_\_(self,eps\_model:nn.Module,n\_steps:int,device:torch.device):

#

183super().\_\_init\_\_()184self.eps\_model=eps\_model

#

β1​,…,βT​ රේඛීයව වැඩිවන විචල්යතා කාලසටහනක් සාදන්න

187self.beta=torch.linspace(0.0001,0.02,n\_steps).to(device)

#

αt​=1−βt​

190self.alpha=1.-self.beta

#

αt​ˉ​=∏s=1t​αs​

192self.alpha\_bar=torch.cumprod(self.alpha,dim=0)

#

T

194self.n\_steps=n\_steps

#

σ2=β

196self.sigma2=self.beta

#

q(xt​∣x0​) බෙදා හැරීම ලබා ගන්න

q(xt​∣x0​)​=N(xt​;αt​ˉ​​x0​,(1−αt​ˉ​)I)​

198defq\_xt\_x0(self,x0:torch.Tensor,t:torch.Tensor)-\>Tuple[torch.Tensor,torch.Tensor]:

#

රැස් αt​ කර ගණනය කරන්න αt​ˉ​​x0​

208mean=gather(self.alpha\_bar,t)\*\*0.5\*x0

#

(1−αt​ˉ​)I

210var=1-gather(self.alpha\_bar,t)

#

212returnmean,var

#

වෙතින්නියැදිය q(xt​∣x0​)

q(xt​∣x0​)​=N(xt​;αt​ˉ​​x0​,(1−αt​ˉ​)I)​

214defq\_sample(self,x0:torch.Tensor,t:torch.Tensor,eps:Optional[torch.Tensor]=None):

#

ϵ∼N(0,I)

224ifepsisNone:225eps=torch.randn\_like(x0)

#

ලබාගන්න q(xt​∣x0​)

228mean,var=self.q\_xt\_x0(x0,t)

#

වෙතින්නියැදිය q(xt​∣x0​)

230returnmean+(var\*\*0.5)\*eps

#

වෙතින්නියැදිය pθ​(xt−1​∣xt​)

pθ​(xt−1​∣xt​)μθ​(xt​,t)​=N(xt−1​;μθ​(xt​,t),σt2​I)=αt​​1​(xt​−1−αt​ˉ​​βt​​ϵθ​(xt​,t))​

232defp\_sample(self,xt:torch.Tensor,t:torch.Tensor):

#

ϵθ​(xt​,t)

246eps\_theta=self.eps\_model(xt,t)

#

රැස් කරන්න αt​ˉ​

248alpha\_bar=gather(self.alpha\_bar,t)

#

αt​

250alpha=gather(self.alpha,t)

#

1−αt​ˉ​​β​

252eps\_coef=(1-alpha)/(1-alpha\_bar)\*\*.5

#

αt​​1​(xt​−1−αt​ˉ​​βt​​ϵθ​(xt​,t))

255mean=1/(alpha\*\*0.5)\*(xt-eps\_coef\*eps\_theta)

#

σ2

257var=gather(self.sigma2,t)

#

ϵ∼N(0,I)

260eps=torch.randn(xt.shape,device=xt.device)

#

නියැදිය

262returnmean+(var\*\*.5)\*eps

#

සරලඅඞු කිරීමට

Lsimple​(θ)=Et,x0​,ϵ​[∥∥​ϵ−ϵθ​(αt​ˉ​​x0​+1−αt​ˉ​​ϵ,t)∥∥​2]

264defloss(self,x0:torch.Tensor,noise:Optional[torch.Tensor]=None):

#

කණ්ඩායම්ප්රමාණය ලබා ගන්න

273batch\_size=x0.shape[0]

#

කණ්ඩායමේඑක් එක් නියැදිය t සඳහා අහඹු ලෙස ලබා ගන්න

275t=torch.randint(0,self.n\_steps,(batch\_size,),device=x0.device,dtype=torch.long)

#

ϵ∼N(0,I)

278ifnoiseisNone:279noise=torch.randn\_like(x0)

#

xt​ සඳහා නියැදිය q(xt​∣x0​)

282xt=self.q\_sample(x0,t,eps=noise)

#

ලබාගන්න ϵθ​(αt​ˉ​​x0​+1−αt​ˉ​​ϵ,t)

284eps\_theta=self.eps\_model(xt,t)

#

MSEඅලාභය

287returnF.mse\_loss(noise,eps\_theta)

Trending Research Paperslabml.ai