对抗生成网络GAN
GAN简介
论文:Generative Adversarial Nets
参考资料:
- bilibili - 【机器学习】白板推导系列(三十一) ~ 生成对抗网络(GAN)
对抗生成网络 GAN 的英文全称为 Generative Adversarial Network,
-
生成器(Generator, \(G\))
- Generator是一个函数,输入是随机向量(随机噪声)\(z\),输出是 \(x\);
-
判别器(Discriminator, \(D\))
- Discriminator也是一个函数,输入是 \(x\),输出是一个标量;
GAN的训练流程
我们需要借助一个高水平的判别器来训练我们的生成器,举个不恰当的例子,比如我们是做工艺品的,我们期望的目标是制造出的工艺品能够达到以假乱真的地步,这个时候我们需要一个鉴赏专家来告诉我们,我们制造出的工艺品是否逼真,因为专家给我们的反馈是十分重要的,我们可以借助专家给我们的反馈信息,来提升自己的工艺技术。
那么我们如何训练判别器呢?事实上,我们从上帝视角来看,其实我们是知道哪些是真的,哪些是假的,所以我们可以直接将古董和工艺品混合在一起,去给鉴赏专家,告诉鉴赏专家哪些是真的,哪些是假的,让鉴赏专家从带标签的样本中去学习、去提升鉴别能力。
判别器的学习
首先我们初始化生成器 \(G\) ,然后输入一组随机向量(Randomly sample a vactor),生成器会根据输入的向量产生一些图片,我们把这些图片标注成 0(假图片)。同时把已有训练集中真实的图片标注成 1(真图片)。两者同时丢进判别器 \(D\) 中,以此来训练判别器 \(D\) 。使得当输入是真图片的时候,判别器给高分(分数接近于1),而输入假图片的时候,判别器给低分(接近于0)。
此时,我们便可以用监督学习的方式来对判别器进行训练。
生成器的学习
针对于 \(D\) 我们有标记为\(1\)和\(0\)的数据,因此我们可以对其进行训练。那么对于生成器,有 \(x\)(也就是随机噪声 \(z\)),那么他的标签 \(y\) 在哪里呢?
事实上,我们在训练生成器的时候可以做出假设“判别器能够做出准确可靠的判断”,在这个假设下,我们可以通过判别器来产生生成器的标签 \(y\) :
-
我们通过随机向量(噪声数据)经由生成网络产生一组假图片,我们将这些假图片都标记为 1(也就是说,人为的把假的图片当作真实的);
-
将这些假图片输入到判别器中,判别器在对这些图片进行判别的时候,会发现这些图片是假的图片,然后给出低分,这样就产生了误差(因为标记的为1,但是判别器给了低分);
-
由于在训练生成器的时候,这个网络是串接的,所以一个很重要的操作就是保持判别器网络的参数不发生改变,只是把误差一直方向传播,传到生成网络那块后更新生成网络的参数,这样就完成了生成网络的训练了。
在完成生成器的训练之后,我们又可以产生新的假的图片去对判别器进行训练。我们把这个过程称作为单独交替训练。同时要定义一个迭代次数,交替迭代到一定次数后停止即可。
数学表示
-
我们有一组含有 \(n\) 个样本的数据集 \(X = \left\{ x^{\left( 1 \right)}, x^{\left( 2 \right)}, \cdots, x^{\left( n \right)} \right\}\),假设这些样本数据从一个概率分布 \(P_{\text{data}}\)中产生;
-
假设 \(G\) 的概率分布为 \(P_g\left( x;\theta_g \right)\),实际上我们所生成的样本也是从这个概率分布中抽样而得出的;
-
假定噪声 \(z\) 从一个简单的分布中产生(如高斯分布),即 \(z \sim P_z\left( z \right)\);
-
我们将判别器认为 \(x\) 是真样本的概率记为 \(D\left( X;\theta_d \right)\);
需要注意的是:
-
我们不对生成器 \(G\) 的概率分布 \(P_g\) 进行建模,而是使用神经网络来逼近生成器 \(G\) 的概率分布 \(P_g\);
-
我们有 \(z \rightarrow G\left( Z;\theta_g \right) \rightarrow x\) ,其中 \(z\) 是输入噪声, \(G\left( Z;\theta_g \right)\) 是生成器的神经网络,\(x\) 是生成的样本;
判别器
我们所希望判别器 \(D\) 能达到的效果是:
为了方便计算,我们将上式进行改写:
所以,判别器的目标函数为:
为了便于初学者理解,这里说明一下 \(\mathbb{E}_{x\sim p_{data}} \left[ f\left( x \right) \right]\) 所代表的含义:\(\mathbb{E}_{x\sim p_{data}} \left[ f\left( x \right) \right] = \frac{1}{N} \sum_{i=1}^N f\left( x_i \right), x_i \sim p_{data}\)。
生成器
我们所希望生成器 \(G\) 生成的样本能够使判别器 \(D\) 尽可能地以为是真样本,即生成器所期望达到的效果是:\(D\left( G\left( z \right) \right) \uparrow\),即\(\log \left(1 - D\left( G\left( z \right) \right) \right)\downarrow\)
所以,生成器 \(G\) 的目标函数为:
综上所述,总目标为:
算法推导
在开始进行推导之前,我们介绍一下传统的生成器(这里除去GAN)方法:
首先再次明确一下我们的目标:我们所期望生成器生成的样本尽可能逼真,换句话说,我们所期望生成器生成的样本尽可能与真实的样本相似,即:\(P_g \rightarrow P_{data}\)。
对于常规的生成模型(这里除去GAN)来说,我们直接将生成器 \(G\) 的概率分布进行 \(P_g\) 建模:\(P_g\left( \theta_g \right)\) ,那么我们有:
\[\begin{align}\theta_g &= \arg \underset{\theta_g}{\max} \sum_{i=1}^N \log p_g\left( x_i \right) \\ &= \arg \underset{\theta_g}{\min} KL \left( P_{data} \mid\mid P_g \right) \end{align} \]上式 \(\left( 1 \right)\) 为极大似然估计的推导,上式 \(\left( 2 \right)\) 为 KL 散度的推导。
我们获得参数 \(\theta_g\) 之后,便可以得到生成器的概率分布 \(P_g\left( \theta_g \right)\),所以生成器生成的样本可以从 \(P_g\left( \theta_g \right)\) 中采样得到 \(X \sim P_g\left( \theta_g \right)\)。
我们记生成器的目标函数为 \(V\left( D,G \right) = \mathbb{E}_{x\sim P_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{x\sim P_g}\left[ \log \left( 1-D\left( x \right) \right) \right]\),那么对于固定的 \(G\) 来说:
我们探讨是否存在最优的 \(D_G^\star\)使得\(V\left( D_G^\star,G \right)\)最大化,很自然地会想到对 \(V\left( D,G \right)\) 求 \(D\) 的偏导,即:
所以,对于固定的 \(G\) 来说,最优的判别器 \(D\) 是:
将 \(D_G^\star\) 代入生成器 \(G\) 的目标函数 \(V\left( D,G \right)\),则有:
当 \(P_{data} \left(x\right) = P_g\left( x \right) = \left[ P_{data}\left( x \right) + P_g\left( x \right) \right]/2\) 时,"\(=\)"成立。
所以 \(P_g^\star\left( x \right)=P_g\left( x \right)\),此时 \(G_G^\star = P_{data}\left( x \right) / \left[ {P_{data}\left( x \right) + P_g\left( x \right)} \right] = \frac{1}{2}\)。
GAN目前的问题
训练不稳定
待更新
Model Collapse
待更新
工程上的技巧
待更新
如果觉得这篇文章对您有用的话,请点推荐或者关注,这对我来说是十分宝贵的鼓励!