ddpm (旧)

1 AE

Autoencoder,自编码器。1980 这个思想已经被提出来了,但是由于算力限制,当时的只是用计算机加速一下 PCA 这样的东西。

PCA 本质就是一个自编码器。相当于把一个高维压缩到一个低维,然后低维再去还原回去,使得失真度尽可能低。

2006 年,提出了用深度神经网络来代替这个压缩和还原的过程。我用下面的图来解释:

image

这个神经网络输入输出都是 5 维,但是隐层 latent space 只有 2 维。然后我训练的 loss 很简单,就是 。不断的这么训练。

然后我想压缩的话,就把 input 输进来,取出 latent space 的特征表示,就是压缩后的向量。

如果我想还原的话,就把刚才压缩后的向量输进后面黄色的 network ,就可以得出还原的 output。

非常精巧的思想,right?思想简单而且很好实现,我们把蓝色部分的 network 叫做 encoder ,黄色部分的 network 叫做 decoder,绿色部分的 network 叫做 latent space。

2 生成模型的思考

生成模式是指,网络能生成我们未曾喂进去的数据。

上面的 AE 已经可以给我们带来启发了。既然 AE 中我们把整个 AE 分为了 encoder 和 decoder ,那么显然 decoder 是能单独提出来的啊!

假设 latent space 是 k 维,那么我随便弄一个 k 维向量,然后扔进 decoder,不就会生成出来一个东西了吗?

很好的 idea,但是这样并不 work 。也就是大概率你随便弄的 k 维向量丢进去经过 decoder 生成出来的东西是一个毫无意义的乱码。

究其本质,是因为你随机弄的 k 维向量在 latent space 中是个并无语意的点。也就是先前训练集中没有数据被映射到这个点。

降维的本质,就是从高维空间到低维空间的映射,而且大多数情况,是点对点的映射。

至此,我们似乎能稍微感受到生成模型的本质了:我们需要在一个空间中随便选点,而且这个点必须要有语义!

如何保证呢?

传统的 encoder 只能保证是点对点的映射,所以这必然会导致 latent space 中大部分点都是无意义的,而且有意义的点之间可能离得很远。

所以,我们需要构建一个新的 encoder ,使得可以完成点对分布的映射。这样大部分区域就都有意义了。

怎么弄呢?我们此时的 latent space 可以去拟合分布的参数,我就以一维正态分布(高斯分布就是正态分布)举例,假设 latent space 就俩神经元分别拟合

然后我的 loss 有三个:。这样就保证了我训练出来的模型,既能压缩还原图片,而且其 latent space 的参数代表的分布是个标准正态分布。

但是如何完成点对分布的映射呢?感觉你这样还是点对点映射啊,只不过从高维到二维的压缩罢了。

所以训练的过程中,要引入——采样。

即每次一张图片进来,我先经过 encoder ,得到 ,然后根据这个分布,我去这个分布里采样一个点 ,然后把 (因为是一维分布,所以此时只有一个数)扔进 decoder ,然后得到 output。

通过这么训练,其实上就完成了点到分布的映射。因为同一张图片,因为采样的存在,所以一维坐标上的任意一点都可能被选中,然后去生成图像。相当于这张图片被映射到了整个数轴,只不过越靠近 的地方,被映射训练的次数更多,也就是跟原图像越像。

这种训练方式就是思维的一个跨越,好好体会。

但是这么做的话,当我们的 input 图像很多的话,必然会使得数轴上的某点承担的“责任”过多,即可能很多图像都会被映射到这个点上,那么这个点 decoder 回去的图像就“四不像”了。所以还原效果肯定不好。说白了,就是 latent space 太小了,其表征能力不够,我们需要扩大它。

一个很自然的想法就是将其扩展到二维标准正态分布,这很好。于是 latent space 就有四个神经元,分别表示 ,将 latent space 可视化如下:

image

这样子,我们再去做训练,效果会好很多。采样的时候按照二维高斯分布去采样即可。

而且,经过科学家们的实践发现,这个 latent space 居然带有含义了!具体来说,他们发现,这不是二维标准正态嘛,其中 x 轴控制的维度控制着生成图像的亮暗, 轴控制的维度控制着生成图像的数字类型(假设是 MNIST 数据集)。

这并不是我们之前人为能想到的。这是个意外发现。我们来想下为什么会出现这种情况。

因为 loss 函数的限制,我们保证了两个分布都尽可能的接近标准正态分布,而两个标准正态分布的叠加仍然是标准正态分布,所以 latent space 确实在逼近二维标准正态分布,这没问题。

