GAN对抗生成网络原始论文理解笔记

文章目录

  • 论文:Generative Adversarial Nets
  • 符号意义
  • 生成器(Generator)
  • 判别器(Discriminator)
  • 生成器和判别器的关系
  • GAN的训练流程简述
  • 论文中的生成模型和判别模型
  • GAN的数学理论

论文:Generative Adversarial Nets

符号意义

  • G()表示对生成器功能的一个封装函数
  • D()表示对判别器功能的一个封装函数
  • x表示真实数据
  • z表示含噪音的数据
  • x‾\overline xx表示G(z),将噪音数据输入到生成器得到的结果
  • θgθ_gθg表示生成器的参数
  • θdθ_dθd表示判别器的参数
  • Pdata(x)P_{data}(x)Pdata(x)表示真实数据分布
  • PG(x;θ)P_G(x;\theta)PG(x;θ)表示生成器生成的数据分布

生成器(Generator)

狭义的生成器就是输入一个向量,通过生成器,输出一个高维向量(代表图片、文字等)
其中输入向量的每一个维度都代表一个特征。如下图示例:
在这里插入图片描述

判别器(Discriminator)

狭义的判别器就是输入数据(生成器产物或者真实数据),通过判别器,输出一个标量数值,输出的数值越大,则代表这个数据越真实。如下图示例(假设输出数值在0-1之间):
在这里插入图片描述

生成器和判别器的关系

结合图来理解生成器和判别器的关系:

  • 首先输入噪音让生成器v1生成图片
  • 之后输入不同来源的图片到判别器v1,由判别器v1来判断图片是真实图片还是生成器生成的图片
  • 然后为了骗过判别器,生成器v1升级为v2,再生成新的图片。
  • 再将不同来源的图片输入到升级的判别器v2来判断图片是真实图片还是生成器生成的图片
  • 依次循环下去,直到判别器无法区分图片来源,也就是生成器产生的图片真实度越来越接近真实图片的真实度。

在这里插入图片描述

GAN的训练流程简述

  • 在每个训练迭代器中:
    • 先训练判别器
      • 从数万张图片(数据集)中采样出m个样本,即{ x1,x2,...,xm{x_1,x_2,...,x_m}x1,x2,...,xm}
      • 随机从一个分布(高斯分布或均匀分布)里采样出有噪音的m个样本,即{z1,z2,...,zm{z_1,z_2,...,z_m}z1,z2,...,zm}
      • 通过生成器获得生成的数据,即{ x‾1,x‾2,...,x‾m{\overline x_1,\overline x_2,...,\overline x_m}x1,x2,...,xm},其中x‾i\overline{x}_ixi=G(ziz_izi)
      • 更新判别器的参数使v‾\overline vv最大。
        • v‾=1m[logD(xi)+log(1−D(x‾i))]\overline v=\frac{1}{m}[logD(x_i)+log(1-D(\overline x_i))]v=m1[logD(xi)+log(1D(xi))]
        • 梯度下降更新参数θdθ_dθd
    • 再训练生成器
      • 随机从一个分布(高斯分布或均匀分布)里采样出有噪音的m个样本,即{z1,z2,...,zm{z_1,z_2,...,z_m}z1,z2,...,zm}
      • 更新生成器的参数使v‾\overline vv最小
        • v‾=1m[logD(xi)+log(1−D(x‾i))]\overline v=\frac{1}{m}[logD(x_i)+log(1-D(\overline x_i))]v=m1[logD(xi)+log(1D(xi))]
        • 梯度下降更新参数θgθ_gθg

当训练判别器的时候,就相当于把生成器固定住了,当训练生成器的时候,就相当于把判别器固定住了,于是就有对上述关于v‾\overline vv的讲解:
对于判别器,目标是提升辨认图片来源的能力,对真实图片输出大的数值,所以D(xi)D(x_i)D(xi)越大越好,D(x‾i)D(\overline x_i)D(xi)越小越好,也就是v‾\overline vv越大越好。
对于生成器:目的是希望自己生成的图片越来越真实,也就是要让D(x‾i)D(\overline x_i)D(xi)越大越好,也就是v‾\overline vv越小越好(另一项当成常数即可)。

