原始GAN-pytorch-生成MNIST数据集(原理)

news2024/12/24 11:29:58

文章目录

    • 1. GAN 《Generative Adversarial Nets》
      • 1.1 相关概念
      • 1.2 公式理解
      • 1.3 图片理解
      • 1.4 熵、交叉熵、KL散度、JS散度
      • 1.5 其他相关(正在补充!)

1. GAN 《Generative Adversarial Nets》

Ian J. Goodfellow, Jean Pouget-Abadie, Yoshua Benjio etc.

https://dl.acm.org/doi/10.5555/2969033.2969125

1.1 相关概念

生成模型:学习得到联合概率分布 P ( x , y ) P(x,y) P(x,y),即特征x和标签y同时出现的概率,然后可以求条件概率分布和其他概率分布。学习到的是数据生成的机制。

判别模型: 学习得到条件概率分布 P ( y ∣ x ) P(y|x) P(yx),即在特征x出现的情况下标记y出现的概率

学习一个分布和近似一个分布?

1.2 公式理解

GAN的似然函数(损失函数还要加上一个负号哦):
m i n G m a x D V ( D , G ) = E x ∼ P d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] (1.1) \underset{G}{min}\underset{D}{max}V(D,G) = E_{x \sim P_{data}(x)}[log D(x)]+E_{z\sim p_{z}(z)}[log(1-D(G(z)))] \tag{1.1} GminDmaxV(D,G)=ExPdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))](1.1)

为了学习数据x的分布 p g p_g pg,定义了一个含有噪声的变量分布 p z ( z ) p_z(z) pz(z);V是评分方程(这个值是越大越好的),G是一个生成器,D是一个判别器;训练D最大化真实数据和生成数据的区别,训练G最小化真实数据和生成数据的区别;

注意这个公式有两项,第一项是指是否能正确识别真实的数据;第二项是指是否能够识别生成的数据;
(1) 完美D

  1. D ( x ) D(x) D(x)完美识别真实数据和生成数据, E x ∼ P d a t a ( x ) [ l o g D ( x ) ] E_{x\sim P_{data}(x)}[log D(x)] ExPdata(x)[logD(x)]趋近于1,而 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]趋近于0,整体趋近于1.
  2. D D D不完美的时候,由于存在 l o g log log会使得两项都是一个负数;那训练的目的就是使得这个负数尽量小
  3. 因此需要最大化判别器带来的值,来使得判别器D最佳。

(2) 完美G

  1. G只和 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]相关,如果G完美忽悠D的时候, E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]输出的结果就是负无穷;
  2. 当不是那么完美的时候,输出的值就是一个负数;我们目的是使得这个输出尽量小,以使得生成器最佳。
  3. 所以需要最小化生成器带来值 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]

训练过程

训练D说明

