小提示1:本篇部分内容基于个人理解,仅供参考,如有错误(非常)欢迎指出。另外,如果有看不明白的不好理解的地方,也欢迎告知作者。

小提示2:转载请注明出处。

 

案例分析
前面两篇介绍了GAN的基础理论,以及对目标函数的优化的一些尝试,现在我们先来了解一下GAN具体使用情况,从而对GAN有一个更直观的认识。

 

InfoGAN
InfoGAN是在GAN的框架下,通过引入信息论的方法,引导模型学习数据的解耦表征(disentangled features)的模型。得到解耦表征后,我们就可以通过这些“独立”的隐表征(latent features)像控制开关一样控制生成的数据,例如让生成的图像是冷色调或者是暖色调。
InfoGAN具体的方法,是将原生GAN的噪音变量(noise)$z$拆分为$z$和一系列的隐编码(latent code)$c_i$,$i$是隐编码的编号$i=1,2, \dotsb$。InfoGAN在模型训练时,引导$c_i$学习数据的某种特征,使$c_i$成为我们需要的解耦表征。
相比原生的GAN,InfoGAN的目标函数多了一个正则项(regularizer),也就是式$(\ref{3.1})$中等号右边第二项:

\begin{equation} \min_G{⁡\max_D{⁡V(D,G)}} = V(D,G) - \lambda I(c;G(z,c)) \label{3.1} \end{equation}

其中$\lambda$是超参数,控制正则项在目标函数中的影响力,它通常取较小的值,以保证等号右边两项的量级接近。正则项中的$I(·)$为互信息(mutual information),定义为$I(X;Y)=H(X)-H(X \mid Y)=H(Y)-H(Y \mid X)$,是信息熵$H(Y)$与条件熵$H(Y \mid X)$的差值,对于$X$和$Y$对称(symmetric)。当$I(X;Y)=0$时,表明$X$和$Y$是相互独立的,因为$H(Y)=H(Y|X)$,增加条件$Y$时,$X$的熵没有得到约束;相反,当$X$和$Y$存在一对一的映射关系时,确定$Y$就能确定$X$——打个比方,一个秃顶的人有极大概率是个男的——此时$X$的条件熵$H(X \mid Y)=0$,$X$和$Y$的互信息$I$等于信息熵$H(X)$、$H(Y)$。
目标函数中互信息的作用,就是引导隐编码$c$和生成数据建立起联系。对于离散的隐编码$c$——离散就是说$c$的取值是1、2、3这样的值,而不是1到3之间的任意整数或小数——目标函数中的互信息为:

\begin{align} I(c;G(z,c)) &= H(c) - H(c \mid G(z,c)) \nonumber \\[6pt] &= - \sum_c{p(c) \log{⁡p(c_i)}} + \sum_x{p_g (x) H(c \mid G(z,c)=x)} \nonumber \\[6pt] &= - \sum_c{p(c) \log{⁡p(c)}} + \sum_x{p_g (x) \sum_c{p(c \mid x) \log{p(c \mid x)}}} \label{3.2} \end{align}

由$(\ref{3.2})$可知信息熵和条件熵的定义。由于条件熵中的后验$p(c \mid x)$是未知的,所以只能计算互信息的近似(approximate)。通过辅助分布(auxiliary distribution)$q(c \mid x)$来近似$p(c \mid x)$,可以推导出互信息$I$的下界(lower bound):

\begin{align} I(c;G(z,c)) &= H(c) - H(c \mid G(z,c)) \nonumber \\[6pt] &= H(c) + E_{x \sim P_g (x)} [E_{c \sim P(c \mid x)} [\log{p(c \mid x)}]] \nonumber \\[6pt] &= H(c) + E_{x \sim P_g (x)} [KL(p(· \mid x) \parallel q(· \mid x)) + E_{c \sim P(c \mid x)} [\log{q(c \mid x)}]] \nonumber \\[6pt] &\ge H(c) + E_{x \sim P_g (x)} [E_{c \sim P(c \mid x)} [\log{q(c \mid x)}]] \label{3.3} \end{align}

