GAN的损失函数

article/2025/10/11 17:34:44

1.GAN

在这里插入图片描述
在训练过程中,生成器和判别器的目标是相矛盾的,并且这种矛盾可以体现在判别器的判断准确性上。生成器的目标是生成尽量真实的数据,最好能够以假乱真、让判别器判断不出来,因此生成器的学习目标是让判别器上的判断准确性越来越低;相反,判别器的目标是尽量判别出真伪,因此判别器的学习目标是让自己的判别准确性越来越高

当生成器生成的数据越来越真时,判别器为维持住自己的准确性,就必须向辨别能力越来越强的方向迭代。当判别器越来越强大时,生成器为了降低判别器的判断准确性,就必须生成越来越真的数据。在这个奇妙的关系中,判别器判断的准确性由GAN论文中定义的特殊交叉熵 V V V来衡量,判别器与生成器共同影响交叉熵 V V V,同时训练、相互内卷,对该交叉熵的控制时此消彼长的,这是真正的零和博弈。

2. 特殊交叉熵 V V V

在生成器与判别器的内卷关系中,GAN的特殊交叉熵公式如下:
V ( D , G ) = 1 m ∑ i = 1 m [ log ⁡ D ( x i ) + log ⁡ ( 1 − D ( G ( z i ) ) ) ] V(D,G)=\frac1m\sum_{i=1}^{m}[\log D(x_i) +\log(1-D(G(z_i)))] V(D,G)=m1i=1m[logD(xi)+log(1D(G(zi)))]
其中,字母 V V V是原始GAN论文中指定用来表示该交叉熵的字母,对数 log ⁡ \log log的底数为自然底数 e e e m m m表示共有 m m m个样本,因此以上表达式是全部样本交叉的均值表达式。
除此之外, x i x_i xi表示任意真实数据, z i z_i zi与真实数据相同结构的任意随机数据, G ( z i ) G(z_i) G(zi)表示在生成器中基于 z i z_i zi生成的假数据,而 D ( x i ) D(x_i) D(xi)表示判别器在真实数据 x i x_i xi上判断出的结果, D ( G ( z i ) ) D(G(z_i)) D(G(zi))表示判别器在假数据 G ( z i ) G(z_i) G(zi)上判断出的结果,其中 D ( x i ) D(x_i) D(xi) D ( G ( z i ) ) D(G(z_i)) D(G(zi))都是样本为“真”的概率,即标签为 1 1 1的概率。

在原始论文中,这一交叉熵被认为是一种“损失”,但它有两个特殊之处:

  • 不同于二分类交叉熵等常见的损失函数,损失 V V V上不存在最小值,反而存在最大值。具体来看, D ( x i ) D(x_i) D(xi) D ( G ( z i ) ) D(G(z_i)) D(G(zi))都是概率,因此这两个值的范围都在 ( 0 , 1 ) (0,1) (0,1)之间。对于底数为 e e e的对数函数来说,在定义域为 ( 0 , 1 ) (0,1) (0,1)之间意味着函数的值为 ( − ∞ , 0 ) (-\infty,0) (,0)。因此理论上来说,损失 V V V的值域也在 ( − ∞ , 0 ) (-\infty,0) (,0)
  • 损失 V V V在判别器的判别能力最强时达到最大值,这就是说判别器判断得越准确时,损失反而越大,这违背我们对普通二分类网络中的损失函数的期待。但我们从判别器和生成器角度分别来看待公式 V V V,则可以很快理解这一点。