生成器生成的数据就是V(G,D)的第二项的输入: g ( z ) = x g(z) = x g(z)=x,那么对z的求和就可以变为对x的求和。
V ( G , D ) V(G,D) V(G,D)展开成积分/求和的形式
V ( G , D ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) d x + ∫ z p z ( z ) ⋅ l o g ( 1 − D ( g ( z ) ) ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) + p g ( x ) ⋅ l o g ( 1 − D ( x ) ) d x (1.2) \begin{aligned} V(G,D) &= \int_x p_{data} \cdot log(D(x))dx + \int_z p_z(z) \cdot log(1-D(g(z))) \\ &=\int_x p_{data} \cdot log(D(x)) + p_g(x) \cdot log(1-D(x))dx \end{aligned} \tag{1.2} V(G,D)=xpdatalog(D(x))dx+zpz(z)log(1D(g(z)))=xpdatalog(D(x))+pg(x)log(1D(x))dx(1.2)
对于 任意的 ( a , b ) ∈ R 2 \ { 0 , 0 } (a,b) \in R^2 \backslash \{0,0\} (a,b)R2\{0,0},函数 y → a l o g ( y ) + b l o g ( 1 − y ) y \rightarrow a log(y) + blog(1-y) yalog(y)+blog(1y)是一个凸函数,我们需要求这个函数的最大值,就求导数
a y + b 1 − y = 0 y = a a + b \begin{aligned} \frac{a}{y}+\frac{b}{1-y} = 0 \\ y = \frac{a}{a+b} \end{aligned} ya+1yb=0y=a+ba
则在 y = a a + b y = \frac{a}{a+b} y=a+ba的时候有最大值,对应于判别器的概率即为:
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D_G^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} DG(x)=pdata(x)+pg(x)pdata(x)
将最优解带入到价值函数之中
C ( G ) = m a x D V ( G , D ) = E x ∼ p d a t a [ l o g D G ∗ ( x ) ] + E z ∼ p z [ l o g ( 1 − D G ∗ ( G ( z ) ) ) ] = E x ∼ p d a t a [ l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) ] + E x ∼ p g [ l o g p g ( x ) p d a t a ( x ) + p g ( x ) ] (1.3) \begin{aligned} C(G) &= \underset{D}{max}V(G,D) \\ &= E_{x \sim p_{data}}[log D_G^*(x)] + E_{z \sim p_z}[log(1-D_G^*(G(z)))] \\ &= 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)}] \end{aligned} \tag{1.3} C(G)=DmaxV(G,D)=Expdata[logDG(x)]+Ezpz[log(1DG(G(z)))]=Expdata[logpdata(x)+pg(x)pdata(x)]+Expg[logpdata(x)+pg(x)pg(x)](1.3)
根据KL散度和JS散度的定义,可以将上面的公式改写为
C ( G ) = K L ( P d a t a ∣ ∣ p d a t a + p g 2 ) + K L ( p g ∣ ∣ p d a t a + p g 2 ) − l o g ( 4 ) = 2 ⋅ J S D ( p d a t a ∣ ∣ p g ) − l o g ( 4 ) (1.4) \begin{aligned} C(G) &= KL(P_{data} || \frac{p_{data}+p_g}{2}) + KL(p_g || \frac{p_{data}+p_g}{2}) -log(4) \\ &= 2 \cdot JSD(p_{data}||p_g) - log(4) \end{aligned} \tag{1.4} C(G)=KL(Pdata∣∣2pdata+pg)+KL(pg∣∣2pdata+pg)log(4)=2JSD(pdata∣∣pg)log(4)(1.4)

注意 p d a t a + p g 2 \frac{p_{data}+p_g}{2} 2pdata+pg这里除以2是为了保证是一个分布(即概率的积分是等于1的)

在固定D训练G的时候,我们就是为了最小化这个 C ( G ) C(G) C(G),根据上面推导:
所以给出结论:当 p g = p d p_g = p_d pg=pd时, D G ∗ ( x ) = 1 2 D_G^*(x) = \frac{1}{2} DG(x)=21,因此 C ( G ) = l o g 1 2 + 1 2 = − l o g 4 C(G) = log\frac{1}{2} + \frac{1}{2} = -log4 C(G)=log21+21=log4,可以得到最小的 C ( G ) C(G) C(G)

1.3 图片理解

在这里插入图片描述

绿色是生成的分布;黑色是真实分布;蓝色是判别器的分布

(b)表示训练辨别器,使得辨别器可以非常好地区分二者
©表示训练生成器,继续欺骗判别器

1.4 熵、交叉熵、KL散度、JS散度

  1. (Entropy)
    K-L散度源于信息论,常用的信息度量单位为(Entropy)
    H = − ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) H = -\sum_{i=1}^{N}p(x_i) \cdot logp(x_i) H=i=1Np(xi)logp(xi)
    注意这个对数没有确定的底数(可以使2、e或者10)。

熵度量了数据的信息量,可以帮助我们了解用概率分布近似代替原始分布的时候我们到底损失了多少信息;但问题是如何将熵值压缩到最小值,即如何编码可以达到最小的熵(存储空间最优化)。

  1. 交叉熵 : 量化两个概率分布之间的差异
    H ( p , q ) = − ∑ x p ( x )    l o g    q ( x ) H(p,q) = -\sum_{x}p(x) \; log \; q(x) H(p,q)=xp(x)logq(x)

  2. KL散度kullback-Leibler divergence):量化两种概率分布 P和Q之间差异的方式,又成为相对熵
    将熵的定义公式稍加修改就可以得到K-L散度的定义公式:
    D K L ( P ∣ ∣ Q ) = ∑ i = 1 N p ( x i ) ⋅ ( l o g p ( x i ) − l o g q ( x i ) ) = ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^{N} p(x_i) \cdot (log p(x_i) - log q(x_i)) = \sum_{i=1}^{N}p(x_i) \cdot log \frac{p(x_i)}{q(x_i)} DKL(P∣∣Q)=i=1Np(xi)(logp(xi)logq(xi))=i=1Np(xi)logq(xi)p(xi)
    其中 p p p q q q分别表示数据的原始分布和近似的概率分布。

