学习笔记:生成对抗网络(Generative Adversarial Nets)(附代码)

同时训练两个模型:(1)生成模型G,不断捕捉训练库里真是图片的概率分布,将输入的随机噪声转变成新的样本(即假数据),使其像是一个真的图片。(2)判别模型D,用来估计一个样本来自训练数据的概率,即它可以同时观察真是和假造的数据,并判断这个数据的真假(这个数据是不是从数据集中获取的图片)。在训练的过程中让两个网络互相竞争。刚开始的时候这两个模型均未经过训练,然后生成模型产生一张假数据欺骗判别模型,判别模型判断这张图片的真假,经过这个过程两个模型的能力一起变的越来越强。

在了解此网络之前先了解生成模型与判别模型:
(关于生成模型与判别模型的内容主要参考http://blog.csdn.net/zouxy09/article/details/8195017

1)决策函数Y=f(x)与条件概率分布PY|X
监督学习的任务主要就是从所给的数据中学习一个模型,对给定的输入X预测相应的输出Y。这个模型的一般形式为决策函数Y=f(x)或者是条件概率分布P(Y|X)
决策函数Y=f(x):输入数据X,得到其所对应的Y,将Y与某一阈值比较,根据比较的结果判断X所属的类别。如果为二分类问题(w1,w2表示两个类别),那么当Y大于所设定的阈值时则为w1,小于时为w2.
条件概率分布PY|X:输入数据X,通过比较它属于所有类的概率,然后将概率最大的类别作为输入数据X所属的类别。即如果Pw1|X大于Pw2|X,那么就认为X属于w1.
以上两个模型都可以具有对给定的输入X预测相应的输出Y的功能。且这两种方式有很多相同之处。例如在二分类问题中,求得条件概率Pw1|XPw2|X之后,求其比值Y=Pw1|X/w2|X,如果Y大于1或者某个阈值,那么X就属于类w1,反之则属于w2。而同样,很神奇的一件事是,实际上决策函数Y=f(X)也是隐含着使用P(Y|X)的。因为一般决策函数Y=f(X)是通过学习算法使你的预测和训练数据之间的误差平方最小化,而贝叶斯告诉我们,虽然它没有显式的运用贝叶斯或者以某种形式计算概率,但它实际上也是在隐含的输出极大似然假设(MAP假设)。也就是说学习器的任务是在所有假设模型有相等的先验概率条件下,输出极大似然假设。
因此分类器的目标就是在给定训练数据的基础上训练一个概率模型PY|X,然后再将其应用于其余测试数据。如果可以准确分类,那么则改模型为有效的。但实际上想象总是美好的,概率模型的估计很多情况下还是比较难的。尤其是在给定的数据不充足的情况下,由于数据不充足时模型很难学得数据所具有的规律。
分类器可以被看成是一个决策函数(或决策面),如果能够从要解决的问题和训练样本出发直接求出判别函数,就不用估计概率模型了,这就是决策函数Y=f(X)的伟大使命了。例如支持向量机,我已经知道它的决策函数(分类面)是线性的了,也就是可以表示成Y=f(X)=WX+b的形式,那么我们通过训练样本来学习得到W和b的值就可以得到Y=f(X)了。还有一种更直接的分类方法,它不用事先设计分类器,而是只确定分类原则,根据已知样本(训练样本)直接对未知样本进行分类。包括近邻法,它不会在进行具体的预测之前求出概率模型P(Y|X)或者决策函数Y=f(X),而是在真正预测的时候,将X与训练数据的各类的Xi比较,和哪些比较相似,就判断它X也属于Xi对应的类

监督学习方法又可以被分为判别方法以及生成方法。其所学得的模型则被称为生成模型以及判别模型。
1)判别模型:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括k近邻,感知级,决策树,支持向量机等。
1)生成模型:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。基本思想是首先建立样本的联合概率概率密度模型P(X,Y),然后再得到后验概率P(Y|X),再利用它进行分类,就像上面说的那样。这里是先求出P(X,Y)才得到P(Y|X)的,然后这个过程还得先求出P(X)。P(X)就是你的训练数据的概率分布。因此只有当数据比较充分时才得到的P(X)才能更好的描述数据的真是分布。这种方法中不仅需要学习条件概率密度分布,并且还要学习P(X),且在求P(X)的过程中具有很多局限性,因此相比较而言判别模型会更方便。
这样的方法之所以称为生成方法,是因为模型表示了给定输入X产生输出Y的生成关系。用于随机生成的观察值建模,特别是在给定某些隐藏参数情况下。典型的生成模型有:朴素贝叶斯和隐马尔科夫模型等。
由生成模型可以得到判别模型,但是由判别模型得不到生成模型。
生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么那个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。

根据以上知识重新切入生成对抗网络,
这里写图片描述
以手写体为例,初始化生成模型G以及判别模型D,假设此处生成模型采用简单的RBF(但这个方法推导繁琐,计算复杂,采样时马尔科夫链的混合速度慢。),判别模型采用全连接网络,后面接softmax。或者也可以两个均采用卷积加全连接网络。
总的过程是根据训练集估计样本分布P(x),然后对其进行采样生成和训练集数据相似的新样本。
两个网络在训练时,训练鉴别器时,最小化鉴别误差。训练生成器时,最大化鉴别误差。这两个过程均可通过反向传播算法实现。
利用训练好的网络,可以将任意一个噪声向量转化为与训练数据相似的数据。该噪声可以看做是该样本在低位空间的编码。

训练过程
随机产生一个随机向量,输入生成模型,然后得到一个新的向量,作为假数据,记为Dz.
从训练集中选择一张图片,作为真实数据,同样将其转化为向量,记做x.
将前两步中某一步产生的数据作为判别网络的输入(因此判别模型的输入为两类数据,真/假),经过判别网络后输入值为该输入属于真实数据的概率,real为1,fake为0.
然后根据得到的概率值计算损失函数。(其过程为先更新判别模型的参数,然后再更新生成模型的参数)
根据判别模型和生成模型的损失函数,可以利用反向传播算法,更新模型的参数。

原文给出的优化函数
这里写图片描述
从这个函数看出其目的是最小化G和真实的数据集中的数据分布,最大化D的区分度。

这里写图片描述
从这个图可以看到这个算法的整个流程,首先根据随机采样噪声数据,然后根据真实数据分布采样训练数据。然后通过梯度下降算法更新判别器的参数。更新完成之后,然后通过再采样得到的噪声数据更新生成器的参数。

其应用和详细的介绍也可以参考
https://adeshpande3.github.io/adeshpande3.github.io/Deep-Learning-Research-Review-Week-1-Generative-Adversarial-Nets

关于GANs的乡段代码以及demo,
https://github.com/Shicoder/DeepLearning_Demo/tree/master/AdversarialNetworks
https://github.com/goodfeli/adversarial

Reference:
1)http://blog.csdn.net/zouxy09/article/details/8195017
2)http://blog.csdn.net/shenxiaolu1984/article/details/52215983
3)http://blog.csdn.net/sxf1061926959/article/details/54630462
4)https://adeshpande3.github.io/adeshpande3.github.io/Deep-Learning-Research-Review-Week-1-Generative-Adversarial-Nets

展开阅读全文

没有更多推荐了,返回首页