在这里插入图片描述

论文中的生成模型和判别模型

GAN提出了两个模型:

  • 生成模型(Generator)
    生成模型主要是用来生成数据分布,目的是尽量与原数据分布接近。

  • 判别模型(Discriminator)
    判别模型主要是用来判断样本是来自真实分布还是生成模型生成的分布。目的是能够更加好地区分哪些样本来自真实数据,哪些样本来自生成模型的数据,越真实的数据得到的结果越大。

用数学来表示训练过程中两模型的变化,如下图:

在这里插入图片描述

绿色线表示真实数据的分布,蓝色线表示生成模型输出的数据分布,红色线表示判别器(越高就表示给的分数越大)

  1. 首先判别模型对真实数据的分布给高的分,对生成模型输出的数据分布给低分。
  2. 生成模型得出的分布就往分高的地方移动。
  3. 判别模型对生成模型得出的新分布进行打压,将它区域的分数压低。
  4. 不断执行2,3,最终生成模型输出数据的分布和真实数据的分布十分接近,判别器无法判断了。

GAN的数学理论

最大似然估计转换为最小化KL散度问题

真实数据的分布是Pdata(x)P_{data}(x)Pdata(x) ,我们定义一个分布PG(xi;θ)P_G(x_i;\theta)PG(xi;θ) ,我们想要找到一组参数θ\thetaθ,使得PG(xi;θ)P_G(x_i;\theta)PG(xi;θ)越接近Pdata(x)P_{data}(x)Pdata(x)越好。比如说,PG(xi;θ)P_G(x_i;\theta)PG(xi;θ) 如果是一个高斯混合模型,那么θ\thetaθ就是均值和方差。
采用极大似然估计方法,我们从真实数据分布 Pdata(x)P_{data}(x)Pdata(x)里面取样 m 个点,x1,x2,...,xm{x_1,x_2,...,x_m}x1,x2,...,xm,根据给定的参数 θ 我们可以算出某个x在该分布的概率 PG(xi;θ)P_G(x_i;θ)PG(xi;θ),即:
在这里插入图片描述
也可以将极大似然估计等价于最小化KL散度,我们需要找一个最大的θ\thetaθ使得PG(xi;θ)P_G(x_i;\theta)PG(xi;θ)接近Pdata(x)P_{data}(x)Pdata(x),就有下列式子:
在这里插入图片描述
将其化简,得:
在这里插入图片描述
由于需要最大化概率的θ\thetaθ,也就是可以近似等价于原分布的期望,可得:
在这里插入图片描述

然后再展开成期望定义的形式,并且加减一项常数项(不含θ\thetaθ),不影响结果,有:
在这里插入图片描述
最终化成了最小化KL散度的形式。
其中KL散度用来衡量两种概率分布的相似程度,越小则表示两种概率分布越接近。形式为:
在这里插入图片描述

所以机器学习中的最大似然估计,其实就是最小化我们要寻找的目标分布PGP_GPGPdataP_{data}Pdata的KL散度。

定义PGP_GPG

如何来定义PGP_GPG呢?
以前是采用高斯分布来定义的,但是生成的图片会很模糊,采用更复杂的分布的话,最大似然会没法计算。所以就引进了Generator来定义PGP_GPG,如下图:

在这里插入图片描述

全局最优

优化目标是最小化PGP_GPGPdataP_{data}Pdata之间的差异:

在这里插入图片描述
虽然我们不知道PGP_GPGPdataP_{data}Pdata的公式,但是我们可以从这两个分布中采样出一些样本。
PGP_GPG,我们从给定的数据集中采样出一些样本。(该步骤对应训练判别器流程步骤1)
PdataP_{data}Pdata,我们随机采样出一些向量,经过Generator输出一些图片。(该步骤对应训练判别器流程步骤2,3)
之后经过Discriminator我们就可以计算PGP_GPGPdataP_{data}Pdata的收敛。Discriminator的目标函数是:
在这里插入图片描述
该目标函数对应训练判别器的损失函数,意思是假设x是从PdataP_{data}Pdata 里面采样出来的,那么希望D(x)越大越好。如果是从 PGP_GPG里面采样出来的,就希望它的值越小越好。x~PdataP_{data}Pdata表示该均值的x都来自PdataP_{data}Pdata分布。

