1、sde角度看ddpm

sde 将 ddpm 中的时间连续化,定义前向过程的sde:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络

 

 反向过程的sde:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_02

再定义扩散过程的 p(xt|x0) 分布

对下面公式左右应用待定系数法,并假设 ft(xt) = ft*x

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_03

 可以求出ft,gt 和

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_自适应_04

 

 构造神经网络sθ逼近∇log,等价于epsθ逼近eps,从而得到ddpm的损失函数,然后进行训练epsθ

预测:将epsθ带入sθ,sθ再代入

2、ode角度看ddpm

对sde引入Dirac函数可以得到Fokker-Planck方程,考虑σt=0的极端情形,此时SDE退化为ODE:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_05

 

还是要构造神经网络sθ逼近∇log。。。

2.1:PNDM 论文:通过引入 ϵθ = gradient part  和 ϕ = transfer part 来对 ODE 三大经典数值解法(the forward Euler method, Runge-Kutta method and linear multi-step method)的改进

2.2:DPM-Solver 论文:它仅用10-20步(function evaluation)就采样出很好的样本:

给出ODE的精确解:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_数据集_06

 

 在采用过程中,从xti-1步解出xti步,直到采样出x0:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_数据集_07

 

 当k=1时,可以化简为:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_数据集_08

 

当 k=2,3 时,分别对应算法 DPM-Solver-2,DPM-Solver-3

3、条件生成

两种方式

Classifier-Guidance:直接用训练好的无条件扩散模型,用一个分类器来调整生成过程以实现控制生成,仅仅在采样的时候变了,即均值多出来1个由条件y引入的梯度项:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_09

Classifier-Free:往扩散模型的训练过程中就加入条件信号,需要重新训练扩散模型,训练过程的epsθ除了输入xt和t,还要输入条件y;采样时,原来的p(xt-1|xt)就自动变为p(xt-1|xt,y)。所以区别仅仅是epsθ新增了个输入 y,不过为了实现相关性和多样性之间做了平衡,要有2个输入传给dit,分别是带条件的和不带条件的

从外部来看,总结一下:

无条件模型:训练只要一大堆图片,采样啥都不用;

有条件模型Classifier-Guidance:不用训练,直接用无条件训练好的模型,采样的时候新增一条由条件(可以是文本、图片...)控制的梯度项(与epsθ无关);

有条件模型Classifier-Free:训练时,一张图片配一个条件(该图片和该条件是深度绑定的,换下一张图片可能条件就变了)同时输入给epsθ;采样的时候epsθ只要条件;

4、DIT

DIT结构:

其中eps1和eps2是有条件和无条件的有机融合,这一块只有预测才会用到,训练的话就不需要了,所以此处有2个输入传给dit,分别是带条件的和不带条件的(即Classifier-Free),本质上就是先生成一个无条件的,再向有条件的做个偏移:无条件+(有条件 - 无条件)* cfgscale, cfgscale 越大,则最后生成的越偏向有条件的(例如图片越像条件“狗”)。此处的无条件是一律假定 labelid=1000,只是为了统一输入格式。

改进:有条件和无条件可以看成条件1和条件2,把无条件的 labelid=1000换成条件2,比如prompt2 文本串(比如,),然后可以改进DIT,DIT内部新增1个Transformer方案(比如 cliptokenizer + clipTextmodel)用于处理文本串。所有的无条件的 labelid=1000就都换成prompt2 文本串。此时就成了条件1和条件2的过渡了, cfgscale 越大,越靠近条件1。有人将其称为negative_promp,我觉得不合理,正条件和负条件怎么平衡呢

 

adapter ln (adaLN)就是对隐藏状态做自适应的归一化,自适应就是新增了可学习参数(shift,scale,gate),这些参数通过将时间和条件通过MLP融合后输出,其中 gate 参数是零初始化的(adaLN-Zero),使得 DiT block as the identity  function

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_10

 vae decoder:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_数据集_11

 

  vae encoder:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_12

 训练:

其中labelid 10% 变成1000,在效果上将数据集划分了10%的无条件数据,90%的有条件了,意思是让ai也学学无条件下怎么生成,我感觉没必要

如果是针对编辑图片,最好是设置两个数据集:第一个数据集是图片编辑之前的,比如(图片1,"泰迪狗"),(图片2,"泰迪狗"),第二个是之后的,比如(图片11,"泰迪狗和我"),(图片22,"泰迪狗和我"),然后这样就去掉10%的限制了

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_13

 

 预测:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_14

 

 5、条件unet

引入crossattention机制来利用条件:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_自适应_15

 将文本通过Transformer 得到序列向量的方案,可以具体化为:cliptokenizer + clipTextmodel:

python ADF检验中滞后阶数总是得0 fpe准则确定滞后阶数_神经网络_16