14 生成模型GAN
- 2019年最好的结果:BigGAN
生成对抗网络GAN
问题:希望从训练样本分布中采样新数据,但这个分布不仅维度高而且还很复杂,难以直接实现。
解决方案:对一个简单的分布采样,比如均匀分布;然后,学习一种映射将其变换到训练样本分布。
Q:用什么方法能够实现这个复杂的映射?
A:神经网络!
上述网络无法直接训练,Goodfellow想出两个玩家博弈的方法。
- 生成网络:期望能够产生尽量真实的图片,进而骗过判别器。
- 判别网络:期望能够准确的区分真假图片。
博弈过程中,生成器的能力会逐步提升到逼近真实的情况。如果生成器生成的图和真实图片分不开的时候,就会停止。
- 采用minmax的方式联合训练:
x~pdata,即真实数据分布;p(z)是噪声分布;G{\thetag}是生成器 ,\theta_g是神经网络的参数,神经网络的任务是吃进一个z,生成一个样本\hat{x};D{\theta_d}就是判别器,也是一个神经网络,输出0到1之间的数,1表示样本是真的。 E代表期望,不可能单看一个样本,要看所有样本。 最大化max的含义(此时生成器G是固定的):让判别器对真实的图片打1分,对于假的图片打0分;这样式中两项都会尽量大,训练的是判别器。 最小化min的含义(此时判别器是固定的):此时与式中第一项没有关系,因此相当于让生成的样本越判断成1越好,即希望生成的样本\hat{x}被判别器判断为真样本。
训练GAN:两个玩家的游戏
- 一般是先训练判别器,因为要判别器先具有一定能力。
- 交替训练。
- 因为存在上图的问题,因此真实中做的时候是两个最大化问题。
训练好网络后,判别器就不要了,只要生成器,将来用z就可以生成图片。训练的时候用什么方式采样的z,生成的时候用一样的方式就好。
GAN的工作过程(直观解释)
最后真的和假的达到纳什均衡,判别器看什么概率都是0.5,分不出来真假,游戏结束。但很多时候是训练不到这样一个稳态的。
- 学的实际上就是将z映射成x的分布。
产生的样本
可以看到生成的样本和数据库中找到的最近邻很像,但不一样。
在CIFAR10数据集上生成的效果不太好,因为数据太少。
GAN背后的数学故事
Generation
- 我们的目标是找到数据分布,分布上的点都是高概率的点,分布上任何一个点采样一个点(高维空间中的图像),这个地方一定对应着一个有意义的图像;其他地方是低概率的点,在低概率的地方采样一个图像,长得和真实的图像就可能不太相似,产生不了真实的人脸。
极大似然估计
- 给定数据分布P_{data}(x)(可以对其采样获得数据),这个分布是什么我们不知道。
- 我们能够得到一个分布,其参数由\theta所决定(神经网络参数也好,其他参数也好),希望分布产生的x和真实分布的x很相似。
- 目标:确定参数\theta,使得与相似,这样就可以用这个分布来产生样本。
- 比如为高斯混合模型,则\theta表示高斯分布的均值与协方差矩阵。
现在的任务是从采样样本,这件事情很容易,因为这就是训练样本集。我们其实不知道真实数据,但知道训练样本就是来自真实数据的。所谓从真实数据中采样样本,即从样本集找一堆样本,因为样本集就来自真实样本。
接下来,希望计算产生这些样本的似然:
希望让这个概率越大越好,通过极大似然估计来求取。
但很多时候是无法计算的,因为正态分布的假设在高维图像数据里基本不符合这个分布,因此很难直接用这个分布干这个事情。下面看看GAN是如何做这个事情的。
最大化似然=最小化KL散度
(即两个分布的KL距离),两个分布越接近,散度越小,反之越大。
对所有的样本求和这件事情就和期望一样,因此可以近似等于:
然后继续往下推,加一项于\theta无关的,推出结论。
如何定义一个通用的?不能用正态分布了,因为正态分布在真实空间不行,所以干脆用神经网络来学。
产生器(Generator)
- 利用神经网络来构建产生器G,网络输出定义了一个密度分布
- GAN要做的就是拉近两个分布,用两个分布的差异来调整生成器G。
- 两个分布的差异如何表示:
判别器(Discriminator)
现在的困难是,不知道的分布,也不知道的分布,但是可以得到它们的采样数据。
- GAN公式回顾: