GAN, Generative Adversarial Networks
GAN是现在deep learning最火热的方向
文本生成图像需要用GAN来解决,比图像生成文本要复杂很多
在GAN出现之前,几乎没有什么算法能解决图像生成的问题
当这个问题被解决之后,就诞生了许多应用,比如换脸、图像修复、图像变成漫画、给漫画上色、将漫画变成真实的图像GAN还应用在数据的生成上。对于深度学习的算法任务来说,它之所以有效,其中一个重要原因是因为有海量数据,但是对于有些问题来说它可能没有那么多数据,所以我们可以用对抗神经网络来生成一些数,从而可以达到数据增强的效果
可以看出2018年GAN机器生成的图片已经非常逼真的,完全可以以假乱真了
而2014的时候质量却还比较差
4年的时间,GAN发生了天翻地覆的变化
画家的成长历程
根据画家怎样练习、成长,画出一幅好的作品
来学习怎样用神经网络来逼近一幅优秀的作品
p(x)即数据分布
对于非监督学习来说,其目标就是p(x)画家达芬奇在成名之前也是小菜,在年轻的时候,画画就是左图的样子;当他练习过无数次之后,最终画出右图的样子
这说明他经过不停地练习、不停地观察,学到了一个很好的p(x)的分布(可以理解为笔画的分布?)
我们再来细看一个画家的成长历程
少年的时候,画画事业刚开始起步,画出了左图。然后他有个哥哥,他是见过蒙娜丽莎原作的,然后他就能判断出他弟弟画的和原作差远了,相距十万八千里当学画画5年以后
这个时候画的比原来好多了,比较接近原作水平了。但这个时候哥哥的鉴赏能力也提升了,还是觉得你画的不行(如果现在给5年前的哥哥看可能就会认为你画的比较接近了)
十年后
十年后你的技艺已经渐入佳境了,已经可以画出微胖形的蒙娜丽莎
但哥哥还是能一眼看出体型的差距
最后
最后当你已经成为绘画大师的时候,画出来的画就连达芬奇本人都不能分辨了,你哥哥更不用说
这是就是达到了纳什均衡点
仅为无法分辨,所以由50%的概率是对的,50%的概率是错的
此时我们就收获了一名画家,也就是p(x),就是如何画一幅优秀作品的distribution
这个过程来多机器学习中就是
Pg(x)就是我们学到的分布,是你脑中x的分布
Pr(x)是鉴别是通过学习真实的画 掌握的分布我们要的是在得到纳什均衡时,Pg(x)要很接近于Pr(x)
一旦把这个网络调到Pg(x)接近于Pr(x),我们就可以用这个网络来做其他事情了
怎样训练GAN
L(D,G)也写作V(D,G) ,叫做Value函数
D就是Pr(x),通过真实的画学到的
Z就是给generator的一些信号,告诉你画什么,给一个什么Z,就画一个什么x,就是Pg(x)
minmaxV(D,G)这种写法表示min,max交替进行的过程
- 训练生成器,就是使V(D,G)变小
- 训练判别器,就是是V(D,G)变大
x~pdata(x) 表示 当x是真实数据的时候
z~pz(z)当输入z是随机向量的时候
D(x) 表示x是真实图像的概率 (当D(x)=1表示x是真实图像,当D(x)=0判断是虚假图像)
z是生成器的输入,x是判别器的输入
1-D(G(z)) G(z)是z经过生成器之后得到的图像,D(G(z))就是判断生成图像是不是一个真实的图像
训练D的时候,G保持不变,max整个函数
使得它最大,就是使得D(x)越大越好,就是真实数据中的x都要判别D(x)为1,就会使得判别器越来越好
使得它最大,就要最大化log(1-D(G(z))),就要最大化1-D(G(z)),就要最小化D(G(z)),就是使得D能够将生成的图片判别为假
各种GAN
可以看到GAN的研究从16年开始是成指数增长的
各种GAN,命名26个字母都用光了
DCGAN
深度卷积生成对抗网络(DCGAN)
DCGAN相对于原始的GAN并没有太大的改进,只是将全卷积神经网络应用到了GAN中。相较原始的GAN,DCGAN几乎完全使用了卷积层代替全连接层,判别器几乎是和生成器对称的。
DCGAN能改进GAN训练稳定,但是对GAN训练稳定性来说是治标不治本,没有从根本上解决问题
GAN的JS散度缺陷
GAN使用了JS divergence
GAN在训练时用到的非常严重的问题就是training不稳定
根本原因在于JS divergence对于两个分布不重合的情况下是无法给出一个有效的信息来度量程度
引入了一个新的度量标准就是Wassertein Distance,即Earth Mover Distance,即EM距离
WGAN
Earth Mover 衡量P和Q的相似度
Earth Mover Distance也叫做Wassertein Distance使用了Wassertein Distance的GAN就叫做WGAN
WGAN的最主要的区别就是把JS Divergence换成了Wassertein Distance,可以很好地解决两个distribution不overlap的情况,从而从根本上解决了GAN的train的时候在早期不能很好的收敛的问题
但是有一个约束
训练不稳定是GAN常见的一个问题。虽然WGAN在稳定训练方面有了比较好的进步,但是有时也只能生成较差的样本,并且有时候也比较难收敛。原因在于:WGAN采用了权重修剪(weight clipping)策略来强行满足critic上的Lipschitz约束,这将导致训练过程产生一些不希望的行为。
所以提出了另一种截断修剪的策略-gradient penalty,即惩罚critic相对于其输入(由随机噪声z生成的图片,即fake image)的梯度的norm。就是这么一个简单的改进,能使WGAN的训练变得更加稳定,并且取得更高质量的生成效果。
注意:GAN之前的D网络都叫discriminator,但是由于这里不是做分类任务,WGAN作者觉得叫discriminator不太合适,于是将其叫为critic。
WGAN-GD Gradient Descent 梯度下降
WGAN-GP Gradient Penalty 梯度惩罚
不同GAN的效果对比
为什么不用DCGAN
DCGAN取得好的效果要精心设计training的过程,精心设计网络参数,在这种情况下才能取得这么好的效果
WGAN,任何网络结构,只要符合约束,就能慢慢得去收敛