我们的目标是让判别器无法区分PGP_GPGPdataP_{data}Pdata,也就是让它没办法把V(G,D)调大。接下来从数学上去解释这个结论。

给定生成器,我们要找到能最大化目标函数V(D,G)的D*:
在这里插入图片描述
现在我们把积分里面的这一项拿出来看:
PdatalogD(x)+PG(x)log(1−D(x))P_{data}logD(x)+P_G(x)log(1-D(x))PdatalogD(x)+PG(x)log(1D(x))

我们想要找到一组参数D*,使这一项最大。把式子简写一下,将PdataP_{data}Pdata用a表示,PGP_GPG用b表示,得:
f(D)=alog(D)+blog(1−D)f(D)=alog(D)+blog(1-D)f(D)=alog(D)+blog(1D)
对D求导得:
df(D)dD=a∗1D+b∗11−D∗(−1)\frac{df(D)}{dD}=a*\frac1D+b*\frac1{1-D}*(-1)dDdf(D)=aD1+b1D1(1)
另这个求导结果为0,得:
D∗=aa+bD^*=\frac a{a+b}D=a+ba
将a,b代回去,得:
D∗=Pdata(x)Pdata(x)+PG(x)D^*=\frac {P_{data}(x)}{P_{data}(x)+P_G(x)}D=Pdata(x)+PG(x)Pdata(x)
再将这个D带入V(G,D*)中,然后分子分母同时除以2,之后可以化简为JS散度形式(KL散度的变体,解决了KL散度非对称的问题),得:
在这里插入图片描述
PdataP_{data}Pdata=PGP_GPG时,JS散度为0,值为-2log2,达到最优(也就是让判别器没办法把V(G,D)调大)。这是从正向证明当PdataP_{data}Pdata=PGP_GPG时达到最优,还需从反向证明才可以得出当且仅当PdataP_{data}Pdata=PGP_GPG才可以达到的全局最优。
反向证明很容易:假设PdataP_{data}Pdata=PGP_GPG,那么D*=12\frac 1221,再直接代入V(G,D*)即可得到-2log2。

所以,当且仅当PdataP_{data}Pdata=PGP_GPG才可以达到的全局最优。也就是,当且仅当生成分布等于真实数据分布时,我们取得最优生成器。

我们从头整理一下,我们的目标是找到一个G*,去最小化PdataP_{data}PdataPGP_GPG的差异,也就是:
G∗=argminGDiv(PG,Pdata)G^*=argmin_GDiv(P_G,P_{data})G=argminGDiv(PG,Pdata)
但是这个差异没法之间去算,所以就用一个判别器来计算这两个分布的差异:
D∗=argmaxDV(D,G)D^*=argmax_DV(D,G)D=argmaxDV(D,G)
所以优化目标就变为:
G∗=argminGmaxDV(G,D)G^*=argmin_Gmax_DV(G,D)G=argminGmaxDV(G,D)
这个看起来很复杂,其实直观理解一下,如下图,我们假设已经把生成器固定住了,图片的曲线表示,红点表示固定住G后的 maxD(G,D)max_D(G,D)maxD(G,D) , 也就是 PGP_GPGPdataP_{data}Pdata 的差异。而我们的目标是最小化这个差异,所以下图的三个网络中, G3G_3G3 是最优秀的。
在这里插入图片描述
参考的文章:
GAN论文阅读——原始GAN(基本概念及理论推导)
生成对抗网络(GAN) 背后的数学理论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php cdi_CDI和lambda的策略模式

php cdi策略设计模式在运行时动态选择一种实现算法,一种策略。 该模式可用于根据情况选择不同的业务算法。 我们可以将不同的算法实现定义为单独的类。 或者,我们利用Java SE 8 lambda和函数,这些lambda和函数在此处用作轻量级策略实现。 C…

Linux 命令之 cp -- 复制文件或目录

文章目录一、命令介绍二、常用选项三、命令示例(一)复制某个目录到某个目录下(二)复制文件(三)复制文件到目标目录下,若存在文件则备份(四)复制某个目录的全部文件到某个…

