深度学习500问——Chapter07:生成对抗网络(GAN)(1)

news2025/2/26 9:28:43

文章目录

7.1 GAN基本概念

7.1.1 如何通俗理解GAN

7.1.2 GAN的形式化表示

7.1.3 GAN的目标函数是什么

7.1.4 GAN的目标函数和交叉熵有什么区别

7.1.5 GAN的Loss为什么降不下去

7.1.6 生成式模型、判别式模型的区别

7.1.7 什么是mode collapsing

7.1.8 如何解决mode collapsing


7.1 GAN基本概念

7.1.1 如何通俗理解GAN

生成对抗网络(GAN,Generative adversarial network)自从2014年被lan Goodfellow提出以来,掀起了一股研究热潮。GAN由生成器和判别器组成,生成器负责生成样本,判别器负责判断生成器的样本是否为真。生成器要尽可能迷惑判别器,而判别器要尽可能区分生成器生成的样本和真实样本。

在GAN的原作[1]中,作者将生成器比喻为印假钞票的犯罪分子,判别器则类比为警察。犯罪分子努力让钞票看起来逼真,警察则不断提升对于假钞的辨识能力。二者相互博弈,随着时间的进行,都会越来越强。那么类比于图像生成任务,生成器则不断生成尽可能逼真的假图像。判别器则判断图像是否是真实的图像,还是生成的图像,二者不断博弈优化。最终生成器生成的图像使得判别器完全无法判别真假。

7.1.2 GAN的形式化表示

上述例子只是简要介绍了一下GAN的思想,下面对于GAN做一个形式化的,更加具体的定义。通常情况下,无论是生成器还是判别器,我们都可以用神经网络来实现。那么,我们可以把通俗化的定义用下面这个模型表示:

上述模型左边是生成器G,其输入是z,对于原始的GAN,z是由高斯分布随机采样得到的噪声。噪声z通过生成器得到了生成器的假样本。

生成的假样本与真实样本放到一起,被随机抽样送入到判别器D,由判别器去区分输入的样本是生成的假样本还是真实的样本。整个过程简单明了,生成对抗网络中的“生成对抗”主要体现在生成器和判别器之间的对抗。

7.1.3 GAN的目标函数是什么

对于上述神经网络模型,如果想要学习其参数,首先需要一个目标函数。GAN的目标函数定义如下:

\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) \\= {\rm E}{x\sim{p{data}(x)}}[\log D(x)] + {\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]

第一部分:判别器的优化通过\mathop {\max}\limits_D V(D,G)实现,V(D,G)为判别器的目标函数,

其第一项{\rm E}{x\sim{p{data}(x)}}[\log D(x)]表示对于从真实数据分布中采用的样本,其被判别器判定为真实样本概率的数学期望。对于真实数据分布中采用的样本,其预测为正样本的概率当然是越接近1越好。因此希望最大化这一项。

第二项{\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]表示:对于从噪声P_z(z)分布当中采样得到的样本,经过生成器生成之后得到的生成图片,然后送入判别器,其预测概率的负对数的期望,这个值自然是越大越好,这个值越大,越接近0,也就代表判别器越好。

第二部分:生成器的优化通过\mathop {\min }\limits_G({\mathop {\max }\limits_D V(D,G)})来实现。注意,生成器的目标不是\mathop {\min }\limits_GV(D,G),即生成器不是最小化判别器的目标函数,二是最小化判别器目标函数的最大值,判别器目标函数的最大值代表的是真实数据分布生成数据分布的JS散度,JS散度可以度量分布的相似性,两个分布越接近,JS散度越小。

7.1.4 GAN的目标函数和交叉熵有什么区别

判别器目标函数写成离散形式即为:

V(D,G)=-\frac{1}{m}\sum_{i=1}^{i=m}logD(x^i)-\frac{1}{m}\sum_{i=1}^{i=m}log(1-D(\tilde{x}^i))

可以看出,这个目标函数的交叉熵是一致的,即判别器的目标是最小化交叉熵损失,生成器的目标是最小化生成数据分布和真实数据分的JS散度。

7.1.5 GAN的Loss为什么降不下去

