GAN详解,公式推导解读,详细到每一步的理论推导

news2024/12/28 17:53:26

在看这一篇文章之前,希望熟悉掌握熵的知识,可看我写的跟熵相关的一篇博客https://blog.csdn.net/m0_59156726/article/details/138128622

1. GAN

原始论文:https://arxiv.org/pdf/1406.2661.pdf
放一张GAN的结构,如下:我们有两个网络,生成网络G和判别网络D。生成网络接收一个(符合简单分布如高斯分布或者均匀分布的)随机噪声输入,通过这个噪声输出图片,记做G(z)。判别网络的输入是x,x代表一张图片,输出D(x)代表x为真实图片的概率。最终的目的式能够生成一个以假乱真的图片,使D无法判别真假,D存在的意义是不断去督促G生成的质量

在这里插入图片描述

先拿出论文中的优化公式,后面在详解由来。
m i n G m a x D V ( G , D ) = 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 ) ) ) ] \underset{G}{min} \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] GminDmaxV(G,D)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
这里 p d a t a ( x ) p_{data}(x) pdata(x) 表示真实数据的分布,z是生成器G输入的噪声, p z ( z ) p_{z}(z) pz(z)是噪声的分布,乍一看这个公式是不是很难理解。没关系,接下来,我们慢慢分析由来。

2 GAN的优化函数

2.1 判别器D

我们先看判别器D,作用是能够对真实数据 x ∼   p d a t a ( x ) x\sim~p_{data}(x) x pdata(x)其能够准确分辨是真,对生成的假数据G(z)能够分辨是假,那么实际上这就是一个二分类的逻辑回归问题,还记得交叉熵吗?没错这也等价于交叉熵,只不过交叉熵是负对数,优化最小交叉熵必然等价于优化以下最大值:
m a x D V ( G , D ) = 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 ) ) ) ] \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] DmaxV(G,D)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
看过我前面写的熵的问题,公式由来很容易懂。我们现在单独从公式来看,这个函数要想取得最大值,必然当真实数据来的时候D(x)=1,当假数据G(z)来的时候D(x)=0。这也满足我们的初衷:能够分辨真假。实际上是一个二分类。
这一步目标是优化D,G是固定的不做优化,G为上一次迭代优化后的结果,因此可简写成:
D G ∗ = m a x D V ( G , D ) D_G^*= \underset{D}{max}V(G,D) DG=DmaxV(G,D)

2.2 生成器G

在来看看生成器,对于生成器来说,我不想判别器D能够识别我是真假,我希望判别器识别不出来最好,理想极端情况下:D(x)=0,D(G(z))=1,也就是真的识别成假,假的识别成真。反应在优化函数上就是,是不是很好理解了
m i n 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 ) ) ) ] \underset{G}{min} = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] Gmin=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
当理想情况下D(x)=0,D(G(z))=1,必然是最小值优化。
同样这一步优化是优化G,D不做优化,D为上一次迭代优化后的结果,因此可简写成:
G D ∗ = m i n G V ( G , D ) G_D^*= \underset{G}{min}V(G,D) GD=GminV(G,D)

2.3 互相博弈

作者习惯上把分开的两个优化写道一起,就变成了我们最初看到的论文中的公式:
m i n G m a x D V ( G , D ) = 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 ) ) ) ] \underset{G}{min} \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] GminDmaxV(G,D)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
但是实际上,D和G在迭代过程中是分开优化的。
上面说了,我生成器又要能够准确判断真假,又要不能够判断,作为判别器他说他好难啊,怎么办呢,干脆判别器最终输出0.5,这也是理想优化结果,谁也不偏向。这也是整个GAN优化的终极目的。

3 训练过程

在这里插入图片描述
对于判别器D优化,因为这是个二分类,ylogq + (1-y)log(1-q):对于x,标签只会为1,因此只有log(D(x))这一项;对于g(z),其标签只会为0,因此只有log(1-D(G(z)))这一项,在损失函数上, l o s s = c r o s s E n t r y L o s s ( 1 , D ( x ) ) + c r o s s E n t r y L o s s ( 0 , D ( G ( z ) ) ) loss=crossEntryLoss(1,D(x)) + crossEntryLoss(0,D(G(z))) loss=crossEntryLoss(1,D(x))+crossEntryLoss(0D(G(z)))
对于生成器G优化:因为D(x)这一项,并不包含生成器的优化参数,因此在求梯度的时候D(x)这一项为0,因此只有log(1-D(G(z)))这一项,损失函数: l o s s = c r o s s E n t r y L o s s ( 1 , D ( G ( z ) ) ) loss=crossEntryLoss(1,D(G(z))) loss=crossEntryLoss(1D(G(z)))