向上累积频数怎么算_excel数据分析向上累计和向下累计怎么做呢

2016-07-08 00:25赵飞虎 客户经理一、Excel在分析性测试、复核中的运用注册会计师在分析审计风险确定重点审计领域、重要性水平和重大异常经济业务事项时,常常要对被审计单位的会计报表进行分析性测试和复核。在执行具体审计程序时,也常常要对本期数和上…

okta使用_使用Okta的单点登录保护您的Vert.x服务器

okta使用“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 Vert.x是Spring生态系统中增长最快的元素之一,保护Vert.x服务器可…

Linux 命令之 make -- GNU的工程化编译工具

文章目录一、命令介绍二、常用选项三、命令示例(一)指定命令 make 的工作目录一、命令介绍 make 命令是 GNU 的工程化编译工具,用于编译众多相互关联的源代码文件,还可以编辑内核或模块,以实现工程化的管理&#xff0…

SDL2笔记

SDL2基本操作头文件主函数初始化创建窗口窗口暂停以及事件讲解销毁窗口(释放指针)并退出加载bmp图片新加载图片的方法(使用渲染、纹理)加载其他格式的图片头文件 #include "SDL.h" #include "SDL_image.h"主函数 int main(int argc,char* argv[]) //一定…

操作系统时间片轮换_《操作系统_时间片轮转RR进程调度算法》

转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250时间片轮转RR进程调度算法一、概念介绍和案例解析时间片轮转法 - 基本原理:在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时&am…

java ee打印功能_Java EE 8的前5个新功能

java ee打印功能备受期待的Java Enterprise Edition 8版本具有两个令人兴奋的新API(JSON绑定1.0和Java EE Security 1.0),并且对当前API进行了改进(JAX-RS 2.1,Bean Validation 2.0,JSF 2.3,CDI…

SDL2事件笔记

SDL2事件窗口关闭的事件:鼠标事件鼠标点击事件鼠标移动事件键盘事件用SDL_PollEvent(&event)来检测是否有事件,用SDL_Event的实例属性event.type来获取事件。 窗口关闭的事件: SDL_QUIT鼠标事件 鼠标点击事件 鼠标点击事件&#xff1…

什么是复数

我们把形如 zabi(a、b均为实数)的数称为复数。其中,a 称为实部,b 称为虚部,i 称为虚数单位。当 z 的虚部 b=0 时,则 z 为实数;当 z 的虚部 b≠0 时,实部 a=0 …

qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园

QNX操作系统是一个类Unix实时操作系统,遵从POSIX规范,驱动程序具有良好的可移植性。编写任何驱动程序都会遇到同样的一个问题:应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单,QNX有大量资料说明这一点。当客户端调用…

spring api层打包_Spring项目的按层打包已过时

spring api层打包我认为Spring应用程序不应该以逐层方法构造。 在我看来,按功能打包更有意义。 首先,让我简要描述每种方法。 “按层打包”(在非Java世界中为“按类型折叠”) 该项目结构根据源代码文件所属的体系结构层将其分为…

C++ Primer(第五版)第七章 类 部分答案

第七章 类练习7.2练习7.3练习7.4练习7.6练习7.7练习7.9练习7.14、7.15、7.22练习7.23、7.24、7.26练习7.27练习7.2 曾在 2.6.2 节的练习(第 76 页)中编写了一个 Sales_data类,请向这个类添加 combine 和 isbn 成员。 创建头文件sales.h #ifn…

arpanet(阿帕网)

“阿帕”(ARPA),是美国高级研究计划署(Advanced Research Project Agency)的简称。他的核心机构之一是信息处理技术办公室(IPTO Information Processing Techniques Office),一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出,则在前面加\试试。 空格: 数学公式 数学公式要使用$$,需将公式放在两个$中间。 下标: _上标: ^分数:方法1:\frac{分子}{分母} 方法2:分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)是一个公开性质的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员,并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果,您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下,当您在道路上行驶时,您会看到附近的树木在快速移动,而距离较远的树木将沿同一方向移动但速度较慢,结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…