专栏首页今天也有在好好摸鱼(雾GAN(对抗生成网络)的基本原理以及数学证明

GAN(对抗生成网络)的基本原理以及数学证明

Preface

今天在PD Lib和DL斗智斗勇时,突然想起了自己非常想学的GAN,机缘巧合下便百度了,得到了以下两篇文章:

于是便对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 (Discriminator) - 判别器,判断输入时捏造的还是真实的
  • G (Generator) - 生成器,从随机噪声中生成我们想要的数据

随着训练的进行,我们要提高D的辨析能力,但同时也要G的能力来骗过D,因为我们的最终目的是要让G来生成可以骗过D的信息。总结来说,通过对这两个模型的训练,我们就可以找到随机噪声与有意义数据的映射,达到创作的目的。

GAN的流程和目标函数

GAN的目标函数

GAN的目标函数如下:

V(D, G) = \mathbb E_{x \sim P_{\text{data}} } [\log D(x)] + \mathbb E_{\boldsymbol {z} \sim P_z}[\log(1 - D(G(\boldsymbol {z})))]

其中,D为Discriminator的模型函数,G为Generator的模型函数,随机变量x服从原来正确的数据集的分布P_\text {data},随机变量(这里可能是高维随机变量,取决于模型具体实现)\boldsymbol {z}服从分布P_z(生成噪音),\mathbb E代表期望。

GAN的流程

G^* = \arg \min _G \max _D V(D, G)

即,可以分为两步理解:

  1. G为常数的情况下,选择合适的D使得V(D,G)能够最大化。
  2. 在这之后,选取合适的G来最小化V(D, G),这个G就是我们想要的生成模型。

在每一步的训练中:

  • 个真实数据:
\{x^{(1)}, x^{(2)}, x^{(3)}, \cdots, x^{(m)}\}

使用,一般使用服从正态分布的随机数)

\{\boldsymbol {z}^{(1)}, \boldsymbol {z}^{(2)}, \boldsymbol {z}^{(3)}, \cdots, \boldsymbol {z}^{(m)}\}

生成个假数据,其中

\forall i \in [1, m], i \in \mathbb Z \Rightarrow x^{(i)} \sim P_{\text{data}}, \boldsymbol {z} ^ {(i)} \sim P_z
  • 的分辨能力
\theta_d := \theta_d + \alpha_d \nabla_{\theta_d} \frac 1 m \sum _ {i = 1} ^ m \Big [ \log D\big ( x^{(i)} \big) + \log \big ( 1 - D \big ( G(\boldsymbol{z}^{(i)}) \big ) \big ) \Big]
  • 生成的数据更有迷惑性
\theta_g := \theta_g - \alpha_g\nabla_{\theta_g} \frac 1 m \sum _{i = 1} ^ m\log \Big ( 1 - D\big ( G(\boldsymbol{z} ^ {(i)})\big ) \Big )

GAN的数学原理

Prerequisites

信息量(自信息)

信息量是指信息多少的量度,即,对于一条信息,传达这条信息所需的最少信息长度为自信息。

信息论创始人C.E.Shannon,1938年首次使用比特(bit)概念:1(bit)= \log_2 2。它相当于对二个可能结局所作的一次选择量。信息论采用对随机分布概率取对数的办法,解决了不定度的度量问题。

定义:符合分布P的某一事件x出现,传达出这条信息的信息量记为:

I = \log \frac 1 {P(x)} = - \log P(x)

香农熵

从离散分布P中随机抽选一个事件,传达这条信息所需的最优平均信息长度为香农熵,表达为:

H(P) = \sum_x P(x) \log \frac 1 {P(x)} = - \sum_x P(x) \log P(x)

若分布是连续的,则:

H(P) = \int_x P(x) \log \frac 1 {P(x)} \mathrm dx = -\int_x P(x) \log P(x) \mathrm dx

交叉熵

用分布P的最佳信息传递方式来传达分布Q中随机抽选的一个事件,所需的平均信息长度为交叉熵,表达为

H_P(Q) = \sum_x Q(x) \log \frac 1 {P(x)} = - \sum_x Q(x) \log P(x)
H_P(Q) = \int_x Q(x) \log \frac 1 {P(x)} \mathrm dx = - \int_x Q(x) \log P(x) \mathrm dx

$KL$ Divergence

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}

对于连续分布:

D_{KL}(Q||P) = D_P(Q) = \int_{-\infty} ^ {\infty} P(x)\log \frac {P(x)}{Q(x)} \mathrm dx

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个样本,记作:

\{x^{(1)}, x^{(2)}, x^{(3)}, \cdots, x^{(m)}\}

