Theme NexT works best with JavaScript enabled

学习飞翔的企鹅

What's the point in living if I have to hide ?

0%

基础Diffusion生成模型与DDPM

目前基于diffusion的生成模型已经逐渐从CV迁移到其他领域,并均展现出不错的效果。正好最近研究项目是生成式的任务,就想应该学习一下diffusion,说不定可以有不错的效果。打算分两篇文章对这个领域的基础知识进行记录,本篇先讲解最基础的diffusion model (Sohl-Dickstein et al., 2015),再学习denoising diffusion probabilistic model (Ho et al. 2020, DDPM)及对其的优化 (Nichol & Dhariwal, 2021)。下一篇讲解抽象程度更高的denoising diffusion implicit model (Song et al., 2020, DDIM)和分析逆向过程最优方差的论文 (Bao et al., 2022, Analytic-DPM)。

一、Diffusion Model

1. 概述

Diffusion的思想是通过一个前向的扩散过程将复杂的真实数据分布转换为一个简单、易处理的分布(例如正态分布),之后通过有限步的逆过程还原真实数据的分布。如图1,真实数据x0经过总过T步加服从正态分布的噪音的过程得到xTxT服从标准正态分布N(0,I)。而模型学习逆向的转移概率pθ(xt1|xt),从标准正态分布中采样的xT开始,逐步生成真实数据。训练目标则是生成的数据分布和真实数据分布尽可能相似。整个生成过程因为存在随机性,所以即使初始的xT是一样的,在采样的过程中分歧会越来越大,最后得到完全不一样的结果。

overview

