Introduction

本文是对几篇GAN的略读,主要阐述想法和技术,其中蕴含的idea或者实现细节搁置不提,有机会再提出来单独讲讲吧,included papers:

  • SGAN(StackedGAN)
  • InfoGAN

SGAN (Stacked GAN)


SGAN属于Conditional GAN的一种(文章指出进行修改也可以进行unsupervised学习),在模型上采用了多层级的G和D的架构,并使用一个预训练的分类DNN,它将多层级的G的目标看成是invert DNN的forward的过程,抽出它的不同层级的特征作为不同层级的GAN的目标,希望不同层级的GAN学习到DNN输出的高层特征到DNN输入的底层特征的解码

同时SGAN还有分层单独训练端到端的两种训练方法。

模型

模型主要包括三个部分:

  • 用于分类的pre-trained DNN,把预训练的分类网络划分成不同的blocks(conv + pooling的组合),称之为Encoder:Ei{E_{i}}
  • 用于invert某一层Ei{E_{i}}的生成器:Gi{G_{i}}
  • Gi{G_{i}}对应的Di{D_{i}},用于计算GAN Loss。

Encoders

每一个Ei{E_{i}}的输入hi{h_{i}}是上一层的输出: h0{h_{0}}为训练的图片,hN{h_{N}}为标签。

hi+1=Ei(hi){ h_{i+1} = E_{i}(h_{i}) }

Generators

Gi{G_{i}}接受Ei{E_{i}}的输出和噪声:

hi^=Gi(hi+1,z){ \hat{h_{i}} = G_{i}(h_{i+1}, z) }

当使用端到端的训练时,Gi{G_{i}}接受上一层生成器的输出:

hi^=Gi(hi+1^,z){ \hat{h_{i}} = G_{i}(\hat{h_{i+1}}, z) }

进一步,作者解释了使用多层的生成器的idea:将label到image的条件分布变成了多个分布的联合分布,而每个Gi{G_{i}}对中间的简单的分布进行建模:

PG(x^y)=PG(h0^hN^)PG(h0^,,hN1^hN^)=iPGi(hi^hi+1^){ \begin{aligned} P_{G}(\hat{x} \vert y) &= P_{G}(\hat{h_{0}} \vert \hat{h_{N}}) \\ & \propto P_{G}(\hat{h_{0}},\cdots,\hat{h_{N-1}} \vert \hat{h_{N}}) \\ &= \prod_{i} P_{G_{i}}(\hat{h_{i}} \vert \hat{h_{i+1}}) \\ \end{aligned} }

整体模型架构
整体模型架构

Loss

每层的GAN采用了三种Loss训练:

LGi=λ1LGiadv+λ2LGicond+λ3LGient{ \mathcal{L}_{G_{i}} = \lambda_{1} \mathcal{L}_{G_{i}}^{adv} + \lambda_{2} \mathcal{L}_{G_{i}}^{cond} + \lambda_{3} \mathcal{L}_{G_{i}}^{ent} }

GAN Loss

GAN Loss使用的原始paper中提到的修改过的Vanilla GAN Loss,每个层级的Di{D_{i}}需要鉴别该层级的真实的图片输入的featurehi{h_{i}}Gi{G_{i}}生成的featurehi^{\hat{h_{i}}}的真实性。

Di=max[Ehi[logDi(hi)]+Ehi+1,z[log(1Di(Gi(hi+1,z)))]]{ D_{i}^{\ast} = \max \left[ \mathbb{E}_{h_{i}}[ \log D_{i}(h_{i})] + \mathbb{E}_{h_{i+1},z}[ \log( 1 - D_{i}(G_{i}(h_{i+1}, z)))] \right] }

Gi=maxEhi+1,z[log(Di(Gi(hi+1,z)))]{ G_{i}^{\ast} = \max \mathbb{E}_{h_{i+1}, z}[ \log(D_{i}(G_{i}(h_{i+1},z)))] }

Conditional Loss

Idea是防止Gi{G_{i}}忽略conditional的信息hi+1{h_{i+1}},在某种意义上可以看成是重建的Loss

具体做法是将hi^{\hat{h_{i}}}再带入到Ei{E_{i}}中得到hi+1{h_{i+1}^{\prime}},优化它和hi+1{h_{i+1}}的差异。

