GAN基础理解

生成对抗网络(Generative Adversarial Network,简称GAN),是非监督式学习的一种方法,通过让两个神经网络相互博弈的方式进行学习。

GAN介绍

生成网络

生成网络做的事不同于之前的network,都是一个function,你给他一个X就可以输出一个Y

生成网络做的事实际上不是输入一个X输出一个Y,而是给定一个随机的启发的点(distribution sample)加上或者不加上X 最终输出一个分布(distribution)。

image-20210514101010215

那这种可以输出,一个distribution的network,我们就叫它generator

GAN的分类

GAN细的分类有很多,此处以结构进行划分。

  • unconditional generation,不输入X,只输入一个 distribution sample 生成 y。

image-20210514141213358

  • conditional generation,给定一个 Condition x,让它根据 x 跟 z 来產生 y。

image-20210520162536362

  • unsupervised Learning,如Cycle GAN,X跟Y是不成对(unlabeled)的数据,只给X要求生成Y,且没有Y的label。

image-20210524140340298

GAN的运行流程

其流程类似生命演化过程。

image-20210514150713503

GAN由两部分组成:generator 和 discriminator。

generator 负责根据输入生成输出结果。

discriminator 负责衡量generator输出的效果。

  • 第一次generator从一个随机的输入中生成一些奇怪的东西。discriminator就会学习区分generator输出跟真正的图片的不同。
  • generator调整其参数,进化后再次输出一些结果,试图骗过discriminator。但是discriminator也是会进化的,它会试图分辨这一组图片,跟真实图片之间的差异。
  • 如此循环往复,二者既是竞争也是合作关系。

discriminator、generator的架构师自己设计的。用CNN、Transfermer都行。

unconditional generation

以让机器生成二次元人物的脸为例。

首先 Z 是一个从一个normal distribution里sample出来的向量,通常会是一个low-dimensional的向量,其维度自定义。

而生成的 y 是一个高纬度的向量,从这个向量再输出成图片。

image-20210514141653002

补充说明:不同的distribution之间的差异,可能并没有真的非常大,只要够简单,generator会想办法,把这个简单的distribution,对应到一个复杂的distribution。

算法细节

generator跟discriminator,他们就是两个network。

初始化 generator跟discriminator的参数

第一步是,定住你的generator,只train你的discriminator

image-20210514153526036

接下来定住discriminator改成训练generator

image-20210514155446050

接下来就是反复的训练

算法的目标

在生成的问题里面,我们要min、max的到底是什么?

我们想要 Minimize 的东西是这个样子的,我们有一个 Generator

  • 给它一大堆的 Vector,给它从 Normal Distribution Sample 出来的东西
  • 丢进这个 Generator 以后,会產生一个比较复杂的 Distribution,这个复杂 Distribution,我们叫它 PG
  • 然后 我们有一堆的 Data,这个是真正的 Data,真正的 Data 也形成了另外一个 Distribution,叫做 Pdata
  • 我们期待 PG 跟 Pdata 越接近越好

image-20210516190051672

我们衡量两个 Distribution 之间的某种距离。

image-20210516190555803

Div Of PG 跟 Pdata,它指的意思就是 PG 跟 Pdata,这两个 Distribution 之间的 Divergence(散度)

Divergence 这边指的意思就是,这两个你可以想成是,这两个 Distribution 之间的某种距离

  • 如果这个 Divergence 越大,就代表这两个 Distribution 越不像
  • Divergence 越小,就代表这两个 Distribution 越相近

有了这个衡量标准以后,我们现在的目标,是要去找一个 Generator,调整其参数使其产生的 PG 跟 Pdata 之间的 Divergence 越小越好。

如何计算Divergence是个很困难的问题。

但是GAN说只要能从PG和Pdata里sample出东西就能计算Divergence。

  • 把你的图库拿出来,从图库裡面随机產生,随机 Sample 一些图片出来,你就得到 Pdata

  • 从 Normal Distribution(正态分布) Sample 出来的 Vector,丢到 Generator 裡面,生成的就PG

Discriminator

在GAN里面,一个特别的地方就是,除了generator以外,我们要多训练一个东西,叫做discriminator。

discriminator它的作用是,它会拿一张图片作為输入,它的输出是一个数值scalar,scalar越大就代表说,现在输入的这张图片,越像是真实的二次元人物的图像

Discriminator 就是一个function

image-20210514142817844

训练一个 Discriminator,它的训练的目标是

  • 看到 Real Data,就给它比较高的分数
  • 看到这个 Generative 的 Data,就给它比较低的分数

实际就是一个Optimization 问题。

image-20210517110317766

我们希望这个 Objective Function V越大越好

image-20210517112608814

  • 意味著我们希望这边的 D (Y) 越大越好,我们希望 Y 如果是从 Pdata Sample 出来的,它就要越大越好
  • 我们希望说如果 Y 是从,这个 PG Sample 出来的,它就要越小越好

但,PG 跟 Pdata 很像,很难分开,PG与Pdata越像Divergence 就越小

image-20210517145950583

所以我们说我们本来的目标是要找一个 Generator,去 Minimize PG 跟 Pdata 的 Divergence

image-20210517150917682

