*注:本博客参考李宏毅老师2020年机器学习课程. 视频链接
目录
- 1 Generation Adversarial Network
- 2 GAN原理
- 3 Generator质量评估
- 4 Conditional Generation
- 5 无配对数据的训练-Cycle GAN
- 6 基于GAN的其他应用
1 Generation Adversarial Network
1.1 GAN的工作方式
Generation Adversarial Network(GAN),即生成对抗网络,是一种由两个子结构组成的网络,一个称为Generator,一个称为Discriminator。Generator负责产生输出,以“骗过”Discriminator,Discriminator则需要鉴别哪些是真实的数据,哪些是由Generator生成的数据,在这种对抗的形势下,使得两个结构的性能越来越好。
1.2 Generator的特点
与一般的网络相比,Generator是一个具有创造力的网络,也就是说,对于一个相同的输入,Generator可能输出完全不同的结果,但是这些结果都是正确的。为了实现这种创造力,在Generator的输入中,包含了一个随机变量 Z Z Z, Z Z Z以加法、拼接或其他形式与输入数据 X X X结合,使得每一次执行,Generator都能产生不一样的结果。
为什么需要Generator这样的网络结构呢?使用传统的网络结构来完成生成这件事有什么不妥呢?以视频预测为例,假设将车辆行驶视频监控作为输入,希望网络预测下一个时间点汽车的位置。那么在训练集中,当汽车需要转向,可能训练集中同时存在向左转和向右转的数据,如果使用传统的网络,为了最小化对所有样本的损失函数,那么网络的预测结果会导致汽车在转角处“分裂”,既向左转,也向右转————显然这不是我们想要的结果。事实上,在这一案例中,预测汽车向左转,或者向右转都是正确的,但是,同时向左向右转,就是错误的。
1.3 Discriminator的特点
Discriminator的输入是一张图片,输出是一个数值,代表这张图片是真实的图片的概率。
1.4 “对抗”的进行
训练GAN网络大致分为以下步骤:
- 固定G的参数,以减小D的输出值为目标,仅更新D的参数,提高其分辨能力;
- 固定D的参数,以增大D的输出值为目标,仅更新G的参数,提高其欺骗能力;
接下来只需重复上述步骤,就能逐步提高GAN的性能。
1.5 GAN的应用
GAN可以用来完成一些生成类的工作,例如人脸生成、动漫人物生成等,值得注意的是,对于无条件生成(即训练时只输入随机变量,不输入其他固定数据),采用插值法,能够让GAN产生一系列中间图片。如图:
(图1,来自李宏毅2021春机器学习课程)
2 GAN原理
2.1 GAN的目标
假设仅以随机变量作为Generator的输入,所有的输入都是从一个分布中采样得出的,那么对于整个输入空间,Generator将会产生一个输出的分布 P G P_G PG,而真实的数据的分布是 P d a t a P_{data} Pdata,因此可以说,GAN的目标就是使得 P G P_G PG和 P d a t a P_{data} Pdata尽可能的接近,表示为:
G
∗
=
a
r
g
m
i
n
G
D
i
v
(
P
G
,
P
d
a
t
a
)
(1)
G^*=arg \underset{G}{\rm{min}}Div(P_G,P_{data})\tag{1}
G∗=argGminDiv(PG,Pdata)(1)
D
i
v
Div
Div表示两个分布的距离。式1看上去很简单,然而难点在于,如何计算Div。对于这种连续的分布而言,要计算两个分布的距离是非常困难的。GAN算法的巧妙之处就在于,只需要从两个分布中随机抽取一些数据,就能够估算两个分布的距离,从而实现网络的优化。
Discriminator的工作是尽可能地区分生成的数据和真实的数据,由于GAN中的变量只有D和G的参数,因此可以看成最大化
V
(
D
,
G
)
V(D,G)
V(D,G),
V
V
V表示生成的数据和真实的数据之间的差异。
D
∗
=
a
r
g
m
a
x
D
V
(
D
,
G
)
(2)
D^*=arg\underset{D}{\rm{max}}V(D,G)\tag{2}
D∗=argDmaxV(D,G)(2)
从直观上来看,如果两个分布的距离非常大,那么从这两个分布中采样出来的数据点的差距也非常大。当采样了足够多的点之后,我们可以将Discriminator所做的事情看作是一个分类任务,分类两个距离非常大的分布中的样本会非常容易,因此
V
(
D
,
G
)
V(D,G)
V(D,G)也会比较大,而当两个分布距离很小,
V
(
D
,
G
)
V(D,G)
V(D,G)也比较小。
从上面的论述中我们可以隐约感受到, V ( D , G ) V(D,G) V(D,G)与Div是正相关的,事实上,可以用数学推导证明这件事:Generative Adversarial Networks。
总而言之,我们现在知道了
V
(
D
,
G
)
V(D,G)
V(D,G)是可以估计Div的,因此,可以使用式2来替换式1中的Div,得到:
G
∗
=
a
r
g
m
i
n
G
m
a
x
D
V
(
D
,
G
)
(3)
G^*=arg \,\underset{G}{\rm{min}}\,\underset{D}{\rm{max}}V(D,G)\tag{3}
G∗=argGminDmaxV(D,G)(3)
而GAN中的Generator和Discriminator所进行的“对抗”,就是在优化式3这个既包含min又包含max的计算式。
2.2 WGAN
事实上,GAN通过计算式2来估计的Div称为JS Divergence,这种距离有一个缺点是,如果两个分布中的采样点没有任何交集,那么计算所得的距离都是一个相同的定值。
在图像处理任务中,每一张图片都可以看作一个高维向量,真实的图片数据在这个向量空间中却仅占一小部分,其余的都是人类无法理解的没有现实意义的图像。这就导致在这个庞大的向量空间中,真实数据所占的一小部分空间和Generator生成图片的一小部分空间很难有交集,即便有,可能也就像两个曲面相交一样,重合的部分只占整个空间的极少数。
如此一来,JS Divergence在训练中变化就不明显,也就是说,Discriminator的区分能力总是远远高于Generator的生成能力,导致在模型训练时很难观测到训练的进度。
在WGAN中提出了一种新的计算两个分布之间距离的方法,称为Wasserstein distance:
m
a
x
D
∈
1
−
L
i
p
s
c
h
i
t
z
{
E
y
∼
P
d
a
t
a
[
D
(
x
)
]
−
E
y
∼
P
G
[
D
(
x
)
]
}
(4)
\underset{D\in{1-Lipschitz}}{\rm{max}}\{E_{y\sim P_{data}}[D(x)]-E_{y\sim P_{G}}[D(x)]\}\tag{4}
D∈1−Lipschitzmax{Ey∼Pdata[D(x)]−Ey∼PG[D(x)]}(4)
上式中,
E
E
E表示期望,
D
∈
1
−
L
i
p
s
c
h
i
t
z
D\in{1-Lipschitz}
D∈1−Lipschitz表示D是一个足够平滑的函数,函数值不存在剧烈的突变。
要求D足够平滑,是为了避免当两个分布没有重合部分时,Discriminator为了区分两个分布而将他们的函数值设置为无限大的情况,如图2:
(图2,来源李宏毅2021春机器学习课程)
为了做到D足够平滑,在原始的WGAN中,简单地设置了一个阈值c,将D的输出超过c的部分全部截断为c,当前然这样做并不能完全解决这样一个优化问题。于是在Improved Training of Wasserstein GANs中,令两个分布中的采样点的梯度近似于1,从而实现D的平滑。在Spectral Normalization for Generative Adversarial Networks中,保持两个分布中的采样点处处小于1,取得了很好的效果。
2.3 GAN训练的难点
2.3.1 难以训练
GAN从它的训练方式本身,就导致了GAN很难训练:由于GAN需要Generator和Discriminator相互促进,因此一旦两个子网络中任何一个的Loss无法继续下降,就会导致整个网络停摆,GAN依然是一个前瞻性的网络结构。
下面列出一些目前为止比较有效的GAN的文章:
- DCGAN:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
- Improved Techniques for Training GANs
- BigGAN:Large Scale GAN Training for High Fidelity Natural Image Synthesis
- Tips and tricks to make GANs work
2.3.2 文字生成
GAN通常用于解决图片生成的任务,那么如果使用GAN来生成文字,是否可行呢?从实验结果来看,训练GAN来产生文字是一件非常困难的事情。在Transformer中使用了Decoder来产生文字,如果将Decoder换成Gnerator,并且在其后接一个Discriminator,理论上来说可行。但是,由于文字使用了one-hot编码来表示,如果输入产生了一个较小的变化,导数Generator的输出也产生一个较小的变化,这个变化可能不足以改变one-hot编码中最大的那一项的地位,导致输出的文字并没有发生改变,如此一来,就无法计算梯度从而更新参数了。
2.3.3 Mode Collapse与Mode Dropping
除此之外,使用GAN完成生成式的任务还有两个典型的问题:
- Mode Collapse:随着训练的进行,生成的图片越来越趋于同一张特性形式的图片。这可能是因为Discriminator存在一个“盲点”,而Generator恰好捕捉到了这个盲点。这将导致生成图片的多样性大幅减少。
- Mode Dropping:尽管生成的图片质量较高,也有较好的多样性,但是经过多次训练之后,模型生成的图片总是那么几张。
这两种问题比较难以有效的解决,仍然值得研究。
2.4 GAN与监督学习
在图片生成任务中,假设不使用GAN,而是对数据集中每一张图片都分配一个低维向量作为 X X X,训练一个网络来将这个低维向量转换为原始图片,这样是否可行呢?事实上,已经有了这样的研究,但如果对每一张图片分配随机向量,训练的结果往往很差,要得到好的结果,每张图片所分配的向量必须经过慎重的选择。参考:
3 Generator质量评估
3.1 借助人脸识别系统
目前人脸识别系统已经有较高的准确度,在使用GAN生成人脸的任务中,可以将GAN的生成结果送入人脸识别系统,计算识别出的人脸数量占总数的比例,这一比例越高,说明生成的图片更像人脸。
3.2 借助图像分类系统
将GAN的生成结果送入图像分类系统,每一张图片都会有一个类别分布,
- 对于单张图片,分布越集中,说明系统认为该图片属于某一类别的概率越大,即单张图片的质量较高;
- 将所有图片的类别分布取平均,如果平均后的分布越分散,说明GAN产生的图片多样性越强;
基于上述两个标准,一种判断Generator性能的指标:Inception Score(IS)就被提出,图片质量越高、多样性越强,IS分数也就越高。
但是在生成人脸的任务中,由于生成的都是人脸,所以多数图片可能会被分为同一个类别,因此不一定适用。
3.3 Frechet INception Distance(FID)
FID的思想是,虽然人脸可能都会被分到同一个类别,但是在分类网络的softmax层之前的向量,很可能同一个类别的图片所得到的向量值也不有很大的不同。因此只要取出这个向量,估计生成图片和真实图片的正态分布之间的FID,就能判断生成图片的质量了。
3.4 不同类型的GAN之间的比较
Google在2017年发表的文章Are GANs Created Equal? A Large-Scale Study中,对比了不同的GAN模型在不同数据集上的FID分数
(图3,来源:Are GANs Created Equal? A Large-Scale Study)
3.5 质量评估的进一步思考
目前评估GAN的主要手段是人脸检测+FID,但是即便是这两项指标结果都比较好,也不一定能说明GAN具有非常优秀的性能。举例而言,假设Generator最终学习到的结果是输出与样本一摸一样的图片,或者仅仅是将样本进行旋转、镜像等操作之后的图片,这当然会得到很高的分数,但是这并不是我们想要的,因为这样的模型不具备“创造性”。
因此,研究更多的、更有效的评估手段也是很重要的,在Pros and Cons of GAN Evaluation Measures中,作者给出了更多的Generator评估指标。
4 Conditional Generation
有条件生成的任务是,输入一个 X X X和一个随机变量 Z Z Z到Generator中,产生一张与输入 X X X有关的图片。在这种任务中,Discriminator不能再仅仅以图片作为输入,而是也要将 X X X作为输入的一部分,否则Generator生成的图片为了骗过Discriminator,将会变得与 X X X无关。
(图4,来源李宏毅2021春机器学习课程)
那么为了训练这样的网络,数据也需要进行标注,需要将每一张图片都与一个 X X X配对,作为正样本。而将图片与不正确的 X X X配对,作为负样本,同时Generator产生的图片也都作为负样本,来训练Discriminator。
(图5,来源李宏毅2021春机器学习课程)
Conditional GAN的应用很多,除了上面提到的文字转图片,还有图片转图片、图片上色、图像修补……等等。对于输入一张图片,输出也是一张图片的任务,往往称为pix2pix或者Image Translation。
- 在Image-to-Image Translation with Conditional Adversarial Networks一文中,作者结合GAN和监督学习,给出了使用图片生成图片的例子。
- Few-Shot Adversarial Learning of Realistic Neural Talking Head Models一文输入图片,产生了会运动的图片(视频)。
- Audio to Scene Samples这个网站训练GAN输入声音产生图片。
5 无配对数据的训练-Cycle GAN
Conditional GAN需要获得成对的 X X X和 Y Y Y才能够展开训练,但是对于某些任务而言,成对的数据很难获得,例如将真人的照片转换为动漫人物的图片。在这种无配对数据的情况下,如何训练GAN呢?
在Unconditional GAN中,仅使用一个随机变量作为输入,最终生成网络能够学习到一种映射关系使得输入数据的分布与输出数据的分布尽可能接近。按照这种思路,如果将Unconditional GAN的随机输入改成数据集中的 X X X,那就应该也能够实现类似的效果。
但是与Conditional GAN一样,这样的输入并不能保证生成网络产生的图片与 X X X有较高的相似度,Generator可能为了更容易地七篇Discriminator而产生与 X X X无关的图片。同时,由于数据集没有配对,因此不能通过Conditional GAN中的方法来解决这个问题。
Cycle GAN为解决这个问题提供了一种思路,在Cycle GAN中,除了将源数据转换为目标数据的Generator之外,还添加了一个将目标数据转换为源数据的Generator,和区分目标数据与源数据的Discriminator,如图6:
(图6,来源李宏毅2021春机器学习课程)
在Cycle GAN中不仅仅要求G能够骗过对应的D,并且要求 G x → y G_{x\to y} Gx→y的输入和 G y → x G_{y\to x} Gy→x的输出要尽可能相似。
具有类似思想的文章参考如下:
- Cycle GAN:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks;
- Disco GAN:Learning to Discover Cross-Domain Relations with Generative Adversarial Networks;
- Dual GAN:DualGAN: Unsupervised Dual Learning for Image-to-Image Translation;
- Star GAN(多风格转换):StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation.
这篇文章没有使用Cycle GAN,完成了真实图片到动漫人物图片的转换:U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation。
6 基于GAN的其他应用
6.1 无监督的摘要生成
6.2 无监督的翻译
6.3 无监督的语音识别
- Completely Unsupervised Phoneme Recognition by Adversarially Learning Mapping Relationships from Audio Embeddings
- Unsupervised Speech Recognition via Segmental Empirical Output Distribution Matching
- Completely Unsupervised Speech Recognition By A Generative Adversarial Network Harmonized With Iteratively Refined Hidden Markov Models