一、简介
PixelCNN 是一个生成模型,2016年出自DeepMind的Aaron van den Oord[1]。[5]指出当前的生成模型主要可分为两类:
- 基于最大似然的模型,比如:各类VAE(变分自编码器) 和 autoregressive models(自回归模型)
- 隐式生成模型,比如:Gan(生成对抗网络)
PixelCNN属于第一种模型,即最大似然模型。这种生成模型较Gan的优势是[5]:
likelihood based methods optimize negative log-likelihood (NLL) of the training data. This objective allows model-comparison and measuring generalization to unseen data
. Additionally, since the probability that the model assigns to all examples in the training set is maximized, likelihood based models, in principle, cover all modes of the data
, and do not suffer from the problems of mode collapse and lack of diversity
seen in GANs.
简单说就是,Gan还很难进行模型的比较(即没有一个好的方法来比较各种Gan模型),它对于未见过的数据之泛化,不能覆盖真实数据的所有多样性,而且会出现模式坍塌和数据多样性的损失。而以上这些,在最大似然模型的方法中都可以解决,由此可见,Gan虽热却不是包打天下的,近期的[5]就生成了质量堪比BigGan[6]的图像。[5] 所使用的方法是一种复合方法,主要是两种方法的复合:一种是VQ-VAE(矢量量化-变分自编码),我在上一篇博客有介绍;另一种就是本篇博客介绍的PixelCNN。这两种似然方法的结合,也能创造出惊艳的作品来,而且不需要太多的资源,真是我等草根的福音,以下我就自己的理解来聊一聊PixelCNN。
二、PixelCNN
如果我们把一幅图片 x \mathbf x x 看成是由各像素 x i x_i xi 随机组成的随机变量 x = { x 1 , x 2 , ⋯   , x N } \mathbf x=\{x_1,x_2, \cdots, x_N\} x={
x1,x2,⋯,xN},则一幅图片就可以表示为各像素的联合分布:
p ( x ) = p ( x 1 , x 2 , ⋯   , x N ) p(\mathbf x)=p(x_1,x_2, \cdots, x_N) p(x)=p(x1,x2,⋯,xN)
PixelCNN 的基本思想是将这个联合分布因子化,用条件分布的乘积来表示,如下:
p ( x 1 , x 2 , ⋯   , x N ) = ∏ i = 1 N p ( x i ∣ x < i ) ( 1 ) p(x_1,x_2, \cdots, x_N) = \prod_{i=1}^N p(x_i|x_{<i})\qquad (1) p(x1,x2,⋯,xN)=i=1∏Np(xi∣x<i)(1)
在生成这幅图片时,我们用前面的像素作为条件,作条件概率,估算当前的像素概率,逐点生成像素。这个思想其实也很朴素和直白,具体就是:
- 由 p ( x 1 ) p(x_1) p(x1) 得到 x ^ 1 \hat x_1 x^1;
- 由 p ( x 2 ∣ x ^ 1 ) p(x_2|\hat x_1) p(x2∣x^1) 得到 x ^ 2 \hat x_2 x^2;
- 由 p ( x 3 ∣ x ^ 1 x ^ 2 ) p(x_3|\h