不难发现,在 V V V的表达式中,两部分对数都与判别器 D D D有关,而只有后半部分的对数与生成器 G G G有关。因此我们可以按如下方式分割损失函数:
对判别器:
L o s s D = 1 m ∑ i = 1 m [ log ⁡ D ( x i ) + log ⁡ ( 1 − D ( G ( z i ) ) ) ] Loss_D=\frac1m\sum_{i=1}^m[\log D(x_i) +\log(1-D(G(z_i)))] LossD=m1i=1m[logD(xi)+log(1D(G(zi)))]
从判别器的角度来看,由于判别器希望自己尽量能够判断正确,而输出概率又是“数据为真”的概率,所以最佳情况就是所有的真实样本上的输出 D ( x i ) D(x_i) D(xi)都无比接近 1 1 1,而所有的假样本上的输出 D ( G ( z i ) ) D(G(z_i)) D(G(zi))都无比接近 0 0 0。因此对判别器来说,最佳损失值是:
L o s s D = 1 m ∑ i = 1 m [ log ⁡ D ( x i ) + log ⁡ ( 1 − D ( G ( z i ) ) ) ] = 1 m ∑ i = 1 m [ log ⁡ 1 + log ⁡ ( 1 − 0 ) ] = 0 Loss_D=\frac1m\sum_{i=1}^m[\log D(x_i) +\log(1-D(G(z_i)))]= \frac1m\sum_{i=1}^m[\log 1+\log (1-0)]= 0 LossD=m1i=1m[logD(xi)+log(1D(G(zi)))]=m1i=1m[log1+log(10)]=0
这说明判别器希望以上损失 L o s s D Loss_D LossD越大越好,且最大值理论上可达 0 0 0,且判别器追求大 L o s s D Loss_D LossD的本质是令 D ( x ) D(x) D(x)接近 1 1 1,令 D ( G ( z ) ) D(G(z)) D(G(z))接近 0 0 0。不难发现,对判别器而言, V V V更像是一个存在上限的积极的指标(比如准确率)。

而从生成器的角度来看,生成器无法影响 D ( x i ) D(x_i) D(xi),只能影响 D ( G ( z i ) ) D(G(z_i)) D(G(zi)),因此只有损失的后半段与生成器相关。因此对生成器:
L o s s G = 1 m ∑ i = 1 m [ 常数 + log ⁡ ( 1 − D ( G ( z i ) ) ) ] Loss_G=\frac1m\sum_{i=1}^m[常数+\log(1-D(G(z_i)))] LossG=m1i=1m[常数+log(1D(G(zi)))]
生成器的目标是令输出的数据越真越好,最好让判别器完全判断不出,因此生成器希望 D ( G ( z i ) ) D(G(z_i)) D(G(zi))越接近 1 1 1越好。因此对生成器来说,最佳损失是(去掉常数项):
L o s s G = 1 m ∑ i = 1 m log ⁡ ( 1 − D ( G ( z i ) ) ) = log ⁡ ( 1 − 1 ) = − ∞ Loss_G=\frac1m\sum_{i=1}^m\log(1-D(G(z_i)))= \log(1-1)= -\infty LossG=m1i=1mlog(1D(G(zi)))=log(11)=
这说明生成器希望以上损失 L o s s G Loss_G LossG越小越好,且最小理论值可达负无穷,且生成器追求小 L o s s G Loss_G LossG的本质是令 D ( G ( z ) ) D(G(z)) D(G(z))接近 1 1 1。对生成器而言, V V V更像是一个损失,即算法表现越好,该指标的值越低。从整个生成对抗网络的角度来看,我们(使用者)的目标与生成器的目标相一致,因此对我们而言, V V V被定义为损失,它应该越低越好。

