GAN的损失函数

news2025/1/14 18:01:56

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://www.coloradmin.cn/o/149071.html

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

相关文章

PCL点云处理之快速点特征直方图(FPFH)描述符(八十六)

PCL点云处理之快速点特征直方图(FPFH)描述符(八十六) 前言一、快速点特征直方图理论二、FPFH和PFH的区别二、实验过程1.代码2输入法线的NAN值检查用 OpenMP 加速 FPFH前言 对于具有 n 个点的给定点云 P,点特征直方图(见点特征直方图(PFH)描述符)的理论计算复杂度为 O (nk…

VueRouter路由的使用(上)

文章目录VueRouter路由的使用p21路由的原理_hash改变historyP22 认识vue-router路由的基本使用流程默认路径router-link路由懒加载路由的其他属性动态路由的基本匹配NotFound路由嵌套编程式导航VueRouter路由的使用 p21 路由的原理_hash改变 <!DOCTYPE html> <html …

JavaScript 运算符

文章目录JavaScript 运算符JavaScript 算术运算符JavaScript 赋值运算符用于字符串的 运算符对字符串和数字进行加法运算JavaScript 运算符 运算符 用于赋值。 运算符 用于加值。 运算符 用于给 JavaScript 变量赋值。 算术运算符 用于把值加起来。 实例 指定变量值&am…

Java基础学习笔记(十)—— 异常

异常1 异常概述2 异常处理方式2.1 JVM默认处理异常的方式2.2 throws方式处理异常2.3 throw抛出异常2.4 try-catch方式处理异常2.5 Throwable成员方法2.6 异常的练习3 自定义异常1 异常概述 异常&#xff1a;就是程序出现了不正常的情况。程序在执行的过程中&#xff0c;出现的…

Vivado综合设置之-gated_clock_conversion

本文验证-gated_clock_conversion设置为on或off时&#xff0c;给Schematic带来的差异。 -gated_clock_conversion设置为on时&#xff0c;用于移除门控时钟&#xff0c;门控时钟是由门电路而非专用时钟模块&#xff08;例如MMCM或PLL&#xff09;生成的时钟。 门控时钟会对设计…

Java-集合(3)

Vector集合类 1.Vector底层保存数据的也是一个对象数组&#xff1a;protected Object[] elementDate; 2.Vector是线程同步的&#xff0c;也就是线程安全Vactor的操作方法都带有synchronized修饰。以此可以进行安全线程保障&#xff0c;所以在开发中如果确认只有一个线程操作集…

dubbo学习笔记3(小d课堂)

dubbo高级特性 启动依赖检查 我们现在直接来启动我们的消费者&#xff1a; 它会报错。 我们 再去直接运行我们的消费者就不会报错。 我们也可以不在代码中去配置&#xff1a; 实际工作中比较建议使用这种方式。 dubbo.reference.check是配置所有的reference里的service都是f…

C语言:大小端

大小端 对于整型来说&#xff0c;内存中存放的是补码&#xff0c;补码是按大小端模式进行存储&#xff1a; 大端存储数据低位存在内存高地址&#xff0c;高位存在内存低地址小端存储数据低位存在内存低地址&#xff0c;高位存在内存高地址 记忆方法 小小小&#xff1a;数据 小…

前端组件库自定义主题切换探索-01

探索原因背景 首先自然是项目有需求&#xff0c;这是必须去做的原因 其次&#xff0c;是我们项目没有直接使用市面上现成的基于element-ui或者ant-design的第三方UI框架&#xff0c;比如avue&#xff0c;而是有着自己的UI组件库 第三&#xff0c;我们的组件库基于ant-design-v…

Win10下干净卸载VMware15.5

一、说明 虚拟机属于服务软件&#xff0c;在Windows10下卸载实属不易。下面请看我所总结的卸载文档。 二、如何彻底卸载VMware虚拟机 需要删除的部分很多&#xff0c;包括&#xff1a; 三、删除步骤一&#xff1a;需要禁用VM虚拟机服务 首先&#xff0c;因为VM的软件属于底层…

【自学Python】Python转义字符

文章来源嗨客网&#xff08;www.haicoder.net&#xff09; Python转义字符 Python转义字符教程 在编程中有一些字符是打不出来的&#xff0c;比如换行&#xff0c;提示音&#xff0c;下一个制表位等等&#xff0c;于是程序语言的开发者就设计了转义序列&#xff08;escape se…

4 机器学习之决策树

学习笔记自&#xff0c;慕课网 《Python3 入门人工智能》 https://https://coding.imooc.com/lesson/418.html#mid32776 决策树、异常检测、主成分分析 常用的分类方法&#xff1a; 逻辑回归的思路&#xff1a; 决策树的思路&#xff1a; 1. 决策树 1.1 ID3决策树&#x…

Java 防御XSS攻击实战与示例代码

XSS, 跨站脚本攻击, 简单来说, 就是非本站点的脚本被执行了。 关于XSS 的详细介绍和防御参考: XSS(跨站脚本)攻击与预防 和 跨站脚本攻击(XSS)及防范措施。 本篇介绍在Java 项目中如何快速修复XSS 漏洞。本篇使用的是黑名单的方式, 对于非法字符进行转义。 黑名单的方式…

Win10的IE以及其他浏览器无法使用的解决方法

前言 最近&#xff0c;突然无法使用Win10的IE&#xff0c;网络连接正常&#xff0c;重置过IE&#xff0c;恢复过高级选项设置&#xff0c;检查过无代理设置&#xff0c;清理过缓存删除IE个人设置&#xff0c;以及清理过DNS解析缓存&#xff0c;IE都会显示无法访问此页面的网络…

Django3还可以这样学之Django的创建

Django (Flask说&#xff1a;“其实我是你的双胞胎哥哥啊”) 一、前言 传统的web框架为MVC设计模式&#xff0c;即M是指业务模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。虽然这种设计模式耦合性低、可重用性高、部署快等特点&#xff0c; 但是完全理解该设计模式…

【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现

文章目录一、贝叶斯简介二、贝叶斯公式推导三、拼写纠正案例四、垃圾邮件过滤案例4.1 问题描述4.2 朴素贝叶斯引入五、基于朴素贝叶斯的垃圾邮件过滤实战5.1 导入相关库5.2 邮件数据读取5.3 构建语料表&#xff08;字典&#xff09;5.4 构建训练集的特征向量5.5 朴素贝叶斯算法…

web服务器的相关配置

一&#xff1a;简单介绍web服务 1、什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方式将信息以Interne…

数字化时代,企业如何培养员工的数据思维意识

很多的企业&#xff0c;他们都有意识想通过大数据或者商业智能BI来推动一些数据信息化的项目建设&#xff0c;比如企业的财务分析、经营管理分析、供应链分析、运营、市场分析等等&#xff0c;这都是很好的表现。 但在实际跟进和深入沟通的时候就发现很多分析的想法是没有办法…

OpenCV(9)-图像轮廓

图像轮廓 图像轮廓概述 图像轮廓是具有相同颜色或强度的连续点的曲线 作用&#xff1a; 可以用于图形分析物体的识别与检测 注意&#xff1a; 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作画轮廓时会修改输入的图像 轮廓查找API&#xff1a; findConto…

FastDFS简介/架构/安装/代码

1简介/架构 1.1简单介绍 分布式文件系统&#xff0c;看名字就知道&#xff0c;它可以存储在不同的机器上。肯定也要有路由功能。 特点 备份容错&#xff0c;负载均衡&#xff0c;动态扩容 场景 0-500MB之间大小的文件存储&#xff08;图片&#xff0c;短视频&#xff0c;文…