简单认识下GAN,GAN与最大似然的关系,几个基本概念的介绍
GAN的思想,一个判别模型D,一个生成模型G组成对抗网络。如何对抗呢? D的目的是尽量识别出G生成的样本, D(x) 表示样本被判断为真实数据的概率;G的目的是尽量让D无法识别自己生成的样本。
生成对抗网络的D之优化函数:
先来回顾下最大似然估计问题,以二分类为例。
样本总是唯一地属于某个类1/0,假设正样本标记为1,负样本标记为0。
在一个样本在label已知时,则样本为类别y=label的概率为:
对抗网络的样本来自真实数据 xi 和生成数据 G(zi) ,天然分裂为label=1(当 xi∈data 时)和label=0(当 xi∈G(zi) 时),判别器判别某样本类型y=label的概率函数可以表示为 P(y|x;(θd)) ,生成器的模型表示为 G(z) ,其中 z 为随机噪声。
其样本集判别为各自类别的总概率:
对抗网络,还有另一方生成器 G(z;θg) 。它的优化目标是什么呢?
G对自身参数的优化方向,依赖于外部,主要是让D对其生成样本无法识别,最好是判断概率为0.5。
前面只是介绍了对抗网络的组成结构,及优化目标的构造,怎么具体训练呢?
两个最优+一个过程收敛。
1) given G , 则D∗G(x)=Pdata(x)Pdata(x)+Pg(x)。
如何解释: V(G,D) 化简
=∫xpdata(x)lnD(x)dx+∫zpz(z)ln(1−D(G(z)))dz
=∫xpdata(x)lnD(x)dx+∫xpg(x)ln(1−D(x))dx
=∫xalny+bln(1−y)dx
最后的式子在 y=aa+b 时,取得最值。有空再想这个最值求解吧。
2) given D∗ ,则 V(G,D∗) 在 Pg=Pd 时,有最值 V∗(G,D∗)=−ln4 。
在 D∗ 下,整体的最优状态是什么样子呢?预期是 pg=pd ,且 D(G(z))=12 。验证下是否是呢?
V(G,D∗) 化简:
=Ex∼pdata[lnPdata(x)Pdata(x)+Pg(x)]+Ex∼pg[lnPg(x)Pdata(x)+Pg(x)]
=∑x∈datapd(x)lnlnPd(x)Pd(x)+Pg(x)+∑x∈G(z)Pg(x)lnlnPg(x)Pd(x)+Pg(x)
=∑x∈datapd(x)ln2lnPd(x)Pd(x)+Pg(x)+∑x∈G(z)Pg(x)ln2lnPd(x)Pd(x)+Pg(x)
−∑x∈dataPd(x)ln2−∑x∈GPg(x)ln2=−1∗ln2−1∗ln2=−ln4
=KL(Pd||Pd+Pg2)+KL(Pg||Pd+Pg2)−ln4
对于最后的式子,可以根据KL最值得知, Pd=Pd+Pg2; Pg=Pd+Pg2时,有最小值KL=0 ,从而得证 V(G,D∗) 的最优值及条件。
3) 训练过程收敛。
训练过程是交叉进行的,分别优化G和D, opt{G|givenD∗t}⇔opt{D|givenG∗} 。实际训练过程不容易收敛到最优值,进一步优化看GCGAN。GAN的论文有个Table2对生成模型面临的难点总结了下。
优点:
1) 训练时,只需要BackPropagation和dropout即可,不需要使用MC(Markov Chain),不需要根据网络推断某些分布。Import
2)对抗网络,对任意可导函数有效。
3)生成模型不用直接根据真实样本更新,而是利用流经判别模型的梯度。减少了数据依赖。
4)生成模型可表示的分布 Pg 更多样化,可以表示陡峭的分布,而MC训练的分布对此力不从心。Import
缺点:
1) Pg 表示方式不明确。
2)G和D的训练要同步好,否则容易G(x)生成单一性太强的样本,无法训练。
两方对抗,多方对抗有没有可能?纳什均衡、博弈论的内容看下。
1) momentum
梯度下降的加速技巧:积累之前的同向梯度,震荡方向的梯度相互抵消。
将参数更新 θt+1=θt−ηΔtJ(θ) 替换为:
1) https://ishmaelbelghazi.github.io/ALI/
2) http://blog.aylien.com/introduction-generative-adversarial-networks-code-tensorflow/
3)《Generative Adversarial Nets》
4)《Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks》
5) 《Batch Normalization, Accelerating Deep Network Training by Reducing Internal Covariate Shift》
6)《Dropout, A Simple Way to Prevent Neural Networks from Overfitting》