1、sde角度看ddpm
sde 将 ddpm 中的时间连续化,定义前向过程的sde:
反向过程的sde:
再定义扩散过程的 p(xt|x0) 分布
对下面公式左右应用待定系数法,并假设 ft(xt) = ft*x
可以求出ft,gt 和
构造神经网络sθ逼近∇log,等价于epsθ逼近eps,从而得到ddpm的损失函数,然后进行训练epsθ
预测:将epsθ带入sθ,sθ再代入
2、ode角度看ddpm
对sde引入Dirac函数可以得到Fokker-Planck方程,考虑σt=0的极端情形,此时SDE退化为ODE:
还是要构造神经网络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的精确解:
在采用过程中,从xti-1步解出xti步,直到采样出x0:
当k=1时,可以化简为:
当 k=2,3 时,分别对应算法 DPM-Solver-2,DPM-Solver-3
3、条件生成
两种方式
Classifier-Guidance:直接用训练好的无条件扩散模型,用一个分类器来调整生成过程以实现控制生成,仅仅在采样的时候变了,即均值多出来1个由条件y引入的梯度项:
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
vae decoder:
vae encoder:
训练:
其中labelid 10% 变成1000,在效果上将数据集划分了10%的无条件数据,90%的有条件了,意思是让ai也学学无条件下怎么生成,我感觉没必要
如果是针对编辑图片,最好是设置两个数据集:第一个数据集是图片编辑之前的,比如(图片1,"泰迪狗"),(图片2,"泰迪狗"),第二个是之后的,比如(图片11,"泰迪狗和我"),(图片22,"泰迪狗和我"),然后这样就去掉10%的限制了
预测:
5、条件unet
引入crossattention机制来利用条件:
将文本通过Transformer 得到序列向量的方案,可以具体化为:cliptokenizer + clipTextmodel: