【李沐论文精读】GAN精读

论文:Generative adversarial nets

参考:GAN论文逐段精读、生成对抗网络、李沐视频精读系列

一、介绍

        什么是GAN?

        GAN(Generative adversarial network,生成对抗网络),它由生成器G(Generator Neural Network)和判别器D(Discriminator Neural Network)组成,生成器G负责生成样本,判别器D负责判断生成器生成的样本是否为真。生成器要尽可能迷惑判别器,而判别器要尽可能区分生成器生成的样本和真实样本。

        生成器G从给定噪声中(一般是指均匀分布或者正态分布)采样来合成数据,判别器D用于判别样本是真实样本还是G生成的样本。G的目标就是尽量生成真实的图片去欺骗判别网络D,使D犯错;而D的目标就是尽量把G生成的图片和真实的图片分别开来。二者互相博弈,共同进化,最终的结果是D(G(z)) = 0.5,此时G生成的数据逼近真实数据(图片、序列、视频等)。

        最后我们希望生成器G生成的样本能“以假乱真”。


二、相关工作(Related Work)

        之前的生成模型总是想构造一个分布函数出来,同时这些函数提供了一些参数可以学习。这些参数通过最大化对数似然函数来求解。这样做的缺点是,采样一个分布时,求解参数算起来很难,特别是高维数据。因为这样计算很困难,所以最近有一些Generative Machines,不再去构造分布函数,而是学习一个模型来近似这个分布。前者真的是在数学上学习出一个分布,明明白白知道数据是什么分布,里面的均值方差等等到底是什么东西。而GAN就是通过一个模型来近似分布的结果,而不需要构造分布函数。这样计算起来简单,缺点是不知道最终的分布到底是什么样子。

        DBM 和 我们的 generative models 有什么区别?

  • DBM:一定要学分布,知道均值、方差等一系列参数
  • GAN:用一个模型学习你想要的结果,答对题就行。
三、GAN的目标函数与求解
3.1 目标函数

        GAN最简单的框架就是模型都是MLP。

        (1) 生成器G是要在数据x上学习一个分布p_g(x),其输入是定义在一个先验噪声z上面,z的分布为p_{z}(z)。生成模型G的任务就是用MLP把z映射成x

  • 比如图片生成,训练图片是224*224,每个像素是一个随机变量,那么x就是一个50176维的随机变量,变量每个元素都是p_g(x)控制的。
  • 不管最终x如何生成,假设不同的生成图片其实就是那么100来个变量控制的,而MLP理论上可以拟合任何一个函数。那么我们就构造一个100维的向量,MLP强行把z映射成x。所以z可以先验的设定为一个100维向量,其均值为0,方差为1,呈高斯分布。(这样算起来简单)
  • 随机设定z为100维向量的缺点,就是MLP并不是真的了解背后的z是如何控制输出的,只是学出来随机选一个比较好的z来近似x,所以最终效果也就一般。
  • G的可学习参数是G(z;\theta _{g})

        (2) 判别器D是输出一个标量(概率),判断其输入是G生成的数据/图片,还是真实的数据/图片。

  • D的可学习参数是D(x;\theta_{d})
  • 对于D,真实数据label=1,假的数据label=0

        (3) 两个模型都会训练

  • G的目标是希望生成的图片“越接近真实越好,D(G(z))变大接近1,也就是最小化log(1-D(G(z))),记作\underset{G}{min}
  • D的目标是最大化logD(x),记作\underset{D}{max}

        由此最终目标函数公式如下:

其中,E代表期望,X\rightarrow P_{data}代表分布为P_{data}的真实样本,Z\rightarrow p_z(z)代表分布为P_{z}(z)的生成样本。公式中的\underset{G}{min}\, \underset{D}{max}则是对抗网络的训练。

假设x和z都是一维向量,且z是均匀分布,模型训练过程可以表示为:

如上图所示:虚线点为真实数据分布,蓝色虚线是判别器D的分布,绿色实线为生成器G的分布。初始训练出生成器网络G和判别器网络D;从a到d是我们希望的训练过程。

a. 生成器从均匀分布学成绿色实线表示的高斯分布,这时候判别器还很差;
b. 判别器学成图b所示的分布,可以把真实数据和生成数据区别开来;
c.生成器波峰靠向真实数据波峰,自然就使得判别器难以分辨了;辨别器为了更准,其分布也往真实数据靠拢;
d.最终训练的结果,生成器拟合真实分布,判别器难以分辨,输出概率都为0.5 。

3.2 求解过程

算法迭代过程如下:

        k是一个超参数,不能太小也不能太大。要保证判别器D可以足够更新,但也不能更新太好。

  • 如果D更新的不够好,那么G训练时在一个判别很差的模型里面更新参数,继续糊弄D意义不大;
  • 如果D训练的很完美,那么log(1-D(G(z)))趋近于0,求导结果也趋近于0,生成器难以训练。

整体来说GAN的收敛是很不稳定的,所以之后有很多工作对其进行改。

四、理论结果
4.1 全局最优解p_{g}=p_{data}

        这部分需要证明目标函数\underset{G}{min}\underset{D}{max}V(D,G)有最优解,且这个解当且仅当p_{g}=p_{data}时成立,也就是生成器学到的分布等于真实数据的分布。

       (1) 固定生成器G,最优的辨别器应该是:

  • *表示最优解
  • p_gp_{data}表示x在生成器拟合的分布里面,和真实数据的分布里面,它的概率分别是多少。
  • p_{g}=p_{data}时,结果为1/2,表示两个分布完全相同,最优的判别器也无法将其分辨出来。
  • 这个公式的意义是,从两个分布里面分别采样数据,用目标函数\underset{G}{min}\underset{D}{max}V(D,G)训练一个二分类器,如果分类器输出的值都是0.5,则可以认为这两个分布是完全重合的。在统计学上,这个叫two sample test,用于判断两块数据是否来自同一分布。

        (2) 把D的最优解代回目标函数,目标函数之和G相关,写作C(G)并最小化这一项就行。

        (3)证明当且仅当p_{g}=p_{data}时有最优解C(G)=-log4

  • 上式两项可以写成KL散度,即:

  • 又因为JS散度定义为:

JSD(P\parallel Q)=\frac{1}{2}D(P\parallel M)+\frac{1}{2}D(Q\parallel M)

M=\frac{1}{2}(P+Q)

  • 简化为:C(G)=-log4+2\cdot JSD(p_{data}\parallel p_g)
  • 要求minC(G),只有最后一项等于0时成立(JS散度≥0),此时p_{g}=p_{data}

ps:JS散度跟KL散度的区别是前者是对称的,p_gp_{data}可以互换,而后者不对称。

4.2 收敛证明

        这部分证明了:给定足够的训练数据和正确的环境,在算法1中每一步允许D达到最优解的时候,对G进行下面的迭代:

训练过程将收敛p_{g}=p_{data},此时生成器G是最优生成器。

五、结论

GAN的优点

  • 比其它模型生成效果更好(图像更锐利、清晰)。
  • GAN能训练任何一种生成器网络(理论上-实践中,用 REINFORCE 来训练带有离散输出的生成网络非常困难)。大部分其他的框架需要该生成器网络有一些特定的函数形式,比如输出层是高斯的。重要的是所有其他的框架需要生成器网络遍布非零质量(non-zero mass)。
  • 不需要设计遵循任何种类的因式分解的模型,任何生成器网络和任何判别器都会有用。
  • 无需利用马尔科夫链反复采样,无需在学习过程中进行推断(Inference),回避了近似计算棘手的概率的难题。

GAN的缺点

  • 难以收敛(non-convergence)。目前面临的基本问题是:所有的理论都认为 GAN 应该在纳什均衡(Nash equilibrium)上有卓越的表现,但梯度下降只有在凸函数的情况下才能保证实现纳什均衡。当博弈双方都由神经网络表示时,在没有实际达到均衡的情况下,让它们永远保持对自己策略的调整是可能的【OpenAI Ian Goodfellow的Quora】。
  • 难以训练:崩溃问题(collapse problem)。GAN模型被定义为极小极大问题,没有损失函数,在训练过程中很难区分是否正在取得进展。GAN的学习过程可能发生崩溃问题(collapse problem),生成器开始退化,总是生成同样的样本点,无法继续学习。当生成模型崩溃时,判别模型也会对相似的样本点指向相似的方向,训练无法继续。
  • 无需预先建模,模型过于自由不可控。与其他生成式模型相比,GAN不需要构造分布函数,而是使用一种分布直接进行采样,从而真正达到理论上可以完全逼近真实数据,这也是GAN最大的优势。然而,这种不需要预先建模的方法缺点是太过自由了,对于较大的图片,较多的 pixel的情形,基于简单 GAN 的方式就不太可控了(超高维)。

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

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

相关文章

原理篇-- 定时任务xxl-job-服务端(admin)项目执行器注册执行器任务状态回调

文章目录 前言一、执行器注册&执行器任务状态回调触发时机:二、服务端接收执行器和任务执行状态请求:2.1 JobApiController:2.2 AdminBiz 接口:2.3 AdminBiz 接口实现类AdminBizImpl:2.4 执行器注册:2.5 执行器的移…

长电科技斥资45亿元收购晟碟半导体80%股权

2024年3月3日,西部数据公司旗下间接全资子公司SanDisk中国有限公司与长电科技有限公司(JCET集团有限公司的全资子公司)签订了股权购买协议。根据协议,SanDisk中国将向JCET出售其间接全资子公司、在中国注册成立的外商独资有限责任…

如何把已安装的nodejs高版本降级为低版本

第一步.先清空本地安装的node.js版本 按健winR弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出,输入cmd再点击回车键) 然后进入命令控制行窗口,并输入where node查看之前本地安装…

HTML(基本标签)

HTML标签 <div>div标签</div> <span>这是一个span标签</span> <p>段落标签</p> 图片标签 --相对路径 <img src"../images/手.bmp/" alt"图像显示不出来的时候用文字替换" title"这是一个提示文本"…

android开发游戏加速器,Android架构组件Room功能详解

