GAN的基本原理其实非常简单,这里以生成图片为例进行说明。假设我们有两个网络,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。

用随机梯度下降法训练D和G

DCGAN(Deep Convolutional Generative Adversarial Networks)的原理和GAN是一样的,这里就不在赘述。它只是把上述的G和D换成了两个卷积神经网络(CNN)。
https://zhuanlan.zhihu.com/p/24767059 代码
https://github.com/carpedm20/DCGAN-tensorflow

GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,不管三七二十一,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了。

GAN不适合处理文本数据

1、将pooling层convolutions替代,其中,在discriminator上用strided convolutions替代,在generator上用fractional-strided convolutions(即deconvolution)替代。
2、在generator和discriminator上都使用batchnorm。 
解决初始化差的问题
帮助梯度传播到每一层
防止generator把所有的样本都收敛到同一个点。
直接将BN应用到所有层会导致样本震荡和模型不稳定,通过在generator输出层和discriminator输入层不采用BN可以防止这种现象。
3、移除全连接层 
global pooling增加了模型的稳定性,但伤害了收敛速度。
4、在generator的除了输出层外的所有层使用ReLU,输出层采用tanh。
5、在discriminator的所有层上使用LeakyReLU。

在DCGAN中,G的网络结构是需要进行up-sample , 所以使用的“de-convolution”层,而对于D则是比较普遍的卷基层进行下采样。