而且因为我们是点对概率的映射,而正态分布能保证任意一个点都能被采样到,所以 latent space 中的绝大部分都会被采样到过至少一次,也就是说有了语义。另外,因为我们的 latent space 是个正态分布,所以越靠近 的地方会被采样越多次,换句话说,越靠近 的地方跟 input 长的越像。这就会使得 latent space 中的欧式距离与语义挂上了钩。

所以很自然,同一个特征变化的 input 映射到 latent space 中在坐标体现上是连续变化的。

这就可以很好的解释为什么“每个维度是 latent space 中的一个“控制开关”,控制数据的某种特性“了。

此时的 latent space 具有的两个性质,已经能很好的支持它成为一个生成模型了:

  1. 绝大部分区域都具有“语义”
  2. 距离与“语义”挂上了钩

那么,我们在 latent space 里任意采样一点,生成出来的图片至少会有语义。然后通过调节各个轴的取值,我们还能改变图像的某种属性。这是一个很好的生成模型。

3 VAE

Variational Auto-Encoder。前面在 “2 生成模型的思考” 里我已经把 VAE 的核心 idea 讲出来了,就是将 AE 点对点的映射变为点对分布的映射。这也是 variational 变分这个单词的含义,即变换分布。

下面我直接来讲解它的框架图:

image

encoder 就是个 network 不用管。

然后 latent space 就是 (这里都是俩向量,表示多维)。为啥要用 呢?因为 network 的输出是有正有负的,所以我们就令其输出为 ,然后算出的 就是正的了。

然后 sampled noise 是干啥呢?因为我们知道,对于 ,那么 。那么我们考虑逆过程,令 ,然后对 采样,得到的 给它乘一个 ,然后加上 ,得到的样本就相当于从 中采样了。

这么做第一是方便,第二是我们将要丢给 decoder 的东西就带有 了,这样反向传播的时候我们就能将影响叠到 身上了,否则原来那样直接采样我们无法对 进行反向传播。这算是一个小 trick 吧。

得到的 latent vector 后丢给 decoder 就可以得到输出了。

然后 VAE 的 loss 函数是 ,第一部分就是衡量还原的图片像不像,第二部分就是令第 i 个维度的分布尽可能接近一维标准正态分布 (这样若干个维度共同表示的 latent space 才能是一个多维标准正态分布)。

具体第二项是怎么来的,是用 的 KL 散度推出来的。KL 散度可以看作是衡量两个分布之间差距的一种工具。这比前面我在 “2 生成模型的思考” 里提到的直接让 直接是 loss 的效果更好。

KL 散度

数字、货币都是衡量事物的一个东西。

那么衡量事件信息含量的东西,叫做信息量

衡量随机变量 的信息含量的东西,叫做熵

衡量两个分布 之间差距的东西,叫做 KL 散度

  • 注意 KL 散度不是距离,即
  • KL 散度始终 >=0,吉布斯不等式证的

4 公式理解 VAE

前面 Section 1, 2, 3 都是为了让小白有更好的 AI 直觉而写的,作为初学生成模型是很好的,下面我来用公式这个角度去理解 VAE 。

规定 为数据, 为数据本身服从的分布, 为模型预测的分布,那么 likelihood-based 思想就是想让 这两个分布尽可能接近。

但是 是个非常复杂的分布,无法求出来,所以 这样的损失函数肯定是求不出的。所以,我们得绕点远路解决这个问题。

首先,我告诉你有这个不等式: 。右边的那一坨叫做 ELBO ,推导方法有两种:

法一:

琴生不等式是说,对于凸函数 ,有 是一个凹函数。

琴生不等式很好理解,一个最简单的例子就是凸函数上取两点

但这种推法,推出这个 ELBO ,也没啥用,还是没找到突破口。只是找到了定值 的一个下界。所以,就需要掌握第二种推法:

法二:

通过法二这个推法,我们可以知道, 与下界 ELBO 之间,差了一个 KL 散度。当 KL 散度取到 0 时取等号。

那么 recall 下 VAE 的结构,一个 encoder 一个 decoder ,再观察 KL 散度,发现 KL 散度描述的是 encoder 的分布 和真正映射的分布 之间的距离。我们当然希望这个距离越小越好,当这个距离是 0 时,那么我们的 encoder 就是完美的,因为此时它的编码结果就是真实数据的分布。

所以我们希望优化 encoder ,也就是最小化这个 KL 散度,因为 是定值,等价于最大化 ELBO 。那如何 ELBO 如何计算呢?我们继续将 ELBO 拆解一探究竟。

重建项的意思就是首先 映射到了 分布上,然后同过 decoder 再映射回 的分布的 。所以要让映射回去的 的分布与 本身分布越接近越好。所以可以用 来代表这个 reconstruction term ,越小越好。