在原始论文当中,该损失 V V V被表示为如下形式:
min ⁡ G max ⁡ D V ( D , G ) = E x ∼ P d a t a ( x ) [ log ⁡ D ( x ) ] + E z ∼ P z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min \limits_G \max \limits_D V(D, G)=\mathbb{E}_{x \sim{P_{data}} (x)} [\log D(x)] + \mathbb{E}_{z \sim{P _{z}}(z)}[\log (1 - D(G(z)))] GminDmaxV(D,G)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]
即先从判别器的角度令损失最大化,又从生成器的角度令损失最小化,即可让判别器和生成器在共享损失的情况下实现对抗。其中 E \mathbb{E} E表示期望,第一个期望 E x ∼ P d a t a ( x ) [ log ⁡ D ( x ) ] \mathbb{E}_{x \sim{P_{data}} (x)} [\log D(x)] ExPdata(x)[logD(x)]是所有 x x x都是真实数据时 log ⁡ D ( x ) \log D(x) logD(x)的期望;第二个期望 E z ∼ P z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \mathbb{E}_{z \sim{P _{z}}(z)}[\log (1 - D(G(z)))] EzPz(z)[log(1D(G(z)))]是所有数据都是生成数据时 log ⁡ ( 1 − D ( G ( z ) ) ) \log (1 - D(G(z))) log(1D(G(z)))的期望。当真实数据、生成数据的样本点固定时,期望就等于均值。
如此,通过共享以上损失函数,生成器与判别器实现了在训练过程中互相对抗, min ⁡ G max ⁡ D V ( D , G ) \min \limits_G \max \limits_D V(D, G) GminDmaxV(D,G)的本质就是最小化 L o s s G Loss_G LossG的同时最大化 L o s s D Loss_D LossD。并且,在最开始训练时,由于生成器生成的数据与真实数据差异很大,因此 D ( x i ) D(x_i) D(xi)应该接近 1 1 1 D ( G ( z i ) ) D(G(z_i)) D(G(zi))应该接近 0 0 0。理论上来说,只要训练顺利,最终 D ( x i ) D(x_i) D(xi) D ( G ( z i ) ) D(G(z_i)) D(G(zi))都应该非常接近 0.5 0.5 0.5,但实际上这样的情况并不常见。


B站up:菜菜


http://chatgpt.dhexx.cn/article/fkCU5jlS.shtml

相关文章

损失函数比较

Pytorch学习之十九种损失函数 一、简介 损失函数(Loss Function)是用来评估模型好坏程度,即预测值f(x)与真实值的不一致程度,通常表示为L(Y, f(x))的一个非负的浮点数。比如你要做一个线性回归,你拟合出来的曲线不会和原始的数据…

常见的损失函数

1、损失函数的意义 机器学习中的监督学习本质上是给定一系列训练样本 ,尝试学习 的映射关系,使得给定一个 ,即便这个 不在训练样本中,也能够得到尽量接近真实 的输出 。而损失函数(Loss Function)则是这个过…

损失函数

损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结…

常见损失函数