4 在看优化

4.1 D的最优解

还记得完美的优化结果是D=0.5吗?这到底是怎么来的呢。我们先看一下对于D的优化,去求D的最优解

m a x D V ( G , D ) = 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 ) ) ) ] \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] DmaxV(G,D)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
写成积分形式:不知道怎么来的可以补一下概率论均值的计算。
m a x D V ( G , D ) = ∫ x p d a t a ( x ) l o g D ( x ) d x + ∫ x p z ( z ) l o g ( 1 − D ( g ( z ) ) ) d z \underset{D}{max}V(G,D) = \int_{x}p_{data}(x)logD(x)dx + \int_{x}p_{z}(z)log(1-D(g(z)))dz DmaxV(G,D)=xpdata(x)logD(x)dx+xpz(z)log(1D(g(z)))dz
我们考虑在优化D的时候G是不变的,并且假设,通过G生成的g(z)满足的分布为 p g p_g pg,因此上式子可写为:
m a x D V ( G , D ) = ∫ x p d a t a ( x ) l o g D ( x ) + p g ( x ) l o g ( 1 − D ( x ) d x \underset{D}{max}V(G,D) = \int_{x}p_{data}(x)logD(x) + p_{g}(x)log(1-D(x)dx DmaxV(G,D)=xpdata(x)logD(x)+pg(x)log(1D(x)dx
上式什么时候取得最大结果呢, a l o g ( y ) + b l o g ( 1 − y ) alog(y) + blog(1-y) alog(y)+blog(1y)在[0,1]上最大值是y=a/(a+b),因此上式最大值是

D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D_G^*(x)= \cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)} DG(x)=pdata(x)+pg(x)pdata(x)
以上我们得到D的最优解,但是别忘了,我们目标是G能够生成的分布pg能和pdata一致,让D真假难辨,那么此时pg = pdata,D=0.5,判别器已经模棱两可了。然而这一结果只是我们的猜测。

4.2 G的最优解

作者也是先说了pg=pdata是G的最优解,后面才证明的。让我们跟着作者思路证明一下。
D的最优解已经得到了,带入求解G最优的公式,这里作者起了个C(G)的名称,按照他的思路来,已然求C(G)的最小值
C ( G ) = E x ∼ p d a t a ( x ) [ l o g D G ∗ ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D G ∗ ( G ( z ) ) ) ] = E x ∼ p d a t a ( x ) [ l o g D G ∗ ( x ) ] + E x ∼ p g [ l o g ( 1 − D G ∗ ( x ) ) ] = E x ∼ p d a t a ( x ) [ 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 ) ) ] = ∫ x p d a t a ( x ) l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) + p g ( x ) l o g p g ( x ) p d a t a ( x ) + p g ( x ) d x = ∫ x ( l o g 2 − l o g 2 ) p d a t a ( x ) + ( l o g 2 − l o g 2 ) p g ( x ) + p d a t a ( x ) l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) + p g ( x ) l o g p g ( x ) p d a t a ( x ) + p g ( x ) d x = − l o g 2 ∫ x [ p d a t a ( x ) + p g ( x ) ] d x + ∫ x p d a t a ( x ) ( l o g 2 + l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) ) + p g ( x ) ( l o g 2 + l o g p g ( x ) p d a t a ( x ) + p g ( x ) ) d x C(G) = E_{x\sim p_{data}(x)}[logD_G^*(x)] + E_{z\sim p_{z}(z)}[log(1 - D_G^*(G(z)))] \\ =E_{x\sim p_{data}(x)}[logD_G^*(x)] + E_{x\sim p_{g}}[log(1 - D_G^*(x))] \\ =E_{x\sim p_{data}(x)}[log\cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)} ] + E_{x\sim p_{g}}[log(\cfrac{p_{g}(x)}{p_{data}(x)+p_g(x)} )]\\ = \int_{x}p_{data}(x)log\cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)} + p_{g}(x)log\cfrac{p_g(x)}{p_{data}(x)+p_g(x)}dx\\ = \int_{x}(log2-log2)p_{data}(x) + (log2-log2)p_{g}(x) + p_{data}(x)log\cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)} + p_{g}(x)log\cfrac{p_g(x)}{p_{data}(x)+p_g(x)}dx\\ =-log2\int_{x}[p_{data}(x)+p_g(x)]dx + \int_{x}p_{data}(x)(log2 +log \cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)}) + p_{g}(x)(log2 + log\cfrac{p_{g}(x)}{p_{data}(x)+p_g(x)})dx C(G)=Expdata(x)[logDG(x)]+Ezpz(z)[log(1DG(G(z)))]=Expdata(x)[logDG(x)]+Expg[log(1DG(x))]=Expdata(x)[logpdata(x)+pg(x)pdata(x)]+Expg[log(pdata(x)+pg(x)pg(x))]=xpdata(x)logpdata(x)+pg(x)pdata(x)+pg(x)logpdata(x)+pg(x)pg(x)dx=x(log2log2)pdata(x)+(log2log2)pg(x)+pdata(x)logpdata(x)+pg(x)pdata(x)+pg(x)logpdata(x)+pg(x)pg(x)dx=log2x[pdata(x)+pg(x)]dx+xpdata(x)(log2+logpdata(x)+pg(x)pdata(x))+pg(x)(log2+logpdata(x)+pg(x)pg(x))dx
由于对概率积分结果为1,上式继续化简为:
C ( G ) = − 2 l o g 2 + ∫ x p d a t a ( x ) l o g p d a t a ( x ) [ p d a t a ( x ) + p g ( x ) ] / 2 + ∫ x p g ( x ) l o g p g ( x ) [ p d a t a ( x ) + p g ( x ) ] / 2 C(G)=-2log2 + \int_{x}p_{data}(x)log\cfrac{p_{data}(x)}{[p_{data}(x)+p_g(x)]/2} + \int_{x}p_{g}(x)log\cfrac{p_{g}(x)}{[p_{data}(x)+p_g(x)]/2} C(G)=2log2+xpdata(x)log[pdata(x)+pg(x)]/2pdata(x)+xpg(x)log[pdata(x)+pg(x)]/2pg(x)
看过熵的应该知道后两项其实式散度的形式,写为散度的形式,
C ( G ) = − l o g 4 + K L ( p d a t a ( x ) ∣ ∣ p d a t a ( x ) + p g ( x ) 2 ) + K L ( p g ( x ) ∣ ∣ p d a t a ( x ) + p g ( x ) 2 ) C(G)=-log4 + KL(p_{data}(x)||\cfrac{p_{data}(x)+p_g(x)}{2})+KL(p_{g}(x)||\cfrac{p_{data}(x)+p_g(x)}{2}) C(G)=log4+KL(pdata(x)∣∣2pdata(x)+pg(x))+KL(pg(x)∣∣2pdata(x)+pg(x))
在我写熵的那篇文章里已经详细介绍和推导过,KL(P||Q)散度取最小值0的时候P=Q,因此上式最小值的情况是:
p d a t a ( x ) = p d a t a ( x ) + p g ( x ) 2 p_{data}(x) = \cfrac{p_{data}(x)+p_g(x)}{2} pdata(x)=2pdata(x)+pg(x) p g ( x ) = p d a t a ( x ) + p g ( x ) 2 p_{g}(x) = \cfrac{p_{data}(x)+p_g(x)}{2} pg(x)=2pdata(x)+pg(x)。这两个当且仅当 p g ( x ) = p d a t a ( x ) p_{g}(x)=p_{data}(x) pg(x)=pdata(x)时满足。
又因为JSD散度和KL散度有如下关系:
J S D ( P ∣ ∣ Q ) = 1 2 K L ( P ∣ ∣ M ) + 1 2 K L ( Q ∣ ∣ M ) , M = 1 2 ( P + Q ) JSD(P||Q) = \cfrac{1}{2}KL(P||M)+\cfrac{1}{2}KL(Q||M),M= \cfrac{1}{2}(P+Q) JSD(P∣∣Q)=21KL(P∣∣M)+21KL(Q∣∣M),M=21(P+Q)
因此继续简化:
C ( G ) = − l o g 4 + 2 J S D ( p d a t a ∣ ∣ p g ) C(G)=-log4+2JSD(p_{data}||p_g) C(G)=log4+2JSD(pdata∣∣pg)
由于JSD的散度取值为(0,log2),当为0的时候 p g = p d a t a p_{g}=p_{data} pg=pdata,同样也证明了G最优解的情况是 p g = p d a t a p_{g}=p_{data} pg=pdata。至此也完成论文中的证明,不得不说GAN中的理论真的很强,这些理论对后面各种生成模型用处非常大。虽然GAN是历史的产物,但是他带来的价值却很高,如果想做AIGC,GAN必学习。