然后因为我们是要最大化 ELBO 嘛,所以 越小越好。 这个分布是自己定的,因为我们要求 VAE 有生成能力,所以规定了 服从正态分布。所以我们就要让 encoder 产生的 这个分布尽可能接近正态分布。

所以回顾一下,这个问题一共存在下面的分布:

我们首先为了让 尽可能接近,需要要让 ELBO 尽可能大。然后想让 ELBO 尽可能大,发现需要满足两个要求:

  1. 尽可能近
  2. 尽可能进

很巧欸,也就是说,只要满足了这两个条件,那么就可以让 encoder 的分布 和 decoder 的分布 与真实数据之间映射的分布接近了。那么模型就收敛了。

而且这两个条件是可以量化的,条件 1 就用 ,条件 2 就用 。算出来一个常量用反向传播去优化 encoder 和 decoder 的参数即可。

上面的数学推导很精彩,为 VAE 提供了理论支撑。

5 公式理解 diffusion model

先说明,diffusion model 的推导不难,但是步骤非常长。个人认为需要掌握好推导的关键思路即可。具体完整的推导去看这个 up 主的视频:

diffusion model 其实本质上就是一个级联隐层的 VAE 。在推导方法上跟推导 VAE 是一致的。

先说好,diffusion model 里的公式推导为了方便,我们把变量名先说好:

  1. 所有隐层不再用 来表示。所有层都用 表示, 代表数据, 代表最后一层。
  2. 前向加噪的 encoder 都用 表示,反向去噪的 decoder 都用 表示。

先说好,diffusion model 的隐层跟 VAE 的隐层有几点不同:

  1. 所有隐层 的维度与数据 的维度相同
  2. 所有的 encoder 都不需要学习,而是实现定义好的正态分布,即

同样的,diffusion model 我们也规定最后一层的隐层变量分布服从标准正态分布,即

好,接下来开始推导。

推导思路一样的,我直接给出结果:

发现跟 VAE 的唯一区别,就是多了 denoising matching term 。

第一项相当于就是反向去噪的最后一步。

第二项就是我们不用算因为是个定值。而且这个值其实在我们的规定下,就趋近于 0 了。因为其实可以通过递推推导出:

,当 时, ,所以 趋近于

第三项里的 咋求啊,其实可以求的,这里我直接给出结果:

所以我们想要 接近,就让 的均值和方差分别你和上面的均值和方差就好啦。

然后拟合均值和方差,可以经过推导转化为根据 和步数 拟合 。即

recall 一下,我们要最大化 ELBO ,需要最小化 denoising matching term 和 reconstruction term,然后最小化 denoising matching term 即最小化

当我们最小化 这玩意时,发现其实 reconstruction term 也顺便最小化了。

然后作者经过推导,又推出最小化 ,就等价于最小化 ,其中

所以,最小化上面那玩意,就相当于训练优化了整个 diffusion model。

下面给出 DDPM 的训练和推理过程:

image

训练就是 input 一个 ,一个时间步 ,一个标准 noise 。然后 model 根据 input 算出预测的 noise ,跟 ground truth 的 对比一下。

推理就是从最后一层开始推(最后一层是标准正态分布),所以 从标准正太分布里采样。然后依次往前推就行。

补充一句,其实可以公式推导出:,所以重参数化就可以得到 的表达式。

如果没看懂,就从 Section 4 开始,再看一遍。

6 Stable Diffusion Model

image

我是这么理解 stable diffusion model 的,首先需要准备一个 CLIP 模型,然后准备很多 image-text pairs ,把这些 pairs 经过 CLIP 得到很多向量 pairs 。然后用这些 pairs 去训练一个 diffusion model ,即 input image vector, text vector, t, 去训练。

然后用把 pairs 中的 images 的向量取出来,去训练一个 decoder ,input vector ,输出 image 。

这样子之后,推理的时候,只需要输入一段文字,经过 CLIP 的 text encoder 后得到 text vector,再来一个标准 noise 编码后,一起 input 进 diffusion model 里,就能输出一个 image vector 。把这个 image vector 输入进 decoder ,即可还原出图片。

因为 diffusion model 去噪的过程是随机过程,所以这个模型就具有了生成能力。

  • 算法
    437 引用 • 254 回帖 • 24 关注
3 操作
qixingzhou1125 在 2025-04-02 20:57:26 更新了该帖
qixingzhou1125 在 2025-04-02 00:30:32 更新了该帖
qixingzhou1125 在 2025-03-21 18:41:13 更新了该帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...