常见损失函数 (cs231n) 文章目录 常见损失函数损失函数定义0-1损失函数(zero-one loss)绝对值损失函数(Absolute loss)log对数损失函数(Log Loss)平方损失函数(Square Loss)指数损失函数 (Exponential Loss)SVM损失函数(Hinge Loss)感知损失函数(percep…

【常见的损失函数总结】

文章目录 损失函数的定义神经网络的学习为何要设定损失函数?常见的损失函数1. 0-1损失函数(zero-one loss)2. 对数损失函数3. 平方损失函数MSE(均值平方差)4. Hinge 损失函数5. 交叉熵损失函数 (Cross-entropy loss function) 损失函数的定义 损失函数&…

神经网络损失函数汇总

目录 一、基础知识 二、分类 (1)二分类交叉熵损失函数(binary_crossentropy) (2)categorical_crossentropy损失函数 (3)sparse_categorical_crossentropy (4&#…

Jmeter 使用正则表达式提取器将返回值全部保存到一个文件中

目标:将响应数据 {"errorCode":0,"message":"success","data":null} 中的message字段的值全部保存到一个文件中。 1.正则表达式提取器 正则表达式:提取内容的正则表达式【()表示提取,对于你要提取的…

Jmeter性能测试报告模板

性能测试报告 一、测试内容 针对当当网——服务器,进行性能测试,主要针对的核心业务是:注册,登录,查看商品信息与提交订单等。 二、测试方法 本次采用Apache的开元测试工具jmeter,采用本地动态拼装请求数据…

Jmeter5.4.1测试批量上传文件(参数化)

0、下载jmeter5.4.1 jmeter5.4.1-Java文档类资源-CSDN下载 注意需要java环境哦 jdk1.8-java_sdk_jre-Java文档类资源-CSDN下载 启动命令: java -jar ApacheJMeter.jar 用这个启动才是中文版本,另外启动后,界面字体太小&#xff0c…

Jmeter接口测试参数化详解

接口测试是目前最主流的自动化测试手段,它组合不同的参数向服务器发送请求,接受和解析响应结果,通过测试数据的交换逻辑来验证服务端程序工作的正确性。我们在测试过程中需要考虑不同的输入组合,来覆盖不同的测试范围;…

Jmeter学习之用户定义变量与用户变量

一、User Defined Variables 1、添加方法:选择“线程组”,右键点击添加-Config Element-User Defined Variables,定义你所需要的参数,如 2、在对应的需要使用参数的位置,使用${host}替代。 …

jmeter请求get接口报错(java.net.URISyntaxException: Illegal character in query at index 153: http://qa....)

log: 问题描述: 接口请求类型:get 请求参数:{"canshu1":"17600000005","canshu2":"test-0004","canshu3":"2021090301"},如下: 请求的时候报错如下: …

jmeter文件上传请求配置:文件,图片,语音、视频上传

图片上传http请求配置: 跟一般的http请求相对,图片上传的配置请求参数多了以下3个部分 1.点击图中【高级】,将客户端实现方式改为java 2.点击【参数】,按照基本请求参数配置即可 3.点击【文件上传】,配置图片路径&am…

JMeter外观配置与汉化

1、JMeter外观配置 推荐使用系统默认的外观,原因:不会出现窗口拉伸、变形等问题。 路径:选项->外观->System 2、JMeter汉化 方法1:修改JMeter设置(一次性的,下次打开JMeter还会恢复默认配置&#x…

16、Jmeter如何创建桌面快捷带图方式(亲测有效)

First step** 1、先找到jmeter文件安装的bin目录—>jmeter.bat文件,创建桌面快捷方式。 ** 2、右键,点击“发送到”---->桌面快捷方式”。然后再选中桌面快捷方式,右键,点击“属性”,修改“属性”里的路径为&am…

11、jmeter读取CSV文件之元件数据文件设置基础页面了解(1)

使用场景以及好处: 读取用例的方法通常有两种,1、通过建立多个请求信息实现接口的入参参数化,2、通过读取csv文件,加载测试用例。第一种方法会导致脚本过于冗余,不便于维护,因此多数情况我们会使用读取csv文…

JMeter的基本使用

目录 一、下载JMeter 二、设置语言为简体中文 三、JMeter外观设置 三、添加线程组 四、添加HTTP请求 五、添加信息头管理器 ​六、创建察看结果树 七、运行查看结果 一、下载JMeter 下载地址:Apache JMeter - Apache JMeter™ 下载zip文件解压后运行bin目录…

使用Jmeter进行性能测试的基本操作方法

Jmeter是一款轻量型的优秀测试软件产品,在很多场合如个人测试,企业测试中都有广泛应用。相比体积巨大的我们在某些场合可能更倾向于对Jmeter的使用,那么我们要如何利用该软件进行性能测试呢? 我们需要下载安装这款全免费的测试软件…

JMeter下载安装及入门教程

1 JMeter介绍 JMeter使用了不同技术和协议,是一款可以进行配置和执行负载测试、性能测试和压力测试的工具。负载测试、性能测试和压力测试概念: 负载测试: 这类测试使系统或者应用程序在预先设计好的极端场景下测试运行。这类测试用来评估系统或者程序…

Jmeter模拟selenium操作浏览器

前言 selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#… selenium支持多语言,是因为selenium与浏览器驱动之间是通过http协议进行通信的。只关心通信的数据是否能够正确解读 ,并不关心这个数据是从哪个客户…