【DDPM】DiffusionModel原理
持续施工中
I’m still working on it.
本文是根据油管视频整理的笔记,原视频中将DDPM和DDIM都有讲到,所以我会穿插一些DDIM的东西
导入
视频:https://www.youtube.com/watch?v=ifCDXFdeaaM
基本概念
训练过程–Forward Process
逐步添加高斯噪声,直到变成纯高斯噪声
生成过程–Denoise Process
逐步去除噪声,直到变成图像
训练过程
首先,我们来看看DDPM中的算法是怎么说的
这里的是一张干净的图像(样本集中的)
从均匀分布中采样一个t
再从均值是0,方差是1的标准高斯分布采样一个噪声,这个噪声的尺寸大小和图像一样大,但里面全是噪声
- 这里的是预先人为定义好的东西,并且随着t增加,会变小;即t越大,原来图占的比例越小,噪声占比越大
- 是模型预测出来的噪声,预测出来的噪声是要和原噪声进行比较
关于这里的噪声的讨论
之间不是相互独立的,每一步的噪声 是基于前一状态 和原始图像 的偏差计算得出的
由于每个 都是由前一个时间步 加上一些噪声得到的,这意味着每个 实际上是包含了从 到当前时间步 所有噪声的累积。
尽管每一步加入的噪声是独立的,但每个时间步生成的$ ϵ_t$包含了所有之前步骤的噪声累积,因此 和 在数学上是相关的。
训练过程
在想象中,我们的训练过程是下图这样的
生成过程
首先,我们来看看DDPM中的算法是怎么说的
从标准高斯分布采样出一个噪声矩阵
然后进行T步的循环,每次循环中要采样一个噪声
- η = 1 时,方差 完全由 和 的值确定,对应原始的DDPM工作,其中噪声添加是随机的,模拟了正向扩散过程的逆过程。
- η = 0 时,方差 为零,这意味着在逆向生成过程中没有额外噪声被添加,此时的模型变成了确定性的,对应DDIM(去噪扩散隐式模型)方案,这是一种更加稳定和可预测的生成方式。
通过调整 η 的值,研究人员可以在随机性和确定性之间进行权衡,从而控制生成过程中噪声的影响程度
看着很复杂,不急,后面会慢慢解析
但,这儿有个问题:在生成过程中,这里为什么要再采样并加入一个噪声z???【后面有解释】
DDPM和DDIM在生成过程中的区别
差异主要体现在状态转移和噪声处理上,我将通过对比这两种模型的去噪过程公式来说明这一点。
DDPM的去噪过程
在DDPM中,去噪过程是一个随机过程,每一步都依赖于前一步的输出和新添加的噪声。去噪公式可以表示为:
$ x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}t}} \epsilon\theta(x_t, t)\right) + \sigma_t z $
其中:
- 是当前步的图像。
- 是学习得到的噪声预测。
- 和 是预定的方差调度参数。
- 是根据 调整的噪声级别,当 时, 最大,添加最多噪声。
- 是标准正态分布的随机变量。
这个过程是一个典型的马尔可夫链过程,因为每一步的输出依赖于前一步的状态和新引入的随机噪声。
DDIM的去噪过程
DDIM的设计目标是在不牺牲太多生成质量的情况下,加快生成速度并提高确定性。其去噪过程去除了额外噪声的添加,公式如下:
$ x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}t}} \epsilon\theta(x_t, t)\right) $
注意,这里没有 项,这意味着:
- 过程是确定性的,一旦确定了开始的噪声,整个逆过程可以精确地重现,无需依赖于随机噪声。
- 因为去除了随机噪声的引入,每一步的状态完全由前一步的状态和模型预测的噪声确定,不再是一个马尔可夫过程。
虽然这两个公式,目前看着只差了一个噪声项,但他们的推导过程不大不一样!具体推导在后面
DDIM通过使用一个确定性的采样路径,即在逆向过程中,不再随机采样噪声。这使得DDIM在恢复数据时更加高效且稳定。
DDIM的关键在于它利用了一个被称为“implicit sampling”的方法,该方法不需要在每一步明确地向数据添加噪声。相反,它直接计算从当前噪声状态到下一个较少噪声状态的最优路径。这种方式减少了随机性,使得生成的过程更加快速且具有更少的随机变化。
如上图,假如当前是,而当前的它会预计最终走到,但如果直接到,得到的结果就和实际的有一定差距,所以它并不会一大步的直接到,而是选择每次走一小步(去除一些噪声),然后在重新预测最终走到,也许这个新的会离更近一些,然后它就再走一小步
就是每次去除一点然后再矫正再去一点
对比和效率
- 随机性和效率:DDPM通过引入随机噪声保持了高度的随机性,这对于生成多样化的图像很有帮助,但这种随机性也导致了生成过程的不确定性和较慢的收敛速度。DDIM通过去除随机噪声,减少了这种不确定性,使得生成过程更快,更可控。
- 应用场景:DDPM适用于需要图像多样性的场景,如艺术创作、样本增强等;而DDIM则更适用于需要快速、可重现结果的场景,如内容过滤、特定图像修复等。
图像生成模型的目标
https://www.youtube.com/watch?v=73qwu77ZsTM
求出“真实图像的分布”
而在如今的生成图像中,不仅仅要生成出图像,而是要添加“条件”
以前是只让生成的图像还原真实图像(生成一只狗),现在是要“一只在奔跑的狗”
但不论怎么说,我们的目标,还是求出“真实图像的分布”
也就是模拟一个分布,这个要和原来的分布越接近越好
那么,怎么来衡量“接接近越好”?
假设,我们现在有个分布,现在任意从的样本集中拿一张图,我们照样可以用模型来还原出这张图,那这么模型就是完美还原
但实际上,不大可能;
不过,我们如果让模型来尽量还原出的样本集的图,也就是让生成出的图的概率最大化
不同的图像生成模型,最终目标都是让最大化(似然最大化)
最终目标都是让最大化(似然最大化),具体怎么操作呢?
下面是将似然最大化
推导成最小化KL散度的公式
,KL散度用来度量两个分布的距离
回顾VAE
为什么要先讲VAE,因为VAE很多东西和DM非常类似
VAE的全称是(Variational Autoencoders) 它定义了一个连续的、不易处理的密度函数,是通过优化似然的下界(lower bound)来逼近极大似然的方法.因此,这里要是用积分来定义公式
自编码器-Autoencoders
那么要了解VAE,首先要对自编码器(Autoencoders ,AE) 有一定的了解。自编码器是一种通过无监督的方式去学习数据内在表征(降维)的神经网络,如下图所示:
左侧是PCA的方法进行一个降维,右侧是通过自编码器方法对图片进行一个降维。它们的区别是:
- PCA是将矩阵经过sigmoid激活后保留主成分达到降维的目的,然后通过和WT相乘获得新的压缩后的图片
- 自编码器则是通过一系列神经网络(编码器)将图片变成一个向量,然后再通过一些列神经网络(解码器)将这个向量复原成一张图片
他们的效果对比如下,我们看到自编码器相对于PCA有更多的参数,但复原后的图片也更加清晰
自编码器进行预训练
自编码器有什么应用场景呢?
首先,训练一个能够用于重构输入的隐层向量表示:
然后,训练完毕后,隐层特征就可以用于其他有监督训练任务(例如有大量数据,却只有少量标签)
那么我们可不可以随机初始化一个隐层向量,然后通过decoder来生成图像呢?这是比较困难的。因为用固定的自编码器去生成图片的时候,虽然隐层向量空间是连续的,但是每张图片生成的向量是离散的。处于离散向量之外的其他向量,不一定能生成图片。
就如同下图,虽然自编码器可以压缩黑狗还原黑狗,压缩白狗还原白狗,但是处于黑狗和白狗之间的那部分向量,是不一定能生成斑点狗的
VAE的原理
由此,我们提出,在自编码器的隐层向量空间中加入一些噪音,使得自编码器也能够生成斑点狗的照片:
那么既然我们定义在连续空间上,因此VAE的概率密度函数也得是连续的,由此得到了公式
其中:x是图像,而z是可以是隐层向量空间里面的一个随机向量(连续变量)。所以对于每一个z可能会生成一张图片。
用VAE模型生成图像
VAE模型怎么去生成一张图像?
- 首先,从高斯分布中生成一个随机变量z,使得 $z \sim N(0,I) $
- 让每个z 去生成令一个正态分布
- 让 服从正态分布
- 两个函数可以用神经网络表示
- 因为z可以一直生成,因此理论上可以表示成无穷多个正态分布的mixture(即 )。但事实上训练的图片是有限的,因此, 训练目标为最大化或
但事实上z不可能随机生成的,而是要根据我们的输入图片学习而来的(巧妇难为无米之炊)。放在数学层面上解释,就是我们要去寻找后验概率 .这部分,就是自编码器中 decoder 的部分
在VAE中,是什么?
如上图所示
- 是一个分布;
- 网络G作用:从“高斯分布”采样出来的张量Z,经过网络G生成某个内容
- :泛指网络G的各种参数
所以,按理来说,如果要定义,其公式为
即:每个被采样出的概率*由产生出的概率,再对所有的做积分
其中,
-
每个是从高斯分布被采样出的,是已知的
-
怎么办呢?
-
一个简单的想法是:如果G(z)生成的东西和样本中的x一样,就输入1;否则输出0;如下面公式所示
-
但这样的结果是:全是零,毕竟不可能生成的东西和样本完全一样
-
P_\theta(x|z)= \left\{ \begin{array}\\ 1, G(z)=x & \\ 0, G(z)\neq x \end{array} \right.
而实际上呢,用的是下面的公式
这里输出的G(z)
是一个高斯分布的均值
,所以就正比于
并且很直观的,如果与越接近,则说明应该越大
在实际优化过程中,我们要优化:的下界
这里取是为了方便计算,让累乘过程变成累加
这里的可以是任意的分布,先不管它,而P(x)又可以表示为
所以,可以表示为
随后在中,分子分母同时乘以
这目的是为了使用log的特性,将乘法变成加法,从而得到下面公式
其中, 这玩意是啥?它是和的KL散度
而KL散度必为正值,所以可以推导出一个不等式
即
这里的中,指期望
从而得到了的lower bound
后续的目标是优化这个lower bound,这里的优化指的是“最大化”这个lower bound,从而让能得到较大的值
VAE过渡到DDPM
说了这么多VAE,那这和DDPM有什么关系???
我们想象中,DDPM在生成图像过程中,是不断去除噪声的----从纯高斯噪声逐步到
我们可以将这里去噪声网络的结果,想象成“一个高斯分布的均值
”
而由一个噪声,生成到图像的概率是
这里是对所有的积分,而积分的内容是产生的概率,乘以产生的概率,一直乘到产生的概率
注意:这里的是直接从高斯分布采样的,不是模型产生的,所以没有的角标;是模型产生的
从DDPM的我们可以看出,DDPM其实是进行了多步的VAE,如下图
所以呢,适用于VAE的优化目标,即**“最大化”lower bound**的方式,也适合DDPM,即下图
这里引出了一个新的问题,我们之前在VAE说“这里的可以是任意的分布”
那在DDPM中,就被替换成了
问题来了,这个是什么呢?怎么求呢?
求q()分布
https://www.youtube.com/watch?v=m6QchXTx6wA
首先,来看看是什么?
q()是个分布,它是由加噪声得到的
这里的是加噪声过程的公式
下面,我们来看看怎么
一步加噪声到
其中,
- 是上一张噪声
- 是人为设定的超参数,是用来控制不同步数添加噪声多少的
- 一次是从高斯分布采样的噪声
它的直观演示图如下(图中的和反了)
这里的超参数是否可以自学习?可以,但DDPM作者们尝试过后,发现效果不好
即,在加噪声的过程中,每一步都要
- 设定步数t的超参数
- 从高斯分布采一次噪声
- 加乘法和加法
一步,一步,一步,一步……………………最终得到纯高斯噪声图像
那,有没有简单的方法,可以直接从加噪声到???
比如,在从到时,需要采样一次高斯分布的噪声
在从到时,需要采样一次高斯分布的噪声
这两次的噪声,是完全独立的,互不相干的
接下来,将从到的公式,代入到从到的公式,那不就可以套娃了嘛,如下图
那么问题又来了
上图中,两个采样高斯分布的噪声,能否用一次采样来代替?
没错,可以!但是公式又要稍微变化下
原来关于加噪声的公式就要变了
变成了
这里的只要采一次高斯分布即可!!!
为什么,这里可以用一次加噪声来平替多次加噪声?
如果真的完全相等,那么“这里的只要采一次高斯分布”的就一定与和是相关的!
但是,由于我们不要求完全相等,因为也没必要完全相等,毕竟都是随机加噪声出来的结果,不用那么纠结
从结果上来说,这样平替的方法效果没啥损失,反而提高了效率
解释下上面“公式的变化”,本质上是做了个正则化的技巧,当我们把两个拥有不同方差的两个高斯融合在一起时,融合后的方差就单纯的把两个方差相加(如下图)
那么,按照这种套路,将直接加噪声到的公式就变成了
同样的,这里的只用采样一次高斯分布
为了简化公式,这里做两个约定
于是!
我们得到了!
常见的!
我们在前向加噪声过程中,没有训练过程,可以直接跳步!一步加噪声到任意的
找到优化的目标
为什么要求啊,求的目的是为了求,而求是为了求
而它,是我们要优化的目标!它叫"lower bound"!我们的目标是为了让"lower bound"最大化
我们现在已经知道了"lower bound"中每个符合的表达形式,现在我们可以开始求"lower bound"了!
上图的推导结果来源:Understanding diffusion models a unified perspective
过程太复杂了,直接看结果
结果一共有三项
- :与要训练的模型无关!
- 这一项,与要训练的模型无关!
- 是从高斯分布采样的初始噪声;
- 而是已经设定好的,是在Forwarding Process中(加噪声过程中),也与模型无关;注意:加噪声过程是固定的行为,不涉及模型学习
- :这里又用了KL散度,来计算两个分布的距离
- :是与模型无关的,我们得想办法算出来
- :真正与模型相关的!有关的!
从结果中看,最重要的是最后一项,我们要将"lower bound"最大化,也就是要将第三项最小化(前面有个负号)
也就是说!要将两个分布的KL散度最小化!!!
没错,还是很直观的!
我们的最终大目标是生成模型要生成逼真的图像,也就是说,我们要模拟出真实图像的分布!
所以,我们的模型的分布与真实图像的分布,它们的KL散度(分布之间的距离)越小越好
所以,我们先不看前两个式子,我们只关注第三个,与模型相关的式子
我们要求:图中蓝色框内的是未知的
这里的表示由和一个高斯噪声
产生出,这里的从肉眼看是个图像,但它其实是个某种分布
我们目前已知:,,,也就是说从到,从到,以及直接从到,这三个过程我们都是知道的
但如果此时,不再给高斯噪声,而是从和直接到,此时需要经过公式转换,也能求出来,如下图所示
公式如下
也就是说,我们得到了转换后的,在公式推导下,最终得到下图的内容
上图推导来源论文:Understanding diffusion models a unified perspective
那么,现在就知道了具体的值,并且也是符合一个高斯分布的,其均值是由和共同决定的
知道了后呢,就可以求出和的KL散度(KL散度即:两个分布之间的距离)
求KL散度最小值
https://www.youtube.com/watch?v=67_M2qP5ssY
可以用上面这个公式来将两个分布求他们的求KL散度,但实际呢,有个更简单的方法
要注意,我们求KL散度的目标,是为了让这个求KL散度值最小,从而让“整个式子”的结果最大(最大化“似然”)
所以,我们刚刚求出了具体的值,其均值是由和共同决定的,它是一个固定的值,跟我们要训练的网络无关,如下图所示,方差和均值都是fixed
而另一个分布呢,它的方差我们就当成固定的,因为在前面的讨论中,我们只让均值是符合高斯分布
综上,我们的最终目标是让KL散度最小,而其中一个分布是固定的;另一个分布只有均值可以改变
所以,我们只能让的均值接近的均值,这里的()就是
我们训练的模型
现在,我们来看下这两个分布的两个均值分别是什么
的均值是下面的公式,它是一个固定的
所以,我们只能训练DenoiseModel,让其输出的均值越接近的均值越好
目标:训练DenoiseModel,让其输出的均值越接近的均值越好
下面举例说下,怎么训练
比如我们的是已知的样本图,随后,用之前提到的方法**“一步到位”加噪声**,直接得到,如下图所示
我们将和输入给DenoiseModel,而DenoiseModel要做的,就是将输出一个接近下面玩意
我们实际上是用来预测出上面的的均值,而这个均值中,甚至没有的参与!!!
如果将上述的的均值再化简,可以得到下面的公式
我们再搬出来这个公式,作一些移项后,得到了的公式(加噪过程中的我们不可能知道了,是模型预测的)
我们把替换掉,让上面这个图的公式中,只有而没有,并且,成功地把引入到了公式中
这里是用加噪过程中的的公式,即,使用(指预测的)替换掉了去噪过程中的【因为我们在去噪过程中,是不可能知道的,毕竟我们最终要生成的就是】
这里就能看出来DDIM和DDPM的公式区别,简单来说,假如DDIM当前步是,想要得到下一步,它需要两个输入值:和(指预测的),而仍可以用来计算出来。这样一来,的最终公式中,还是仅需要就可以计算出来。
而这里替换效果的好坏,就要看了(是模型训练出来的),如果非常牛,那么我们用**(指预测的)就可以100%替换掉去噪过程中的,也就是让上图中的?完全等于的均值**,也就是去噪声过程中,每一步都能100%把加噪过程那一步实际添加的去掉(尽管实际上不可能)
而在这个公式中,只有是真正需要模型来预测的,而其它的值都是人为设定的
所以至此,我们就知道了,这个模型的输出值虽然是一个噪声,但模型的目标并不是简单的让某个图像把噪声减去后,让它更像原图
而是为了让KL散度更小
而是为了让似然最大化
而是为了让我们模拟的分布更接近真实图像分布
过程的一小步,模型的一大步
但是,原公式中还有添加了一个“额外的噪声”
这个问题的本身是**“为什么要额外添加随机性”**
为什么要额外添加随机性
下面这个图,是ChatGPT在输出文字时的一个逻辑,即输出几率最大的待选字
文字合成领域
论文:https://arxiv.org/abs/1904.09751 对此进行了探讨
如上图所示,左侧是让GPT每次都选择几率最大的待选字进行输出,右侧是人写出来的文章
可以看到,人写的文章,用的字并不是选择几率最大的那个词汇,而是有“随机性”的跳跃的;如果只输出几率最大的那个词汇,最终可能会反复出现同样的内容
语音合成领域
除了文字合成,在语音合成领域也有使用随机性噪声的案例,在合成的过程中,需要随机dropout
图像合成领域
所以,在图像领域DiffusionModel中,在去噪声的过程中,也添加一些噪声
如果不添加噪声会怎样?
下面是去噪声的过程中,完全不添加噪声的对比图
实际采样过程中,每步都要加入新的noise,这样做是因为根据经验,这有助于稳定神经网络防止崩溃。如果不加入新的noise,那么结果将会更加接近原始训练数据集的平均值,而非结果(说白了依旧是一堆糊状的平均值),加入之后则会产生具体的图像
总结
假设,我们拿很多梵高的画作为训练集图片,这些图是符合某种分布的(符合某种分布可以理解为,你看到这个画就觉得这个画是梵高画的);或者把分布比作“类”,把每个图片比作“对象”,我们现在手里有很多很多”图片“而我们是希望反向推出这个”分布“;一旦得到这个分布,我们就可以从这个分布中,”生成“新的图片了
我们的做法,是先向所有图像(时间步t=0)添加噪声,假设一共要加100次(T=100)噪声,加噪声的最终目的,是让图像转成高斯分布(因为高斯分布我们是已知的);而每一次添加噪声后(从宏观角度看,或从类的角度看),在t=1时所有的的图像,也可以符合一种分布(我们还是未知的);然后继续添加噪声,在t=10时所有的图像也可以符合一种分布(未知)。随着t越来越大,当t=90时的所有图像,已经很接近于我们知道的高斯分布(接近已知),而等t=100时,所有图像都是高斯分布(已知)。
从而,我们得到了从未知分布到已知分布的过程【加噪声过程】
加噪声的过程中,每一步添加多少噪声,是由噪声控制表(人为设定的),能否让机器自己学呢?理论上可以,但实践发现效果不好
随后,我们需要从已知分布得到未知分布【去噪声过程】
我们希望的目的是,有一个非常强的模型,输入给他一个在时间步t=100的图像,它能输出【加噪声过程】对t=99的图像添加了的噪声,一旦模型得到了这个噪声,我们就可以拿t=100的图像 减去 噪声 得到 t=99的图像,后续反复如此。直到得到t=0的图像(也就是恢复出来的。
然而,在去噪声的过程中,模型预测的噪声和在t=99时添加的真实噪声可能有一定误差,我们根据这个误差,可以反向的修正网络的参数,直到可以控制误差小于某个阈值。此时就可以近似认为,模型可以99.99%的能力预测出时间步t的图像的噪声
不同部件的功能
在使用像 Stable Diffusion 这类基于扩散的图像生成模型时,一些关键组件包括 ckpt (checkpoint) 模型文件、采样器(如 DDPM 或 DDIM),以及调度器。这些组件共同协作,使得从随机噪声生成精细图像成为可能。我将逐一解释它们的作用和相互关系。
CKPT 模型文件
CKPT 模型文件是训练好的模型的保存状态,包含了模型的所有参数和权重。这些文件是机器学习中的“检查点”,允许从特定的训练阶段开始执行或继续训练过程。在图像生成的上下文中,这些模型文件被用来:
- 预测噪声:具体来说,模型是训练来预测在给定的噪声图像中的原始图像的噪声分布。这样,当我们逐步去除预测的噪声时,就能逐渐还原出原始的、无噪声的图像。
采样器(Sampler)
采样器用于管理如何从完全噪声化的状态(通常是一个高斯分布)逆向生成目标图像的过程。它们定义了逆向步骤的具体执行方式:
- DDPM(Denoising Diffusion Probabilistic Models):在这种方法中,采样过程包括向图像中注入随机噪声和逐步去除噪声的步骤。它依赖于概率推断来逐步还原图像,每一步都是随机的,这有助于探索多种可能的输出。
- DDIM(Denoising Diffusion Implicit Models):DDIM 提供了一个更快和更确定的逆向扩散路径。它通过计算给定的扩散路径上的噪声状态,而不是随机地选择,从而可以更快地生成图像,同时保持较高的质量。
调度器(Schedule)
调度器则控制噪声的增加和减少的时间表,即在扩散和反向扩散过程中的“步骤计划”。它们精确地管理:
- 噪声水平的调整:确定在每一步中噪声应该被加入或去除的量。
- 步骤的数量和间隔:决定整个生成过程中应该有多少步骤,以及这些步骤之间的时间间隔。
调度器也有很多方案,如linear,cosine,karras等,不同的调度器也会影响生成结果,下图展示了一些调度器的计算公式
注意在cosine中,当t越接近于T时,就越接近0,此时会让图像更接近于一个纯高斯噪声【并不是完全为高斯噪声】
这篇文章讨论了让完全为高斯噪声的效果,即等于0
总结来说,ckpt 模型文件提供了训练好的模型参数,采样器(如 DDPM 和 DDIM)定义了噪声的去除过程的具体执行方式,而调度器则优化了这个过程的步骤和时间表。这些组件共同作用,实现了从高噪声状态到高质量图像的转变。
关于训练
训练过程是包含了”加噪声过和去噪过程“,加噪声过程,把一张图加噪声,得到这个图的纯噪声图(服从高斯分布);去噪声过程,从这个高斯分布图开始去除噪声,使用DDIM或DDPM进行去除噪声,而生成过程,就是去噪声过程,所以也会使用DDIM或DDPM,训练过程中同样需要DDPM,DDIM之类的采样器,而一旦模型被训练好,哪怕训练过程中用DDIM作为采样器去除的噪声,在实际生成中,可以用DDIM或DDPM,但从效果上,也许用DDIM更好
实验
在ComfyUI中,使用Ksampler(Advanced)采样器,
- add_noise: disable
- noise_seed: 42
- control_after_generate: fixed
- steps: 20
- cfg: 8
- smapler_name: ddpm
- scheduler: normal
可能是ComfyUI的bug,如果不对Ksampler进行一些修改,无法连续两次根据相同一样参数生成图像;于是,在使用scheduler=normal生成一张图后,将scheduler修改成karras再生成图,再调整回scheduler为normal,反复如此
Q1: 相同初始噪声,分别使用DDPM、DDIM,在使用相同的schedule添加噪声,能否得到相同图像;
结论
经过验证,当Ksampler中的"add_noise
"设置为disable,在其它参数全部一致(噪声,scheduler等)下多次进行生成,DDPM确实生成了不同的图像;与原版论文中DDPM的行为相似(因为会在生成过程中添加随机噪声)
在其它参数全部一致(噪声,scheduler等)下多次进行生成,而DDIM确实只生成相同的图像
另外,当Ksampler中的"add_noise
"变成enable后,DDPM也可以多次生成相同的图像,DDIM仍是多次生成相同的图像
猜测时add_noise=enable后,会启用
相同初始噪声,分别使用DDPM、DDIM,不添加噪声,能否得到相同图像
结论
使用v2-1_512-ema-pruned.safetensors,当Ksampler中的"add_noise
"变成disable后,不论用DDPM/DDIM都无法生成图像(会出现全部是纯色图像或只有人物袖子的图片),无法完成任务
相关链接
Diffusion从理论角度入门讲解
Lilian Weng’s blog on Diffusion Models
这篇博客由Lilian Weng撰写,详细介绍了扩散模型的理论基础,包括其工作原理、生成质量的提升以及分辨率的扩展。
Diffusion从实战角度的入门讲解
Part I: Understanding Diffusion Models to Generate My Favorite Dog - Part 1
这篇文章是关于如何实战应用扩散模型生成图像的初学者指南,具体展示了生成过程和模型训练的基本步骤。
Part II: Understanding Diffusion Models to Generate My Favorite Dog - Part 2
这篇文章是第一部分的延续,深入探讨了更多高级技巧和优化方法,帮助读者更好地掌握扩散模型的应用。
Diffusion历史梳理
这段视频详细梳理了扩散模型的发展历史,从早期的研究到最新的进展,为读者提供了全面的历史背景。
详解Classifier Guidance与Classifier Free Guidance(图非常好)
Geometry and Guidance in Diffusion Models - Sander.ai
这篇文章解释了扩散模型中的几何学和指导技术,包括classifier guidance和classifier-free guidance,并配有详细图示帮助理解。
Guidance Techniques in Diffusion Models - Sander.ai
本文具体探讨了不同的指导技术在扩散模型中的应用,帮助读者理解这些技术的实现细节和效果。
StableDiffusion3论文
这是StableDiffusion3的原始论文链接,提供了该模型的详细研究和技术实现。
StableDiffusion3论文讲解
Stable Diffusion 3 Explained - YouTube
这段视频对StableDiffusion3的论文进行了详细讲解,适合希望快速了解该论文核心内容的读者。
Another explanation of Stable Diffusion 3 - YouTube
另一段视频讲解了StableDiffusion3的论文,从不同角度分析了其技术细节和创新点。
Rectified Flow
Understanding Rectified Flow - Hugging Face
这篇博客文章介绍了Rectified Flow的概念和应用,帮助读者理解其在生成模型中的作用和优势。
自己实现DDIM及DDIM inversion
Implementing DDIM and DDIM Inversion - UCLA Deep Vision
这篇文章详细介绍了如何实现DDIM及其逆过程,为读者提供了实战代码和实现步骤。
使用Cross Attention解释StableDiffusion
Explaining Stable Diffusion with Cross Attention - Colab
这篇Colab笔记本通过Cross Attention机制解释了Stable Diffusion模型的工作原理,适合希望通过代码实践理解模型的读者。
Transformers讲解
Transformers Explained - YouTube
这段视频对Transformer模型进行了深入讲解,适合对这一基础模型感兴趣的读者。
Another explanation of Transformers - YouTube
另一段关于Transformer模型的讲解视频,从不同角度分析了其工作机制和应用场景。
Towards Data Science: Transformers
这篇文章详细介绍了Transformer模型的工作原理和技术细节,适合希望从理论角度深入理解的读者。
Tokenizer计算
这个工具用于计算文本中的token数量,帮助用户理解和优化模型输入。
DIT架构