GAN的诞生

在讲GAN的内容之前想先讲一下GAN诞生的故事。GAN的创造者是Ian Goodfellow,有一天为了庆祝一个朋友Razvan Pascanu获得了博士学位,他和一些朋友在蒙特利尔一家酒吧嗨。他们开始讨论一个新的研究方向,通过数学的方法确定图片内容,大概意思是把图片都喂给机器,通过统计之类的方法,机器可以自己生成图片。我们的主角Goodfellow也喝高了,表示这种方法不会work,有太多统计数据需要考虑,没人能把这些东西都记录下来。但是他有更好的方法:使用神经网络构建逼真的照片。

然后Goodfellow就说了他的思路,一个网络在学习如何生成一个逼真的图片的同时,另一个网络可以作为他的对手,试图确定这些图片的真假,通过这种方法,可以生成与真实图片无法区分的图像。

然后这两个人就发生了争执,都认为对方的方法不行。Goodfellow晚上回家就开始干这件事。

“我回家的时候还有点醉,我的女朋友已经睡了。酒吧里的朋友们错了!”他回忆道。“我熬夜并在笔记本电脑上开始写GAN”。

非常幸运的是,代码第一次跑起来就成功了。

“这真的非常幸运,”他说,“因为如果它没有奏效,我可能会放弃这个想法。”

之后他和其他一些研究人员在晚一些的时候发表了描述这个方法的论文。而在这之后,GAN就火了,几年里出了几百篇和GAN有关的论文。

在这里可以找到大部分的关于GAN的文章:
https://github.com/hindupuravinash/the-gan-zoo

这篇文章就是要讲一讲这个论文,也是GAN的开山之作,不过我觉得除了论文本身,它诞生的过程也有很多值得我们学习的地方。比如Goodfellow大胆的想法,比如他喝完了酒,嗨完了,回到家就开始验证他的想法的行动力,比如他为证明自己的想法不服输的精神。

我觉的这个过程换一个我们平常这些人还真不一定也能创造个GAN出来,我们平常出去嗨完了,肯定没心情再去搞研究去了,有些好的想法可能拖一段时间没做就给忘了之类的。总之,Goodfellow对于学术,对自己的要求,不断探索的精神都很值得我们学习。

GAN的公式

闲话不多说,现在开始讲GAN的论文。这里也贴一下原文下载地址:
https://arxiv.org/abs/1406.2661

另外,这篇文章公式推导部分会涉及到KL散度,JS散度之类的内容,如果之前没什么了解,也可以看一下我之前发的博客:
https://blog.csdn.net/qian99/article/details/85845292

首先说一下GAN的大体流程吧,网络主要由两部分构成,一个是生成器,负责生成图片,另一个是判别器,负责判断图片是否是真实图片,先生成一个噪声,这个噪声作为生成器的输入,生成器通过神经网络给出一个生成的图片,然后判别器会判断这张图片是否是真实图片。生成器可以通过判别器的结果知道自己生成的到底“像不像”,判别器可以通过真实图片与生成图片的判断结果知道自己的判断“准不准”,这样,两者就可以互相博弈,不断提高自己的能力,在论文中,会给出证明,两者最终会达到一个平衡状态,这个时候两者达到了纳什均衡。

在给出公式之前,先说一下符号定义。
这里先说一下,论文中公式带g下标或者G的符号,基本上都和生成器(Generator)有关。而公式中带d或者带D的符号,基本上都和判别器(Discriminator)有关。

datadatadata : 这里指的就是训练数据,也可以说是一个真实数据的数据分布。
pgp_gpg​ :生成器的数据分布。
zzz :噪声
pz(z)p_z(z)pz​(z) :噪声的概率分布。
G(z;θg)G(z;\theta_g)G(z;θg​) :表示将噪声zzz映射到datadatadata这个空间的生成器函数GGG,它的参数是θg\theta_gθg​,输出的在论文中的任务上是一张图片(其实可以推广到其他问题,也可以是其他输出)。
D(x;θd)D(x;\theta_d)D(x;θd​) :判断输入xxx来源于datadatadata这个数据分布的概率的判别器函数,xxx这里对应一张图片,输出是一个标量,θd\theta_dθd​是判别器的参数。

下面是论文中给出的优化的目标函数:

min⁡Gmax⁡DV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]\min_G\max_DV(D,G) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_z(z)}[log(1-D(G(z)))]Gmin​Dmax​V(D,G)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

乍一看挺复杂哈,没关系,我们把公式拆开了一部分一部分看。

首先是:
Ex∼pdata(x)[logD(x)]E_{x\sim p_{data}(x)}[logD(x)] Ex∼pdata​(x)​[logD(x)]
这个形式的话,在我看来其实与交叉熵差不多,只不过少了一个负号,对这块东西不了解的同学可以参考上一篇博客:https://blog.csdn.net/qian99/article/details/85845292
简单来理解的话,就是判别器DDD认为xxx属于真实的数据分布的这一事件的负交叉熵,从数值上看的话,判别器越好,这个值就越大。

