加载中...

对抗生成网络GAN

GAN简介

论文:Generative Adversarial Nets

参考资料:


对抗生成网络 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(也就是说,人为的把假的图片当作真实的);

  2. 将这些假图片输入到判别器中,判别器在对这些图片进行判别的时候,会发现这些图片是假的图片,然后给出低分,这样就产生了误差(因为标记的为1,但是判别器给了低分);

  3. 由于在训练生成器的时候,这个网络是串接的,所以一个很重要的操作就是保持判别器网络的参数不发生改变,只是把误差一直方向传播,传到生成网络那块后更新生成网络的参数,这样就完成了生成网络的训练了。

在完成生成器的训练之后,我们又可以产生新的假的图片去对判别器进行训练。我们把这个过程称作为单独交替训练。同时要定义一个迭代次数,交替迭代到一定次数后停止即可。

数学表示

  1. 我们有一组含有 \(n\) 个样本的数据集 \(X = \left\{ x^{\left( 1 \right)}, x^{\left( 2 \right)}, \cdots, x^{\left( n \right)} \right\}\),假设这些样本数据从一个概率分布 \(P_{\text{data}}\)中产生;

  2. 假设 \(G\) 的概率分布为 \(P_g\left( x;\theta_g \right)\),实际上我们所生成的样本也是从这个概率分布中抽样而得出的;

  3. 假定噪声 \(z\) 从一个简单的分布中产生(如高斯分布),即 \(z \sim P_z\left( z \right)\)

  4. 我们将判别器认为 \(x\) 是真样本的概率记为 \(D\left( X;\theta_d \right)\)

需要注意的是:

  1. 我们不对生成器 \(G\) 的概率分布 \(P_g\) 进行建模,而是使用神经网络来逼近生成器 \(G\) 的概率分布 \(P_g\)

  2. 我们有 \(z \rightarrow G\left( Z;\theta_g \right) \rightarrow x\) ,其中 \(z\) 是输入噪声, \(G\left( Z;\theta_g \right)\)生成器的神经网络,\(x\) 是生成的样本;

判别器

我们所希望判别器 \(D\) 能达到的效果是:

\[\begin{cases} D\left( x \right)\uparrow, & \text {if $x$ is from $p_{data}$} \\ \left( 1-D\left( G\left( z \right) \right)\right)\uparrow , & \text {if $x$ is from $p_{g}$} \end{cases} \]

为了方便计算,我们将上式进行改写:

\[\begin{cases} \log D\left( x \right)\uparrow, & \text {if $x$ is from $p_{data}$} \\ \log \left( 1-D\left( G\left( z \right) \right)\right)\uparrow , & \text {if $x$ is from $p_{g}$} \end{cases} \]

所以,判别器的目标函数为:

\[\max_D \mathbb{E}_{x\sim p_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{z\sim p_z} \left[ \log \left( 1-D\left( G\left( z \right) \right) \right) \right] \]

为了便于初学者理解,这里说明一下 \(\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\) 的目标函数为:

\[\min_G \mathbb{E}_{z\sim p_z} \left[ \log\left( 1- D\left( G\left( z \right) \right) \right) \right] \]

综上所述,总目标为:

\[\underset{G}{\min} \underset{D}{\max} \mathbb{E}_{x\sim p_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{z\sim p_z} \left[ \log \left( 1-D\left( G\left( z \right) \right) \right) \right] \]

算法推导

在开始进行推导之前,我们介绍一下传统的生成器(这里除去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\) 来说

\[\begin{align} V\left( D,G \right) &= \int_x P_{data}\left( x \right)\log \left( D\left(x\right) \right) \text{dx} + \int_x P_{g}\left( x \right)\log \left( 1-D\left( x \right) \right) \text{dx}\notag \\ &= \int_x \left[ P_{data}\left( x \right)\log \left( D\left(x\right) \right) + P_{g}\left( x \right)\log \left( 1-D\left( x \right) \right) \right]\text{dx} \notag\end{align} \]

我们探讨是否存在最优的 \(D_G^\star\)使得\(V\left( D_G^\star,G \right)\)最大化,很自然地会想到对 \(V\left( D,G \right)\)\(D\) 的偏导,即:

\[\begin{align} \frac{\partial V\left( D,G \right)}{\partial D} &= \int_x \frac{\partial}{\partial D}\left[ P_{data}\left( x \right)\log\left( D\left( x \right) \right) + P_g\left( x \right)\log\left( 1-D\left( x \right) \right)\right] \text{dx}\notag \\ &= \int_x\left[ P_{data}\left( x \right)\frac{1}{D\left( x \right)} + P_g\left( x \right) \frac{-1}{1-D\left( x\right)}\right] \triangleq 0 \notag \\ &\Rightarrow D_G^\star = \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \notag\end{align} \]

所以,对于固定的 \(G\) 来说,最优的判别器 \(D\) 是:

\[D_G^\star \left( x \right)=\frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \]

\(D_G^\star\) 代入生成器 \(G\) 的目标函数 \(V\left( D,G \right)\),则有:

\[\begin{align} \underset{G}{\min}\underset{D}{\max}V\left( D,G \right) &= \underset{G}{\min} V\left( D_G^\star, G \right)\notag\\ &= \underset{G}{\min}\mathbb{E}_{x\sim P_{data}} \left[ \log\left( \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \right) \right] + \mathbb{E}_{x\sim P_g} \left[ \log \left( 1-\frac{P_{data}\left( x \right)}{P_{data}\left( x\right)+P_g\left( x \right)} \right) \right] \notag \\ &= \underset{G}{\min}\mathbb{E}_{x\sim P_{data}} \left[ \log\left( \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \right) \right] + \mathbb{E}_{x\sim P_g} \left[ \log \left( \frac{P_g\left( x \right)}{P_{data}\left( x\right)+P_g\left( x \right)} \right) \right] \notag \\ &= \underset{G}{\min} \mathbb{E}_{x\sim P_{data}}\left[ \log\left( \frac{P_{data}\left( x \right)}{\left[ P_{data}\left( x \right)+P_g\left( x \right) \right]/2} \cdot \frac{1}{2}\right)\right] + \mathbb{E}_{x\sim P_g}\left[ \log\left( \frac{P_{g}\left( x \right)}{\left[ P_{data}\left( x \right)+P_g\left( x \right) \right]/2} \cdot \frac{1}{2}\right)\right] \notag \\ &= \underset{G}{\min} KL\left( P_{data}\left(x \right)\middle\| \frac{P_{data}\left(x\right)+P_g\left( x \right)}{2} \right) + KL\left( P_{g}\left(x \right)\middle\| \frac{P_{data}\left(x\right)+P_g\left( x \right)}{2} \right)-\log 4 \notag \\ &\ge -\log 4 \notag\end{align}\]

\(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

待更新

工程上的技巧

待更新


如果觉得这篇文章对您有用的话,请点推荐或者关注,这对我来说是十分宝贵的鼓励!

posted @ 2022-03-06 21:45  HeyRay_Yang  阅读(124)  评论(0)    收藏  举报