根据生成网络的参数\theta_g,我们可以计算出这m个真实样本在生成网络中出现的概率P_G(x^{(i)}; \theta_g),那么生成这样的m个样本数据的似然(likelihood)为:

L = \prod_{i = 1} ^ m P_G(x^{(i)}; \theta_g)

由于我们想要两个分布尽量相似,那么我们肯定希望这个似然L尽量大,即生成这样的真实数据的概率尽量大,遂我们最大化这个似然,找到\theta_g^*

\begin{aligned} \theta_g^* &= \arg \max _ {\theta_g} \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的概率,也可以如下计算得到:

P_G(x) = \int _ \boldsymbol{z} P_z(z)\cdot 1\{G(z) = x\} \mathrm dz

注:1\{\cdot\}的含义是若打括号内的逻辑运算为真则取1,假则取0. 即

1\{\text {True}\} = 1, 1 \{\text {False}\} = 0

但是我们发现,上述的过程是难以进行计算的,甚至完全没办法求P_G(x),这只是模型的想法而已。

现在我们看回之前我们提到的目标函数:

V(D, G) = \mathbb E_{x \sim P_{\text{data}} } [\log D(x)] + \mathbb E_{\boldsymbol {z} \sim P_z}[\log(1 - D(G(\boldsymbol {z})))]

与最优化生成模型:

G^* = \arg \min _G \max _D V(D, G)

我们接下来分步解释。

首先,我们不妨解释一下\max_D V(G, D),这部分的含义之前也解释过,是在给定G的情况下,最大化V(G, D)。观察发现,其形式其实与交叉熵损失函数非常相似:

\mathcal L(\hat y, y) = -(y\log \hat y + (1 - y) \log (1 - \hat y))

其实他们表达的目的也差不多。我们先化简一下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})))] \\ &= \int_x P_\text {data}(x) \log D(x) \mathrm dx + \int_\boldsymbol{z} P_z(\boldsymbol{z}) \log (1 - D(G(\boldsymbol{z})))\mathrm dz \\ &= \int_x P_\text {data}(x) \log D(x) \mathrm dx + \int_x P_G(x)\log (1 - D(x)) \mathrm dx \\ &= \int_x [P_\text {data}(x) \log D(x) + P_G(x)\log (1 - D(x))] \mathrm dx \end{aligned}

让我们考察积分内部的项,我们可以对它做指数运算,即:

e^{P_\text {data}(x) \log D(x) + P_G(x)\log (1 - D(x))} = D(x) ^ {P_\text {data}}\times(1- D(x))^{P_G(x)}

其想表达什么便不言而喻了,它表达的就是判别器判别是真的的正确率和判别是假的的正确率,总体来说就是衡量D的能力,所以我们想要最大化V,提高D的判别能力。

f(D) = P_\text {data}(x) \log D(x) \mathrm dx + P_G(x)\log (1 - D(x))

因为这里P_\text {data} (x)P_G(x)都可以看作常数,所以

\arg \max _ D \int_x f(D) \mathrm dx = \arg \max _D f(D)

最大化f(D),即令其导数为0

\frac {\mathrm d f(D)} {\mathrm dD } = \frac {P_\text {data}(x)}{D} - \frac {P_G(x)} {1 - D} = 0

则:

\frac {P_\text {data}(x)}{D} = \frac {P_G(x)} {1 - D}
D^*(x) = \frac {P_\text {data}(x)}{P_\text {data}(x) + P_G(x)}

