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

在看这一篇文章之前,希望熟悉掌握熵的知识,可看我写的跟熵相关的一篇博客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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中,电源是非常重要的一环,现在高性能的硬件功耗往往很高,因此一款优秀的电源整个系统稳定运行的基石。最近,我发现一款由安耐美(Enermax)推出的PlatiGemini 1200W电源,它不仅满足…

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

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

Ant Design Vue + js 表格计算合计

1.需要计算的数量固定&#xff08;如表1&#xff0c;已知需要计算的金额为&#xff1a;装修履约保证金 装修垃圾清运费出入证工本费 出入证押金 这四项相加&#xff0c;可以写成固定的算法&#xff09;&#xff1a; 表格样式&#xff1a; <h4 style"margin: 0 0 8px…

TensorFlow进阶一(张量的范数、最值、均值、和函数、张量的比较)

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

科研工作学习中常用的录制动图软件——screenToGif

一、前言 俗话说&#xff0c;字不如表&#xff0c;表不如图&#xff0c;静图不如动图。 动图给人的直观感受&#xff0c;还是很不错的。在曾经的学生期间&#xff0c;进行组会汇报&#xff1b;还是如今工作中&#xff0c;给领导汇报。我经常使用screenToGif这款软件&#xff…

Yolov5 v7.0目标检测——详细记录环境配置、自定义数据处理、模型训练与常用错误解决方法(数据集为河道漂浮物)

1. Yolov5 YOLOv5是是YOLO系列的一个延伸&#xff0c;其网络结构共分为&#xff1a;input、backbone、neck和head四个模块&#xff0c;yolov5对yolov4网络的四个部分都进行了修改&#xff0c;并取得了较大的提升&#xff0c;在input端使用了Mosaic数据增强、自适应锚框计算、自…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-UNIX时间戳

UNIX时间戳 UNIX时间戳最早是在UNIX系统使用的&#xff0c;所以叫做UNIX时间戳&#xff0c;之后很多由UNIX演变而来的系统也继承了UNIX时间戳的规定&#xff0c;目前linux&#xff0c;windows&#xff0c;安卓这些操作系统的底层计时系统都是用UNIX时间戳 时间戳这个计时系统和…

5 个有用的 Linux Shell 转义序列

目录 ⛳️推荐 前言          1、退格符 2、换行符 3、换页符 4、制表符 5、Unicode ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前言          如何在你的…

计算机网络-IS-IS路由计算

前面已经学习了建立IS-IS邻接关系和同步LSDB&#xff0c;然后基于此路由器会进行路由计算。 一、路由计算 因为IS-IS路由器有不同的级别&#xff0c;只维护自身级别的LSDB&#xff0c;因此就是Level-1只有区域内的路由信息&#xff0c;Level-2有Level-2的路由信息&#xff0c;L…

初始Maven

1.背景 问题引入&#xff1a;为什么要使用 Maven&#xff1f; 1.1 添加第三方 jar 包 在 JavaEE 开发领域&#xff0c;有大量的第三方框架和工具可以供我们使用。使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF 目录中的 lib 目录下。但是会导致每次创建一个新工程就需要将…

【Linux】信号的产生

目录 一. 信号的概念signal() 函数 二. 信号的产生1. 键盘发送2. 系统调用kill()raise()abort() 3. 软件条件alarm() 4. 硬件异常除零错误:野指针: 三. 核心转储 一. 信号的概念 信号是消息的载体, 标志着不同的行为; 是进程间发送异步信息的一种方式, 属于软中断. 信号随时都…

医药流通企业如何安全访问医药ERP?无需公网IP和改变现有IT架构

随着目前医药流通行业竞争的加剧&#xff0c;市场供应日趋饱和&#xff0c;传统的粗放式管理缺陷逐渐暴露&#xff0c;导致从事医药行业企业的利润不同程度的下滑&#xff0c;想要满足医药行业客户的个性化需求&#xff0c;为适应企业未来发展&#xff0c;医药流通行业越来越多…

Docker 安装 Mongo

创建宿主机目录 在你的宿主机上创建必要的目录来存储 MongoDB 的数据和配置文件。这样做可以保证即使容器被删除&#xff0c;数据也能得到保留。 mkdir -p /develop/mongo/data mkdir -p /develop/mongo/config创建 MongoDB 配置文件 创建一个名为 mongod.conf 的 MongoDB 配…

C语言中整型与浮点型在内存中的存储

今天让我们来看看整型的数据和浮点型的数据在内存中是怎么存储的呢 整型数据在内存中的存储 整型数据在内存中存储的是二进制的补码 正数的话也没什么可说的&#xff0c;原码反码补码都相同 我们来看看负数&#xff1a; 以-5为例 原码&#xff1a;10000000 00000000 00000000 0…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…

【HTML】页面引用Vue3和Element-Plus

在现代前端开发中&#xff0c;Vue 3 和 Element Plus 是非常受欢迎的技术。Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架&#xff0c;而 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;提供了丰富的 UI 组件&#xff0c;帮助开发者快速构建高质量的前端应用。 …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透&#xff08;穿透 wordpress &#xff09; 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透&#xff08;穿透 w…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化&#xff08;Multi-Objective Particle Swarm Optimization, MOPSO&#xff09;算法是一种基于种群的优化算法&#xff0c;它结合了粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;和多目标优化的思想。多目标粒子群&#xff08;MOPSO&am…

DevOps(八)Jenkins的Maven和Git插件

一、Maven简介 Maven是一个构建生命周期管理和理解工具&#xff0c;用于Java项目。它提供了标准化的构建流程&#xff0c;并简化了从项目编译到文档生成等各种构建方面的管理。 Maven是由Apache软件基金会开发和维护的一个流行的项目管理工具。它的设计目的是简化Java项目的构…

PE结构(二)PE头字段说明

PE头字段 DOS头 PE标记 标准PE头 可选PE头 我们今天分析一下PE头字段中所有重要成员的含义 DOS头 DOS头中我们需要去分析的是如下两个成员&#xff1a; 1.WORD e_magic&#xff1a;MZ标记&#xff0c;用于判断是否为可执行文件&#xff0c;即如果显示4D 5A&#xff0c;…