然后是:

Ez∼pz(z)[log(1−D(G(z)))]E_{z\sim p_z(z)}[log(1-D(G(z)))]Ez∼pz​(z)​[log(1−D(G(z)))]
这一项与上一项类似,输入项改为了生成的数据,简单来说,就是生成数据属于生成数据分布的负的交叉熵,从数值上看的话,当判别器DDD固定,生成器越好,越像真实数据,这个值就越小,当生成器GGG固定,判别器越好,这个值越大。

综合来看,这两部分的和在DDD或者GGG的某一个固定时,变化是一致的。

最后,我们看一下等式左边的那一项:
min⁡Gmax⁡DV(D,G)\min_G\max_DV(D,G)Gmin​Dmax​V(D,G)

V(D,G)V(D,G)V(D,G)表示我们要优化的值,由于生成器与判别器优化方向是不同的,这两个东西在不断的对抗,所以训练的时候肯定是固定一个,训练另一个,而minminmin和maxmaxmax则指出了训练对应的网络时的训练方向。

公式推导与证明

接下来是推导公式,我们要证明,上面给出的公式是可以优化到一个最优解的,并给出这个最优解是什么。

当GGG固定时,DDD的最优解是:
DG∗(x)=pdata(x)pdata(x)+pg(x)D^*_G(x) = \frac{p_{data}(x)}{p_{data}(x) + p_{g}(x)}DG∗​(x)=pdata​(x)+pg​(x)pdata​(x)​
接下来是证明,当GGG固定,我们要求解V(D,G)V(D, G)V(D,G)的最大值:

V(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]=∫xpdata(x)log(D(x))dx+∫zpz(z)log(1−D(g(z)))dz=∫x[pdata(x)log(D(x))+pg(x)log(1−D(x))]dxV(D,G) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_z(z)}[log(1-D(G(z)))]\\ \qquad\qquad\qquad=\int_x p_{data}(x)log(D(x))dx + \int_z p_z(z) log(1 - D(g(z)))dz\\ \qquad\quad=\int_x [p_{data}(x)log(D(x)) + p_g(x) log(1 - D(x))]dx V(D,G)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]=∫x​pdata​(x)log(D(x))dx+∫z​pz​(z)log(1−D(g(z)))dz=∫x​[pdata​(x)log(D(x))+pg​(x)log(1−D(x))]dx
关于上面的推导有一些问题需要解释一下,首先是积分,这里应该是把数据看作是连续的,而在真实世界我们显然不能把整个数据分布都获取到,不过这里是证明,自然是没什么问题。
下一个是关于pg(x)p_g(x)pg​(x),这个东西其实看起来会有些迷惑的,这个东西基本可以认为是生成的数据与真实分布重叠的部分。差不多是这个意思:

接下来我们设:
a=pdata(x)a=p_{data}(x)a=pdata​(x)
b=pg(x)b=p_g(x)b=pg​(x)
y=D(x)y=D(x)y=D(x)

那么我们就是求f(y)=alog(y)+blog(1−y)f(y) = alog(y) + blog(1-y)f(y)=alog(y)+blog(1−y)在[0,1]的最大值。我们求一下导:
df(y)dy=ay−b1−y=0\frac{\mathrm{d} f(y)}{\mathrm{d} y} = \frac{a}{y} - \frac{b}{1-y} = 0dydf(y)​=ya​−1−yb​=0
可以推出:
y=aa+by = \frac{a}{a+b}y=a+ba​

可以发现,这个结果正是DG∗(x)D^*_G(x)DG∗​(x)。
接下来,我们用一个新的符号C(G)C(G)C(G)表示这个最优化的结果:
C(G)=max⁡DV(G,D)=Ex∼pdata[logDG∗(x)]+Ez∼pz[log(1−DG∗(G(z)))]=Ex∼pdata[logDG∗(x)]+Ex∼pg[log(1−DG∗(x))]=Ex∼pdata[logpdata(x)pdata(x)+pg(x)]+Ex∼pg[logpg(x)pdata(x)+pg(x)]C(G) = \max_DV(G,D)\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\\ =E_{x \sim p_{data}}[logD^*_G(x)] + E_{z \sim p_z}[log(1-D^*_G(G(z)))]\qquad\ \\ =E_{x \sim p_{data}}[logD^*_G(x)] + E_{x \sim p_g}[log(1-D^*_G(x))] \qquad\qquad \\ \qquad=E_{x \sim p_{data}}[log{\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}}] + E_{x \sim p_g}[log{\frac{p_g(x)}{p_{data}(x) + p_g(x)}}] C(G)=Dmax​V(G,D)=Ex∼pdata​​[logDG∗​(x)]+Ez∼pz​​[log(1−DG∗​(G(z)))] =Ex∼pdata​​[logDG∗​(x)]+Ex∼pg​​[log(1−DG∗​(x))]=Ex∼pdata​​[logpdata​(x)+pg​(x)pdata​(x)​]+Ex∼pg​​[logpdata​(x)+pg​(x)pg​(x)​]

