今天在PD Lib和DL斗智斗勇时,突然想起了自己非常想学的GAN,机缘巧合下便百度了,得到了以下两篇文章:
于是便对GAN有了初步的了解(以前肯定是心不在焉才没有理解的(划掉)),随后又在五楼生命科学
的书架上找到了相关资料,遂学了一波。
2014 年,Ian Goodfellow 和他在蒙特利尔大学的同事发表了一篇震撼学界的论文。没错,我说的就是《Generative Adversarial Nets》,这标志着生成对抗网络(GAN)的诞生,而这是通过对计算图和博弈论的创新性结合。他们的研究展示,给定充分的建模能力,两个博弈模型能够通过简单的反向传播(backpropagation)来协同训练。 这两个模型的角色定位十分鲜明。给定真实数据集 R,G 是生成器(generator),它的任务是生成能以假乱真的假数据;而 D 是判别器 (discriminator),它从真实数据集或者 G 那里获取数据, 然后做出判别真假的标记。Ian Goodfellow 的比喻是,G 就像一个赝品作坊,想要让做出来的东西尽可能接近真品,蒙混过关。而 D 就是文物鉴定专家,要能区分出真品和高仿(但在这个例子中,造假者 G 看不到原始数据,而只有 D 的鉴定结果——前者是在盲干)。 理想情况下,D 和 G 都会随着不断训练,做得越来越好——直到 G 基本上成为了一个“赝品制造大师”,而 D 因无法正确区分两种数据分布输给 G。 实践中,Ian Goodfellow 展示的这项技术在本质上是:G 能够对原始数据集进行一种无监督学习,找到以更低维度的方式(lower-dimensional manner)来表示数据的某种方法。而无监督学习之所以重要,就好像 Yann LeCun 的那句话:“无监督学习是蛋糕的糕体”。这句话中的蛋糕,指的是无数学者、开发者苦苦追寻的“真正的 AI”。 ——pytorch实现GAN
GAN - Generative Adversarial Nets, 生成对抗网络,简单来讲其有两个组成部分:
随着训练的进行,我们要提高D的辨析能力,但同时也要G的能力来骗过D,因为我们的最终目的是要让G来生成可以骗过D的信息。总结来说,通过对这两个模型的训练,我们就可以找到随机噪声与有意义数据的映射,达到创作
的目的。
GAN的目标函数如下:
其中,D 为Discriminator的模型函数,G 为Generator的模型函数,随机变量x 服从原来正确的数据集的分布P_\text {data} ,随机变量(这里可能是高维随机变量,取决于模型具体实现)\boldsymbol {z} 服从分布P_z (生成噪音),\mathbb E 代表期望。
即,可以分为两步理解:
在每一步的训练中:
使用,一般使用服从正态分布的随机数)
生成个假数据,其中
信息量是指信息多少的量度,即,对于一条信息,传达这条信息所需的最少信息长度为自信息。
信息论创始人C.E.Shannon,1938年首次使用比特(bit)概念:1(bit)= \log_2 2 。它相当于对二个可能结局所作的一次选择量。信息论采用对随机分布概率取对数的办法,解决了不定度的度量问题。
定义:符合分布P 的某一事件x 出现,传达出这条信息的信息量记为:
从离散分布P 中随机抽选一个事件,传达这条信息所需的最优平均信息长度为香农熵,表达为:
若分布是连续的,则:
用分布P 的最佳信息传递方式来传达分布Q 中随机抽选的一个事件,所需的平均信息长度为交叉熵,表达为
KL 散度:用分布P 的最佳信息传递方式来传达分布Q ,比用分布Q 自己的最佳信息传递方式来传达分布Q ,平均多耗费的信息长度为KL 散度,表达为D_P(Q) 或D_{KL}(Q||P) ,KL 散度衡量了两个分布之间的差异。
`$ \begin{aligned}
D_{KL}(Q||P) = D_P(Q) &= H_P(Q) - H(Q) \
&= \sum_x Q(x) \log \frac 1 {P(x)} - \sum _x Q(x) \log \frac 1 {Q(x)} \
&= \sum_x Q(x) \log \frac {Q(x)} {P(x)}
\end{aligned}$`
对于连续分布:
KL Divergence越大,两个分布差异越大,反之差异越小。
看完Prerequisites,我们回归正题讨论GAN的原理。我们现在想要做的事情,其实就是将一个服从P_G 的随机噪声\boldsymbol z 通过一个生成网络G 得到一个和真实数据分布P_{\text {data}}(x) 差不多的生成分布P_G(x;\theta_g) ,其中\theta_g 为生成网络G 的参数。我们希望找到一个\theta_g 使得两个分布P_{\text {data}}(x) 与P_G(x;\theta) 尽可能地相似(使得他们地KL散度尽可能得小)。
我们从真实数据分布P_\text{data}(x) 中取m 个样本,记作:
根据生成网络的参数\theta_g ,我们可以计算出这m 个真实样本在生成网络中出现的概率P_G(x^{(i)}; \theta_g) ,那么生成这样的m 个样本数据的似然(likelihood)为:
由于我们想要两个分布尽量相似,那么我们肯定希望这个似然L 尽量大,即生成这样的真实数据的概率尽量大,遂我们最大化这个似然,找到\theta_g^* :
`$ \begin{aligned}
\thetag^* &= \arg \max {\thetag} \prod {i = 1} ^ m P_G(x^{(i)}; \theta_g) \
&\Leftrightarrow \arg \max {\theta_g} \log \prod {i = 1} ^ m P_G(x^{(i)}; \theta_g) \
&= \arg \max {\theta_g} \sum{i = 1} ^ m \log P_G(x^{(i)}; \theta_g) \
&\approx \arg \max {\theta_g} \mathbb E{x \sim P_{\text {data}}} \log P_G(x; \theta_g) \
&= \arg \max {\theta_g} \int x P_\text{data}(x) \log P_G(x; \theta_g)\mathrm dx \
&= \arg \max {\theta_g} \int x P\text{data}(x) \log P_G(x; \theta_g)\mathrm dx \&- \int x P\text{data}(x) \log P\text {data}(x)\mathrm dx \
&= \arg \max {\theta_g} \int x P\text {data} (x) \log \frac {P_G(x; \theta_g)} {P\text {data}(x)} \mathrm dx \
&= \arg \max {\theta_g} - \int x P\text {data} (x) \log \frac {P\text {data}(x)} {P_G(x; \theta_g)} \mathrm dx \
&= \arg \min {\theta_g} KL(P\text {data} || P_G(x; \theta))
\end{aligned}$`
所以可见,其实最大化这个似然,和最小化KL散度是基本相同的。
上述式子中,P_G(x;\theta_g) 代表在生成分布中出现x 的概率,也可以如下计算得到:
注:1\{\cdot\} 的含义是若打括号内的逻辑运算为真则取1 ,假则取0 . 即
但是我们发现,上述的过程是难以进行计算的,甚至完全没办法求P_G(x) ,这只是模型的想法而已。
现在我们看回之前我们提到的目标函数:
与最优化生成模型:
我们接下来分步解释。
首先,我们不妨解释一下\max_D V(G, D) ,这部分的含义之前也解释过,是在给定G 的情况下,最大化V(G, D) 。观察发现,其形式其实与交叉熵损失函数非常相似:
其实他们表达的目的也差不多。我们先化简一下V(G, D) 看看能得到什么结果:
`$ \begin{aligned}
V(G, D) &= \mathbb E{x \sim P{\text{data}} } \log D(x) + \mathbb E_{\boldsymbol {z} \sim P_z}\log(1 - D(G(\boldsymbol {z}))) \
&= \intx P\text {data}(x) \log D(x) \mathrm dx + \int_\boldsymbol{z} P_z(\boldsymbol{z}) \log (1 - D(G(\boldsymbol{z})))\mathrm dz \
&= \intx P\text {data}(x) \log D(x) \mathrm dx + \int_x P_G(x)\log (1 - D(x)) \mathrm dx \
&= \intx [P\text {data}(x) \log D(x) + P_G(x)\log (1 - D(x))] \mathrm dx
\end{aligned}$`
让我们考察积分内部的项,我们可以对它做指数运算,即:
其想表达什么便不言而喻了,它表达的就是判别器判别是真的的正确率和判别是假的的正确率,总体来说就是衡量D 的能力,所以我们想要最大化V ,提高D 的判别能力。
令
因为这里P_\text {data} (x) 和P_G(x) 都可以看作常数,所以
最大化f(D) ,即令其导数为0 :
则:
这样,我们就得到了那个状态下最优的D^* 的表达式。我们将这个能够最大化V 的D 代入回V(G, D) :
`$ \begin{aligned}
\max V(G, D) &= V(G, D^*) \
&= \mathbb E{x \sim P\text {data}} \Big \log \frac {P\text {data}(x)}{P\text {data}(x) + P_G(x)} \Big + \mathbb E{x \sim P_G} \Big [ \frac {P_G(x)}{P\text {data}(x) + P_G(x)}\Big ] \
&= \intx P\text {data} (x) \log \frac {\frac 1 2 P\text {data}}{\frac 1 2 (P\text{data}(x) + PG(x))} \mathrm dx + \int x PG(x) \log \frac {\frac 1 2 P_G(x)} {\frac 1 2 (P\text {data} (x) + P_G(x))} \mathrm dx \
&= -2\log 2 + D{KL} (P\text {data} || \frac 1 2 P_\text{data}(x) + P_G(x)) + D{KL} (P_G(x) || \frac 1 2 [P\text {data}(x) + P_G(x)]) \
&= -2\log 2 + JSD (P_\text{data}(x) || P_G(x))
\end{aligned}$`
其中,我们引入了JS Divergence,定义如下:
容易得到,KL Divergence是不对称的,而JS Divergence是对称的。他们都可以衡量两组分布建的差异。这里我们想要两组分布差异最小,故取\min
所以,这也就解释了为什么:
是我们的目标过程。
本文作者:博主: gyrojeff 文章标题:GAN(对抗生成网络)的基本原理以及数学证明
本文地址:https://cloud.tencent.com/developer/article/1827340
版权说明:若无注明,本文皆为“gyro永不抽风!”原创,转载请保留文章出处。
许可协议:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者!
我的博客即将同步至腾讯云+社区,邀请大家一同入驻