References

浅谈Diffusion Model

Denoising Diffusion Probabilistic Model
DDPM

如何运作

从Gaussion distribution里sample出一个Vector
Dimension和目标图片大小一致

经过一个Denoise network,筛去一些杂讯,不断Denoise得到清晰的图片
denoise的次数是事先定好的,step从大到小
杂讯到图片的步骤,称为Reverse process

Pasted image 20240709152149

Denoise Model

输入除了杂讯图之外,还有杂讯的严重程度
这里denoise model一直是同一个

Noise predictor

Pasted image 20240709152318 noise predictor 预测杂讯的样子,然后减掉输入的图片产生输出图片
Pasted image 20240709152625

  • 为什么不直接训练一个end-to-end model直接产生图片
    • 这个可能比较简单
    • 如果产生一个原图加杂讯,那模型基本就能画出原图了,不是很合理
  • 有杂讯的图减去杂讯
  • 但是会有很多不同情况,每一步去噪的输入噪声程度都不一样,怎么指明
    • 加入step描述程度
Forward process/Diffusion Process

但是在训练时的ground truth怎么来
人为增加噪声
对dataset中的图片,人为sample Gaussion distribution中的噪声,一次次加,每一次加带有step数和噪声ground truth
这个过程称为diffusion process

Text-to-Image

文字生图仍然需要成对的资料
将文字也作为输入喂给Denoise模组(也就是给noise predictor)

几个流行模型介绍

大概架构

三个部分Text encoder, Generation model, Decoder
分开训练然后组合起来

Text encoder

对文字进行编码,喂给generation model

Generation Model

输入一个杂讯和文字向量,经过中间生成模型(一般是diffusion model)产生一个中间产物
中间产物是图片压缩的结果
可以是人类看得懂的也可以是人类看不懂的

Decoder

中间产物解码得到图片

Stable Diffusion

SD
Pasted image 20240709163518

  • 一个encoder,编码各种东西
  • 经过diffusion model
  • decoder解压缩

DALL-E

Pasted image 20240709163641

  • encoder
    • 文本encoder,图像encoder
  • Autoregressive 运算量大,生成不完整的图(压缩的版本)
  • Diffusion,生成完整的图片
  • decoder还原图片

Imagen

Pasted image 20240709164140

  • encoder 编码文本向量
  • diffusion model 生成一张不清晰的图
  • decoder也是diffusion model,通过几次放大得到清晰图片

Encoder

Pasted image 20240709164422

  • 文字的encoder会有很大的影响
  • FID越低越好
  • CLIP分数越高越好

两张图表明,文字的encoder比较重要,越大越好,但是diffusion model影响不大

Frechet

FID 一个pre-trained CNN model, 得到CNN的Latent Representation
真实影像的representation和生成的影像的representation
假设两组representation是高斯分布(没什么道理)
计算Frechet distance,距离越小越好 Pasted image 20240710013309
需要比较多的sample来进行计算

Contrastive

CLIP 400million的image和text对训练得到的模型 将文本(描述)和图片编码,相匹配距离越近越好,不相匹配越远越好
Pasted image 20240710014006
这样的训练认为,CLIP能判断文字和图片的匹配程度---CLIP score

  • 将文本和生成的图片输入,看结果是否接近

Decoder

Decoder训练不需要成对的文本和图片
只需要图片的训练就可以获得这种能力

  • 如果中间产物是小图
    • 将大图缩小,就得到成对的训练数据
  • 如果中间产物是latent Representation
    • 训练一个Auto-encoder,
    • 图片输入,encoder一下变成latent representation,decode一下,变成原图
    • 训练完后这个decoder就是对应的decoder

Latent

人类不可读的一张图 如果原图 latent representation 是 都是对应的downsample 是 channel,表示每一个位置是多少个数字来表示 也可以把latent representation 看成图

Generation Model

diffusion model noise加在图片上,杂讯生图
现在diffusion model产生的是中间产物,noise应该加在中间产物(小图片或者latent representation)上

  • 怎么得到中间产物
    • 用decoder阶段得到的encoder编码一下
  • sample 一些noise不断加到中间产物上

获得数据集之后,训练noise predicter

  • 文字输入
  • step
  • 对应的加噪声的图片

Diffusion Model原理剖析

第一讲

VAE & Diffusion
  • VAE是将图片经过encoder变成一个latent representation,然后经过decoder恢复成图片
  • Diffusion有两个过程,forward process 和 reverse process,forward process可以看成是encode过程

