Gans
Gans全称Generative Adversarial Networks,既生成又对抗,所以先说一下生成和对抗模型分别是什么。
生成和对抗模型的算法:
- 目的:计算f:x->y,或者p(y|x)
- 生成模型:
1). 用参数表达p(x), p(x|y)
2). 通过样本数据求出以上参数
3). 利用Bayes rules求出p(y|x) - 对抗模型:
1). 用参数表达p(y|x)
2). 通过样本数据求出以上参数
生成模型(generative model)和对抗模型(discriminative model)放在一起对比着更好理解。生成模型学习的是不同class各自的概率分布(如p(x)),而且p(x|y)中condition on y也显示了其生成的特征;对抗模型学习的是不同class之间的分界线在哪里(需要注意的是,对抗模型并非必须计算出一个概率数字p(x),其实质上对样本分布作了一个模拟,比如说决策树模型,虽然它预测结果靠的并不是生成具体的概率p(x),但是也能将样本分配到不同的class中去,这种预测结果本身就是暗含了样本概率分布的)。
正是因为生成类模型计算需要用到class的概率分布(p(x|y)),这导致了它具体实施起来十分困难,例如在一个图像识别的任务中,它必须要搞清楚p(是人的眼睛 | 出现在额头上)”,或者p(图片上的船形物体是船|出现在水边)这些十分复杂的概率,才能判断出图片上的是人脸还是船;而对抗模型则只需要搞清楚这张图片到底“是人脸”“不是人脸”,“是船”“不是船”就行了。
Gans本质是一种生成模型,并结合了对抗模型,它既有一个生成神经网络不断地把random noise处理成和原始概率分布接近的数据,又有一个对抗神经网络不断地学会区分原始数据和生成数据到底是原始的还是生成的。
具体实现方法:
- 一些Notation:
G():生成模型
D():对抗模型
x:原始数据(例如一张图片)
z:random noise
G(z):生成模型的输出
D(x):对抗模型对真实数据的判断(是原始的还是生成的)
D(G(z)):对抗模型对生成数据的判断(是原始的还是生成的)
-
Flow:在一个epoch i i i 里发生了这些:
- A random noise z i z_i zi is generated
- z i z_i zi is fed into G(), and G() outputs G ( z i ) G(z_i) G(zi), which is the generated sample
- Original sample x i x_i xi is fed into D(). Generated sample G ( z i ) G(z_i) G(