生成式模型学习笔记
最近这两天在看Diffusion,然后沿着Diffusion的路径回去看了看VAE等经典生成式模型的理论,发现以前很多对其中的很多地方都比较模糊。经过一番考据之后,发现我以前对于生成式模型有许多的误解和没想通的地方,所以打算写一篇博客梳理一下。
生成式模型到底在干什么?困难在哪?
我们都知道生成式模型可以生成各种各样的数据,例如GPT可以生成各种文本,Diffusion可以生成图像等。这些模型假设需要生成的数据服从某个分布,这样需要生成数据的话只需要从中进行采样即可。那么要实现一个生成式模型,就需要实现两点:需要对真实数据分布建模,以及能从建模的分布中进行采样。
然而,当我们需要生成复杂数据时,这两点都是很困难的。首先,真实数据分布是相当复杂的,你可以想象一下,是自然语言的话,这个分布会长什么样,我们很难直接去拟合这种复杂的分布。另外,可能很多初学者会忽略的一点是,即使我们有一个准确的,我们也很难利用其进行生成,因为我们也很难在其中进行高效采样。是想一下,现在你有一个自然语言的分布,我要让你从中采样出一句话,按照离散分布的采样方法,你可能要枚举某个长度内所有词元的排列组合才能进行一次采样,而这在计算上是不可接受的。
为了解决这些问题,主流的生成式模型大多采取的一条思路是:使用多个简单的分布的组合来表示复杂的分布。这样做的好处是:首先简单的分布比复杂的分布容易学习和拟合,并且从简单的分布中进行采样是容易的。这同时解决了上述的两大困难,也是现在的生成式模型能够如此成功的原因。下面我们来具体看一看是怎么做的。
生成离散序列
当我们要对离散的序列(例如语言)进行生成的时候,我们来看看如何对数据分布进行建模。方便起见,我们固定序列的长度都为,我们有一个离散序列数据集那么有:
其中,是词表。要对上述的联合分布直接进行建模是非常困难的,并且即使我们真的拥有了一个准确的,我们也很难高效的在其中进行采样。我们尝试用更简单的分布的组合来表示这个复杂的分布,我们对上面的式子进行一些变换:
我们将上述联合分布变成了一系列条件分布的乘积,显然每个条件分布都远远比这个联合分布简单。那么我们来看如何利用这些条件分布采样出服从的数据。考虑这样一个采样过程:首先,根据分布采样出第一个词元,因为词表的大小通常不会超过20万,所以这是很容易做到的。根据采样出的词元,计算条件分布,然后利用这个条件分布采样出第二个词元,以此类推,直到采样出,得到一个完整的序列。不难看出,依据这种方式采样出的是符合分布的。
采样的问题解决了,下面就是如何拟合这类条件分布。其实,这些条件分布可以看做是一个以序列为输入的分类器(输出结果是各词元出现的概率,即一个离散分布)。那么,理论上能够处理序列输入的各种分类模型都可以用来拟合这些条件分布,主流的选择是Transformer。
那么推导一下训练目标吧,我们希望我们建模的分布和真实数据分布尽可能的接近,可以通过最小化KL散度来实现:
即为最大化似然函数,在分类的意义下就是我们最常见的交叉熵啦。
生成连续的高维向量
下面我们来考虑如何生成连续的高维向量(图像就是典型的连续高维向量)。还是考虑对数据分布进行建模。
首先,要对形式未知的连续分布进行建模比对离散分布要更加复杂和困难,同时要从一个形式未知的连续分布中进行采样也会变得更加困难。所以对于连续分布,我们往往会假设其形式,然后使用各种模型去拟合它的参数,而不是像离散分布那样去直接拟合它本身,这大大限制了单个连续分布的表达能力。
直接用单个具有某种具体形式的连续分布来表示显然不靠谱,还是考虑使用简单的分布的组合来表示。我们可以仿照上一节的做法把拆成每个分量的条件分布的组合吗?当然可以!不过像对于图像这种数据,这样我们需要逐像素的生成,效率太低了!我们这里考虑另外一种方式吧:引入隐变量并定义联合分布。对联合分布进行展开可得。此时我们对的形式和条件概率的形式进行假设(例如设成高斯分布),则类似于第一节的采样过程,我们先采样出,然后计算条件分布,再采样出即可,只需2步即可采样出!而由于每个都对应一个不同的,虽然和都是简单分布,但是其组合在一起可以表示较为复杂的分布!
错误的路径
不过我们的真实数据里其实是没有隐变量的,不如我们试试直接从采样出吧,那么我们来最小化KL散度试试:
发现问题所在了吗?上述目标式要求刻画两个独立随机变量之间的关系。这显然是不合理也是不可能做到的。上述问题的症结在于与之间是独立的,我们需要打破这种独立性。
变分自编码器VAE
为了打破独立性,我们引入刻画从到的分布。我们重新拆解一下联合分布:。
此时,我们再试试最小化的KL散度:
通过引入,我们成功的打破了与之间的独立性。而的目标也从刻画两个独立随机变量之间的关系变成了刻画两个相关的随机变量之间的关系,这个任务显然要容易很多。
下面我们简单解读一下这个目标。第一项告诉我们,从分布采样出的重构出来的要和原来的越接近越好。由于第一项只能保证从采样出来的能够有效重构成原来的,在我们的实际生成过程中的采样出来的并不一定能重构成原来的,所以第二项则是想让和越接近越好。
经典的模型VAE就是采取上述的建模方式和优化目标。本文受到苏神博客的启发,没有采用经典的从极大似然的角度出发进行推导,而是采用了更统一也更直观的KL散度的角度出发。VAE假设分布,,。我们可以用神经网络来拟合上述的。那么上述的优化目标可以写成:
就可以进行训练了~其中我们称其为编码器,我们称其为解码器,实际生成过程中,我们其实只需要用到解码器即可。我们之所以没有固定编码器的方差,就是因为在训练初期的时候,编码器可以通过调整均值和缩小方差来提高隐变量与之间的关联程度,降低重构的难度,避免模型需要面临从一个随机信号中构建出另一个一张随机信号的的任务。而当解码器具备一定的生成能力后,编码器则会向标准高斯分布靠拢,以保证生成过程中从标准高斯分布中采样出的隐变量能够被成功解码。这是一个动态平衡,相互拮抗的过程。
扩散模型Diffusion
VAE其实是一个仅依赖于单个隐变量的生成式模型,2步即可采样出,这步子或许迈得太大了。如果考虑多个隐变量,那么我们会得到什么呢?首先我们通过联合分布写出数据的生成过程:
要处理上述这么多隐变量要彼此之间的关系是很复杂的,所以我们不妨使用一个简单的方式来简化一下问题,例如马尔科夫链:
接下来,定义一下其编码过程:
那我们来尝试最小化两个联合分布的KL散度吧:
我们单独看期望里的积分项,令其为:
那么接下来就是设这些分布的形式,然后神经网络拟合!且慢且慢,比起用神经网络去拟合这些编码分布,实际上我们有一个更优雅的做法。从VAE那里我们知道了,编码器实际对于最终的生成过程没有作用,只是为了辅助模型训练而设立的。而编码器的作用是使得训练时每一个都与保持一定的关联性,同时希望近似服从。我们可以设计一个过程,将逐渐变为一个纯高斯噪声,这样能够同时满足上方的两点,又没有引入新的参数。
我们可以设所有的编码过程(方便起见,我们将视为)为,其中都是人为指定超参数,这样我们就完成第一个目的,即每一个都和保留一定的关联性。接下来我们想要与尽量接近。那我们来推导一下,此时是个什么样的分布吧!
首先我们考虑是如何变成的。首先是如何变成的呢?按照上述定义从中采样而得,我们可以利用重参数化技巧来表示,设:
同理,我们可以表示:
同理,我们可以表示:
由于高斯分布的线性可加性,第二项可重新表示为。此刻我们惊讶的发现,竟然也是一个高斯分布!其可以表示为,现在我们希望这个分布能够尽量接近标准高斯分布。我们先来看均值,当都是较小的常数,并且较大时,,即均值很接近。接下来研究一下方差系数:
此时我们令,则有:
此时方差近似为,完美符合要求!重新整理一下符号,令,可以得到:
接下来我们推导一下是什么分布:
即是高斯分布,其均值和方差为:
那么很自然的,我们也设为高斯分布。我们使用神经网络来拟合的均值,其方差即为不需要拟合。将这些分布的形式代入目标式后,去掉无关的常数,我们有:
观察一下,可以发现,由于:
所以上述目标函数可以整合为:
实践中,为了方便从中采样,我们往往还会进行一些变换。利用重参数化技巧,,其中。则可得。则有:
则我们设,重新代入目标函数可得:
这就是大名鼎鼎的Diffusion的训练目标啦!
总结一下Diffusion,其将VAE的通过一个隐变量表示复杂分布的思想扩展,使用多个隐变量来表示复杂分布。而如果隐变量之间的依赖关系很复杂的话,建模会变得十分麻烦,所以其引入马尔可夫假设,使用马尔可夫链来建模隐变量间的关系。通过最小化联合分布的KL散度,导出训练目标后。而为了降低训练难度,其通过一个巧妙的高斯过程固定了编码过程,从而去除了Diffusion对于编码器的依赖,最后通过一些数学技巧,将目标函数最终整理成,给定时间步,和当前采样出的隐变量,要求预测从到所添加的高斯噪声的任务。
总结
一个有效的生成式模型既要对真实的分布进行建模,又要能够从这个建模的分布里进行采样。主流的生成式模型往往利用一系列简单的分布的组合来表示复杂的真实分布,同时解决上述两类问题。针对离散序列,可以将联合分布拆解成一系列条件分布的乘积。针对连续高维向量,则可以通过引入隐变量和原始数据组成联合分布再进行拆解。所有的优化目标最后都落在想让两个分布尽可能相似上,即为最小化KL散度,中间加入各种作者的奇思妙想,最后演变成了不同的生成式模型。
本文最主要的目的还是帮助自己梳理一下近期学习的一些知识,也参考了很多网上的资料,所以肯定有许多不足之处,这些就等日后再修补吧。
参考文献
[1] 变分自编码器(二):从贝叶斯观点出发. https://spaces.ac.cn/archives/5343
[2] 概率视角下的生成模型. https://zhuanlan.zhihu.com/p/611466195
[3] Auto-Encoding Variational Bayes. https://arxiv.org/abs/1312.6114
[4] Denoising Diffusion Probabilistic Models. https://arxiv.org/pdf/2006.11239