备注

参考:
https://blog.csdn.net/sallyxyl1993/article/details/64123922
https://www.cnblogs.com/LXP-Never/p/9706790.html

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

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

相关文章

索引超详细解析

目录 索引概述 无索引时: 索引: 索引结构 介绍: 二叉树: B-Tree(多路平衡查找树): 经典BTree MySQL中B树 Hash索引 hash索引的特点: 存储引擎支持: 为什么InnoDB存储选择使用BTree…

升级 jQuery:努力打造健康的 Web 生态

jQuery 对 Web 的影响始终是显而易见的。当 jQuery 在 2006 年首次推出时,几乎立即成为 Web 开发人员的基本工具。它简化了 JavaScript 编程,使操作 HTML 文档、处理事件、执行动画等变得更加容易。从那时起,它在 Web 标准和浏览器功能的演变…

深度学习基础:循环神经网络中的Dropout

深度学习基础:循环神经网络中的Dropout 在深度学习中,过拟合是一个常见的问题,特别是在循环神经网络(RNN)等复杂模型中。为了应对过拟合问题,研究者们提出了许多方法,其中一种被广泛应用的方法…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果,使网页界面更加生动有趣,吸引用户注意力。另外,相较于静态背景图片,CSS渐变无需额外的HTTP请求,减轻服务器负载,加快页面加载速度;同时CSS渐变能够根据容…

