原文链接:Generating Diverse High-Fidelity Images with VQ-VAE-2
加载速度慢点这里:中科院镜像
由于科研需要,最近在学习图像生成相关的文献知识,VQ-VAE-2是我目前了解到的比较新的生成模型,一开始搜索到的其实是PixelCNN,然后发现它是16年的工作,然后继续搜索相关工作,在Google DeepMind找到了VQ-VAE-2,由此发现了一系列相关工作。这里就从VQ-VAE-2开始,毕竟是目前性能相对好的模型,先尽快学习看看能不能用上。(VQ-VAE-2的发展过程可以参考这里:From Autoencoder to Beta-VAE)
代表样例
作者在论文中表示,VQ-VAE 生成了可以媲美当前最佳 GAN 模型(BigGAN-deep)的图像,且避免了GAN的缺点,如缺乏多样性和ModeCollapse。
生成模型综述
作者将目前的生成模型分为两种类别:
- Likelihood based models:VAEs、基于flow的模型和自回归(autoregressive)模型;
- Implicit generative models:GANs
这些模型都会存在某些方面的缺陷,如样本质量、多样性、生成速度等,接下来稍做分析:
-
GAN生成的样本并不能完全捕捉真实分布中的多样性。另一方面,针对生成对抗网络的评价非常困难,目前依然缺少一个较通用的度量标准,用于在测试集中判断模型是否过拟合。
-
基于似然的模型不存在像GAN一样的问题但是直接在像素空间最大化likelihood存在困难,首先在像素空间上NLL(negative log-likelihood,这个概念目前还不是很清楚,大概就是用来衡量样本质量,基于似然的模型的主要任务就是优化此项) 不能很好的度量样本质量,其次这些模型缺少对于全局结构的关注。目前,也存在着一些针对这些问题的优化方法,这里不做讨论。
-
既然存在这些问题,所以 “In this paper”,作者利用了有损压缩(lossy compression)的思想。JPEG图像压缩技术已经可以做到去除80%的数据量,而对图像不造成显著影响。在VQ-VAE(一代)中,就已经提出,通过自编码器的vetor-quantizing intermediate representations(量化的向量中间百表征,这里还不清楚具体是什么,VQ就是指这个啦)将图像压缩到discreate latent space。这样产生的表征比原图小30多倍,但仍然可以使解码器重建图像,几乎无损。接下来采用PixelSnail(一种基于self-attention的SOTA的PixelCNN)对这些离散表征的先验知识建模,从这些先验知识采样最终decoder得到的图像同样高质量,而且速度也是30多倍的快,这样就可以训练高分辨率图像。这里用的编码解码器结构和VQ-VAE一样(区别就是提出了一个分层结构)
背景知识
-
VQ-VAE
关于VQ-VAE的详细解析以后再写,这里为了理解VQ-VAE2先介绍
简单来说,还是一个Encoder-Coder结构。Encoder用来把图像转换为离散隐性空间的序列,Decoder从这些离散变量中重建图像。
具体一点,输入图像 x x x,通过编码器(此时编码器作为一个非线性的mapping)生成向量 E ( x ) E(x) E(x),然后采用最近邻重构,将 E ( x ) E(x) E(x)替换为codebook的中的一个nearest prototype vector,解释一下codebook,可以理解为一个离散的编码表,举一张人脸图像为例,codebook就包括头发颜色,脸型,表情和肤色等等。因此,量化就是通过编码表,把自编码器生成的向量 E ( x ) E(x) E(x)离散化。
解释一下codebook,可以理解为一个离散的编码表,举一张人脸图像为例,codebook就包括头发颜色,脸型,表情和肤色等等。因此,量化就是通过编码表,把自编码器生成的向量 E ( x ) E(x) E(x)离散化。
解码器通过另一个非线性函数重建数据,重建错误的梯度从解码器反向传播到编码器,采用straight-through gradient estimator(这里先不展开,就当这是一种方法)
VQ-VAE还引入了codebook loss和commitment loss来align编码表codebook的向量空间和encode的输出。这里也不展开说,以后读VQ-VAE的时候再详细分析。这里先贴出公式, s g sg sg是停止梯度操作:
文中给出了VQ-VAE的implementation:
- 代码
- 样例
-
PixelCNN
先贴一段原文,下次再补充
具体的这篇博客讲的很详细:图片生成模型——gated pixelCNN
VQ-VAE-2框架
分为两阶段:
-
训练一个分层的VQ-VAE用于图像编码到前面提到的离散隐空间
和VQ-VAE不同之处在于,这里使用了分层的VQ,作者提到其动机是把全局信息(如shape和geometry)和局部信息(如纹理)分开建模。如图所示,top level用于model全局信息,bottom level用于model局部细节(原文中还有再加middle level,实验结果表明加了middle level之后,生成的图像清晰度更高)。框图中,原图为256 * 256,通过下采样得到 64 * 64的表征,然后再量化为bottom level的latent map;另一方面,64 * 64再降为32 * 32,量化得到top level的latent map。解码器分别从两个隐层中重建图像,重建的loss即上面的公式2。 -
在用所有的图像数据构建的离散隐空间拟合一个PixelCNN先验
经过Stage1,将图片编码为了整数矩阵,所以在Stage2用自回归模型PixelCNN,来对编码矩阵进行拟合(即建模先验分布)。通过PixelCNN得到编码分布后,就可以随机生成一个新的编码矩阵,然后通过编码表 E E E映射为浮点数矩阵,最后经过 d e o c d e r deocder deocder得到一张图片。
总结
总体来说VQ-VAE-2实现图像生成分两步走:
- 训练编解码器,使其能够很好的复现图像
- 训练PixelCNN自回归模型,使其能够拟合编码表分布,从而通过随机采样,生成图片
对于VQ-VAE-2的简单理解先到这里,后续再对PixelCNN等自回归模型进行分析。