docs/si/diffusion/ddpm/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/diffusion/ddpm/ init.py)
මෙය PyTorch ක්රියාත්මක කිරීම/නිබන්ධනයකි කඩදාසි Denoising Diffusion Probilistic ආකෘති.
සරළව කිවහොත්, අපි දත්ත වලින් රූපයක් ලබාගෙන පියවරෙන් පියවර ශබ්දය එක් කරමු. ඉන්පසු අපි සෑම පියවරකදීම එම ශබ්දය පුරෝකථනය කිරීමට ආකෘතියක් පුහුණු කර රූප ජනනය කිරීමට ආකෘතිය භාවිතා කරමු.
පහත දැක්වෙන අර්ථ දැක්වීම් සහ ව්යුත්පන්නයන් මෙය ක්රියාත්මක වන ආකාරය පෙන්වයි. විස්තර සඳහා කරුණාකර කඩදාසි වෙත යොමු වන්න.
ඉදිරි ක්රියාවලියT කාලසටහන සඳහා දත්තx0∼q(x0) වලට ශබ්දය එක් කරයි.
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x1:T∣x0)=t=1∏Tq(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∏Tpθ(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∑Tlogq(xt∣xt−1)pθ(xt−1∣xt)]=Eq[−logq(xT∣x0)p(xT)−t=2∑Tlogq(xt−1∣xt,x0)pθ(xt−1∣xt)−logpθ(x0∣x1)]=Eq[DKL(q(xT∣x0)∥p(xT))+t=2∑TDKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))−logpθ(x0∣x1)]
DKL(q(xT∣x0)∥p(xT))අපි නියතව සිටින බැවින්β1,…,βT නියත වේ.
ඉදිරි ක්රියාවලිය posterior විසින් සමනයx0 වේ,
q(xt−1∣xt,x0)μt(xt,x0)βt=N(xt−1;μt(xt,x0),βtI)=1−αtˉαˉt−1βtx0+1−αtˉαt(1−αˉt−1)xt=1−αtˉ1−αˉt−1βt
කඩදාසි නියතයන්ට සකසාσt2 ඇතිΣθ(xt,t)=σt2I තැන සකසයිβt හෝβt~.
එවිට,pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),σt2I)
ලබා දී ඇති ශබ්දයϵ∼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σt21∥∥μ~(xt,x0)−μθ(xt,t)∥∥2]=Ex0,ϵ[2σt21∥∥αt1(xt(x0,ϵ)−1−αtˉβtϵ)−μθ(xt(x0,ϵ),t)∥∥2]
ශබ්දය පුරෝකථනය කිරීම සඳහා ආකෘතියක් සමඟ නැවත පරාමිතිකරණය කිරීම
μθ(xt,t)=μ~(xt,αtˉ1(xt−1−αtˉϵθ(xt,t)))=αt1(xt−1−αtˉβtϵθ(xt,t))
ϵලබා දීϵθ ඇති අනාවැකි පළ කරන උගත් ශ්රිතයක්(xt,t) කොහේද?
මෙය ලබා දෙයි,
Lt−1=Ex0,ϵ[2σt2αt(1−αtˉ)βt2∥∥ϵ−ϵθ(α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ˉ)βt2 ඉවතලීම ඉහළ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)=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)=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)μθ(xt,t)=N(xt−1;μθ(xt,t),σt2I)=αt1(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
αt1(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)