DDPM(Diffusion)个人总结
注:这是笔者自己的笔记,主要供复习使用,因此比较粗糙,详细过程请移步其余优秀博客
最终目的:得到p(x0∣xT)p(x_0|x_T)p(x0∣xT)。其中TTT是加噪的步数,是预先定义的;注意,这里学习的是x0x_0x0的分布,而不是x0x_0x0!
为了实现这个目的,我们的模型真正学习的是:p(xt−1∣xt)p(x_{t-1}|x_t)p(xt−1∣xt),有了这样的模型,我们就可以一步步,由xTx_TxT一直推理到x0x_0x0了。
而前向(加噪)过程是已经被定下来的:xt=αtxt−1+βtεtx_t=\sqrt{α_t}x_{t-1}+\sqrt{β_t}ε_txt=αtxt−1+βtεt,其中εt∼N(0,I)ε_t\sim N(0,I)εt∼N(0,I),于是xt∼N(αtxt−1,βt)x_t\sim N(\sqrt{α_t}x_{t-1},β_t)xt∼N(αtxt−1,βt),于是xt=α˜tx0+β˜tεx_t=\sqrt{\~α_t}x_{0}+\sqrt{\~β_t}εxt=α˜tx0+β˜tε,其中ε∼N(0,I)ε\sim N(0,I)ε∼N(0,I)。
现在,求p(xt−1∣xt)p(x_{t-1}|x_t)p(xt−1∣xt)。根据贝叶斯公式,推导出xt−1=μˉ(x0,xt)+β˜tεx_{t-1}=\bar{μ}(x_0,x_t)+\sqrt{\~β_t}εxt−1=μˉ(x0,xt)+β˜tε,其中ε∼N(0,I)ε\sim N(0,I)ε∼N(0,I),μˉ(x0,xt)=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt\bar{\mu}(x_0, x_t) = \frac{\sqrt{\bar{\alpha}_{t-1}} \, \beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t} (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_tμˉ(x0,xt)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt。注意,在训练时,x0x_0x0是已知的原图,可以直接使用。但推理时,x0x_0x0是未知的,就需要进行预测。(以下为推理时的公式)
如何预测呢?由于xt=α˜tx0+β˜tεx_t=\sqrt{\~α_t}x_{0}+\sqrt{\~β_t}εxt=α˜tx0+β˜tε,可以得到x0=xt−1−αˉtϵαˉtx_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t}\, \epsilon}{\sqrt{\bar{\alpha}_t}}x0=αˉtxt−1−αˉtϵ。注意,这里可不是直接可以推理得到最终生成图片x0x_0x0了。公式上当然是的,但效果会很差。这里的x0x_0x0只是用来推理xt−1x_{t-1}xt−1的一个小零件。我们的U-net输出的噪声就是此处公式中的噪声εεε,即当初生成xtx_txt时的噪声。
将x0x_0x0带入μˉ(x0,xt)\bar{\mu}(x_0, x_t)μˉ(x0,xt),有μˉ(x0,xt)=1αt(xt−βt1−αˉt)\bar{\mu}(x_0, x_t)=\frac{1}{\sqrt{α_t}}(x_t-\frac{β_t}{\sqrt{1-\bar{α}_t}})μˉ(x0,xt)=αt1(xt−1−αˉtβt)。
于是,现在:xt−1=μˉ(x0,xt)+β˜tεx_{t-1}=\bar{μ}(x_0,x_t)+\sqrt{\~β_t}εxt−1=μˉ(x0,xt)+β˜tε,我们对这里的εεε随机采样,就可以得到预测的xt−1x_{t-1}xt−1了。