我们继续下一个推论:C(G)C(G)C(G)这个训练目标达到最优,当且仅当pg=pdatap_g = p_{data}pg​=pdata​,C(G)C(G)C(G) 此时等于−log4-log4−log4。

证明:
pg=pdatap_g = p_{data}pg​=pdata​很好理解,就是我们生成的数据分布与真实的数据分布相同,那么当pg=pdatap_g = p_{data}pg​=pdata​, DG∗(x)=12D^*_G(x) = \frac{1}{2}DG∗​(x)=21​,则C(G)=log12+log12=−log4C(G) = log{\frac{1}{2}} + log{\frac{1}{2}} = -log4C(G)=log21​+log21​=−log4。

接下来是从公式推导来说明,首先看C(G)C(G)C(G)的公式,我们给logloglog内的分母除一个2,在公式后面加一个−log(4)-log(4)−log(4),保证等式相等。
C(G)=Ex∼pdata[logpdata(x)pdata(x)+pg(x)]+Ex∼pg[logpg(x)pdata(x)+pg(x)]=Ex∼pdata[logpdata(x)pdata(x)+pg(x)2]+Ex∼pg[logpg(x)pdata(x)+pg(x)2]−log(4)=−log(4)+KL(pdata∣∣pdata+pg2)+KL(pg∣∣pdata+pg2)=−log(4)+2JSD(pdata∣∣pg)C(G) = E_{x \sim p_{data}}[log{\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}}] + E_{x \sim p_g}[log{\frac{p_g(x)}{p_{data}(x) + p_g(x)}}] \\ \qquad= E_{x \sim p_{data}}[log{\frac{p_{data}(x)}{\frac{p_{data}(x) + p_g(x)}{2}}}] + E_{x \sim p_g}[log{\frac{p_g(x)}{\frac{p_{data}(x) + p_g(x)}{2}}}] - log(4) \\ = -log(4) + KL(p_{data} || \frac{p_{data} + p_g}{2}) + KL(p_g || \frac{p_{data} + p_g}{2}) \\ = -log(4) + 2JSD(p_{data} || p_g)\qquad\qquad\qquad\qquad\qquad\qquad C(G)=Ex∼pdata​​[logpdata​(x)+pg​(x)pdata​(x)​]+Ex∼pg​​[logpdata​(x)+pg​(x)pg​(x)​]=Ex∼pdata​​[log2pdata​(x)+pg​(x)​pdata​(x)​]+Ex∼pg​​[log2pdata​(x)+pg​(x)​pg​(x)​]−log(4)=−log(4)+KL(pdata​∣∣2pdata​+pg​​)+KL(pg​∣∣2pdata​+pg​​)=−log(4)+2JSD(pdata​∣∣pg​)

不了解KL散度和JS散度的话,可以看一下我之前发的文章,下面附上,KL散度与JS散度的公式:
DKL(P∣∣Q)=∑xP(x)logP(x)Q(x)D_{KL}(P||Q)= \sum_x{P(x)log{\frac{P(x)}{Q(x)}}}DKL​(P∣∣Q)=x∑​P(x)logQ(x)P(x)​
JS(P∣∣Q)=12KL(P∣∣P+Q2)+12KL(Q∣∣P+Q2)JS(P||Q) = \frac{1}{2}KL(P||\frac{P+Q}{2}) + \frac{1}{2}KL(Q||\frac{P+Q}{2})JS(P∣∣Q)=21​KL(P∣∣2P+Q​)+21​KL(Q∣∣2P+Q​)

根据上面的公式就可以得出推论的结论,因为JS散度非负,并且当且仅当两个分布相等时等于0,因此,C(G)C(G)C(G)的最大值就是−log(4)-log(4)−log(4),并且条件是pg=pdatap_g = p_{data}pg​=pdata​。这个时候生成模型生成的数据与真实数据完全相同。