InfoGAN的作者在论文$[3.1]$中将式$(\ref{3.3})$称为变分信息最大化(variational information maximization),其中信息熵$H(c)$可以简化为常数,辅助分布$q(c \mid x)$实际上是神经网络。$q(c \mid x)$与编码器(encoder)相似,是将真实数据$x$映射到隐空间。如果要得到离散的$c$,与多分类任务一样,可以在神经网络的最后一层加上SoftMax函数,输出离散的值。
由于式$(\ref{3.3})$中内部的似然$E_{c \sim P(c \mid x)}$在计算时,$c$要从后验$P(c \mid x)$中采样,所以仍然需要对互信息的近似做进一步的转换。定义一个变分下界(variational lower bound):

\begin{align} I(c;G(z,c)) &\ge H(c) + E_{x \sim P_g (x)} [E_{c \sim P(c \mid x)} [\log{q(c \mid x)}]] \nonumber \\[6pt] &= H(c) + E_{c \sim p(c),x \sim P_g (x)} [\log{q(c \mid x)}] \nonumber \\[6pt] &= L_I (G,Q) \label{3.4} \end{align}

将式$(\ref{3.4})$带入$(\ref{3.1})$,得到了InfoGAN的目标函数:

\begin{equation} \min_G{\max_D{⁡V(D,G)}} = V(D,G) - \lambda L_I (G,Q) \label{3.5} \end{equation}

通过目标函数$(\ref{3.5})$来训练模型,得到$c$,然后我们就可以通过$c$来控制生成的数据。打个比方,通过基因我们可以控制生成的人长什么样,而$c$正是这样的基因,它和鼻子、眼镜存在相关性,它们的互信息不是0。


cGANs
除了通过隐表征(latent representation)控制生成的数据,我们还可以直接通过一些明确的信息来控制数据的生成,而cGAN(conditional GAN)采用的正是这样的方法。因为能够使用明确的信息来控制数据的生成,cGAN被广泛应用。图像到文本(image description generation)或文本到图像(text-to-image)的转换、图像到图像的转换(image-to-image translation)(风格迁移、降噪、压缩、锐化等)等应用都可以通过使用cGAN来实现。
相比传统的GAN,cGAN在生成器的输入部分增加了特定的信息,这些信息被称为条件(condition)。这些条件可以是类别标签、文本、图像或者其他形式的信息。这些信息以向量或矩阵的形式,与噪音变量$z$通过拼接(concatenation)$(\ref{3.6})$或者内积(inner production)$(\ref{3.7})$等方式结合,

\begin{align} &concate(\boldsymbol{a},\boldsymbol{b}) = concate(\left[ \begin{array}{c} a_1 \\ a_2 \end{array} \right], \left[ \begin{array}{c} b_1 \end{array} \right]) = \left[ \begin{array} {c} a_1 \\ a_2 \\ b_1 \end{array} \right] \label{3.6} \\[6pt]  &\langle a,b \rangle = a_1 b_1 + a_2 b_2 + \dotsb + a_n b_n \label{3.7} \end{align}