对于很多GAN的初学者在实践过程中可能会纳闷,为什么GAN的Loss一直降不下去。GAN到底什么时候才算收敛?其实,作为一个训练良好的GAN,其Loss就是降不下去的。衡量GAN是否训练好了,只能由人肉眼去看生成的图片质量是否好。不过,对于没有一个很好的评价是否收敛指标的问题,也有许多初学者做了一些研究,后文提及的WGAN就提出了一种新的Loss设计方式,较好的解决了难以判断收敛性的问题。

下面我们分析一下GAN的Loss为什么降不下去?对于判别器而言,GAN的Loss如下:

\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) \\= {\rm E}{x\sim{p{data}(x)}}[\log D(x)] + {\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]

\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G)可以看出,生成器和判别器的目的相反,也就是说两个生成器网络和判别器网络互为对抗,此消彼长。不可能Loss一直降到一个收敛的状态。

  • 对于生成器,其Loss下降快,很有可能是判别器太弱,导致生成器很轻易的就“愚弄”了判别器。
  • 对于判别器,其Loss下降快,意味着判别器很强,判别器很强则说明生成器生成的图像不够逼真,才使得判别器轻易判别,导致Loss下降很快。

也就是说,无论判别器,还是生成器。loss的高低不能代表生成器的好坏。一个好的GAN网络,其GAN Loss往往是不断波动的。

​ 看到这里可能有点让人绝望,似乎判断模型是否收敛就只能看生成的图像质量了。实际上,后文探讨的WGAN,提出了一种新的loss度量方式,让我们可以通过一定的手段来判断模型是否收敛。

7.1.6 生成式模型、判别式模型的区别

对于机器学习模型,我们可以根据模型对数据的建模方式将模型分为两大类,生成式模型和判别式模型。如果我们要训练一个关于猫狗分类的模型,对于判别式模型,只需要学习二者差异即可。比如说猫的体型会比狗小一点。而生成式的模型则不一样,需要学习猫长什么样,狗长什么样。有了二者的长相以后,再根据长相去区分。具体而言:

  • 生成式模型:由数据学习联合概率分布P(X,Y),然后由P(Y|X)=P(X,Y)/P(X)求出概率分布P(Y|X)作为预测的模型。该方法表示了给定输入X与产生输出Y的生成关系。
  • 判别式模型:由数据直接学习决策函数Y=f(X)或条件概率分布P(Y|X)作为预测模型,即判别模型。判别方法关心的是对于给定的输入X,应该预测什么样的输出Y。

对于上述两种模型,从文字上理解起来似乎是不太直观。我们举个例子来阐述一下,对于性别分类问题,分别用不同的模型来做:

1)如果用生成式模型:可以训练一个模型,学习输入人的特征X和性别Y的关系。比如现在有下面一批数据:

Y(性别)01
X(特征)01/43/4
13/41/4

这个数据可以统计得到,即统计人的特征X=0,1...的时候,其类别为Y=0,1的概率。统计得到上述联合概率分布P(X,Y)后,可以学习一个模型,比如让二维高斯分布去拟合上述数据,这样就学习到了X,Y的联合分布。在预测时,如果我们希望给一个输入特征X,预测其类别,则需要通过贝叶斯公式得到条件概率分布才能进行推断:P(Y|X)={\frac{P(X,Y)}{P(X)}}={\frac{P(X,Y)}{P(X|Y)P(Y)}}

2)如果用判别式模型:可以训练一个模型,输入人的特征X,这些特征包括人的五官,穿衣风格,发型等。输出则是对于性别的判断概率,这个概率服从一个分布,分布的取值只有两个,要么男,要么女,记这个分布为Y。这个过程学习了一个条件概率分布P(Y|X),即输入特征X的分布已知条件下,Y的概率分布。

显然,从上面的分析可以看出,判别式模型似乎要方便的多,因为生成式模型要学习一个X,Y的联合分布往往需要很多数据,而判别式模型需要的数据则相对少,因为判别式模型更关注输入特征的差异性,不过生成式既然使用了更多数据来生成联合分布,自然也能够提供更多的信息,现在有一个样本(X,Y),其联合概率P(X,Y)经过计算特别小,那么可以认为这个样本是异常样本。这种模型可以用来做outlier detection。