根据公式所示,K-L散度其实是数据的原始分布p和近似分布之间的对数差的期望。如果用2位底数计算,K-L散度表示信息损失的二进制位数,下面用期望表示式展示:
D K L ( P ∣ ∣ Q ) = E [ l o g p ( x ) − q ( x ) ] D_{KL}(P||Q) = E[log p(x) - q(x)] DKL(P∣∣Q)=E[logp(x)q(x)]

注意:

  • 从散度的定义公式中可以看出其不符合对称性(距离度量应该满足对称性)
  • KL散度非负性
  1. JS散度(Jensen-shannon divergence)
    由于K-L散度是非对称的,所以对其进行修改,使得其能够对称,称之为 JS散度
    (1) 设 M = 1 2 ( P + Q ) M = \frac{1}{2}(P+Q) M=21(P+Q),则:
    D J S ( P ∣ ∣ Q ) = 1 2 D K L ( P ∣ ∣ M ) + 1 2 D K L ( Q ∣ ∣ M ) D_{JS}(P||Q) = \frac{1}{2}D_{KL}(P||M) + \frac{1}{2}D_{KL}(Q||M) DJS(P∣∣Q)=21DKL(P∣∣M)+21DKL(Q∣∣M)
    (2) 将KL散度公式带入上面
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) 2 ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{\frac{p(x_i) + q(x_i)}{2}}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{\frac{p(x_i)+q(x_i)}{2}}) DJS=21i=1Np(xi)log(2p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(2p(xi)+q(xi)q(xi))
    (3) 将 l o g log log中的 1 2 \frac{1}{2} 21放到分子上
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( 2 p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( 2 q ( x i ) p ( x i ) + q ( x i ) ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{2p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{2q(x_i)}{p(x_i)+q(x_i)}) DJS=21i=1Np(xi)log(p(xi)+q(xi)2p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)2q(xi))
    (4) 提出2
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) ) + l o g ( 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{p(x_i)+q(x_i)}) + log(2) DJS=21i=1Np(xi)log(p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)q(xi))+log(2)
    注意这里是因为 ∑ p ( x ) = ∑ q ( x ) = 1 \sum p(x) = \sum q(x) = 1 p(x)=q(x)=1

JS散度的缺陷:当两个分布完全不重叠的时候,几遍两个分布的中心离得很近,其JS散度都是一个常数,所以其获取的梯度是0,是没有办法进行更新的。而两个分布没有重叠的原因:从理论和经验而言,真实的数据分布其实是一个低维流形(不具备高维特征),而是存在一个嵌入在高维度的低维空间内。由于维度存在差异,数据很可能不存在分布的重合。

1.5 其他相关(正在补充!)


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

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

相关文章

string类的理解以及模拟实现

string类的理解为什么需要学习string类标准库中的string类string类简单了解string类常见接口string模拟实现深浅拷贝问题标准库下的stringVS环境下g环境下为什么需要学习string类 在C语言中,字符串和字符串相关的函数是分开的,不太符合面向对象的思想&a…

在线视频加密播放与防下载该如何考虑?

