品读论文-GAN(一)

本文章的目的是品读一下GAN(对抗生成网络)这篇论文,希望大家能在这次的品读中有所收获。

论文的下载地址为:
https://arxiv.org/pdf/1406.2661.pdf

在品读之前,我想问一下,
大家是否觉得GAN只会生成图片,修复图片等图像处理?
我的答案是否定的。

记得有一个比较有名的疑问:机器人会否像人那样做梦?
我觉得是会的。

为什么这么说?
因为GAN的出现可以证明这一点。
GAN的主要思想是,通过设置两个CNN网络,一个网络为生成者(G),一个网络为识别者(D)。
G的作用是把一个一维的随机向量z变成一张图片。
D的作用是对原始的真实图像和G生成的假图像进行分辨。

这里我们先集中于这个有趣的G,它能够把一个随机向量z变成一个我们生活中能看到的常见的图像。
我们可以用这个跟我们人类进行类比。
俗话说日有所思,夜有所梦。
这个随机向量z就像我们人类在日常生活中对身边事物的无意识观察中积累到人的脑里的电荷。
在我们进行休息,大脑进行记忆修复时,就会调用这个随机向量z来产生一些“梦境”,我们也许会记住它,也许也会忘记它。
所以我认为,GAN的思想是让机器人会做梦的方法之一。
其他方法还有面书今年发布的GLANN等。
本文对GAN集中进行分析。

论文前言
论文的前言说的大意是2014年的时候,深度学习在图像识别,分类方面有了很大的突破,但是在深度生成模型方面却比较欠缺突破,其原因是衡量网络的生成物的计算方法在实现上比较棘手,以及生成网络在分段的线性网络单元中很难获取到需要的信息,导致其难以学习数据中的特征。
然后GAN这个网络就提出了除了生成者G以外,也设置了一个识别者D。它们俩是互相竞争的关系。它们互相竞争,互相进步。直至G成长到D无法惩罚它为止。
为了理解这个过程,论文作者举了一个非常有趣的例子。
G是一个造假者,而D则是我们日常中的Police。
刚开始的时候,造假者随便地拿一些材料(z向量)来制作假的货币出来,然后拿给Police检查。
Police拿着真正的货币和造假者弄出来的货币进行检查和学习,并给出真假判断。
每学习一次,Police都会对造假者进行反馈。
它们俩互相竞争,互相进步,直到某个时候,当造假者做出来的货币能以假乱真,糊弄Police的时候,造假者就合格了。
也就是训练成功结束。

网络架构
通过阅读论文的前沿后,相信大家已经对GAN的实现思想有一个大致的了解。
然后接下来我们来开始学习GAN的网络架构思想。
这里我引用Thalles Silva的一张例子图。
品读论文-GAN(一)_第1张图片 图1:GAN的网络架构
引用自:
https://medium.freecodecamp.org/an-intuitive-introduction-to-generative-adversarial-networks-gans-7a2264a81394

从图像中可以看到,G把随机向量z(Random Noise)反卷积成一张假图片,而D则检查真实图片(Training set)和假图片来给出真假判定。

损失函数:
有了网络架构,我们还要看一下网络的损失函数。损失函数是惩罚网络的机制,让网络能够不停学习进步。而GAN的损失函数也是比较有特色的。
损失函数
该loss函数的核心思想是让G(z)最小化(无限接近假值0),让D(G(z))最大化(无限接近真值1)。然后这个想法放在一起,让loss函数的值最小化就会得到以上公式。
是不是还是有点难以理解。我刚开始看的时候也是觉得有点难理解。
这里我们来逐项逐项看。
损失函数第一项
当D(x)无限接近1时,该项无限接近于0。
损失函数第二项
当该项无限接近于0时,D(G(z))无限接近于1,但是G(z)是要无限接近于0的,而D(G(z))是要无限接近1的,这种矛盾状态将引起D和G的竞争关系。所以GAN的对抗思想从loss函数的设置表现出来。
当然还有一种另外的理解方法,也就是说当D遇到真实图片x时,D要想方设法让把真实图片x判定为真(也就是1),而D遇到G生成的假图片z时,要想方设法把z判定为假(也就是0)。而同时,G要想方设法让D把自己生产的假图片z判别为真(也就是1)。竞争关系就体现出来了。

理论结果
品读论文-GAN(一)_第2张图片
图2:论文figure1
先观察论文中的figure1,其中蓝色虚线代表D的分布。它可用以下公式表示:
论文公式2
其中p代表分布的概率。
绿色实线代表的是G的分布。黑色点线代表的是真实数据的分布。
最底的实线z代表的是z向量的分布。
中间的实线x代表的是真实数据x的分布。
刚开始时,D很容易识别出G的数据是假的。随着时间的推移,G会把z向量的值拟合到跟真实数据一样,也就是图3中的(d)那样。此时蓝色虚线会变为1/2。

算法伪代码
品读论文-GAN(一)_第3张图片
当还在训练周期之内执行:
当在k步之内执行:
取m个随机z向量;
取m个随机真实数据;
根据损失函数更新D的网络;
然后:
取m个随机z向量;
根据损失函数更新G的网络;

结语
通过以上的介绍,不知道大家是否对GAN有了较好的认识。
其核心思想是设置两个CNN,G和D。
通过设置特殊的损失函数来实现G和D的竞争关系。
这里附上tensorflow2.0对GAN的实现。
https://www.tensorflow.org/alpha/tutorials/generative/dcgan
GAN的训练有很多需要注意的地方,本人将在下次给大家介绍一些训练GAN的技巧。

你可能感兴趣的:(论文品读)