训练算法

伪代码
Pasted image 20240710160837
大概描述

  • 重复以下直到converged(收敛)
  • 从数据集中sample一张图出来 原图
  • 从1到 中sample一个数出来 程度指示(步数)
  • 从normal distribution 中sample一个 杂讯
    • 大小和原图一致

然后第五行

  • 做一个加权和(weighted sum)
    • 权重是事先定好的,对应数字
    • 越来越小
    • 整个是一张noisy image
    • 越大越小, 占比越大,代表noise越大
  • 代表Noise predictor,将,noisy image传进去
  • ,杂讯图减去noise predictor预测的noise
  • 也就可以看到,训练的目的就是接近
  • 为什么是接近
    • 理论上应该是,对特定阶段加入噪音,模型训练来接近这个噪音
    • 实践上变成,直接sample一个噪声通过权重加到原图上,然后预测原噪声
    • 数学问题

到这里小结一下,DDPM就是理论上,是diffusion process过程不断加噪声,每一次的加的噪声程度逐渐增加,reverse process过程不断去噪,然后实际上通过数学手段,实现变为 指定步数和噪声,按指定的步数权重加噪,然后预测噪声,直接还原图片

生成过程

伪代码
Pasted image 20240710184628

大概描述

  • 是从正态分布中sample出来的一个全是杂讯的图
  • 遍历T到1, 每次再次从正态分布中sample一个的时候
  • 每次生成下一个图,下标减一
  • 直到遍历完

那每次怎么产生下一个图

  • Pasted image 20240710190256
  • 上一次迭代的图和t输入到noise predicter 中,noise predicter预测杂讯,然后竟然要乘以一个常数得到需要减去的杂讯,原图减去这个杂讯之后,竟然要再乘以一个常数,然后竟然还要再加上一个系数与sample的杂讯z的乘积才得到最终输出

第二讲

影像生成模型本质上的共同目标

从一个简单的地方生成一张图

在input的地方,有一个简单的distribution(Gaussion Distribution,例如),sample一下,得到一个vector ,丢到一个network中 输出一个是一张图片
Pasted image 20240711145023

  • 在高斯分布的空间里,随意取出一个sample,通过一个network都可以产生一张图
  • 有network产生的图所构成的空间/distribution,和现实世界的图的空间/distribution 越接近越好

在文生图之中

  • 区别在于加入了对图像的描述(caption),称condition
  • Pasted image 20240711145440

希望network完成一个映射,从简单的distribution,(加上condition),映射到复杂的类似于现实世界的图片distribution中,与现实世界越接近越好

如何才算接近
  • Maximum Likelihood Estimation(最大似然估计)
  • network ,映射到的distribution ,现实世界的distribution

搜集数据集 假设能够计算 (生成某一张图的几率)
那么objective function 就会是
找到一个使得生成上面sample的图片概率最高的

  • 这个就叫maximum likelihood Estimation
  • 最大似然估计
    • 估计一个参数的取值
    • 从样本空间中取样,找到所有可能参数取值下,这些样本发生的事件概率最大的参数

什么道理

进一步的数学推导
  • 取log
  • 求sample出来的 对应的概率和最大,近似于求整个distribution的期望最大
  • 期望的计算
  • 也就等价于(减去一个常数)
  • 那就是
  • 那就是说

极大似然等价于使得两个分布之间距离最小

怎么算

类比VAE的话

Pasted image 20250316205953

全概率公式

是高斯分布,但是后一项该如何考虑
可以这么定义
Pasted image 20240711163619

  • 但是大概率基本都是0,很难找到 使得

VAE中假设,给定 是一个Gaussion Distribution的 Mean
那就有

  • 好像是正态分布期望在几何上的性质
  • x与期望距离越远,概率在钟形曲线上越小
  • 暂时理解为,给定z,模型的输出服从高斯分布, 是给定z模型理想输出即高斯分布的均值,则此时给定z得到x的概率就与 和 x 的距离的相反数成正比

DDPM中,当每一次增加的噪声很小时,可以将 当成是一个高斯分布,我们需要模型预测这个高斯分布,即预测均值和方差。在多数实践中,我们假设模型预测的是分布的均值
则给定 reverse process 每一步降噪的目标 产生的概率和 目标 与均值的距离成反比

