Diffusion model笔记

可以观看Diffusion model来学习一些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} xt1时刻计算出来,加了些噪音,类似于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=αt xt1+1αt z1
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} xt1:
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 xt1=αt1 xt2+1αt1 z2
然后带入到 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 (αt1 xt2+1αt1 z2)+1αt z1
展开:
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 αt1 xt2+(at(1αt1) z2+1αt z1)

⑤因为 z 1 和 z 2 z_1和z_2 z1z2都符合高斯分布分别为 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αt1))
相加后仍然符合高斯分布:在这里插入图片描述
所以可以化简为:
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=αt x0+1αt zt
所以任意时刻的 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} xt1
利用贝叶斯公式求:
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(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)

根据上面⑤讲的:
在这里插入图片描述
⑦正态分布:一个数学期望为μ、方差为 σ 2 σ^2 σ2的正态分布 X ∼ N ( μ , σ 2 ) X\sim N(μ,σ^2) XN(μ,σ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(xtxt1,x0)q(xtx0)q(xt1x0)
在这里插入图片描述继续化简:在这里插入图片描述


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=αt 1(xt1αt zt)
最终结果 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 =αt 1(xt1αt βtzt)
z t z_t zt 怎么求?
z t z_t zt其实就是我们要估计的每一个时刻的噪声
我们可以训练一个模型来进行计算,一些相关论文里使用的unet结构来进行计算。
在这里插入图片描述
UNet是一样的,传进来输入是不同的。

DDPM论文中的训练和采样方法(就是那两个阶段)在这里插入图片描述

Training

(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。

Sampling

(1)首先随机得到一个正态分布->(2)循环(从T->0) ->(3)噪音点,最后一步不用加,t>1时候加->(4)最重要公式,得到 x t − 1 x_{t-1} xt1(高斯分布重采样)
在这里插入图片描述

细节: 代码中在第四步还有重采样过程,得到了u和σ分布,需要采样得到实际图像。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值