“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理和神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
现在大火的stable diffusion系列,Sora,stable video diffusion等视频生成模型都是基于了diffusion模型。而diffusion模型的基石就是DDPM算法(之后有一些diffusion的加速方法,但是原理上还是DDPM),所以需要我们对DDPM有一定的了解,了解了DDPM可以帮助我们更好的理解diffusion模型。
DDPM全称是Denoising Diffusion Probabilistic Models,最开始提出是用于去噪领域。原始论文中数学公式比较多,需要一定的数理基础。
https://arxiv.org/pdf/2006.11239.pdf
实际上,DDPM也没那么复杂,我们两个层面上理解下DDPM的过程,分别是基于vae和基于傅立叶变换。下文中diffusion默认指代的是DDPM文中的diffusion model。
首先,我们可以简单对比下vae和diffusion的推理过程
不同于vae encoder/decoder的叫法,diffusion 的两个过程称为前向过程(加噪)和反向过程(去噪),这两个过程的中间态是一个和输入图像相同尺寸的高斯噪声。而vae是通过数据驱动的方式压缩到一个一维隐空间,这个隐空间也是一个高斯分布,并且不需要n step,而是只需要 1 step。
那其实主观上,可能我们觉得vae多直接啊,而且非常优雅!为啥不用vae?确实,生成模型用了很长时间vae,最后gan变成主流,现在是diffusion。生成模型越来越复杂了。为什么越来越复杂大家还要用?最简单的解释就是,diffusion虽然很麻烦,但是效果好啊,架不住可以新发(水)几篇paper啊 ?。了解光流的同学一定听过RAFT等一个网络不够,我就cascade(级联)多个网络去学习的范式,diffusion也是类似的想法,但是这里并不是简单的把级联,diffusion建模的是信号本身的restoration,意味着diffusion这套建模可以用到1维分布、2维分布、一直到N维分布都可以。这非常重要,接下来我们从第二个点进一步了解。
第二,我们可以通过傅立叶变换的思路去理解diffuison。不了解傅立叶变化的我简单说下,就是用一系列不同频率的余弦函数我们可以逼近任意的时域分布。
我们看最右边蓝色时域分布是一个非常奇怪的分布,实际上可以在频域拆解成若干 不同频率的余弦去表达。那么理论上,余弦可以表达任意分布!
我们学过中心极限定理:无论原始数据的分布如何,只要样本量足够大,这些样本均值的分布将近似为正态分布。我们再回过头看看,为什么我们能从一个高斯分布,通过diffusion model 还原出clear image,甚至是segmentation mask,depth等等表达,都是因为我们的源头是一个包含了所有可能分布的总和啊!
我会通过尽可能简单的语言,带大家一起理解
diffusion原文中用 x_0 表示clear image, x_T 表示高斯噪声,T一般都很大,比如1000。 x_t 表示中间的图像和噪声混合的中间态,t越大,混杂的噪声越大。
p(x|y) 表示去噪过程中给定y,x的分布。
q(x|y) 表示加噪过程中给定y,x的分布。
加噪过程为前向过程
目标函数
众所周知,生成式网络都是为了让估计出来的分布更加接近真实的分布。由于分布这个东西很抽象,一般都是使用一个dataset,然后都是要最大化网络估计出来的后验分布似然,也就是上图中右下角的公式。实践中,这个公式不能直接优化,需要转化,VAE中优化ELBO也是同理。这里省略推导。
对于扩散模型,扩散模型是通过寻找使训练数据的可能性最大化反向马尔可夫转移来训练的。在实践中,训练等同于最小化负对数似然的变分上界。
了解KL 散度的同学应该知道,这个问题就是要 优化 KL 散度,使得预测的分布更加接近真实分布。更直观的可以看下图,红色表示真实分布,蓝色表示预测分布。
在DDPM中,假设多元变量高斯分布是具有相同方差的独立高斯分布的乘积,这个方差值可以随时间t变化。在前向过程中,我们将这些方差设置为相同的大小。t比较小的时候,方差比较小,t比较大的时候,方差比较大。最终方差值没有采用学习策略,而是经验设置了常数,如下:
理论上,对网络结构的要求只有输入和输出维度一致。作者最后选择了U-Net 也不足为奇。
对于training
对于Sampling
DDIM(Denoising Diffusion Implicit Models)是后来提出的一种加速DDPM的方法,现在diffusion大多用的这个方法,一般可以加速差不多20倍,DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。
在最开始的时候,我买了一个坑说DDPM是从噪声还原出任意分布的一种建模方式,那么如何加入有效的引导,使这个生成变得可控呢?不妨看看google 的 Imagen,基于text 引导的 图像生成网络
https://www.assemblyai.com/blog/how-imagen-actually-works/#how-imagen-works-a-deep-dive
Imagen的流程如下
首先,将 caption 输入到一个 text encoder 中。这个 encoder 将文本形式的 caption 转换成一个数值表示,它封装了文本中的语义信息。
接下来,一个 image-generation model 通过从噪声,或者说 "TV static" 开始,逐渐将其转化为一个输出图像。为了引导这个过程,image-generation model 接收 text encoding 作为输入,这起到通知模型 caption 中包含了什么内容的作用,以便它能创建一个相应的图像。输出结果是一个小尺寸图像,它视觉上反映了我们输入到 text encoder 的 caption。
这个小尺寸图像随后被传递到一个 super-resolution model 中,这个模型将图像的分辨率提高。该模型同样将 text encoding 作为输入,这帮助模型决定在增加我们图像大小四倍时,如何填补由此产生的信息缺失。最终结果是我们所期望的中等大小的图像。
最后,这个中等大小的图像再被传递到另一个 super-resolution model 中,这个模型的运作方式与之前的几乎完全相同,只是这次它接收我们的中等大小图像,并将其扩大成一个高分辨率图像。成品是一个 1024 x 1024 像素的图像,它视觉上反映了我们 caption 中的语义。
在训练过程中,text-encoder 是冻结的,这意味着它不会学习或改变它创建 encodings 的方式。它只用于生成输入到模型其他部分的 encodings,而模型的这些部分是被训练的。
文本条件的引入
我们可以看下面这张图,实际上就是diffusion的反向过程中,他的条件加入了一个由文本编码得到的embedding。
diffusion 的讲解就到这里,diffusion model建模的是高斯分布restore到任意分布的过程。我个人并不认为这是图像生成式工作的终点,这个建模方式应用的非常广泛,其实没有利用图像的特点,比如二维信号特有的空间信息,像素关系等。未来如果根据图像本身的特点,或许能直接找到一条short cut,就类似DDIM等加速策略一样,优化贝叶斯公式,那应该会更加优雅高效。
码字不易,可以点赞收藏哈~
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。