GAN——生成对抗网络详解相关推荐

  1. Keras深度学习实战(22)——生成对抗网络详解与实现

    Keras深度学习实战(22)--生成对抗网络详解与实现 0. 前言 1. 生成对抗网络原理 2. 模型分析 3. 利用生成对抗网络生成手写数字图像 小结 系列链接 0. 前言 生成对抗网络 (Gen ...

  2. 54_pytorch GAN(生成对抗网络)、Gan代码示例、WGAN代码示例

    1.54.GAN(生成对抗网络) 1.54.1.什么是GAN 2014 年,Ian Goodfellow 和他在蒙特利尔大学的同事发表了一篇震撼学界的论文.没错,我说的就是<Generative ...

  3. 深度学习(九) GAN 生成对抗网络 理论部分

    GAN 生成对抗网络 理论部分 前言 一.Pixel RNN 1.图片的生成模型 2.Pixel RNN 3.Pixel CNN 二.VAE(Variational Autoencoder) 1.VA ...

  4. 深度学习 GAN生成对抗网络-1010格式数据生成简单案例

    一.前言 本文不花费大量的篇幅来推导数学公式,而是使用一个非常简单的案例来帮助我们了解GAN生成对抗网络. 二.GAN概念 生成对抗网络(Generative Adversarial Networks ...

  5. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 下

    文章目录 1 测试鉴别器 2 建立生成器 3 测试生成器 4 训练生成器 5 使用生成器 6 内存查看 上一节,我们已经建立好了模型所必需的鉴别器类与Dataset类. 使用PyTorch构建GAN生 ...

  6. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 上

    文章目录 1 数据集描述 2 GPU设置 3 设置Dataset类 4 设置辨别器类 5 辅助函数与辅助类 1 数据集描述 此项目使用的是著名的celebA(CelebFaces Attribute) ...

  7. GAN (生成对抗网络) 手写数字图片生成

    GAN (生成对抗网络) 手写数字图片生成 文章目录 GAN (生成对抗网络) 手写数字图片生成 Discriminator Network Generator Network 简单版本的生成对抗网络 ...

  8. GAN -- 生成对抗网络

    GAN -- 生成对抗网络 生成对抗网络(英语:Generative Adversarial Network,简称GAN)是非监督式学习的一种方法,通过让两个神经网络相互博弈的方式进行学习.该方法由伊 ...

  9. 【轩说AI】生成模型(2)—— GAN生成对抗网络 + WGAN + Conditional GAN + Cycle GAN

    文章目录 GAN生成对抗网络(Generative Adversarial Network) 神经网络的本质就是一个函数,一个用于拟合的函数 生成模型面临的前所未有的问题 GAN解决这一问题的思想 O ...

  10. 【强化学习】GAIL生成对抗模仿学习详解《Generative adversarial imitation learning》

    前文是一些针对IRL,IL综述性的解释,后文是针对<Generative adversarial imitation learning>文章的理解及公式的推导. 通过深度强化学习,我们能够 ...

最新文章

  1. 十个利用矩阵乘法解决的经典题目
  2. 一周AI看点 | 董明珠投资150亿洛阳造机器人 北京首条无人驾驶地铁线空载试运行
  3. php字符串常用算法--字符串加密解密
  4. 攻防世界(Pwn) forgot---栈溢出;(方法一)
  5. Java 设计模式之模板方法模式
  6. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
  7. 鸡蛋中营养和脂质含量与降低LDL的食物
  8. 谈谈MacBook Air的电池问题
  9. 数据结构中为什么输入数据还没输入完全就结束了_我岂能忍!面试官居然用数据结构和算法“羞辱”我...
  10. 关于excel密码 工作表密码 工作簿密码 工程密码
  11. C++自学笔记(3)
  12. MFC 教程【1_MFC概述 】
  13. ct与x光的哪个辐射大_胸片、CT、PET/CT哪个辐射大?结果你很难猜到
  14. 是时候考虑怎么用好云了
  15. 联想服务器CPU系列,联想推出采用第三代英特尔至强处理器的ThinkSystem SR860 V2服务器...
  16. java计算机毕业设计Web企业差旅在线管理系统源码+mysql数据库+系统+lw文档+部署
  17. 这个英文语法校正插件很赞!可以校正邮件,也可以校正论文
  18. Windows系统封装(三)安装软件和系统优化清理。
  19. Android 实现京东秒杀功能详解
  20. python中怎么创建一个词典_如何在Python中创建字典词典

热门文章

  1. Hbuilder开发APP(一)——底部导航条简单实现
  2. 基于TensorRT和onnxruntime下pytorch的Bert模型加速对比实践
  3. ArcGIS Pro常见地图包系列--切片包(TPK)
  4. R语言-豆瓣电影top250数据爬取和分析
  5. TSL2561 GY2561 模块 MSP430 单片机 程序 STM32 程序 光强传感器 MSP430F5529
  6. Thief-Book 上班摸鱼神器
  7. 集美大学 - 2840 - 实验7-3 - 编程题
  8. spark.reducer.maxReqsInFlight和spark.reducer.maxBlocksInFlightPerAddress
  9. dnf第七章waiguaⅢ∨dnf第七章好感度【=dnf第七章免费外挂
  10. 提神醒脑 MVP、MVVM 关系精讲