这样,我们就得到了那个状态下最优的D^*的表达式。我们将这个能够最大化VD代入回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 ] \\ &= \int_x P_\text {data} (x) \log \frac {\frac 1 2 P_\text {data}}{\frac 1 2 (P_\text{data}(x) + P_G(x))} \mathrm dx + \int _ x P_G(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,定义如下:

JSD(P||Q) = \frac 1 2 D_{KL} (P||M) + \frac 1 2 D_{KL} (Q || M), M = \frac 1 2 (P + Q)

容易得到,KL Divergence是不对称的,而JS Divergence是对称的。他们都可以衡量两组分布建的差异。这里我们想要两组分布差异最小,故取\min

所以,这也就解释了为什么:

\arg \min _G \max _D V(G, D)

是我们的目标过程。

本文作者:博主: gyrojeff    文章标题:GAN(对抗生成网络)的基本原理以及数学证明 本文地址:https://gyrojeff.top/index.php/archives/5/ 版权说明:若无注明,本文皆为“gyro永不抽风!”原创,转载请保留文章出处。 许可协议:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者! 我的博客即将同步至腾讯云+社区,邀请大家一同入驻

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基础原理 | 生成对抗网络GAN解读

    以最大似然估计的方式来获得生成图像模型的方法,这种方法是可行的,但有比较大的约束,即模型不能太复杂,比如服从正态分布,那么通过最大似然估计的方式就可以计算出,但...

    公众号机器学习与生成对抗网络
  • 生成对抗网络GAN原理 学习笔记

    (1) 学习到高维抽象的分布函数 (2) 模拟预测未来数据 (3) 处理缺省数据问题:如半监督学习 (4) 生产真实样本 建立模型,分析...

    Natalia_ljq
  • 解读 | 通过拳击学习生成对抗网络(GAN)的基本原理

    选自 KDnuggets 机器之心编译 作者:Michael Dietz 参与:Jane W、晏奇、吴攀 生成对抗网络(GAN)近来在研究界得到了很大的关注。在...

    机器之心
  • 『一起学AI』生成对抗网络(GAN)原理学习及实战开发

    在某种形式上,我们使用了深度神经网络学习的从数据示例到标签的映射。这种学习称为判别学习,例如,我们希望能够区分照片中的猫和狗中的照片。分类器和回归器都是歧视性学...

    小宋是呢
  • 深入浅出:GAN原理与应用入门介绍

    选自StatsBot 作者:Anton Karazeev 机器之心编译 参与:乾树、黄小天 生成对抗网络(GAN)是一类在无监督学习中使用的神经网络,其有助于解...

    机器之心
  • 深入浅出介绍:GAN的基本原理与入门应用!

    如果你觉得好的话,不妨分享到朋友圈。 摘要:生成对抗网络(GAN)是一类在无监督学习中使用的神经网络,其有助于解决按文本生成图像、提高图片分辨率、药物匹配、检索...

    IT派
  • 塔荐 | 关于GAN原理与应用的入门介绍

    导读:生成对抗网络(GAN)是一类在无监督学习中使用的神经网络,其有助于解决按文本生成图像、提高图片分辨率、药物匹配、检索特定模式的图片等任务。Statsbot...

    灯塔大数据
  • 深度 | 生成对抗网络初学入门:一文读懂GAN的基本原理(附资源)

    选自 Sigmoidal 作者:Roman Trusov 机器之心编译 参与:Panda 生成对抗网络是现在人工智能领域的当红技术之一。近日,Sigmoidal...

    机器之心
  • 机器之心GitHub项目:GAN完整理论推导与实现,Perfect!

    机器之心原创 作者:蒋思源 本文是机器之心第二个 GitHub 实现项目,上一个 GitHub 实现项目为从头开始构建卷积神经网络。在本文中,我们将从原论文出发...

    机器之心
  • 生成式对抗网络模型综述

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

    SIGAI学习与实践平台
  • 生成式对抗网络模型综述

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

    SIGAI学习与实践平台
  • 读了那么多GANs的原理,还是不懂怎么用!两个案例教教你

    编译|AI科技大本营(rgznai100) 参与 | 尚岩奇、周翔 生成式对抗网络(GANs)是一类用于解决无监督学习问题的神经网络,它们可以完成各种任务,例如...

    AI科技大本营
  • 【Ian Goodfellow 强推】GAN 进展跟踪 10 大论文(附下载)

    ---- 编译:小潘、肖琴 【新智元导读】生成对抗网络GAN的提出者Ian Goodfellow在推特上推荐了10篇GAN论文,是跟踪GAN进展,了解最新技术...

    新智元
  • 这些资源你肯定需要!超全的GAN PyTorch+Keras实现集合

    生成对抗网络及其变体的实现分为基于 Keras 和基于 PyTorch 两个版本。它们都是按照原论文实现的,但模型架构并不一定完全和原论文相同,作者关注于实现这...

    IT派
  • 这些资源你肯定需要!超全的GAN PyTorch+Keras实现集合

    选自GitHub 作者:eriklindernoren 机器之心编译 参与:刘晓坤、思源、李泽南 生成对抗网络一直是非常美妙且高效的方法,自 14 年 Ian...

    机器之心
  • 利用NAS寻找最佳GAN:AutoGAN架构搜索方案专为GAN打造

    自从生成对抗网络(GAN)在 NIPS 2014 大会上首次发表以来,它就一直是深度学习领域的热门话题。

    机器之心
  • 业界 | Petuum提出深度生成模型统一的统计学框架

    选自Medium 作者:Zhiting Hu 机器之心编译 参与:刘晓坤、路、邹俏也 Petuum 和 CMU 合作的论文《On Unifying Deep G...

    机器之心
  • [GAN学习系列2] GAN的起源

    这是 GAN 学习系列的第二篇文章,这篇文章将开始介绍 GAN 的起源之作,鼻祖,也就是 Ian Goodfellow 在 2014 年发表在 ICLR 的论文...

    kbsc13
  • GAN原理,优缺点、应用总结

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

    DoubleV

扫码关注云+社区

领取腾讯云代金券