7.1.7 什么是mode collapsing

某个模式(mode)出现大量重复样本,例如:

上图左侧的蓝色五角星表示真实样本空间,黄色的是生成的。生成样本缺乏多样性,存在大量重复。比如上图右侧中,红框里面人物反复出现。

7.1.8 如何解决mode collapsing

方法一:针对目标函数的改进方法

为了避免前面提到的由于优化maxmin导致mode跳来跳去的问题,UnrolledGAN采用修改生成器loss来解决。具体而言,UnrolledGAN在更新生成器时更新k次生成器,参考的Loss不是某一次的loss,是判别器后面k次迭代的loss。注意,判别器后面k次迭代不更新自己的参数,只计算loss用于更新生成器。这种方式使得生成器考虑到了后面k次判别器的变化情况,避免在不同mode之间切换导致的模式崩溃问题。此处务必和迭代k次生成器,然后迭代1次判别器区分开[8]。

DRAGAN则引入博弈论中的无后悔算法,改造其loss以解决mode collapse问题[9]。

前文所述的EBGAN则是加入VAE的重构误差以解决mode collapse。

方法二:针对网络结构的改进方法

Multi agent diverse GAN(MAD-GAN)采用多个生成器,一个判别器以保障样本生成的多样性。具体结构如下:

相比于普通GAN,多了几个生成器,且在loss设计的时候,加入一个正则项。正则项使用余弦距离惩罚三个生成器生成样本的一致性。

MRGAN则添加了一个判别器来惩罚生成样本的mode collapse问题。具体结构如下:

输入样本x通过一个Encoder编码为隐向量E(x),然后隐向量被Generator重构,训练时,Loss有三个。D_MR(重构误差)用于指导生成real-like的样本。而D_D则对E(x)z生成的样本进行判别,显然二者生成样本都是fake samples,所以这个判别器主要用于判断生成的样本是否具有多样性,即是否出现mode collapse。

方法三:Mini-batch Discrimination

Mini-batch Discrimination在判别器的中间层建立一个mini-batch layer用于计算基于L1距离的样本统计量,通过建立该统计量,实现了一个batch内某个样本与其他样本有多接近。这个信息可以被判别器利用到,从而甄别出哪些缺乏多样性的样本。对生成器而言,则要试图生成具有多样性的样本。

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

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

相关文章

记一次小郭被挖矿后的应急响应

谨以此篇纪念我第n1次被挖矿经历。 时间:2024年3月18日(星期一) 地点:阿里云服务器 响应:确认–>抑制–>消除–>恢复–>总结 确认阶段: 2024年3月18日星期一早上收到了阿里云的短信和邮件…

城市道路井盖破损丢失目标检测数据集VOC-1377张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1377 标注数量(xml文件个数):1377 标注类别数:4 标注类别名称:["jg","jg…

2006-2021年各省能源消费总量数据(无缺失)

2006-2021年各省能源消费总量数据(无缺失) 1、时间:2006-2021年 2、来源:能源年鉴、各省年鉴 3、范围:30个省 4、指标:能源消费总量(万吨标煤) 5、缺失情况:无缺失 …

安卓Termux安装openssh结合内网穿透实现公网使用SFTP传输文件

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP(SSH File Transfer Protocol)是一种基于SSH(Secure Shell)安全协议的文件传输协议。与FTP协议相比,SFTP使用了…

将网址生成快捷方式的两种方式

在日常开发中,总会出现一些很奇怪的需求 1、生成桌面端快捷方式 1、点击右键,生成左面快捷方式。 2、可以将网址填入对象中。如:www.baidu.com。 3、修改快捷文件的图标。注意必须是原生的.icon文件。 4、注意事项。将小图标只能在本地可见&…

全球数字贸易产业联盟分享18个抓单秘诀让你业绩暴涨 | 箱讯科技

1、你就是企业 即使你所在的公司有庞杂的分支机构和几千名职工,但对于顾客来讲,公司就是你,同他直接接触的是你。顾客把你的公司看作一个仅为满足他要求的整体。结论一:不可以把问题推给另一部门;结论二:若…

git安装配置教程(小白保姆教程2024最新版)

目录 一、Git是什么?二、安装Git1.下载git2.安装git3.检测git 三、配置Git1.配置本地信息2.配置SSH1)SSH与SSH Key是什么?2)生成SSH Key3)获取ssh key公钥内容(id_rsa.pub)4)Github账号上添加公…