LGicond=Ehi+1,z[f(Ei(Gi(hi+1,z)),hi+1)]{ \mathcal{L}_{G_{i}}^{cond} = \mathbb{E}_{h_{i+1},z} [f(E_{i}(G_{i}(h_{i+1},z)), h_{i+1}) ] }

Entropy Loss

使用conditional loss的同时,GAN又可能会忽略噪声z{z}的影响,所以这一项是为了防止忽略噪声,我觉得可以把conditional loss看成重建误差,目的是提高图片质量,而这里的误差可以看成是为了提高生成图片的多样性,所以也很像一个图像质量和多样性的trade-off。

作者首先提到现有(当时)的方法没有很好地解决这一问题,接着从信息熵的角度提出了和InfoGAN类似的方法。

LGient=Ezi[Ehi^[logQi(zihi^)]]{ \mathcal{L}_{G_{i}}^{ent} = \mathbb{E}_{z_{i}} [ \mathbb{E}_{\hat{h_{i}}} [ -\log Q_{i}(z_{i} \vert \hat{h_{i}})] ] }

为了鼓励diversity,转化成提高Gi{G_{i}}的建模的分布p(hi^hi+1){p(\hat{h_{i}}\vert h_{i+1})}的熵H(hi^hi+1){H(\hat{h_{i}}\vert h_{i+1})}作者用Variational Conditional Entropy Maximization 的方法证明了优化上式的Entropy Loss是提高熵(证明不详述,和InfoGAN中的证明非常类似)

思想也是用一个Qi{Q_{i}}分布去近似后验分布Pi(zhi^){P_{i}(z\vert \hat{h_{i}})},实际中Qi{Q_{i}}由一个参数化的DNN输出,然后一样地和Di{D_{i}}权值共享,一样地对连续分布,看成高斯分布,不一样的是,Qi{Q_{i}}仅输出均值,而方差给定。

问题:为什么这样一来,最后说LGient{\mathcal{L}_{G_{i}}^{ent}}等价L2重建误差?

InfoGAN


简述 InfoGAN。

latent space 由noisez{z}和 latent codes c{c}组成,通过生成器得到G(z,c){G(z,c)}

如果不加限制,G{G}容易忽略c{c}的影响,idea是计算互信息量:I(c,G(z,c)){I(c,G(z,c))}

I(c,G(z,c))=H(c)H(cG(c,z)){ I(c, G(z,c)) = H(c) - H(c \vert G(c,z)) }

互信息量的含义是:已知G(c,z){G(c,z)}的情况下c{c}的信息量(信息熵)和未知时的信息量减少的多少。我们希望,对任意一张生成图片,它很明显具有某种latent code编码的特性,也就是使得H(cG(c,z)){H(c \vert G(c,z))}尽可能小,所以要互信息量大。

如何将互信息量加入训练?先验分布P(cx){P(c \vert x)}难以计算,使用Variational Information Maximization的方法用另一个Q(cx){Q(c \vert x)}得到它的下界:

I(c,G(z,c))ExG(z,c)[EcP(cx)[Q(cx)]]+H(c)=L1(G,Q){ I(c, G(z,c)) \geq \mathbb{E}_{x \sim G(z,c)}\left[ \mathbb{E}_{c^{\prime} \sim P(c \vert x)\left[ Q(c^{\prime} \vert x) \right]}\right] + H(c) = L_{1}(G,Q) }

P=Q{P = Q}时取等号,而且I(c,G(z,c)){I(c, G(z,c))}取最小值。给定c{c}的分布不变,H(c){H(c)}为固定的常数,只需要优化加号的左项。

整个Loss:

minG,QminDV(G,D)λL1(G,Q){ \min_{G, Q} \min_{D} V(G,D) - \lambda L_{1}(G,Q) }

实现

D{D}和classifier权重共享,除了最后一层不同。D{D}输出binary结果。classifier对每一个控制的ci{c_{i}},如果ci{c_{i}}是离散的变量(给定的分布也是离散的),通过softmax得到Q(cix){Q(c_{i} \vert x)}。如果ci{c_{i}}是连续的变量(给定的分布也是连续的),直接把Q(cix){Q(c_{i} \vert x)}看成一个可分解的高斯变换,也就是输出两个数表示均值和方差

实现的Codes

  • pytorch-infoGAN
    • 对每个离散变量使用随机的one_hot变量,对每个连续的变量使用随机的[-1,1]的变量。然后将它们concat。

References


  1. Xun Huang, Yixuan Li, Stacked Generative Adversarial Networks.