我们只要训练一个 Discriminator,训练完以后,这个 Objective Function 的最大值,就是这个 Divergence,就跟这个 Divergence 有关

image-20210517152330770

  • 我们的目标是要最小的Divergence,也就是PG与Pdata越相似。

当然除了此处用的 JS divergence以外,还有很多其他的divergence衡量算法。

尽管有了 JS divergence算法,但是GAN依然很那Train起来。

Tips for GAN

首先 JS Divergence 有个特性,是两个没有重叠的分布,JS Divergence 算出来,就永远都是 Log2,而GAN里面大部分都是没有重叠。所以JS Divergence并不太适用于GAN中。

Wasserstein Distance

Wasserstein Distance 的想法是这个样子,假设你有两个 Distribution,一个 Distribution 我们叫它 P,另外一个 Distribution 我们叫它 Q

Wasserstein Distance 它计算的方法,就是想像你在开一台推土机

image-20210517165125486

推土机把 P 这边的土,挪到 Q 所移动的平均距离,就是 Wasserstein Distance

BUT,如果是更复杂的 Distribution,你要算 Wasserstein Distance,就有点困难了。

image-20210517203203579

把 P重新塑造成 Q方法有无穷多种,用不同的 Moving Plan,你推土机平均走的距离就不一样

只有穷举所有可能的moving plans,才能算出让平均的距离最小值:Wasserstein Distance。

但如果不执意于一次性将土推平,每次都稍微把 PG 往 Pdata 挪近一点,W Distance 就会有变化,也能起到相似的作用。

WGAN

当你用 Wasserstein Distance,来取代 JS Divergence 的时候,这个 GAN 就叫做 WGAN

Wasserstein Distance 怎麼算

image-20210517213324131

  • y 如果是从 Pdata 来的,那我们要计算它的 D(y) 的期望值
  • y 如果是从 PG 来的,我们计算它的 D(y) 的期望值,但是前面乘上一个负号

所以如果你要 Maximum,这个 Objective Function,你会达成这样的效果,

  • 如果 y是从 Pdata Sample 出来的,D(y),就 Discriminator 的 Output 要越大越好
  • 如果 X 是从 PG,从 Generator Sample 出来的,那 D(y),也就 Discriminator 的 Output,应该要越小越好

image-20210517213552789

但是这边还有另外一个限制,它不是光大括号裡面的值变大就好,还有一个限制是,D 不能够是一个随便的 Function,D必须要是一个 1-Lipschitz 的 Function(D 必须要是一个足够平滑的 Function

Evaluation of Generation 评估

评估一个 Generator 的好坏,并没有那麼容易,最直观就是请人来看。但是并不稳定客观。

把你的 GAN 產生出来的图片,丢到一个的影像的分类系统裡面,让AI为AI评分….

image-20210519162401379

对于单张照片,这个机率的分布如果越集中,就代表说现在產生的图片可能越好

Diversity - Mode Collapse

就是说,你的模型来来回回就出那几张照片,这问题比较难处理。

Diversity - Mode Dropping

你的產生出来的资料,可能只有真实资料的一部分。

评估方法

过去有一样是藉助我们的 Image Classifier,你就把一堆图片,就很像你的 Generator 產生 1000 张图片,把这 1000 张图片裡,都丢到 Image Classify 裡面,看它被判断成哪一个 Class

image-20210519204240918

把所有的 Distribution 平均起来,如果平均的 Distribution 非常集中,就代表现在多样性不够。如果平均完后的结果是非常平坦的,那代表说你的多样性是足够的

memory GAN

GAN会记忆一些训练资料的问题,但是我们希望GAN更有创造性一些。

Conditional Generation

我们可以操控 Generator 的输出,我们给它一个 Condition x,让它根据 x 跟 z 来產生 y,那这样的 Conditional Generation

image-20210520162536362

比如输入文字描述生成相应的图片。

image-20210520164728663

在 Conditional GAN 裡面,你要做有点不一样的设计,你的 Discriminator 不是只吃图片 y,它还要吃 Condition x

光图片好,Discriminator 还是不会给高分

一方面图片要好,另外一方面,这个图片跟文字的叙述必须要是相配的,Discriminator 才会给高分。

Learning from Unpaired Data

X跟Y是不成对的时候,我们依然可以使用GAN。

比如输入真人头像输出动漫头像。

image-20210524140340298

Cycle GAN

在Cycle GAN裡面,我们会train两个generator

  • 第一个generator它的工作是,把X domain的图变成Y domain的图
  • 第二个generator它的工作是,看到一张Y domain的图,把它还原回X domain的图

image-20210524143232414

使得经过两次转换以后,输入跟输出要越接近越好

我们有三个Network

  1. 第一个generator,它的工作是把X转成Y
  2. 第二个generator,它的工作是要把Y还原回原来的X
  3. 那这个discriminator,它的工作仍然是要看,蓝色的这个generator它的输出,像不像是Y domain的图

也就是除了保证输入与输出之间的关联性的同时追求对生成任务完成。

参考:

https://www.bilibili.com/video/BV1Wv411h7kN?p=34

https://github.com/unclestrong/DeepLearning_LHY21_Notes