可以观看Diffusion model来学习一些Diffusion model内容:链接
Diffusion model定义了总的来说就是包含一个扩散过程和一个逆扩散过程,扩散过程中使用马尔可夫链将噪声加入到数据中,逆扩散过程是用噪声构造所需的数据样本。这两个过程都是迭代完成的。
训练好的模型就没有前向过程了。
前向传播过程:
①首先引入一个式子 α t = 1 − β t \alpha_t=1-\beta_t αt=1−βt,其中 β \beta β要越来越大,论文中是0.0001到0.002,也就是说 α \alpha α要越来越小。
其中 α t \alpha_t αt类似于如下图。(注意:可以使用线性变小,也可使用其他的方法)
②然后再来看
设 x t x_t xt是t时刻的一个分布,可以看上面前向过程的图,可以看出 x t x_t xt时刻当前分布是由 x t − 1 x_{t-1} xt−1时刻计算出来,加了些噪音,类似于RNN递归结构。
公式 为 x t = α t x t − 1 + 1 − α t z 1 x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}z_1 xt=αtxt−1+1−αtz1
z 1 z_1 z1可以理解为噪音。
α t \sqrt{\alpha_t} αt和 1 − α t \sqrt{1-\alpha_t} 1−αt可以理解为两个权重。
③然后看最开始的公式,越到最后 α t \alpha_t αt越小,也就是 α t \sqrt{\alpha_t} αt越小, 1 − α t \sqrt{1-\alpha_t} 1−αt越大,说明越往后加的噪声影响越大。
现在想一个问题,如果是递归,从 x 0 x_0 x0运算到 x t x_t xt会不会太慢了
可不可以直接从 x 0 x_0 x0直接得到 x t x_t xt ?
④先计算 x t − 1 x_{t-1} xt−1:
x t − 1 = α t − 1 x t − 2 + 1 − α t − 1 z 2 x_{t-1}=\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_2 xt−1=αt−1xt−2+1−αt−1z2
然后带入到 x t x_t xt中得到:
x t = α t ( α t − 1 x t − 2 + 1 − α t − 1 z 2 ) + 1 − α t z 1 x_t=\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_2)+\sqrt{1-\alpha_t}z_1 xt=αt(αt−1xt−2+1−αt−1z2)+1−αtz1
展开:
x t = α t α t − 1 x t − 2 + ( a t ( 1 − α t − 1 ) z 2 + 1 − α t z 1 ) x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{a_t(1-\alpha_{t-1})}z_2+\sqrt{1-\alpha_t}z_1) xt=αtαt−1xt−2+(at(1−αt−1)z2+1−αtz1)
⑤因为 z 1 和 z 2 z_1和z_2 z1和z2都符合高斯分布分别为 N ( 0 , 1 − α t ) N(0,1-\alpha_t) N(0,1−αt)和 N ( 0 , α t ( 1 − α t − 1 ) N(0,\alpha_t(1-\alpha_{t-1}) N(0,αt(1−αt−1)
相加后仍然符合高斯分布:
所以可以化简为:
x t = α t ‾ x 0 + 1 − α t ‾ z t x_t=\sqrt{\overline{\alpha_t}}x_{0}+\sqrt{1-\overline{\alpha_t}}z_t xt=αtx0+1−αtzt
所以任意时刻的 x t x_t xt都可以通过 x 0 x_0 x0得到。
接下来是逆向过程。
逆向过程是一个去噪的过程,也就是上面那个逆过程。
目前没有办法直接从 x t x_t xt直接算到 x 0 x_0 x0
⑥逆向过程就是 x t x_t xt求 x t − 1 x_{t-1} xt−1
利用贝叶斯公式求:
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(x_{t-1}|x_t,x_0)= q(x_{t}|x_{t-1},x_0)\frac{q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})} q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)
根据上面⑤讲的:
⑦正态分布:一个数学期望为μ、方差为 σ 2 σ^2 σ2的正态分布 X ∼ N ( μ , σ 2 ) X\sim N(μ,σ^2) X∼N(μ,σ2)
函数为: e x p ( − ( X − μ ) 2 2 σ 2 ) exp(-\frac{(X-μ)^2}{2σ^2}) exp(−2σ2(X−μ)2)
正态分布展开后,乘法就相当于加,除法就相当于减。
则 q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(x_{t}|x_{t-1},x_0)\frac{q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})} q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)
继续化简:
⑧
C是个常数项,不影响。
这个式子跟上面的式子进行对比,可以得到期望和方差。
根据公式⑧可以得到
之前说 x t x_t xt可以由 x 0 x_0 x0计算得到,现在逆运算一下
x 0 = 1 α ‾ t ( x t − 1 − α ‾ t z t ) x_0 = \frac{1}{\sqrt{\overline\alpha_{t}}}(x_t-\sqrt{1-\overline\alpha_t}z_t) x0=αt1(xt−1−αtzt)
最终结果 u ~ = 1 α ‾ t ( x t − β t 1 − α ‾ t z t ) \widetilde u =\frac{1}{\sqrt{\overline\alpha_{t}}}(x_t-\frac{\beta_t}{\sqrt{1-\overline\alpha_t}}z_t) u =αt1(xt−1−αtβtzt)
⑨ z t z_t zt 怎么求?
z t z_t zt其实就是我们要估计的每一个时刻的噪声
我们可以训练一个模型来进行计算,一些相关论文里使用的unet结构来进行计算。
UNet是一样的,传进来输入是不同的。
(2)首先先取数据->(3)构建T序列->(4)加符合正态分布的噪声->(5)模型学习
细节:
①在3中假设batch是4个,T为200,每一个img会随机取T值,比如 T 1 T_1 T1=30, T 2 T_2 T2=150, T 3 T_3 T3=60, T 4 T_4 T4=180,
②在5中,其中 ϵ θ \epsilon_{\theta} ϵθ为神经网络模型,通过输入 x t x_t xt和 t t t预测 ϵ \epsilon ϵ,目标为缩小与真实的 ϵ \epsilon ϵ的差距。 t t t相当于是一个时刻(t越大,噪声越大,要告诉模型),类似于transformer的位置编码。
再看一下损失,前面的 ϵ \epsilon ϵ为真实值,减去后面那一坨(预测值),就是损失。
总的来说就是为了得到Unet模型,在unet中还有attention。
(1)首先随机得到一个正态分布->(2)循环(从T->0) ->(3)噪音点,最后一步不用加,t>1时候加->(4)最重要公式,得到 x t − 1 x_{t-1} xt−1
细节: 代码中在第四步还有重采样过程,得到了u和σ分布,需要采样得到实际图像。