图1:diffusion过程的概述(图片来自Ho et al. 2020

2. 前向过程

前向过程的目标是通过不断加噪音将复杂的真实数据分布转换为简单易处理的分布(例如标准正态分布)。其中加入噪音服从的分布种类决定了最后转换成的分布种类,这里以正态分布为例,原论文也讨论了二项分布的情形。给定从真实分布q(x0)中抽样出的数据点x0,我们在总共T步的迭代中逐步加入高斯噪音,每步高斯噪音的方差由序列{βt(0,1)}t=1T决定。显然每步加入噪音后的结果q(xt|xt1)都是服从正态分布的,我们令这些正态分布满足以下公式: q(xxt|xxt1)=N(1βtxxt1,βtII) 我们认为整个过程是Markov过程,即第t步的分布只与第t1步的分布有关,则整个前向过程的概率为: q(xx1:T|xx0)=t=1Tq(xxt|xxt1) 事实上我们可以从x0推导出任意一步结果的分布q(xt|x0),我们令αt=1βtαt¯=i=1tαiϵN(0,I)则: xxtαtxxt1+1αtϵϵ=αtαt1xxt2+αt(1αt1)ϵϵ+1αtϵϵ=αtαt1xxt2+1αtαt1ϵϵ=...=α¯txx0+1α¯tϵϵ=N(α¯txx0,(1α¯t)II)

注意两个正态分布N(0,σ12I)N(0,σ22I)之和为N(0,(σ12+σ22)I)

由于βt(0,1),因此可以想象当前向加噪音的步骤T时,α¯T0,所以xT的分布趋向于标准正态分布N(0,I),这就相当于将复杂的真实数据分布通过加噪音转换为了简单易处理的分布。

需要注意的是方差序列{βt(0,1)}t=1TSohl-Dickstein et al., 2015文中是通过训练得到的,但Ho et al. 2020 (DDPM)提出直接使用预定义的常数效果更好。

3. 逆向过程

逆向过程的目标是通过学习逆向的Markov链的转移概率q(xt1|xt)来将转换成的简单分布转换回真实的数据分布。q(xt1|xt)是无法直接解的,因为需要遍历所有x0:t的可能路径才能知道给定xt时其上一步是xt1的概率。但我们知道的是当βt足够小时,q(xt1|xt)也为正态分布。因此我们需要训练模型pθ(xt1|xt)来拟合这个逆向的转移概率。 pθ(xxt1|xxt)=N(μμθ(xxt,t),ΣΣθ(xxt,t)) 而训练的目标是通过模型生成的数据分布pθ(x0)与真实数据分布q(x0)尽可能相近,即最小化这两个分布的交叉熵Eq(x0)(logpθ(x0))=q(x0)logpθ(x0)dx0(或者说最大化negative log-likelihood)。所以接下来的目标是推导这个损失函数的计算方式。首先我们可以得到模型预测下每种逆向diffusion路径(x0:T)的分布pθ(x0:T)以及预测的数据分布pθ(x0)pθ(xx0:T)=pθ(xxT)t=1Tpθ(xxt1|xxt)pθ(xx0)=pθ(xx0:T)dxx1:T 其中模型预测的数据分布pθ(x0)可以理解为通过所有可能的逆向路径得到x0的概率和(如果是离散变量就是pθ(x0)=pθ(x0:T),更好理解一点)。由于原始的损失函数是难以计算的,我们可以用jensen不等式推导交叉熵的upper bound(类似VAE的优化思想,在VAE中目标函数是variational lower bound): Lce=Eq(xx0)(logpθ(xx0))=Eq(xx0)(logpθ(xx0:T)dxx1:T)=Eq(xx0)(logq(xx1:T|xx0)pθ(xx0:T)q(xx1:T|xx0)dxx1:T)=Eq(xx0)(logEq(xx1:T|xx0)(pθ(xx0:T)q(xx1:T|xx0)))Eq(xx0)(Eq(xx1:T|xx0)(logpθ(xx0:T)q(xx1:T|xx0)))=q(xx0)q(xx1:T|xx0)logpθ(xx0:T)q(xx1:T|xx0)dxx0dxx1:T=q(xx0:T)logpθ(xx0:T)q(xx1:T|xx0)dxx0:T=Eq(xx0:T)[logpθ(xx0:T)q(xx1:T|xx0)]=Eq(xx0:T)[logq(xx1:T|xx0)pθ(xx0:T)]

值得注意的是如果将路径xx1:T看作是隐变量的话,这一形式取负后与variational lower bound的形式是一致的(EZQ[logP(X,Z)Q(Z)]),因此其实也可以通过variational lower bound的过程推出,这种思路可以参考这个博客,我们这里就不再推了。进一步地,这一upper bound又可以进一步拆成若干KL散度和熵的和: LceEq(xx0:T)[logq(xx1:T|xx0)pθ(xx0:T)]=Eq[logt=1Tq(xxt|xxt1)p(xxT)t=1Tpθ(xxt1|xxt)]=Eq[logpθ(xxT)+logt=1Tq(xxt|xxt1)t=1Tpθ(xxt1|xxt)]=Eq[logpθ(xxT)+t=2Tlogq(xxt|xxt1)pθ(xxt1|xxt)+logq(xx1|xx0)pθ(xx0|xx1)]=Eq[logpθ(xxT)+t=2Tlogq(xxt|xxt1,xx0)pθ(xxt1|xxt)+logq(xx1|xx0)pθ(xx0|xx1)](Markov过程,独立于xx0)=Eq[logpθ(xxT)+t=2Tlog(q(xxt1|xxt,xx0)pθ(xxt1|xxt)q(xxt|xx0)q(xxt1|xx0))+logq(xx1|xx0)pθ(xx0|xx1)](Bayes公式)=Eq[logpθ(xxT)+t=2Tlogq(xxt1|xxt,xx0)pθ(xxt1|xxt)+t=2Tlogq(xxt|xx0)q(xxt1|xx0)+logq(xx1|xx0)pθ(xx0|xx1)]=Eq[logpθ(xxT)+t=2Tlogq(xxt1|xxt,xx0)pθ(xxt1|xxt)+logq(xxT|xx0)q(xx1|xx0)+logq(xx1|xx0)pθ(xx0|xx1)]=t=2TEq[logq(xxt1|xxt,xx0)pθ(xxt1|xxt)]Eq[logpθ(xxT)]+Eq[logq(xxT|xx0)]Eq[logpθ(xx0|xx1)] 我们以H作为熵的记号,首先看与xT相关的两项,并将它们合并为LTLT=Eq[logpθ(xxT)]+Eq[logq(xxT|xx0)]=Hq(pθ(xxT))Hq(q(xxT|xx0)) 由于q来源于预定义的方差序列,而xT是服从标准正态分布的噪音,因此此项为定值,不需要进行优化(如果想要训练得到方差序列,则此项不为0)。对于pθ(x0|x1)一项,Sohl-Dickstein et al., 2015文中表示,为了避免边缘效应,此项设置为前向概率的后验概率: pθ(xx0|xx1):=q(xx0|xx1)=q(xx1|xx0)q(xx0)q(xx1) 因此其期望项L0只与q的分布有关,为一常数(同样,如果需要训练得到方差序列,则此项不为常数): L0=Eq(logpθ(xx0|xx1))=Hq(q(xx1|xx0)q(xx0)q(xx1)) 而对于最前面的求和的部分,其中的每一项均可以转换为KL散度: t=2TEq[logq(xxt1|xxt,xx0)pθ(xxt1|xxt)]=t=2Tq(xx0:T)logq(xxt1|xxt,xx0)pθ(xxt1|xxt)dxx0:T=t=2Tq(xx0,xxt)DKL(q(xxt1|xxt,xx0)||pθ(xxt1|xxt))dxx0dxxt=t=2TEq(xx0,xxt)[DKL(q(xxt1|xxt,xx0)||pθ(xxt1|xxt))]=t=2TLt1 则最后我们的优化目标就变成LT+t=1T1Lt+L0,且第一项和最后一项在方差序列提前确定的情况下均为常数,在需要训练得到方差序列时也可以较容易地计算,而中间的T1项中,KL散度均为两个正态分布的KL散度,因此是可以有关于这两个正态分布的均值和方差的解析表达式的: q(xxt1|xxt,xx0)N(μμ1,ΣΣ1), pθ(xxt1|xxt)N(μμ2,ΣΣ2)DKL(q(xxt1|xxt,xx0)||pθ(xxt1|xxt))=12[(μμ1μμ2)TΣΣ21(μμ1μμ2)logdet(ΣΣ21ΣΣ1)+Tr(ΣΣ21ΣΣ1)n] pθ(xt1|xt)的均值和方差均为模型预测的结果,q(xt1|xt,x0)的均值和方差是可以解析计算的(如果没有x0的条件分布q(xt1|xt)则是无法计算的,这也是为什么要在前面的变形中引入x0的条件)。我们之前有推导过: q(xxt|xxt1)=N(αtxxt1,βtII)q(xxt|xx0)=N(αT¯xx0,(1αT¯)II) 所以借助正态分布的概率密度函数表达式,我们可以得到: q(xxt1|xxt,xx0)=q(xxt|xxt1,xx0)q(xxt1|xx0)q(xxt|xx0)=q(xxt|xxt1)q(xxt1|xx0)q(xxt|xx0)(Markovchain性质)=1(2π)n/2(βt(1α¯t1)1α¯t)n/2exp[12((xxtαtxxt1)2βt+(xxt1α¯t1xx0)21α¯t1(xxtα¯txx0)21α¯t)]=1(2π)n/2(βt(1α¯t1)1α¯t)n/2exp[12((1α¯t)βt(1α¯t1)xxt122(αtβtxxt+α¯t11α¯t1xx0)xxt1+C(xxt,xx0))] 其中C(xt,x0)是与xt1无关的项,没有展开写,nxx的维数。通过以上推导可以看到q(xt1|xt,x0)N(μ~(xt,x0),β~tI)β~t=βt(1α¯t1)(1α¯t)μμ~(xxt,xx0)=(αtβtxxt+α¯t11α¯t1xx0)βt(1α¯t1)(1α¯t)=αt(1α¯t1)1α¯txxt+α¯t1βt1α¯txx0 也就是说,给定x0xt,我们就可以计算出q(xt1|xt,x0)所服从的正态分布的均值和方差以及模型预测的pθ(xt1|xt)的均值和方差,从而算出KL散度DKL(q(xt1|xt,x0)||pθ(xt1|xt)),进而计算损失函数进行梯度下降。训练时x0xt均通过抽样得到。

二、Denoising Diffusion Probabilistic Model (DDPM)

Ho et al. 2020 (DDPM)对最基础的diffusion model进行了简化和调整,简化了损失函数并提升了生成质量:

  1. 确定方差序列{βt(0,1)}t=1T作为超参,而不用训练得到
  2. 简化逆向分布,认为每维之间相互独立,并指定方差值:
    • 原始diffusion model:pθ(xt1|xt)=N(μθ(xt,t),Σθ(xt,t))
    • DDPM:pθ(xt1|xt)=N(μθ(xt,t),σt2I),实验中验证了σt的两种取法(σt2=β~t=βt(1α¯t1)(1α¯t) / σt2=βt),结果相近。
  3. 更好的μθ(xt,t)参数化方法
  4. 对于pθ(x0|x1),使用单独的decoder进行预测pθ(x0|x1)=N(μθ(x1,1),σ12I),不是简单使用q的后验概率

接下来详细解释这些简化带来的好处。

1. 目标函数简化

首先因为{βt(0,1)}t=1T提前确定了,因此LTL0都为常数,不需考虑,而由于对逆向的分布的协方差进行了简化,认为每维之间相互独立了,所以Lt1|t[2,T]中所涉及的KL散度也可以继续简化: q(xxt1|xxt,xx0)N(μμ~(xxt,xx0),β~tII), pθ(xxt1|xxt)N(μμθ(xxt,t),σt2II)DKL(q(xxt1|xxt,xx0)||pθ(xxt1|xxt))=12[||μμ~(xxt,xx0)μμθ(xxt,t)||2σt2logdet(β~tσt2II)+Tr(β~tσt2II)n] 由于β~tσt2均为超参生成的常数,因此显然KL散度中只有均值差的平方一项是可变的,即t[2,T]Lt1变为: Lt1=Eq(xx0,xxt)[DKL(q(xxt1|xxt,xx0)||pθ(xxt1|xxt))]=Eq(xx0,xxt)[12σt2||μμ~(xxt,xx0)μμθ(xxt,t)||2]+C 其中C为常数,可以舍去,我们令Lt1=Lt1C,则去掉所有常数项后新的目标函数L为: L=t=2TLt1=t=2TEq(xx0,xxt)[12σt2||μμ~(xxt,xx0)μμθ(xxt,t)||2] 这就比之前完整的KL散度的形式简洁明了多了。

2. 新的参数化方法

从上面的目标函数可以看出,最基本的参数化方法是设计模型以xtt为输入,拟合μ~(xt,x0)的值,但之前我们有推导过,xt可以写成x0与高斯噪音ϵ的加和形式:xt(x0,ϵ)=α¯tx0+1α¯tϵ,ϵN(0,I),因此我们可以进一步推导μθ(xt,t)需要拟合的函数形式: μμθ(xxt,t)=μμ~(xxt,1α¯t(xxt1α¯tϵϵθ(xxt,t)))=1αt(xxtβt1α¯tϵϵθ(xxt,t)) 其中ϵθ(xt,t)即模型,以xtt为输入,输出得到xt的高斯噪音。此时从pθ(xt1|xt)中采样xt1只需计算xt1=1αt(xtβt1α¯tϵθ(xt,t))+σtz,zN(0,I),这个过程中的ϵθ就非常像Langevin dynamics中的下降梯度了。

Langevin dynamics是分子动力学中的概念,从概率分布p(x)中经过梯度下降获得稳定的系统状态,更新的方式为xt=xt1+ϵ2xlogp(xt1)+ϵzt,ztN(0,I),但是这个过程中的zt是用来缓解陷入局部最优的问题的

如果我们可以进一步将此公式代入Lt1可以得到非常像denoising score matching的损失函数: Lt1=Eq(xx0,xxt)[12σt2||μμ~(xxt,xx0)μμθ(xxt,t)||2]=Eq(xx0),ϵϵ[12σt2||μμ~(xxt,1α¯t(xxt1α¯tϵϵθ(xxt,t)))μμθ(xxt,t)||2]=Eq(xx0),ϵϵ[βt22σt2αt(1α¯t)||ϵϵϵϵθ(α¯txx0+1α¯tϵϵ,t)||2]

score matching的生成模型模拟Langevin dynamics的过程,而每步下降梯度是由神经网络进行预测

根据以上推导,我们可以直接让网络预测μ~(xt,x0),也可以预测噪音ϵ。虽然两者在数学上是等价的,但实际实验中通常使用后者训练出的网络效果更好。除此之外,原本的训练目标需要遍历所有t[2,T]Ho et al. 2020 (DDPM)发现如果将t也改成抽样,并去除权重βt22σt2αt(1α¯t),训练效果会更好,即新的训练目标简化为: Lsimple=Et,q(xx0),ϵϵ[||ϵϵϵϵθ(α¯txx0+1α¯tϵϵ,t)||2],tU(1,T),ϵϵN(00,II) 其训练和采样生成的过程也变得非常简洁,如下面的伪代码:

overview

DDPM训练和采样生成的伪代码(来自Ho et al. 2020

值得一提的是去除权重这一行为使得不同步的ϵϵθ(,t)是平等的,这也是score matching网络的做法。虽然从数学推导上来看会使目标函数的最终效果偏离令q(xx0)=pθ(xx0),但从优化的角度来看这么做是合理的。因为不同步t实际使用的是不同的参数,相互之间没有依赖关系,而它们对应目标函数中的项相互之间只是加权求和的关系,所以令整体最小和使每一项分别最小最后的效果是一样的。

3. βt的选取

DDPM原文中选取从β1=104线性增长到βT=0.02βt的选取需要是相对于数据的分布是较小的,这样才能保证前向和逆向的过程的分布是类似的形式(图像生成数据归一化到[1,1])。

三、Improved DDPM

Nichol & Dhariwal (Improved DDPM, 2021) 的文中提出了若干对DDPM模型的优化方法。

首先是提出基于cosine进行βt的变化: βt=clip(1α¯tα¯t1,0.999),α¯t=f(t)f(0),f(t)=cos(t/T+s1+sπ2)2 其中s是较小的偏置,防止在t=0βt过于小。其次,Nichol & Dhariwal (Improved DDPM, 2021) 也提出用模型预测的向量vvβtβ~t进行混合来作为逆向过程的方差: ΣΣθ(xxt,t)=exp(vvlogβt+(1vv)logβ~t) 因为Lsimple是与ΣΣθ无关的,他们选择将原始的训练目标和DDPM中简化的训练目标进行加权作为新的训练目标: Lhybrid=Lsimple+λL 除此之外他们提出通过strided sampling的方式加速生成采样,具体而言,每隔T/S步进行一次更新,这样将总共T步的采样变为S步,每步的方差可以如下计算: βSt=1α¯Stα¯St1,β~St=1α¯St11α¯StβSt

后记

本篇到此就结束了,记录了基础的diffusion model以及由其简化而来的denoising diffusion probabilistic model (DDPM)。而DDPM文中也分析了其框架与Langevin dynamics以及score matching方法的相似之处。除此之外,也记录了Improved DDPM中提出的若干优化。整个过程涉及很多数学推导,需要慢慢看仔细思考才能理解,写完以后大脑cpu温度过高直接去打游戏了。下一篇将讲解抽象程度更高的denoising diffusion implicit model (Song et al., 2020, DDIM)和DDIM理论最优的σ取值(Bao et al., 2022, Analytic-DPM)。

参考文献

[1] What are diffusion models?

[2] Deep Unsupervised Learning using Nonequilibrium Thermodynamics (ICML 2015)

[3] Denoising Diffusion Probabilistic Models (NeurIPS 2020)

[4] Improved Denoising Diffusion Probabilistic Models

Powered By Valine
v1.5.2