在线视频加密播放与防下载该如何考虑? ▲ 图 / 防录屏随机水印 1. 视频加密(分片加密)VRM加密: 将视频进行切片、对碎片逐一进行混淆式加密,包括AES128加密、XOR加密、关键帧错序等。 2. 防录屏(用名信息I…

IM即时通讯开发如何解决大量离线消息导致客户端卡顿的

大部分做后端开发的朋友,都在开发接口。客户端或浏览器h5通过HTTP请求到我们后端的Controller接口,后端查数据库等返回JSON给客户端。大家都知道,HTTP协议有短连接、无状态、三次握手四次挥手等特点。而像游戏、实时通信等业务反而很不适合用…

一个Laravel+vue免费开源的基于RABC控制的博客系统

项目介绍 CCENOTE 是一个使用 Vue3 Laravel8 开发的前后端分离的基于RABC权限控制管理的内容管理系统,由于作者本人比较喜欢写作的原因,因此开发了这个项目,后端使用的PHP的Laravel框架,并且整理了数据层与业务层,相…

node环境搭建以及接口的封装

node环境搭建 文章目录node环境搭建1.在cmd中输入命令安装express(全局)2.在自己的项目下安装serve3.测试接口4.连接mysql4.1 创建数据表4.2 在serve目录下建db下的sql.js4.3 sql.js4.4 在serve路径下安装mysql4.5 在routes 中引入并发送请求4.6 请求到数…

一文3000字从0到1教你用python+selenium搭建UI自动化测试环境以及使用

一、什么是Selenium ? Selenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源、免费;多平台、浏览器、多语言支持;对web页面有良好的支持;API简单灵活易…

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 :2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led:实验现象:总结…

excel图表制作:旋风图让数据对比更直观

旋风图是我们工作中最常用的数据对比图表。旋风图中两组图表背靠背,纵坐标同向,横坐标反向。今天我们就跟大家分享两种制作旋风图的方式。如下表所示,我们以某平台各主要城市的男女粉丝数据为例,制作旋风图来对比男女用户情况。一…

中级嵌入式系统设计师2016下半年下午应用设计试题

中级嵌入式系统设计师2016下半年下午试题 试题一 阅读以下说明,回答问题1至问题3。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能…

7、算法MATLAB ---(运算符)(语句)

运算符&语句1.关系运算符2.逻辑运算符3. if...else 控制语句4. for循环5. While循环6.控制循环退出的关键字6.1 Break6.2 Continue6.3 Return1.关系运算符 ">"大于 ">"大于等于 "<"小于 "<"小于等于 ""等于…

【第六章 JdbcTemplate概念和准备,JdbcTemplate操作数据库(添加)】

第六章 JdbcTemplate概念和准备&#xff0c;JdbcTemplate操作数据库&#xff08;添加&#xff09; 1.JdbcTemplate&#xff08;概念和准备&#xff09; &#xff08;1&#xff09;spring框架对jdbc进行封装&#xff0c;使用JdbcTemplate方便实现对数据库操作。 &#xff08;2&…

数睿通2.0数据服务功能模块发布

文章目录引言API 目录API 权限API 日志结语引言 数睿通 2.0 之前基本完成了数据集成和数据开发两大模块&#xff0c;也因此得到了一些朋友的帮助和支持&#xff0c;在此由衷的表示感谢&#xff0c;你们的支持便是我们更新的最大动力&#xff01; 目前&#xff0c;数据服务模块…

10种聚类算法的完整python操作示例

大家好&#xff0c;聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一系…

【内网安全】——Linux权限维持

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 钱至少对于现在的我来说&#xff0c;的确是万能的在…

04 方法与函数

Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象&#xff0c;可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似&#xff0c;是组成类的一部分 4.1.1 语法结构 格式&#xff1a; def 方法名([参…

程序员是否要加入创业公司?

我从1月份入职到2月份离职&#xff0c;历时一个半月。短暂的体验了一段创业生活&#xff0c;更准确的说是一段“待在”创业团队的生活&#xff0c;因为我发现创业本身跟我关系不大。一个半月的就业经历&#xff0c;对任何人来说都不是一个好选择&#xff0c;当然也不是我所期望…

[oeasy]python0094_视频游戏_双人网球_pong_atari_mos_6502_雅达利_米洛华

编码进化 回忆上次内容 上次 我们回顾了 微软之前的 比尔盖茨和保罗艾伦 mits 迎来的 是帮手还是隐患&#xff1f; intel-8080 遇到了 mos-6502 底层硬件 驱动 游戏行业进化 不光是扑克牌和柏青哥了出现了双人网球 不过 目前的游戏 PDP-1 上的《太空大战》Donner Model 30 上…

K8S---pod基础概念

目录 一、资源限制 二、Pod 的两种使用方式 三、Pod 资源共享 四、底层容器Pause 1、Pause共享资源 1.1 网络 1.2 存储 1.3 小结 2、Pause主要功能 3、Pod 与 Pause 结构的设计初衷 五、Pod容器的分类 1、基础容器&#xff08;infrastructure container&#xff09;…

C++ Primer Plus 第6版 读书笔记(2)第2章 开始学习 C++

C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言&#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了 C的基本概念和技术&#xff0c;并专辟一章介绍了C11新增的功能…

企业网站自动生成系统的设计和实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着Internet技术的发展&#xff0c;人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展&#xff0c;越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势&…