原理:
假设我们有两个网络:一个生G(Generator),一个判别D(Discriminator)。

G是一个生成图片的的网络,它接受一个随机的噪声z,通过这个噪声生成图片,记做G(z)。

D是一个判别网络,判断一张图片是不是“真实的”。它的输入参数是x,x代表一张图片的。输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,输出为0,就代表不可能是真实的图片。

“对抗”的由来:
G(生成网络)的目标是尽量生成真实的图片去欺骗D(判别网络)。
D的目标是尽量把G生成的图片和真实的图片分别开来。

我们希望的状态:
G可以生成以假乱真的图片G(z)。
D难以判定G生成的图片究竟是不是真实的,因此D(G(z)) =0.5。

我们的目的:得到一个生成式的模型G,可以用它来生成图片。
目标函数:
GAN—生成对抗网络
在这里:
x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
D(x)用来判断真实的图片为真实的概率。
D(G(z))是D网络判断G生成的图片是否为真实图片的概率。

G的目的:G希望自己生成的图片尽可能的接近真实图片,也就是D(G(z))得到的概率值尽可能的大。这时候是减小V(D,G),因此前面式子标记是min_G。
D的目的:D越强,D(x)应该越大,D(G(x))应该越小,因此对于式子是max_D。
所以两个网络是对抗不过,随着网络优化,G生成图像越来越接近真实图像,D的判别能力也越来越高。
我们可以看看Lan Goodfellow的描述:
GAN—生成对抗网络
(a)为一开始情况,黑线表示图像x的实际数据分布。绿线表示生成的数据分布。我们希望绿色的线能够趋近于黑色的线。即让生成的数据尽可能接近真实图像。蓝线表示生成的数据对应于D的分布。
一开始情况如a所示,G的能力有限,跟真实图像的数据分布有一定差距,D网络识别真实图像和生成图像虽然有波动但无压力,能够区分出来。
训练一段时间,到了b图,D训练的比较好,可以很明显的区分生成数据,由蓝线可以看出随着黑线和绿线的差异增大,蓝线明显下降了。
训练一段时间后,G的目标是提升概率,因此绿线往蓝线高的方向移动。
训练到D图,随着G网络的提升,G反过来影响D的分布D最终会达到0.5,G网络和D网络处于平衡状态,无法再进一步更新了。
网络实现
GAN—生成对抗网络

算法:使用小批量随机梯度下降法来训练GAN。k是训练判别网络D的更新次数。根据以往经验,我们设k=1。
for 训练次数:
for k次:
从噪声先验知识 p(z) 中抽样m个噪声样本{z1,z2,,…,zm};
从数据生成分布pdata(x)中抽取小批量m个样本{x1,x2,…,xm}。
根据以下随机梯度上升法更新判别器D
GAN—生成对抗网络
end for
从噪声先验知识 p(z) 中抽样m个噪声样本{z1,z2,,…,zm};
根据以下随机梯度下降法更新生成器G
GAN—生成对抗网络
end for
(1)G和D是同步训练的,但两者训练次数不一样,G训练一次,D训练k次。
(2)D的训练是同时输入生成的数据和样本数据计算loss。(不用交叉熵是因为交叉熵会使D(G(z))变为0,导致没有梯度,无法更新G。
在实际训练中,文章中G网络使用了RELU和sigmoid,而D网络使用了Maxout和dropout。并且文章中作者实际使用-log(D(G(z))来代替log(1-D(G(z)),从而在训练的开始使可以加大梯度信息,但是改变后的loss将使整个GAN不是一个完美的零和博弈。
GAN的训练过程可用下图来描述:
GAN—生成对抗网络

GAN的缺点:不容易训练