摘要。近年来,生成工具的惊人增长为文本到图像生成和文本到视频生成提供了许多令人兴奋的应用。这些生成工具背后的基本原则是扩散的概念,这是一种特定的采样机制,克服了以前方法中被认为困难的一些缺点。本教程的目标是讨论扩散模型的基本思想。本教程的目标受众包括有兴趣对扩散模型进行研究或应用这些模型来解决其他问题的本科生和研究生。
目录
1 The Basics: Variational Auto-Encoder (VAE)
1 The Basics: Variational Auto-Encoder (VAE)
1.1 VAE Setting
很长一段时间前,在距离很远的星系中,我们希望构建一个从潜在代码生成图像的生成器。最简单的(也许是最经典的)方法是考虑一个编码器-解码器对,如下所示。这被称为变分自编码器(VAE)[1,2,3]。
自动编码器有一个输入变量 x 和一个潜在变量 z。为了了解主题,我们将 x 视为美丽的图像,z 视为某种生活在某个高维空间中的向量。
例:获取图像的潜在表示并不是一件外星的事情。回到JPEG压缩(可以说是恐龙)的时间,我们使用离散余弦变换(DCT)偏差 来编码图像的底层图像/补丁。系数向量 通过将补丁块 x 投影到偏差所跨越的空间来获得:。因此,如果您给我们一个图像 x,我们将返回一个系数向量 z。从 z 中,我们可以进行逆变换以恢复(即解码)图像。因此,系数向量 z 是潜在代码。编码器是DCT变换,解码器是逆DCT变换。
名称“变分”来自我们使用概率分布来描述 x 和 z 的因素。我们没有求助于将 x 转换为 z 的确定性过程,而是更感兴趣的是确保分布 p(x) 可以映射到所需的分布 p(z),并向后转到 p(x)。由于分布设置,我们需要考虑几个分布。
- p(x):x 的分布。从来没有知道过。如果我们知道它,我们将成为十亿富翁。扩散模型的整个星系是找到从p(x)中抽取样本的方法。
- p(z):潜在变量的分布。因为我们都是惰性的,所以让我们只是使其成为零均值单位方差高斯 p(z) = N (0, I)。
- p(z|x):与编码器相关的条件分布,它告诉我们给定 x 时 z 的可能性。我们无法访问它。p(z|x) 本身不是编码器,但编码器必须做一些事情,以便它与 p(z|x) 始终表现。
- p(x|z):与解码器相关的条件分布,它告诉我们在给定 z 的情况下获得 x 的后验概率。同样,我们无法访问它。
上述四个分布不是太神秘的。这是一个有点琐碎但具有教育性的例子,可以说明这个想法。
例。考虑一个随机变量 X,根据具有潜在变量 z ∈ {1, ..., K} 的高斯混合模型分布表示集群身份,使得 对于k=1,...,k, 。我们假设。然后,如果被告知我们只需要查看第k个簇,则给定Z的X的条件分布为
x 的边际分布可以使用全概率公式找到,给定:
因此,如果我们从 p_X(x) 开始,编码器的设计问题以构建魔术编码器,使得对于每个样本 x ∼ pX(x),潜在代码将是 z ∈ {1, ..., K},分布 z ∼ pZ (k)。
为了说明编码器和解码器的工作原理,让我们假设均值和方差是已知的并且是固定的。否则,我们需要通过 EM 算法估计均值和方差。它可以做到这一点,但繁琐的方程将违背此说明的目的。
编码器:我们如何从 x 获得 z。这很容易,因为在编码器中,我们知道 p_X(x) 和 p_Z (k)。想象一下你只有两个类 z ∈ {1, 2}。实际上,您只是对样本 x 应该所属的位置做出二元决策。你可以通过多种方式进行二元决策。如果你喜欢最大后验,你可以检查
这将返回您一个简单的决策规则。你给我们 x,我们告诉你 z ∈ {1, 2}。
解码器:在解码器端,如果我们给定一个潜在代码 z ∈ {1, ..., K},魔术解码器只需要返回我们从 中抽取的样本 x。不同的 z 将为我们提供 K 个混合组件之一。如果我们有足够的样本,整体分布将遵循高斯混合。
像你这样的智能读者肯定会抱怨:“你的例子是如此微不足道地不真实。”不用担心。我们理解。当然,生活比具有已知均值和已知方差的高斯混合模型要困难得多。但是我们实现的一件事是,如果我们想找到魔术编码器和解码器,我们必须有一种找到两个条件分布的方法。然而,它们都是高维生物。因此,为了我们说更有意义的东西,我们需要施加额外的结构,以便我们可以将概念推广到更难的问题。
在VAE的文献中,人们提出考虑以下两个代理分布的想法:
- q_φ(z|x): p(z|x)的代理。我们让它成为高斯分布。高斯的原因吗?没有特别好的理由。也许我们只是普通人(也就是懒惰的人)。
- p_θ (x|z): p(x|z)的代理。信不信由你,我们也会把它变成高斯分布。但是这个高斯函数的作用与高斯函数q_φ(z|x)略有不同。虽然我们需要估计高斯q_φ(z|x)的均值和方差,但我们不需要估计高斯p_θ (x|z)的任何东西。相反,我们需要一个解码器神经网络将z转换成x。高斯p_θ (x|z)将用来告诉我们生成的图像x有多好。
输入x与潜在z之间的关系以及条件分布如图1所示。有两个节点x和z。“正向”关系由p(z|x)指定(并由qφ(z|x)近似),而“反向”关系由p(x|z)指定(并由pθ (x|z)近似)。
图1:在变分自编码器中,变量x和z由条件分布 p(x|z)和 p(z|x)连接。为了使事情可行,我们分别引入两个代理分布p_θ (x|z)和q_φ(z|x)。
例。是时候考虑另一个简单的例子了。假设我们有一个随机变量x和一个潜在变量z
我们的目标是构建一个VAE。(什么? !这个问题有一个平凡的解,其中z = (x−μ)/σ和x = μ + σz。你完全正确。但是请遵循我们的推导,看看VAE框架是否有意义。)
通过构建VAE,我们的意思是我们想要构建两个映射“编码”和“解码”。为简单起见,我们假设两个映射都是仿射变换:
我们懒得找出联合分布p(x, z),也懒得找出条件分布p(x|z)和p(z|x)。但是我们可以构造代理分布q_φ(z|x)和p_θ (x|z)。既然我们可以自由选择q_φ和p_θ应该是什么样子,那么我们考虑下面两个高斯函数
这两个高斯函数的选择并不神秘。
对于q_φ(z|x):
如果给定x,我们当然希望编码器根据我们选择的结构对分布进行编码。由于编码器结构是ax + b, q_φ(z|x)的自然选择是平均值ax + b。方差选择为1,因为我们知道编码样本z应该是单位方差。
类似地,对于p_θ (x|z):
如果给定z,则解码器必须采用cz + d的形式,因为这是我们设置解码器的方式。方差是c,这是我们需要计算的参数。
在继续这个例子之前,我们将暂停一下。我们想介绍一个数学工具。
1.2 Evidence Lower Bound
我们如何使用这两个代理分布来实现确定编码器和解码器的目标?如果我们把φ和θ作为优化变量,那么我们需要一个目标函数(或损失函数),以便我们可以通过训练样本来优化φ和θ。为此,我们需要建立一个关于φ和θ的损失函数。我们在这里使用的损失函数称为证据下限(ELBO) [1]:
你一定很困惑,地球上的人是怎么想出这个损失函数的!让我们看看ELBO是什么意思以及它是如何推导出来的。
简而言之,ELBO是先验分布logp (x)的下界因为我们可以证明这一点
不等式来源于KL散度总是非负的事实。因此,ELBO是 log p (x)的有效下界。因为我们永远无法访问log p (x),如果我们可以访问ELBO并且如果ELBO是一个很好的下界,那么我们就可以有效地最大化ELBO来实现最大化log p (x) 的目标,并且这是黄金标准。现在的问题是下界有多好。从等式和图2中可以看到,当我们的代理q_φ(z|x)能够完全匹配真实分布 p(z|x) 时,不等式将变成一个等式。所以,游戏的一部分是确保q_φ(z|x)接近p(z|x)。
图2: log p(x)和ELBO的可视化。两者之间的差距由KL散度决定:KL(q_φ(z|x)∥p(z|x))。
Eqn(3)的证明,这里的诀窍就是用我们神奇的代理q_φ(z|x)来探出p(x)的边界并推导出它的边界。(这里大概是都说 log p(x)可以写成 log p(x) 在 q_fai(z|x) 下的期望。 wilson)
最后一个等式是一个有趣的事实对于任意随机变量z和标量a, 。当然,E[a] = a,
既然我们已经得到了Eq_φ(z|x)[·]。再走几步就好了。我们用贝叶斯定理来说明p(x, z) = p(z|x)p(x):
我们知道第一项就是ELBO,而第二项就是KL散度。比较Eqn(5)和Eqn(3),我们知道生活是美好的。(作者很努力让这个教程不太枯燥。wilson)
现在我们有了ELBO。但是这个ELBO仍然不是很有用因为它涉及到p(x, z),这个我们无法访问的东西。所以,我们需要做更多的事情。让我们仔细看看ELBO
我们秘密地将不可访问的p(x|z)替换为它的代理p_θ (x|z)。这是一个美丽的结果。我们只是展示了一些很容易理解的东西。
在Eqn(6)中有两项:
- 重 构。第一项是关于解码器的。如果我们给解码器输入一个潜在的z,我们希望解码器产生一个好的图像(当然!!)。我们想要最大化log p_θ (x|z),它类似于最大似然,我们想要找到模型参数来最大化观察图像的可能性。这里的期望是关于样本z(以x为条件)的。这并不奇怪,因为样本z是用来评估解码器质量的。它不是一个任意的噪声向量,而是一个有意义的潜在向量。所以 z 需要从 q_φ(z|x)中采样。
- 先验匹配。第二项是编码器的KL散度。我们希望编码器将x转换为潜在向量z,这样潜在向量将遵循我们选择的(惰性)分布 N(0, I)。为了更一般,我们将p(z)写为目标分布。因为KL是一个距离(当两个分布变得更不相似时它会增加),我们需要在前面加一个负号,这样当两个分布变得更相似时它就会增加。
例: 让我们继续简单的高斯的例子。我们从之前的推导中知道:
为了确定θ和φ,我们需要最小化先验匹配误差和最大化重构项。对于先验匹配,我们知道
由于,当 时,kl散度最小,使得 。因此,E[ax + b] = 0, Var[ax + b] = 1。对于重构项,我们知道
由于E[z] = 0, Var[z] = 1,因此当c = σ, d = μ时,项最大。
综上所述,编码器和解码器参数为
这很容易理解。
重构项和先验匹配项如图3所示。在这两种情况下,在训练过程中,我们假设我们可以访问z和x,其中z需要从 q_φ(z|x) 中采样。然后,对于重建,我们估计 θ 以最大化 p_θ (x|z)。对于先验匹配,我们找到φ来最小化KL散度。优化可能具有挑战性,因为如果更新φ,分布 q_φ(z|x) 将发生变化。
图3:解释变分自编码器在ELBO中的重构项和先验匹配项。
1.3 Training VAE
现在我们理解 ELBO 的含义,我们可以讨论如何训练 VAE。为了训练 VAE,我们需要地面实况对 (x, z)。我们知道如何获得 x;它只是数据集中的图像。但相应地,z 应该是什么。
让我们谈一下编码器。我们知道 z 是从分布 q_φ(z|x) 生成的。我们还知道 q_φ(z|x) 是高斯的。假设这个高斯的均值 μ 和协方差矩阵 (Ha!我们再次懒惰!我们不使用一般的协方差矩阵,而是假设方差相等)。棘手的部分是如何从输入图像x确定 μ 和 。Okay,如果你跑出线索,不担心。欢迎力量的黑暗面。我们构建了一个深度神经网络,使得
因此,样本z^(ℓ)(其中ℓ表示训练集中第ℓ个训练样本)可以从高斯分布中采样
这个想法总结在图 4 中,我们使用神经网络来估计高斯参数,从高斯中我们抽取样本。注意μ_φ(x^(ℓ))和σ^2_φ(x^(ℓ))是x(ℓ)的函数。因此,对于不同的 x(ℓ),我们将有不同的高斯。
图 4:VAE 编码器的实现。我们使用神经网络对图像进行 x 并估计高斯分布的平均 μ_φ 和方差 σ^2_φ。
备注。对于任何高维高斯 x ∼ N (x|μ, Σ),采样过程可以通过白噪声的转换来完成
其中 w ∼ N (0, I)。半矩阵 Σ 1 2 可以通过特征分解或 Cholesky 分解获得。对于对角矩阵 Σ = σ2I,上述简化为
让我们谈一下解码器。解码器是通过神经网络实现的。为简单起见,让我们将其定义为解码 θ,其中 θ 表示网络参数。解码器网络的工作是取潜在变量 z 并生成图像 bx:
现在让我们做一个更(疯狂)的假设,即解码图像 bx 和地面实况图像 x 之间的误差是高斯的。(Wait,再次高斯?!)我们假设
然后,分布 pθ (x|z) 是
其中 D 是 x 的维度。这个方程说 ELBO 中似然项的最大化实际上是解码图像和地面实况之间的 ℓ2 损失。这个想法如图 5 所示。
图 5:VAE 解码器的实现。我们使用神经网络来获取潜在向量 z 并生成图像 bx。如果我们假设高斯分布,对数似然将给我们一个二次方程。
1.4 Loss Function
一旦您了解编码器和解码器的结构,损失函数就很容易理解。我们通过蒙特卡罗模拟来近似期望:
( MC算法是一大类随机算法,用大量随机样本估算数据的真实值,常用来解决概率统计中的许多复杂计算问题。)
其中 x^(ℓ) 是训练集中的第 ℓ 个样本, 是从 中采样的。分布q_θ为。
Training loss of VAE:
其中 是训练数据集中的地面实况图像, 是从等式 (7) 中采样的。
KL 散度项中的 z 不依赖于 ℓ,因为我们正在测量两个分布之间的 KL 散度。这里的变量 z 是一个虚拟的。
我们需要澄清的最后一件事是 KL 散度。由于 ,我们基本上来自两个高斯分布。如果你去维基百科,我们可以看到两个 d 维高斯分布 N (μ_0, Σ_0) 和 N (μ_1, Σ_1) 的 KL 散度为
通过考虑,我们可以证明KL散度具有解析表达式
其中 d 是向量 z 的维度。因此,整体损失函数 Eqn (12) 是可微的。因此,我们可以通过反向传播梯度端到端地训练编码器和解码器。
1.5 Inference with VAE
对于推理,我们可以简单地将潜在向量 z(从 p(z) = N (0, I) 采样)扔到解码器解码 θ 并获得图像 x。这就是它;见图 6。
图 6:使用 VAE 生成图像与通过解码器发送潜在噪声代码 z 一样简单。
祝贺!我们完成。这是关于 VAE 的一切。
如果您想阅读更多,我们强烈推荐 Kingma 和 Welling [1] 的教程。可以在 [2] 中找到更短的教程。如果您在 Google 中键入 VAE 教程 PyTorch,您将能够找到数百个,如果不是数千个编程教程和视频。
【1】[PDF] An Introduction to Variational Autoencoders-论文阅读讨论-ReadPaper - 轻松读论文 | 专业翻译 | 一键引文 | 图表同屏【2】[PDF] Tutorial on Variational Autoencoders-论文阅读讨论-ReadPaper - 轻松读论文 | 专业翻译 | 一键引文 | 图表同屏