关于生成对抗网络


今天是六一国际儿童节,先祝看到这篇文章的小朋友节日快乐哈哈哈哈哈哈。

前几天和同学参加比赛,文档封面放大到A4尺寸后很模糊。

试了好几种解决方法,效果仍然不太好。

突然我灵机一动,早就听说GAN做图像生成很有东西,那就拉出来溜溜呗。

于是我用GAN,收获了大家的一致好评。

那么GAN为什么会这么强呢?且听我发表拙见。

先看这张经典的对比图。

对比图

左一是原图,将原图压缩,左二是用双三次插值法做插值,左三对压缩的图片用SRResNet用MSE做迭代优化,左四则是用GAN生成图像。

你可能明显看出左四的还原度是最高的。不过猛地一问为什么,你可能说不出来。其实,GAN生成的图像相较于SRResNet在细节方面更加清晰。

这是什么原因造成的呢?

其实用MSE做优化的话,为了最小化MSE,训练得到的理想的数据是整体来说更稳妥的,少了一些激进的数值,从而在生成图像边界的时候现得束手束脚,导致边界部分的模糊状态。而GAN则不会有这种问题。

那么,GAN激进的边界策略真的对吗?仔细看,你会发现,也不一定。哈哈哈哈哈哈啊哈。。。

不过给人以清晰的细节展现,能够更大程度上讨好人的眼球。这一点,GAN做到了。

那么GAN的思想是什么呢?

GAN的核心思想,是做生成器和判别器的对抗。生成器生成更加像原图的图片,判别器尽最大努力判别这是假的。所以这种方式被称为对抗生成。

GAN的图解

举一个简单的例子

目前,生成器要生成一张钞票,它先手画了一张。虽然画得不错,不过判别器还是能一眼看出来这是假币。

手画假币

生成器不服气,打印了一张人民币。判别器看不出来,于是判别器拿出了验钞机,再次证明这是张假币。

打印假币

生成器再次完善了各种细节,连判别器用验钞机也验不出来了。

接近完美的假钞

此时生成器出师了,可以执剑闯天涯了。

由此我们可以将GAN的思想用公式表达出来

GAN的优化函数

整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。

G的目的:G应该希望自己生成的图片“越接近真实越好”。

D的目的:D的能力越强,D(x)应该越大,D(G(x)应该越小。这时V(D,G)会变大。因此式子对于D来说是

求最大(max_D)

式子中,为了前期加快训练,生成器的训练把log(1-D(G(z)))换成-log(D(G(z)))

看看这一个min一个max,有没有对抗内味儿了。

GAN的核心代码

GAN的核心代码

可以看到,循环了k次,第一个式子是更新生成器,第二个式子是更新判别器。

这是一个生成器的例子

生成器

可以看出,这个生成器完成了一个将7 * 7的图片拉伸成28 * 28的任务。

这是一个判别器的例子

判别器

这里做了一个二分类任务,用于判断正负样本。

那这么说的话,GAN就没有缺点吗?

当然不是。相反,原生GAN的缺点非常多:

无法加入约束条件

特别容易陷入局部最优解

G、D相互之间成长必须要同步

过于自由,不可控性太强

特别特别容易崩溃

当然这些只是冰山一角

为了区缓解这些问题,有人提出了CGAN、DCGAN、ACGAN、infoGAN、WGAN……

还有GAN在NLU方向上的应用,做文本生成等等…

不过这是后话了,有机会再聊!


文章作者: Jone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jone !
评论
  目录