GAN-生成对抗网络原理
最近一直在看GAN,我一直认为只有把博客看了一遍,然后再敲一遍。这样才会有深刻的感悟。
GAN(生成式对抗网络)(GAN, Generative Adversarial Networks )是一种深度学习模型,分布在无监督学习上。
分成两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)。简单来说就是:两个人比赛,看是 A 的矛厉害,还是 B 的盾厉害。。
比如:我们有一些真实数据,同时也有随机生成的假数据。A把假数据拼命地模仿成真数据,B拼命地想把真实数据和假数据分开。
这里,A就是一个生成模型,类似于造假钞,一个劲的学习如何骗过B。B是一个判别模型,类似与警察,一个劲地学习如何分辨出A的造假技巧
然后,B的鉴别技巧越来越厉害,A的造假技术越来越逼真,成为一个一流的假币制造者。而GAN就是获得上述的两个模型。
我们需要同时训练两个模型。G:生成器。D:判别器。生成器G的训练过程是最大化判别器犯错误的概率,即判别器误以为数据是真实样本而不是生成器生成的假样本。因此,这一框架就对应于两个参与者的极小极大博弈。在所有可能的函数G和D中,我们可以求出唯一的均衡解,即G可以生成与训练样本相同的分布,而D判断的概率为1/2,意思就是D已经无法判别数据的真假。
为了学习到生成器在数据x上的分布P_g,我们先定义一个输入的噪声变量z,然后根据G将其映射到数据空间中,其中G为多层感知机所表征的可微函数。
同样要定义第二个多层感知机D,它的输出是单个标量。D(x)表示x是真实数据。我们训练D以最大化正确分配真实样本和生成样本的概率,引起我们就可以最小化log(1-D(G(z)))而同时训练G。也就是说判别器D和生成器对价值函数V(G, D)进行极小极大化博弈。
如上图所示,生成对抗网络会训练并更新判别分布(即D,蓝色的虚线),更新判别器后就能将数据真实分布(黑点组成的线)从生成分布P_g(G)(绿色实线)中判别出来。下方的水平线代表采样域Z,其中等距表示Z中的样本为均匀分布,上方的水平线代表真实数据X中的一部分。向上的箭头表示映射x = G(z)如何对噪声样本(均匀采样)施加一个不均匀的分布P_g.
(a) 考虑在收敛点附近的对抗训练:P_g和P_data已经十分相似,D是一个局部准确的分类器。
(b) 在算法内部循环中训练D,从数据中判别出真实样本,该循环最终会收敛到D(x) = P_data(x) / (P_data(x) + P_g(x))
(c) 随后固定判别器并训练生成器,在更新G后,D的梯度会引导G(z)流向更可能被D分类为真实数据的方向。
(d) 经过若干次训练后,如果G和D有足够的复杂度,那么他们就会到达一个均衡点,这时:P_g = P_data,即生成数据的概率密度函数等于真实数据的概率密度函数,生成数据 = 真实数据。在均衡点上D和G都不能进一步提升,并且判别器无法判断数据到底是来自真实样本还是伪造的数据,即D(x) = 1/2
公式推导(公式推导部分来自机器之心):
下面,我们必须证明该最优化问题也就是价值函数V(G, D),有唯一解并且该解满足P_G = P_data
将数学期望展开为积分形式:
其实求积分的最大值可以转化为求被积函数的最大值。而求被积函数的最大值是为了求得最优判别器D,因此不涉及判别器的项都可以被看做为常数项。如下所示:P_data(x)和P_G(x)都为标量,因此被积函数可表示为 a * D(x) + b * log(1 - D(x)).
若令判别器D(x)等于y,那么被积函数可以写为:
为了找到最优的极值点,如果a + b ≠ 0,我们可以用以下一阶导求解:
如果我们继续求表达式f(y)在驻点的二阶导:
最优生成器
当然GAN过程的目标是令P_G = P_data。
这意味着判别器已经完全困惑,它完全分辨不出P_date和P_G的区别,即判断样本来自P_data和P_G的概率都为1/2。基于这一观点,GAN的作者证明了G就是极小极大博弈的解。
GAN-生成对抗网络原理的更多相关文章
- 用MXNet实现mnist的生成对抗网络(GAN)
用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络(Generative Adversarial Network,简称GAN)由一个生成网络与一个判别网络组成.生成网络从潜在空间(la ...
- 生成对抗网络(GAN)
GAN的全称是 Generative Adversarial Networks,中文名称是生成对抗网络.原始的GAN是一种无监督学习方法,巧妙的利用“博弈”的思想来学习生成式模型. 1 GAN的原理 ...
- 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】
本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...
- 生成对抗网络(GAN)相关链接汇总
1.基础知识 创始人的介绍: “GANs之父”Goodfellow 38分钟视频亲授:如何完善生成对抗网络?(上) “GAN之父”Goodfellow与网友互动:关于GAN的11个问题(附视频) 进一 ...
- 生成对抗网络(Generative Adversarial Networks,GAN)初探
1. 从纳什均衡(Nash equilibrium)说起 我们先来看看纳什均衡的经济学定义: 所谓纳什均衡,指的是参与人的这样一种策略组合,在该策略组合上,任何参与人单独改变策略都不会得到好处.换句话 ...
- 使用生成对抗网络(GAN)生成手写字
先放结果 这是通过GAN迭代训练30W次,耗时3小时生成的手写字图片效果,大部分的还是能看出来是数字的. 实现原理 简单说下原理,生成对抗网络需要训练两个任务,一个叫生成器,一个叫判别器,如字面意思, ...
- 深度学习-生成对抗网络GAN笔记
生成对抗网络(GAN)由2个重要的部分构成: 生成器G(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器 判别器D(Discriminator):判断这张图像是真实的 ...
- GAN生成式对抗网络(一)——原理
生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型 GAN包括两个核心模块. 1.生成器模块 --generator 2.判别器模块--de ...
- 人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]本文衔接上一个随笔:人工智能中小样本问题相关的系列模型演变及学习 ...
- 生成对抗网络GAN介绍
GAN原理 生成对抗网络GAN由生成器和判别器两部分组成: 判别器是常规的神经网络分类器,一半时间判别器接收来自训练数据中的真实图像,另一半时间收到来自生成器中的虚假图像.训练判别器使得对于真实图像, ...
随机推荐
- PL/SQL 加字段 修改数据库之后 之后记得保存脚本
- Matlab 读取 ROS bag 文件指定消息数据
近期在接触Ros的时候遇到了一些问题,如何将rosbag中的信息提取出来进行进一步处理呢? 如三维点位置信息,视频信息(如果有的话)等等. 我采用的是MATLAB 读取bag信息 filepath=f ...
- shiro登录验证原理
这段时间有点忙,没咋写博客,今天打开staruml看到以前画的一张shiro原理图,先在这发一下,空了再好好进行分析.
- MySQL基本语句、存储引擎
数据库服务器中存放的是 库(文件加) 表(文件) 表里面是记录(一行数据)quit or exit 退出客户端\s \c \G 库(文件) 创建 create database ...
- 《python核心编程第二版》课后习题6-12答案
下午脑子瓦特,想了半天也没有想出算法,刚刚抽风终于实现了,特此记录. ̄□ ̄|| 题目 (a)创建一个名字为 findchr()的函数,findchr()要在字符串 string 中查找字符 char, ...
- Laravel 5.2--如何让表单提交错误,不清空?
控制器 public function store(Request $request) { $validator = Validator::make($request->all(), [ 'Su ...
- Apache 和 Tomcat联系和区别
作者:郭无心链接:https://www.zhihu.com/question/37155807/answer/72706896来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 搭建python的虚拟环境
文章连接:https://www.cnblogs.com/zlsgh/p/8485848.html ubuntu系统下Python虚拟环境的安装和使用 前言:进行python项目开发的时 ...
- 业务侧有大量timeout请求超时日志
故障背景:程序日志发现有程序请求数据库有大量的timeout请求故障时间:xxx~xxx 故障排查:排查应用服务器和数据库服务器网络和其它硬件监控没有断点,数据库监控请求数当时时间段几乎为0 故障分析 ...
- Math中的floor,round和ceil方法总结
floor向下取整,返回不大于的最大整数 Math.floor(1.4)=1.0ceil向上取整,返回不小于的最小整数 Math.ceil(1.4)=2.0round 四舍五入,将原来的数字加入0 ...