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

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

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

相关文章

Linux:动静态库介绍

动静态库 库的介绍开发环境 & 编译器库存在的意义库的实现库的命名静态库制作和使用总结 动态库的制作和使用动态库的使用方法方法一方法二方法三 库加载问题静态库加载问题动态库的加载问题与位置无关码 C/C静态库下载方式 库的介绍 静态库:程序在编译链接的时…

计算机网络---第十一天

生成树协议 stp作用: 作用:stp用于解决二层环路问题。 BPDU: 含义:桥协议数据单元,用于传递stp协议相关报文 分类:配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

数据库主键ID自增,两种方法获取插入数据库那条数据自动生成的主键ID值

目录 1. 前言 2. 适用于 MyBatis 框架 2.1 获取单条插入语句生成的ID 2.2 获取集合插入生成的多条数据的ID 3. 适用于 MyBatisPlus 框架 3.1 获取单条数据插入生成的ID 3.2 获取集合插入数据生成的多条数据的ID 4. 小结 1. 前言 在开发过程中,我们可能会遇…

OpenCompass 大模型评测实战——作业

OpenCompass 大模型评测实战——作业 一、基础作业1.1、使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C-Eval 数据集上的性能1.1.1、安装基本环境1.1.2、解压数据集1.1.3、查看支持的数据集和模型1.1.4、启动评测 二、进阶作业2.1、将自定义数据集提交至OpenCompass官网 …

2024春季春日主题活动策划方案

2024解冻派对“春日浪漫”主题活动策划方案-32P 方案页码:32页 文件格式:pptx 方案简介: 春来一季,新生欢喜 花香丨微风丨阳光 活动唤起【春日浪漫记忆】! 年轻人不一样的派对活动 可以与朋友/小朋友/家人互动…

深度学习-线性代数

目录 标量向量矩阵特殊矩阵特征向量和特征值 标量由只有一个元素的张量表示将向量视为标量值组成的列表通过张量的索引来访问任一元素访问张量的长度只有一个轴的张量,形状只有一个元素通过指定两个分量m和n来创建一个形状为mn的矩阵矩阵的转置对称矩阵的转置逻辑运…

03-JAVA设计模式-访问者模式

访问者模式 什么是访问者模式 访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中,我们…

数据结构 - 链表详解二 - 无头单向非循环链表

一. 单链表的介绍 上篇文章已经介绍了各种链表的概念了,这篇文章就带大家来实现一下无头单向非循环链表 无头单向非循环链表是一种简单而基本的链表结构,它没有哨兵或额外的头节点来简化操作,且不形成闭环。这种链表直接从首个数据节点开始&…

图文教程 | Git安装配置、常用命令大全以及常见问题

前言 因为多了一台电脑,平时写一些代码,改一些文件,用U盘存着转来转去特别麻烦。于是打算用Git管理我的文件,方便在两个终端之间传输数据啥的。也正好给新电脑装好Git。 📢博客主页:程序源⠀-CSDN博客 &…

HFSS端口介绍2---波端口

前面我们讨论了Lumped Port设定相关的内容,这节我们继续讨论Wave Port(波端口)使用相关的问题。 波端口使用范围 封闭结构:如波导、同轴电缆等 包含多个传播模式的模型 端口平面在求解区域外的模型 模型中包含均匀的波导或者传输线结构 波端口的大小 对于封闭的传输线结构:边…

Ajax技术是啥?在web开发中有啥用?

一、Ajax是啥? Ajax技术是一种让网页能在不完全刷新页面的情况下,通过JavaScript与服务器进行异步数据交换,并更新部分网页内容的技术。 简单来说,Ajax的核心原理就是在JavaScript的控制下,网页悄悄地向服务器请求数…

Kubeedge:edgecore源码速读

Kubeedge源码版本:v1.15.1 首先,我们从edgehub的start函数看起: 它主要干几件事情: 初始化证书相关,这里的证书主要用于webskt的连接启动edgehub,开启三个协程,分别把云发过来的消息路由到边缘…

蝴蝶书--ChatGPT基础科普

temperature的参数调整输出的概率分布,这个参数值越大,分布就看起来越平滑,也就是高概率和低概率的差距拉小了(对输出不那么确定) Top-P在累计概率超过P的词里进行选择,对于概率分布比较均匀的情况&#x…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程,在您的应用中释放人工智能的力量。随着人工智能技术的快速发展,比以往任何时候都更重要的是保持领先地位,并为您的项目利用这些尖端工具。在本课程中,您将深入了解人工智能驱动…

ADB 命令大全

Case1:报错Remote couldnt create file:Read-only file system 输入 adb disable-verity adb reboot adb root adb remount Case2:/system/bin/sh: cant create C:xxx.txt: Read-only file system Android设备的文件系统是基于Linux的&…

物联网硬件设计开发全攻略:十大关键阶段深度解析

为物联网应用设计开发高效稳定的硬件系统本身是一项既复杂又精细的艰巨任务。看似小巧的物联网设备一般由软件、固件和硬件组件组成,其中,硬件组件更是占据了约80%的成本与开发挑战。那么,为何硬件部分如此棘手?在这篇文章中&…

x汽车登陆网站登陆rsa加密逆向

声明: 本文章内容仅供学习交流,不用于其他其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关, 各位看官好哇,今天给大家带来一篇web自动化逆向的文章,如下图当前我…

C++ 几句话彻底点通虚表

#include <iostream>using namespace std;class Base { public:virtual void show() // 声明虚函数{cout << "Base" << endl;} };class Derived : public Base { public:void show() override // 覆盖虚函数{cout << "Derived" &l…

芯科科技大大简化面向无电池物联网的能量采集产品的开发

芯科科技推出其迄今最高能量效率且支持能量采集功能的无线SoC 中国&#xff0c;北京 – 2024年4月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;…

Day1: 5道C++ 面向对象高频题整理

1、什么是类&#xff1f; 在C中&#xff0c;类是一种用户定义的数据类型&#xff0c;它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态&#xff0c;而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图&#xff0c;根据这个蓝图可以创建对象&am…