Network Generator
吃进x,再吃进一个已知分布可以sample出来的simple distribution z,得到一个complex distribution y。
为什么需要输出分布?
Video Prediction
给一段视频,预测后面的游戏画面。
希望机器输出的时候小人同时有向左向右转的可能,具体向左还是向右根据输入的z决定。
也就是当输出有一些随机性,需要解决一些创造力的任务的时候,就希望有一个generator。
举例:Drawing、Chatbot
GAN
各式各样的GAN
举个例子
Anime Face Generation
Discriminator
GAN训练的时候需要Discriminator,本质是neural network,作用是个function,如果输入是image,输出是数值scaler,数值越大,说明越接近真实图片。
Discriminator的架构可以是CNN,可以是transformer。
GAN的基础概念
Discriminator像一个天敌,帮助generator进化。
也可以说他们之间是对抗的关系(一种拟人化描述)。其实是亦敌亦友、相互促进的关系。
GAN演算
先初始化Generator和Discriminator参数,
在每一次迭代的时候:
Step1: 固定G,update D;
拿G产生的objects和database里sample出来的图片相比较,来训练D,训练目标是学着分辨真正的图片和G产生的objects之间的差异,可以当分类任务做,也可以当回归问题做。
Step2: 固定D,update G;
训练Generator去骗过Discriminator,以假乱真。
实际操作是G输入一个vector,产生一个图片,再输入给D去打分,G训练的目标是让固定的D打的分数越高越好。
G和D可以看成一个大的network,其中某一层的hidden layer的输出就代表一张图片,现在希望通过调整参数这个大的network输出的分数越大越好,只是不会调后半段的参数。
接下来就是以上过程再不停迭代。
Anime Face Generation训练测试
随着训练次数增加,人脸越来越清晰。
这是训练5万次的结果。
结果还可以更好:
还可以产生高清人脸。
不同人脸的输入向量做内差可以看到两张人脸之间连续的变化。
The first GAN
Today… BigGAN
GAN目标
目标:PG接近Pdata,divergence是衡量2种分布之间差距的指标。
不需要实际算PG和Pdata分布差异,可以通过采样计算。
训练Discriminator的目标是看到真的数据给比较高的分数,看到生成的数据给比较低的分数。
现在要找一个discriminator maximize objective function(要最小化某东西的叫loss function,要最大化某东西的叫objective function)。
事实上这个objective function就是cross entropy乘以一个负号,就是相当于在训练一个classifier。
这个max的值跟JS divergence有关。
如果PG和Pdata比较有差异,那么D可以比较容易分辨。
既然D的function跟JS divergence有关,那么可以对G的optimization公式进行替换。
刚刚的迭代过程就是在求解这个替换后的min max公式。
除了JS还可以有多种divergence。
但GAN还是不好train
Tips for GAN
JS divergence缺陷
JS divergence is not suitable.
原因有2:
- The nature of data.
Both Pdata and PG are low-dim manifold in high-dim space.
Pdata and PG 是高维空间投射到低维空间的两条线,这两条线重叠的可能性很小。 -
Sampling
如果sample的点不够多,即使他们分布相似,也没办法sample到重叠的部分。
JS1
JS divergence的问题是如果两个分布没有重叠,那算出来的结果永远是log2。
第二个分布明显比第一个分布好,但是从JS的计算结果看不出差别。
有一个现象:如果是二元分类train GAN,最后总会得到100%的正确率,就导致看不出generator有没有越来越好。(因为sample不多,用硬背的也可以背住正确答案)。导致以前train GAN的时候只能用人眼看
Wasserstein Distance
于是就有了使用Wasserstein Distance的想法。
想象有一个推土机,要把P的土推给Q,推土的平均距离就是Wasserstein Distance。
还有比较复杂的Wasserstein Distance,
把P变成Q的moving plan有很多,导致算出来的距离不一样。
为了让Wasserstein Distance只有一个值,会穷举所有moving plan,然后看哪一个moving plan可以让平均距离最小。
Wasserstein Distance可以解决上面JS divergence看不出差别的问题。
WGAN演算
D必须是一个足够平滑的function,如果不对大括号做限制,如果真实数据和生产的数据没有重叠,generator会给真实值无限大正值,给生成值无限大的负值。training就会无法收敛。
加上平滑function的限制可以让真实值和生成值变化不会非常大,就会让真实值和生成值之间的差距不会很大。
这个式子具体怎么解?
Spectral Normalization可以实现smooth function。
GAN is still challenging…
Generate fake images to fool discriminator.
两者相互成长,如果有一个不再进步,另一个也会跟着停下来。
还有一些tips,但是好不好用也不好说。
GAN for Sequence Generation
用GAN生成文字是最困难的。
把Decoder当成一个Generator,想要用Discriminator去train它让得到的分数越来越好,这件事做不到。
为什么呢?
Decoder如果有点变化,分数最大的talker(talker就是输出的文本单位,比如一个中文字)也没变化,输出的分数也没有改变。所以不能做gradient descent。
上次讲过,遇到不能gradient descent的时候,可以reinforcement learning(RL)硬train一发。
但是RL也很难train,所以很长一段时间train不出来sequence。
后来有篇paper train出来了。
除了GAN还有一些其他generative的model,比如variational autoencoder (VAE), FLOW-based model等。
Possible Solution
可以用network生成generator。
评估generator好坏
作业6是用了人脸检测的方法,那么一般的任务怎么辨别?
用影像分类系统,出来的结果分布越集中代表产生的图片越好。
光用这个方法,会有可能被Mode Collapse的现象骗过。这个现象是说有可能生成的data来来去去就几张。相当于这是discriminator的盲点。
这个问题至今没办法很好地解决,即使是爆搜参数。
还有个问题是Mode Dropping,就是生产的数据只是真正的资料的一部分,单独看生产的资料可能觉得分布多样性也够,但真实的资料的多样性其实更好。这个问题还
不像Mode Collapse那样容易被看到。
怎么检测图片的diverse?
图片放到图片分类器输出distribution,每张图片都会生成一个distribution,把这些平均一下,如果平均的distribution非常集中,就代表现在的多样性不够。
如果另一个case,平均完以后分布很平坦,则代表多样性足够。
Inception Score:
quality只看一张图片,diversity看一堆图片,quality越集中越好,diversity越分散越好。
Good quality, large diversity —> Large IS
对于作业6的任务不适用,因为产生的都是人脸,对IS来说区别不大。
还有一个measure,叫FID
Frechet Inception Distance
CNN输出的时候,不取最后softmax分出的类别,而取中间hidden layer输出的高维度向量来代表一张图片。
假设真的图片和产生的图片都符合Gaussian分布然后计算两者之间的distance。distance越小越好。
但有两个问题:
1.不一定都符合Gaussian分布;
2.需要大量的sample。
有一篇跑了各种GAN,用不同的random seed跑,用FID分数评估,分数越小越好。
不同random seed结果变化很多,GAN的表现都差不多,但比VAE的表现好。
We don’t want memory GAN
还有个问题:不希望产生跟训练资料一模一样的人脸。
所以评估generator这件事还是很难。
还有一些其他的mesure的ref
Conditional generation
给y的分布一个限制,把条件x输入给generator。
比如text-to-image这种任务,在输入的文字中给出条件。
Conditional GAN的Discriminator需要输入成对的生成的图片和相应的条件。
Conditional GAN还有更多应用——image translation
图片变图片:房屋设计图变成真的房子,黑白图着色,图片去雾。
用GAN+supervised去训练这种任务效果比较好。
声音转图片
图片动起来
Conditional GAN还可以让图片动起来,让蒙娜丽莎讲话。
GAN用于unsupervised learning
Learning from unpaired data
有一些问题没有成对label的data。
可以训练一个generator,输入是Domain x的分布,输出是Domain y的分布。
Cycle GAN
原始GAN是从Gussain sample出来作为输入,现在换成从Domain x里面sample。
但是这样做还不够,因为输入和输出还没有关联。
解决:增加一个generator,让输出的Domain y再还原回Domain x,这个还原的结果跟原Domain x越接近越好。这个就是cycle gan。为了让第二个generator能够成功还原,第一个generator输出的结果不能跟输入差太多。
Cycle GAN还可以双向。
还有其他的算法跟Cycle GAN作用类似。
脸变二次元的网站
Cycle GAN应用:文字风格转换
Text Style Transfer
一些Cycle GAN的unpaired应用
-Unsupervised Abstractive Summarization: 提炼摘要
-Unsupervised Translation: 无监督翻译
-Unsupervised ASR: 语音到文字
GAN remarks
我自己的GAN总结:
- Network Generator适用于一些需要创造力的任务,Generator的输入是x和simple distribution z,得到一个complex distribution y。GAN训练的时候需要对抗的Discriminator,本质是neural network,作用是个function,如果输入是image,输出是数值scaler,数值越大,说明越接近真实图片。Discriminator的架构可以是CNN,可以是transformer。GAN训练的时候先固定G,update D;再固定D,update G,接下来不停迭代。GAN的训练目标是PG接近Pdata,divergence是衡量2种分布之间差距的指标,可以通过采样计算分布差异,可以用JS divergence衡量。JS有缺陷,就是只要PG和Pdata分布无重叠就分辨不出差别,用Wasserstein Distance可以解决,WGAN演算的时候需要一个足够平滑的function,Spectral Normalization可以实现smooth function。GAN生成Seq比较难,可以reinforcement learning硬train但还是难,不过ScrachGAN可以实现。除了GAN还有一些其他generative的model,比如variational autoencoder (VAE), FLOW-based model等。
- Generator如何评估好坏?比如可以用图片分类系统评价单张图片,出来的结果分布越集中代表产生的图片越好。但是Mode Collapse (生成的图片来回只有几张)和Mode Dropping (生产图片多样性虽够但也只代表一部分)的问题导致评估还是比较难。怎么检测图片的diverse?所有图片放到图片分类器输出distribution,平均一下以后越分散说明代表性越好。Diverse的measurer有Inception Score (Good quality, large diversity)和Frechet Inception Distance (CNN输出的时候,取中间hidden layer输出的高维度向量来代表一张图片)等。
- Conditional generation是指输入的x包含条件,比如text-to-image这类任务。Conditional GAN的Discriminator需要输入成对的生成的图片和相应的条件。Conditional GAN的应用还有image translation、声音变图片、图片动起来。
- GAN还可以用于unsupervised learning,就是训练一个generator,输入是Domain x的分布,输出是Domain y的分布。再加第二个generator让Domain y还原成Domain x就是Cycle GAN。还有其他的算法跟Cycle GAN作用类似如DiscoGAN、DualGAN、StarGAN。Cycle GAN应用有人脸变二次元、文字风格转换、无监督提炼摘要、无监督翻译、无监督语音转文字。