Java基础 Java Object类方法HashMap原理&#xff0c;Hash冲突&#xff0c;并发集合&#xff0c;线程安全集合及实现原理HashMap 和 HashTable 区别HashCode 作用&#xff0c;如何重载hashCode方法ArrayList与LinkList区别与联系GC机制Java反射机制&#xff0c;Java代理模式Jav…

【Spring Cloud原理详解】介绍

Spring Cloud Spring Cloud基于Spring Boot提供了在分布式系统&#xff08;如配置管理、服务发现、断路器、智能路由、微代理、控制总线&#xff09;中常见模式的一站式解决方案&#xff0c;Spring Cloud使用了Spring Boot的开发便利性&#xff0c;简化了分布式系统基础设施的…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&#xf…

Spring MVC 面试题及答案整理,最新面试题

Spring MVC中的DispatcherServlet是什么&#xff0c;它如何工作&#xff1f; DispatcherServlet是Spring MVC中的核心组件&#xff0c;负责协调不同的请求处理器。它的工作流程包括&#xff1a; 1、请求接收&#xff1a; 接收HTTP请求&#xff0c;并将其转发到相应的处理器。…

鱼哥赠书活动第⑩期:一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

鱼哥赠书活动第⑩期&#xff1a; 内容简介&#xff1a;作者简介&#xff1a;读者对象&#xff1a;直播预告&#xff1a;购书链接&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c…

【Python 识别某滑块的距离】今天来换思维搞滑块,不用识别库,几行代码就能搞定,仅供学习

写作日期&#xff1a;2024.03.05 使用工具&#xff1a;Python 温馨提示&#xff1a;此方法仅对有完整图和缺口图的滑块有效&#xff0c;可精准识别出缺口要滑动的距离 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES处理&#xff08;直接…

SpringCloud之OpenFeign入门与实战系列

目录 一、什么是 OpenFeign? 1.1 OpenFeign 功能升级 二、OpenFeign超时重试机制 2.1 超时重试机制 2.2 自定义超时重试机制 2.2.2 自定义超时重试类 2.3 OpenFeign 超时重试的底层原理 一、什么是 OpenFeign? OpenFeign 的全称为 Spring Cloud OpenFeign(下文简称 Op…

[Uniapp]携带参数跳转界面(两种方法)

一、方法1&#xff1a;路由携参 假设现在有两个界面&#xff1a;界面A和界面B。并要由界面A跳转到界面B&#xff0c;则我们可以使用 uni.navigateTo({}) 跳转界面时&#xff0c;将参数附加在URL后&#xff0c…

newSingleThreadExecutor和newFixedThreadPool(1)的区别

维护仅有一个线程的线程池有如下两种方式&#xff0c;正常使用的情况下&#xff0c;二者差异不大&#xff1b;复杂使用环境下&#xff0c;二者存在细微的差异。用newSingleThreadExecutor方式创建的线程池在任何时刻至多只有一个线程&#xff0c;因此可以理解为用异步的方式执行…

Android中 在目录下创建文件的权限添加 流程

Android中读写目录涉及到的权限一般有三个&#xff0c;一个是selinux, 另一个是用户组, 还有一个是目录本身权限问题&#xff0c;本文章针对这三点做详细解析 目录 一: Selinux权限问题 1: 先查看进程SSSPID的标签 2: 再查看要访问的目录的标签 二: 被访问目录本身权限问…

《剑指offer》14--剪绳子(整数拆分)[C++]

目录 题目描述 贪心算法 输出结果 题目描述 把一根绳子剪成多段&#xff0c;并且使得每段的长度乘积最大。 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释:…

Android开发技术总结,附项目源码

今天本文主要讲解&#xff1a; APK文件反编译 什么是反编译如何防止反编译APK文件的基本构造 APK加固的方案原理 APK加固总体架构APK打包基本流程Dex文件的意义 AES加密项目实战 APK加固项目实战APK脱壳技术实战 一.APK文件反编译 1.什么是反编译 定义&#xff1a; 利用…

Java后端核心——Servlet

目录 一.概述 二.基础实现 1.导入坐标 2.定义实现类 3.注解 4.访问Servlet 三.执行流程 四.生命周期 1.加载和实例化 2.初始化 3.请求处理 4.服务终止 五.方法 1.init 2.service 3.destroy 4.getServletInfo 5.getServletConfig 六.体系结构 七.urlPatter…

第二节 JDBC SQL语法

结构化查询语言(SQL)是一种标准化语言&#xff0c;允许对数据库执行操作&#xff0c;例如&#xff1a;创建数据记录&#xff0c;读取内容&#xff0c;更新内容和删除数据记录等。 本教程中将概述SQL&#xff0c;这是了解和学习JDBC概念的前提条件。 经过本章后&#xff0c;您将…

【C++】7-1 简单加法 分数 15

7-1 简单加法 分数 15 全屏浏览 切换布局 作者 刘利 单位 惠州学院 编写add函数&#xff0c;通过函数重载&#xff0c;实现对变量num&#xff0c;增加值n。num增加n的规则如下&#xff1a; 如果num和n都是数值&#xff0c;则num的值变为numn。 如果num为字符&#xff0c;…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…