chapter-13-生成式模型

    xiaoxiao2023-11-06  154

    生成式模型

    假设训练数据符合某分布p,我们的目标是构建一个p模型,来生成和训练数据相似的数据。

    从大的分类标准来看,生成式模型分为两类,显式密度估计和隐式密度估计,这取决于我们定义和求解p模型的方式是显式还是隐式。

    以下是生成式模型的家族图谱:

    pixelRNNs&pixelCNNs

    这里的定义很简单,唯一的一点疑惑是,如何定义元素的顺序?下面有两种方法:

    变分自编码器(Variational Autoencoders,VAE)

    首先是自编码器: 首先我们通过编码器来得到输入数据的特征,然后再将其解构来得到一些与输入数据相似的数据。我们可以通过计算原始数据与重构数据的差来得到损失,并不断缩小损失。结果就是,我们相当于将图片的信息存储到了Z里。我们可以认为Z的每列都代表了图片的一种特征,当它的值改变时,生成的图像也在改变。

    但通过这种方式,我们只能得到已有的图像,因为我们不能随意产生合理的Z值。为了得到新的图像,我们假设Z服从单位高斯分布,并从中取样,然后我们就可通过它来对图像x采样。

    但有个问题,我们如何得到这个解码器呢?按照神经网络的思想,如果一个函数/映射太过复杂,那我们就设置一个神经网络,来让它自己学习合适的函数。

    那么如何训练这个网络呢?回想之前的pixelCNNs和pixelRNNs,一个直观的思路是最大化似然函数: 但如下图所示,这个积分是很难计算的。不过根据贝叶斯公式,我们可以得到下图第二个式子,我们发现,如果能够计算出p(z|x),我们就能计算出p(x)。但p(z|x)并不能直接算出来,于是按照前面的思路,我们用神经网络定义一个它的近似:q(z|x),并称其为编码器。 下面是似然估计的计算过程: 从最后的结果里我们也能看出为什么我们要让似然估计最大。

    以下是VAE的计算流程: 当计算好q(z|x)后,在生成阶段,我们只需要解码器就可以了。我们可以对z进行采样,然后进行迭代训练神经网络即可。

    总结一下VAE:

    生成式对抗网络(GANs)

    如果我们想要高维、复杂的训练分布中采样,是无法直接做到的,一个曲折的方法是,首先找到一个简单的分布与该分布的映射,然后在这个简单分布中采样。

    那么我们该如何找到这个映射呢?神经网络。

    这个神经网络有一点特殊:它是由两个神经网络构成,其中一个叫生成器网络,另一个叫判别器网络。这两个神经网络在训练过程中要不断对抗:前者要生成以假乱真的图片,而后者要想办法辨别出来: 这是它的训练目标: 为了完成这个目标,我们就要分别对判别器和生成器进行梯度上升和梯度下降。

    但在实际实践中,我们发现当生成器的伪造能力较弱时, 的梯度变化较平坦,反之则很陡峭。这和我们希望的相反,因为我们希望在其能力较弱时梯度更陡峭,进而学到更多。于是为了达到这个目的,我们将这项变为: 以下是GANs的伪代码: 之后GANs有了各种各样的探索和改进,下面是一个有点像变魔法的例子:

    最新回复(0)