然后作为模型$G(a,b)$的输入。下面我们来看一些案例:
在论文$[3.2]$的模型中,研究者以人像和年龄作为额外信息加入模型,从而生成输入的人像在指定的年龄的相貌。
在论文$[3.3]$的模型中,研究者同样以图片作为额外信息输入模型,但生成的数据是图片的描述,实现了图像到文字的转换。
论文$[3.4]$的作者首先通过语义分割(semantic detection)和实体分割(instance detection)技术,得到图片中的物体的语义标签(label)和实体边界(boundary),然后以这些标签和边界的“图”作为cGAN的条件输入到生成器,从而生成高清晰的图像。这个模型的研究者甚至实现了将简单的素描转换为清晰的图像的操作。
$[3.5]$的作者则是通过在cGAN中加入子模块——一个成熟的图像处理神经网络——让这个子模块提取图片的标签或者字幕,也就是识别出图像中的人或物,或者从图像中提取出字幕,然后以这些标签或者字幕,加上原图像经过自编码器(autoencoder)后的输出,作为生成器的附加输入,来指定新生成的图像中应包含的物体和场景。新生成的图像与原图像有相同的标签,或者符合原图像中的字幕的描述,但是与原图像不同。这其实也反映了一个事实,就是这些附加信息只描绘了数据的大体分布,数据的生成仍然包含一定的随机性,如果能在数据生成时保留这个随机性,就能使生成的数据更有多样性。另外,论文的作者实验发现,这个模型甚至可以生成生成器没有“见”过的类别对应的图像。不过这个模型在以字幕作为附加条件时,生成的图片效果并不理想,作者分析原因可能是1)字幕中包含了很多子条件,这些条件可能相互冲突;2)字幕提取模型本身效果不理想。
上面的4个案例展示了如何通过额外的信息来控制生成的数据的“样子”。从原理上说,模型的训练过程包括了学习这些额外信息到生成数据的特征的映射。InfoGAN也是特征映射的学习过程,但是InfoGAN中的映射是从隐特征到数据的映射,而那些隐特征本身没有意义。

多样性
在介绍cGAN的案例$[3.5]$,我们谈到了生成数据的多样性(diversity)的问题。cGAN中的c和生成的数据中的某些特征有时候不应该是一一对应的关系,或者说条件c控制了一些特征,但生成的数据中仍应有一些特征是随机的。例如,对于某张图片,我们可以有不同的描述方式,即便是同一个意思,也可以有不同的说法。
GAN的判别器的工作是判断数据是否是生成的,在有监督学习中,判别器需要评估输入的数据——可能是真实数据,也可能是生成数据——与真实的数据的差异(difference)或者相似度(similarity)。但是直接对数据进行比较,可能会使生成的数据尽可能地与真实数据相同,从而降低生成数据的多样性,沦为“莫得感情的复读机”。
为了避免上面提到的问题,论文$[3.3]$的作者不是将模型生成的描述与图像原有的描述进行比较,而是将图像的嵌入(embedding,矩阵化的表示方式)与描述的嵌入进行相似度计算。相似度的计算方法,是通过求这两个嵌入矩阵的内积得到它们的相似度(等价于cosine相似度),然后再用sigmoid函数将相似度映射到[0, 1]的区间,也就是相似度概率化(sigmoid函数的曲线如$图3.1$所示)。另外,为了让模型学习图像相关的语义信息,论文的作者还在目标函数中加入另一项。附加的这一项计算的是图像与不相关的描述的相似度(式$(\ref{3.8})$中等号右边第三项)。模型的目标函数如下:

\begin{equation} V(D,G) = E_{x \sim P_{data}} [\log{⁡D(I,x)}] + \alpha E_{z \sim P_z} [\log{(1-D(I,G(I,z))}] + \beta E_{\acute{x} \sim P_{data}} [\log{⁡(1-D(I,\acute{x}))}] \label{3.8} \end{equation}

其中$x$和$\acute{x}$都是真实的图像描述,但$\acute{x}$对应的不是图像$I$。这样,模型就学会了,图像和哪些描述相关,和哪些描述没有语义上的关系。

(图3.1,来自百度)

上面的例子是图像与文字之间进行转换的情况,如果是图像之间的转换,那应该怎么处理呢?$[3.5]$中的模型PPGN(Plug & Play Generative Network)提供了一种思路——虽然它不一定是一个GAN。这篇论文的作者Nguyen等人将数据生成的过程以MCMC(Markov Chain Monte Carlo,马尔科夫链蒙特卡洛)采样的方式实现(在第一篇的基础部分提到的显性密度生成模型)。在这里不对MCMC做深入地介绍,只做下面的推演。
先看最简单的情况,通过已有的数据$x_t$加上一个服从高斯分布的值,得到新的数据$x_(t+1)$:

\begin{align} &x_{t+1} = x_t + N(0,{\sigma}^2 ) \label{3.9} \\[6pt] &\alpha = \frac{p(x_{t+1})}{p(x_t)} \label{3.10} \end{align}

如果$\alpha < 1$,则以$\alpha$的概率用$x_{t+1}$替换$x_t$,即$x_t= x_{t+1}$。这样,我们就得到了服从某个分布的多样性的样本集$\lbrace x \rbrace$,也就是说$x$的分布收敛于某个分布。
Metropolis-adjusted Langevin算法(MALA)对$(\ref{3.9})$和$(\ref{3.10})$做了一些优化,使新生成的数据跟之前的数据存在关联性:

\begin{align} &x_{t+1} = x_t + \frac{{\sigma}^2}{2 \triangledown \log{⁡p(x_t)}} + N(0,{\sigma}^2) \label{3.11} \\[6pt] &\alpha = f(x_t,x_{t+1},p(x_t),p(x_{t+1})) \nonumber \end{align}

其中$f$是一个比$(\ref{3.10})$更为复杂的函数,它的特点是当$x_{t+1}$与$x_t$接近时,$\alpha$趋向于1。另外,因为密度函数$p(x_t)$是未知的,计算时需要避开$p(x_t)$。Nguyen等人借鉴随机梯度下降(SGD,Stochastic Gradient Decent),用SGLD(Stochastic Gradient Langevin Dynamic),使的计算时只需要少部分采样,而不需要知道$p(x_t)$也能计算$x_{t+1}$和$\alpha$。同时,虽然理论上只有当$x_{t+1}$与$x_t$接近时,$\alpha$才趋向于1,也就是一定接受$x_{t+1}$,但是实验表明,在$x_{t+1}$与$x_t$有一定差异时,也是可以接受$x_{t+1}$的。
通过上面的推演,我们就可以用$(\ref{3.11})$作为生成器来生成新数据了。Nguyen等人将$(\ref{3.11})$做一些变换,得到MALA$(\ref{3.11})$的近似MALA-approx:

\begin{align} x_{t+1} &= x_t + {\epsilon}_{12} \bigtriangledown \log{⁡p(x_t \mid y=y_c)} + N(0, {\epsilon}_3) \nonumber \\[6pt] &= x_t + {\epsilon}_1 \bigtriangledown \log{⁡p(x_t)} + {\epsilon}_2 \bigtriangledown \log{⁡p(y=y_c \mid x_t)} + N(0, {\epsilon}_3) \nonumber \\[6pt] &= x_t + {\epsilon}_1 (R_x (x_t) - x_t) + {\epsilon}_2 \bigtriangledown \log{p(y=y_c \mid x_t)} + N(0, {\epsilon}_3) \nonumber \\[6pt] &\bigtriangledown \log{⁡p(x_t)} \approx \frac{(R_x (x_t) - x_t)}{{\sigma}^2} \nonumber \end{align} 

其中$ {\epsilon}_{12}$、${\epsilon}_1$、${\epsilon}_2$、${\epsilon}_3$是超参数(hyperparameter),分别控制等号右边的后三项,$R_x$是一个重构网络(reconstruction network),例如自编码器,$p(y=y_c \mid x_t)$代表分类模型(classifier),用来提取图像中的标签,$N$是高斯分布,用来增加噪音,使生成的图像具有多样性。当这个模型是GAN时(也就有判别器,以及目标函数中包含GAN的目标函数),那么它可以理解成cGAN。cGAN的附加信息是图像的标签和原图像,生成的目标是类似的一系列图像。
当然,除了上面两种方法,还有很多其他的技术可以帮助模型生成更具多样性的数据,在这里就不一一介绍了。

生成质量
生成模型关注的两个指标,一个是多样性,另一个是质量,或者说准确度。相对于其他生成模型,GAN在图像生成方面通常能得到较清晰的图像。除了清晰之外,高质量的图像当然不能是“画风崩坏”的。不管是为了生成更清晰的图像,还是为了生成的图像更逼真,或者从更广义的角度看,让生成的数据(无论是图像、语言或其他类型)的质量更高,人们做了很多尝试。下面我们来看几个这方面例子。
$[3.4]$这篇论文的作者尝试了组合多个GAN的模式来生成高分辨率的图像。在生成器模块,一个“全局”生成器被用来处理低分辨率的图像,输出的结果经过“局部优化”生成器,最后输出高分辨率的图像。在判别器模块,全局判别器被用来保证生成图像的全局关联性,例如保证图像中的人或其他东西不会扭曲,而其他判别器则是在较小的尺度上保证图像的细节。这样的结构类似于拉普拉斯金字塔(Laplacian pyramid,后面篇章会介绍)。
为了提高图像的质量,作者在判别器的目标函数中还加入了特征匹配损失(feature matching loss/perceptual similarity):

\begin{equation} L_{FM} (D,G) = E_{s,x} {\sum_i{\frac{1}{N_i}  [{\parallel D_k^i (s,x) - D_k^i (s,G(s)) \parallel}_1]}} \label{3.12} \end{equation}

其中$i$表示深度神经网络的第$i$层,$k$是判别器对应的尺度的编号,因此$D_k^i$表示用于处理第$k$个尺度的判别器的第i层的特征提取器(feature extractor),输出第i层的特征/隐藏层(hidden layer),而$D_k$是判别器,输出的是最后一层的结果。$s$是标签,也就是cGAN的condition。$x$是真实的图像数据,$G(s)$是生成的图像。${\parallel · \parallel}_1$是求绝对值。加入特征匹配损失后,判别器的目标函数变为:

\begin{equation} V(D,G) = \min_G{((\max_{D_1,D_2,D_3} \sum_{k=1,2,3}{V_{GAN} (D_k,G)} ) + \lambda \sum_{k=1,2,3}{L_{FM} (D_k,G)})} \label{3.13} \end{equation}

其中$V_{GAN}$为GAN原本的目标函数(GAN loss),$\lambda$是超参数,由人工设置。上面的目标函数表示分别优化$D_1$、$D_2$和$D_3$(有三个判别器),使$V$最大化,优化$G$使$V$最小化。
一些实验表明,特征匹配损失在图片锐化(image super-resolution)和风格迁移(style transfer)任务上,能够提升模型的效果,得到更清晰的图片,$[3.5]$中的实验也证明了这一点。
除了得到清晰的不扭曲的图像外,在人像处理时有时还会要求生成的人像的身份不会发生改变,就是说不会变成另一个人。为了达到这一目标,论文$[3.2]$的作者在GAN模型中加入人脸识别(face recognition)网络,用它来将真实的人像和生成的人像转换为这两个人像的嵌入(embedding),然后以这两个嵌入的欧式距离作为附加损失:

\begin{align} &L_{IP} (G) = {\parallel FR(x) - FR(\bar{x}) \parallel}_2 \nonumber \\[6pt] &V(D,G) = V_{GAN} (D,G) + \lambda L_{IP} (G) \nonumber \end{align}

其中$FR$为人脸识别神经网络。


CycleGAN
通过cGAN,我们可以将某一类数据转换为另一类,但是cGAN要求这两类数据已经做好配对(例如画面和对应的字幕配对),但是在很多场景中,数据间没有这样显性的配对。例如,在做图像的风格迁移时,没有一张照片能够与梵高的画进行配对,或是在进行季节转换时我们有一张夏天时候拍的照片,但没有与之对应的冬天的照片,或者在进行物体转换时,有一匹马在某地拍了一张照,但没有斑马在同样场景拍的照。
虽然上面的例子中,数据之间没有进行配对,但是它们仍然是存在某种映射关系的,类似数学中的$x$到$y$的映射,或者相反,$x=G(y)$。这种映射关系从形式上来说,与传统的GAN中的目标空间与隐空间的关系$\hat{x}=G(z)$是一致的,只不过我们并不关心$z$是什么。$z$可以是来自任意的分布$P(z)$的数据/变量,例如来自高斯分布。但是$y$是来自于真实数据,它服从某个我们不知道的分布$P(y)$。这个分布不能由我们指定,但是我们可以用函数$F(z)$来估计,就像GAN用$G(z)$来逼近$P(x)=\int{G(z)p(z)} dz$一样。如果将$G(z)$替换为$G(y)$,$F(z)$替换为$F(x)$,那就得到了CycleGAN。CycleGAN中$x$和$y$相互映射,形成一个环,模型学习的是它们的相互映射关系。对$x \to y$和$y \to x$,分别有GAN loss:

\begin{align} &V_{GAN} (F,D_Y) = E_{y \sim P_{data} \, (y)} [\log{D_Y (y)}] + E_{x \sim P_{data} \, (x)} [\log{⁡(1- D_Y (F(x)))}] \nonumber \\[6pt] &V_{GAN} (G,D_X) = E_{x \sim P_{data} \, (x)} [\log{D_X (x)}] + E_{y \sim P_{data} (y)} [\log{⁡(1- D_X (G(y)))}] \label{3.14} \end{align}

上面的目标函数中一共包含四个模型,生成器$F$、$G$和判别器$D_X$、$D_Y$。
虽然通过双向的GAN loss,模型可以学到数据$x$和$y$的相互映射关系,但是这种映射关系可能不是我们所希望的。例如我们希望的是将马映射成斑马,但实际上可能是将草变为斑马,而将马映射为草地。就是说$p(x,y)$得到了约束,但$p(x,y)=G(y)p(y)$中的$G(y)$仍然有很多可能。是为了进一步约束模型$G(y)$,CycleGAN的目标函数中增加了循环一致性损失(cycle consistency loss)。在CycleGAN的论文$[3.6]$中,cycle consistency loss为:

\begin{equation} L_{cycle} (F,G) = E_{y \sim P_{data} \, (y)} [{\parallel F(G(y)) - y \parallel}_1 ] + E_{x \sim P_{data} \, (x)} [{\parallel G(F(x)) - x \parallel}_1] \label{3.15} \end{equation}

结合$(\ref{3.14})$和$(\ref{3.15})$,得到目标函数:

\begin{equation} V(F,G,D_Y,D_X) = V_{GAN} (F,D_Y) + V_{GAN} (G,D_X) + \lambda L_{cycle} (F,G) \nonumber \end{equation}

其中${\parallel· \parallel}_1$为L1范数。
因为L1和L2正则化(regularization)会使生成的图像模糊,所以论文$[3.7]$中的循环一致性损失采用对抗机制代替$(\ref{3.15})$的形式:

\begin{align} L_{cycle} (D,F,G) &= E_{y \sim P_{data} \, (y)} [\log{⁡D(y,y)}] + E_{y \sim P_{data} \, (y)} [\log{(1- D(F(G(y)))}] \nonumber \\[6pt] &+ E_{x \sim P_{data} \, (x)} [\log⁡{D(x,x)}] + E_{x \sim P_{data} \, (x)} [\log{(1- D(G(F(x)))}] \nonumber \end{align}

 

未完待续~

 


[3.1] X. Chen, Y. Duan, R. Houthooft, J. Schulman, I. Sutskever, and P. Abbeel, (2016). “Infogan: Interpretable representation learning by information maximizing generative adversarial nets”.
[3.2] G. Antipov, M. Baccouche, and J.-L. Dugelay, (2017). “Face aging with conditional generative adversarial networks”.
[3.3] B. Dai, S. Fidler, R. Urtasun, and D. Lin, (2017). “Towards diverse and natural image descriptions via a conditional gan”. 
[3.4] T.-C. Wang, M.-Y. Liu, J.-Y. Zhu, A. Tao, J. Kautz, and B. Catanzaro, (2018). “High-resolution image synthesis and semantic manipulation with conditional gans”.
[3.5] A. Nguyen, J. Clune, Y. Bengio, A. Dosovitskiy, and J. Yosinski, (2017). “Plug & play generative networks: Conditional iterative generation of images in latent space”.
[3.6] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros, (2017). “Unpaired image-toimage translation using cycle-consistent adversarial networks”.
[3.7] C. Li, H. Liu, C. Chen, Y. Pu, L. Chen, R. Henao, and L. Carin, (2017). “Alice: Towards understanding adversarial learning for joint distribution matching”.