【鼠标悬浮,元素宽度增加,文字一个一个显示出来】

1、实现效果 2、实现思路 宽度变化: 给容器设置:hover时的宽度,通过transition: width 1s ease实现宽度的过渡效果文字一个一个出现:添加一个span标签,并设置文字不能换行,溢出隐藏。通过动画实现span宽度的增加 3、…

ARCM300智慧用电监控装置/剩余电流监测/温度监测/4G上传云平台/断电报警上传/电气火灾预警报警

ARCM300智慧用电在线监控装置是针对 0.4kV 以下的 TT、TN 系统设计的智能电力装置,具有单、三相交流电测量、四象限电能计量、谐波分析、开关量输入、继电器输出功能,以及 RS485 通讯或 GPRS 无线通讯功能,通过对配电回路的剩余电流、导线温度…

HANA计算视图的一切

我已经把BW4HANA的一切 一共几十篇文章都更新完了。当然还有很多想补充的,还没找到时间。 然后我发现,这个HANA 计算视图还是要好好写一写。 还有一些CDS View的创建,以前我写的,由于是上班抽空写的,总想着一篇写全&…

echarts tooltip提示框显示不全

一、背景: 写在前面: 自行封装。一个可由多个柱形图叠加而成的图表,命名为someHoverLine(可自定义)。 下面罗列了移动端和web端的封装组件代码; 展示了vue2、uniapp、vue3的不同封装和使用案列。 二、问题描述: 三、解…

策略模式类图与代码

某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满300返100),等等。现采用策略(Strategy)模式实现该要求,得到如图7.13 所示的类图。 【Java 代码】 import java.util…

开源大数据集群部署(二十)Trino部署

作者:櫰木 1 解压trino的包到opt目录 cd /root/bigdata tar -xzvf trino-server-389.tar.gz -C /opt/ ln -s /opt/trino-server-389 /opt/trino2 创建trino用户,并配置专属jdk11 useradd trino su – trino chown -R trino:hadoop /opt/trino-server-…

git常用命令合集,程序员必备技能,5分钟学会

仓库相关操作 1.git remote -v 查看当前仓库地址 2.git remote add origin 仓库地址:给当前git项目添加远程仓库绑定 3.git branch -M main : 重命名当前分支为main 4.git push -u origin main:将当前(main)分支上的内容上传到刚刚添加的origin远程库…

Java集合List

List特有方法 经典多态写法 // 经典的多态写法 List<String> list new ArrayList<>();常用API&#xff1a;增删改查 // 添加元素 list.add("Java"); // 添加元素到指定位置 list.add(0, "Python");// 获取元素 String s list.get(0);// 修改…

【Python】报错ModuleNotFoundError: No module named fileName解决办法

1.前言 当我们导入一个模块时&#xff1a; import xxx &#xff0c;默认情况下python解释器会搜索当前目录、已安装的内置模块和第三方模块。 搜索路径存放在sys模块的path中。【即默认搜索路径可以通过sys.path打印查看】 2.sys.path.append() sys.path是一个列表 list ,它里…

如何在Ubuntu系统使用docker部署DbGate容器并发布至公网可访问

文章目录 1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数据库管理工…

vue实现从本地上传头像功能

上传头像&#xff1a; <template><div><el-card class"box-card"><div slot"header" class"clearfix"><span>更换头像</span></div><div><!-- 图片、用来展示用户选择的头像 --><img…

2024年国内最受欢迎的10大热门城市

如果你还没有计划好2024年的旅游行程&#xff0c;不妨考虑这些热门城市&#xff0c;去感受它们的魅力吧&#xff01;在时光流转的车轮下&#xff0c;中国城市风貌日新月异&#xff0c;各具特色的城市正以其独特的魅力吸引着国内外的目光。 近日&#xff0c;依据大数据及网络热度…

功能强大的开源数据中台系统 DataCap 2024.03.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…