有DDPM的 满足(全概率公式)

所有的T的可能情况下, 的加和(积分) 是直接sample出来的,所以和模型参数没有关系

得到这个信息后,我们考虑maximize
由于过于难算,所以一般转变为maximize 的 lowerbound
有如下推导(在Variational Autoencoder(VAE) 中已经见过一次)

引入一个简单的分布,等式成立与分布无关

利用贝叶斯公式写成可拆分的形式,引入一项 用于化简

拆分得到

发现第二项是KL divergence

KL divergence 一定大于0,所以 一定满足

这一项可以转化为一个均值

这个均值就是lowerbound

DPPM 通过类似的推导也能得到一个类似的 lower bound

  • 在VAE中是 encoder,而 是一个给定 的Diffusion Process

第三讲

怎么算

服从标准正态分布
则有

所以 服从均值为 ,方差为 的正态分布

根据 的关系,可以直接得到指定步数 t 的分布
Pasted image 20250317211500

直接代入,根据正态分布相加得到,详见另一篇笔记 Diffusion

简化一下,令

Pasted image 20250317211718

给定步数T和超参数 ,就能直接得到 而不用一步步算

回到 loss function

我们已经得到了 lower bound

我们可以通过一系列推导得到能够计算的表达式

分为三项,第一项和第三项和模型(reverse process)有关,第二项是,diffusion process的过程和从Gaussian sample的概率,和模型参数无关
说第三项和第一项处理方式接近,只展开第三项的求解

这个式子是在 分布上,两个不知道什么分布的KL divergence
分别是

怎么计算 ?
结合乘法公式有这么个过程

关于中间的式子, 是怎么来的,我认为是原本应该是 这样后面才有 的展开,但是由于 马尔可夫性质, 无关,所以直接写成

计算出来的这个式子又是什么?

经过一番倒推,可以得到这仍然是一个Gaussian distribution
它的 mean 是

variance是

分布可知

是已知项(就是模型的预测),也是一个Gaussian distribution
那就可以计算 KL divergence

但我们并不是真的需要这个解析解,我们需要的是minimize KL divergence

现在 的分布已知,mean和variance都与模型无关,其相当于一个固定的分布。 与模型相关,但是我们只关心它的均值(模型的输出)而不关心它的方差
所以最小化 KL divergence的方法就是让二者的均值越接近越好

所以实际上做的就是
Pasted image 20250318193220
给定 ,模型的输出与 的均值越接近越好

对右边的式子代入 表示的 ,得到更简单的式子

式子中只有 是未知的,所以模型需要做的就是预测

Pasted image 20250318194207

回到生成过程的伪代码
这个 就是 模型的输出

小结

实际上的顺序可能是
在diffusion process 和 reverse process 的前提下
我们考虑目标函数: maximize
经过一系列推导,我们发现最终做的相当于使得两个分布 和 模型分布 越接近越好
在假设下,我们不考虑 的方差,则目标变成 最小化 两个均值的距离
经过进一步计算我们得到了

发现其中 模型真正需要预测的只有 ,则损失函数变成,给定t和图像,得到加入的
然后在生成的时候一步步减去noise

第四讲

但是,为什么最后还有一项
模型的输出被假设为一个Gaussian 的mean,所以为了能够描述一个Gaussian,很自然会加上一个 noise 来还原 Gaussian 的分布
但是只取 mean 不是也很合理吗

老师在这里进行了一些猜想

为什么需要sample

  • 有一篇文章在GPT 2上进行了研究,如果只使用概率最大的结果,模型会重复输出相同的话
    • Pasted image 20250318195233
  • 语音合成领域也会在testing的时候加入dropout

所以可能diffusion也是为了避免模型只重复输出概率最大而加入了variance

Application

Diffusion 可以用在语音上
但是用在文字上比较复杂 (文字是discrete的,难以加noise)

  • 可以加Gaussian在 word embedding上
  • 可以加其它种类的noise

为什么 Diffusion 的结果这么好?
可能的原因是 将autoregressive的方法加上non auto regressive中
将一步解决的问题变成多步解决

有一种 mask-predict 的方法
Nonauto regressive 一次输出如果举棋不定的话,可以将概率小的盖住,再进行一次decode
Pasted image 20250318200417

概率大的结果认为是好结果,但是第一次sample的结果可能做得比较糟糕,所以我们再sample一次看看

Pasted image 20250318200808