应用软件运维服务方案(word原件)

信息化项目运维服务方案(投标,实施运维,交付) 1.项目整体介绍 2.服务简述 3.资源提供 软件全过程性,标准型,规范性文档(全套资料包)获取:本文末个人名片直接获取&…

WPS二次开发系列:WPS SDK打开在线文档

作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 需求场景 效果展示 3、实现步骤 3.1 步骤一、申…

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编…

《QT实用小工具·三十九》仿 Windows10 画图3D 的颜色选择器, 但更加强大

1、概述 源码放在文章末尾 该项目实现了仿 Windows10 画图3D 的颜色选择器,功能更加丰富更加强大。 项目部分代码如下所示: import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtGraphicalEffects 1.15Item {id…

【踩坑】libtorch load 报错 No such file or directory

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 目录 报错背景 报错原因 解决方法 方法一:把你的编译配置转为release版本 方法二:安装debug版本的libtorch 报错背景…

算法学习001-圆桌问题 中小学算法思维学习 信奥算法解析 c++实现

目录 算法学习001-圆桌问题 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 算法学习001-圆桌问题 一、题目要求 1、编程实现 圆桌边围坐着2n个人,其中n个人是好人&#xff0c…

Redis 安装及配置教程(Windows)【安装】

文章目录 一、简介一、 下载1. GitHub 下载2. 其它渠道 二、 安装1. ZIP2. MSI 软件 / 环境安装及配置目录 一、简介 Redis 官网地址:https://redis.io/   Redis 源码地址:https://github.com/redis/redis   Redis 官网安装地址(无Windo…

基于SSM的物业管理系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物业管理系统2拥有三种角色 管理员:用户管理、物业管理、房产信息管理、小区概况管理、开发商管理、收费标准管理、物业公司管理等 物业:住户管理、收费…

vector的使用(部分接口)

1.vector的使用 1.1vector的定义 (constructor)构造函数声明接口说明vector()无参构造vector (const vector& x)拷贝构造 1.2vector iterator 的使用 iterator的使用接口说明begin end获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位…

【数据结构】单链表的特点

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

UML——类图详解

目录 1. 前言 2. 类图概述 3. 类图表示法 3.1 类的表示方式 3.2 类与类之间关系的表示方式 (1)继承(泛化)关系 (2)实现关系 (3)依赖关系 (4)一般关联关系 (5)聚合关系 (6)组合关系 1. 前言 UML全称(Unified Modeling Language),译为统一建模语言&#x…

Android自定义ListView单击事件失效的解决方法

因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目。 出现点击ListView的每一项都不会执行setOnItemClickListener 里面的onItemClick 方法。 原因是item里面存在一些子控件,默认点击获取的…

使用 PhpMyAdmin 安装 LAMP 服务器

使用 PhpMyAdmin 安装 LAMP 服务器非常简单。按照下面所示的步骤,我们将拥有一个完全可运行的 LAMP 服务器(Linux、Apache、MySQL/MariaDB 和 PHP)。 什么是 LAMP 服务器? LAMP 代表 Linux、Apache、MySQL 和 PHP。它们共同提供…

如何在PostgreSQL中实现分布式事务,特别是在多节点集群环境中?

文章目录 解决方案:使用Citus实现分布式事务步骤一:安装和配置Citus步骤二:定义分布式表和分布键步骤三:执行分布式事务示例代码 总结 在PostgreSQL中实现分布式事务,特别是在多节点集群环境中,是一个复杂但…

c++ - 模板(一)

文章目录 一、函数模板 一、函数模板 1、概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。 2、原理 函数模板是一个蓝图,它本身并不是函数,是编译器用…

【学习】如何高效地进行集成测试

在软件开发的过程中,测试环节至关重要。而在这其中,集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试,以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上,将模块按照设…