VQ-VAE-2: Deepmind论文解读

根据科技媒体的报道,最近deepmind的新模型VQ-VAE-2的生成效果甚至超过了BigGAN,作为生成模型的初学者,我知道GAN,知道AE和VAE,但是却对这篇文章的VQ没有了解。“这会是一种新的生成模型吗”---这个问题使我想一探究竟。

效果图

容我先放几张模型生成的图片来吸引读者的阅读兴趣。你相信这些人脸只是模型臆想出来的吗,这么优美的图像细节到底是如何产生的呢


模型生成的人脸

模型架构

让我们先从一个高层的角度审视一下整个模型,我喜欢这种思维方式---从大到小的思维方式,我想这可能也比较符合中国人的思维方式。当然,这个模型里面的很多东西你可能并不懂,但是这并不影响我们建立对它的整体认知。
该篇文章的整体架构来自于第一代VQ-VAE,其架构图如下:

vq-vae模型图,来自《Neural Discrete Representation Learning》

根据上述模型图,配合图中我加上的红色标注,我们能知道数据在整个模型中的变化为:

第一阶段:size为(长x宽x3)的图像 → size为(长x宽xd)的三维数据
第二阶段:size为(长x宽xd)的三维数据 → size为(长x宽)的二维数据
第三阶段:size为(长x宽)的二维数据 → size为(长x宽xd)的三维数据
第四阶段:size为(长x宽xd)的三维数据 → size为(长x宽x3)的图像

图中右部的映射过程发生在第二阶段,这一阶段进行了数据压缩,将三维数据压缩到二维,那么为什么要压缩呢,映射过程又是怎样的呢

从VAE说起

我们知道,在生成对抗网络之前,变分自动编码器(VAE)是很常用的一个生成模型。它通过对编码器添加约束,强迫它产生服从单位高斯分布的潜在变量,在生成的时候只需要从高斯分布中采样得到一个潜在变量然后将其送入解码器进行解码就能得到有意义的输出。在这个模型中,潜在向量的采样方法不再是从高斯分布中采样而是用自回归的方式进行采样,接下来的介绍你会发现用这种采样方法要求潜在变量是离散的而不是平常所知的连续值。

自回归生成模型

自回归模型,这类模型留意到我们要生成的图像,实际上是离散的而不是连续的。以cifar10的图像为例,它是32×32大小的3通道图像,换言之它是一个32×32×3的矩阵,矩阵的每个元素是0~255的任意一个整数,如果从自然语言处理的角度去理解,我们可以将它看成是一个长度为32×32×3=3072的句子,词表的大小是256,从而用语言生成模型的方法,第一个词是从某个概率分布中采样的,第二个词是在第一个词出现的条件概率分布中采样的……

自回归模型的研究主要集中在两方面:一方面是如何设计这个递归顺序,使得模型可以更好地生成采样,因为图像的序列不是简单的一维序列,它至少是二维的,更多情况是三维的,这种情况下你是“从左往右再从上到下”、“从上到下再从左往右”、“先中间再四周”或者是其他顺序,都很大程度上影响着生成效果。

自回归的方法能有效地做概率估计,但它有一个最致命的缺点:慢。因为它是逐像素地生成的,所以要每个像素地进行随机采样,上面举例的cifar10已经算是小图像的,目前做图像生成好歹也要做到128×128×3的才有说服力了吧,这总像素接近5万个,真要逐像素生成会非常耗时。而且这么长的序列,不管是RNN还是CNN模型都无法很好地捕捉这么长的依赖。

原始的自回归还有一个问题,就是割裂了类别之间的联系。虽然说因为每个像素是离散的,所以看成256分类问题也无妨,但事实上连续像素之间的差别是很小的,纯粹的分类问题捕捉到这种联系。举例来说,在分类问题中模型将正确答案为50的数预测为51是分类错误,同样的,将正确答案为50的数预测为250也是分类错误,这两种情况的惩罚是一样的,然而对于像素问题显然50和51是基本一样的两个类。

第一个创新点:压缩与量化

该篇论文的第一项创新实际上来自一个简单的策略:在培训过程中删除大多数不重要的图像信息,而不会降低图像生成的质量。这篇论文的研究者表示这个想法的灵感来源于每个人都熟悉的长期照片文件类型——JPEG,它实现了10:1的图像压缩,图像质量几乎没有明显的损失。基于DeepMind神经网络的编码器将256×256图像压缩为64×64矢量表示(缩小4倍)和32×32表示(缩小8倍)。模型中的压缩与量化过程确实都能在JPEG的压缩算法中找到对应的步骤。

压缩是为了解决上述的自回归模型慢的特性带来的问题,经过压缩的处理得到潜在变量,再在潜在变量上进行自回归采样,这样就避开了慢的缺点,使得无论图像尺寸多大都不影响自回归模型的运行。另一个好处和普通的图像压缩一样——原始图像里面有大量的冗余信息,比如大块的同色像素,对压缩后的潜在变量使用自回归,可以忽略这些冗余信息,得到结构化的全局语义概率分布。

自回归模型用于潜在变量

量化(离散化)是因为PixelCNN生成的是离散序列,想用PixelCNN建模潜在变量,那就意味着潜在变量也是离散的才行。而这里的自编码器生成的潜在变量都是连续性变量,无法直接生成离散变量。因此有了向量表与向量映射以服务于将潜在变量离散化为整数。为了容易阅读,本文将模型图再次贴出。

vq-vae模型图,来自《Neural Discrete Representation Learning》

量化的具体的步骤是:原始图像通过CNN之后得到size为(长x宽xd)的三维数据,每个如图中①所示的向量都会经过图中右部的映射过程,映射算法用一句话来说就是“寻找向量空间中离自身最近的e,其中e属于向量表”。映射过程将原向量映射为向量表中的某个向量e,那又是如何对应到离散的整数的呢,答案是取向量e在向量表中的索引。这一步骤也是模型题目中VQ(Vector Quantised,向量量化)的来源。

以图中红字所记符号为例:

vq-vae映射过程

至此,模型将输入图像压缩并离散化为一个二维的整数矩阵。

第二个创新点:层级框架

原始的VQ-VAE的编码是只有一层的,而本文与之不同的一个地方就是引入了层次结构的编码过程。模型的编码分为上下两用于层,下层潜在空间较大,为64×64,该层编码捕获图像的局部信息,如纹理; 下层潜在空间较小,为32×32,其表示的目标是对象形状和几何等全局信息。然后,解码器从两个编码中重建图像。 我们从整体上这样理解是没错的,但是有很多细节论文中并没有说清楚,这些地方只能之后研究代码才能明白了。例如:

  1. 从top层的潜在编码decode到bottom层的时候,与bottom层本身的特征图是简单相加还是其他什么操作;
  2. top层的潜在编码和bottom层的潜在编码是如何一起decode出最终图像的
层次化结构

当然上述分辨率和层数只是举例,这里的分层框架不仅限于两层——当需要生成更大尺寸的图像(例如,1024×1024),可以根据具体要求构建其他层。论文中给出的一个高清人脸的生成模型就使用了三层编码,可以看出越底层的编码提供了越多的细节信息,使得图像变得越清晰。
但是在这个地方其实我有点质疑,毫无疑问,底层的编码潜在空间越大包含的信息越多,那么当然能保留更多的细节。所以我其实希望作者对比的是[bottom, middle + bottom, top + middle + bottom],如果这三种组合从左到右能看出明显的质量提升的话那才说明层次结构是有必要的。

从不同层次编码重建示例

代码运行与解析

(待更……)

你可能感兴趣的:(VQ-VAE-2: Deepmind论文解读)