重读经典:《Generative Adversarial Nets》

GAN论文逐段精读【论文精读】

这是李沐博士论文精读的第五篇论文,这次精读的论文是 GAN。目前谷歌学术显示其被引用数已经达到了37000+。GAN 应该是机器学习过去五年上头条次数最多的工作,例如抖音里面生成人物卡通头像,人脸互换以及自动驾驶中通过传感器采集的数据生成逼真的图像数据,用于仿真测试等。这里李沐博士讲解的论文是 NeurIPS 版,与 arXiv 版稍有不同。

GAN 论文链接:https://proceedings.neurips.cc/paper/2014/file/5ca3e9b122f61f8f06494c97b1afccf3-Paper.pdf


1. 标题、作者、摘要

首先是论文标题GAN 就取自于论文标题首字母,论文标题中文意思是:生成式对抗网络。机器学习里面有两大类模型:一种是分辨模型,例如 AlexNetResNet 对数据进行分类或预测一个实数值、另一种就是生成模型,用于生成数据本身。Adversarial 是对抗的意思,第一次读的时候可能不知道什么意思,先放在这里,接着往下读。最后是 Nets,网络的意思,不过建议大家还是写成 Networks 比较规范一些。

下面是论文作者,一作大家很熟悉了,他的另一个代表作就是深度学习经典书籍(花书):《深度学习》,通信作者是深度学习三巨头之一,2018年图灵奖的获得者。

这里有一个小八卦,当时一作在给论文取标题时,有人说 GAN 这个词在中文里写作干,和英语里的 fxxk 意思很接近,但是意义上丰富多了,一作就说这个好,就用它了。
在这里插入图片描述
下面是论文摘要,摘要总共七句话。

  • 前三句话介绍我们提出了一个新的 framework, 通过对抗过程估计生成模型;我们同时会训练两个模型,一个是生成模型 GGG,生成模型用来捕获数据的分布,另一个模型是辨别模型 DDD,辨别模型用来判断样本是来自于训练数据还是生成模型生成的。生成模型 GGG 的训练过程是使辨别模型犯错概率最大化实现的,当辨别模型犯错概率越大,则生成模型生成的数据越接近于真实数据。整个framework类似于博弈论里的二人对抗游戏。
  • 第四句话是说,在任意函数空间里,存在唯一解,GGG 能找出训练数据的真实分布,而 DDD 的预测概率为 12\frac{1}{2}21,此时辨别模型已经分辨不出样本的来源。
  • 最后就是说生成模型和辨别模型可以通过反向传播进行训练,实验也显示了提出的框架潜能。
    在这里插入图片描述

2. 导言、相关工作

下面是 Introduction 部分,总共3段。

  • 第一段说深度学习在判别模型取得了很大的成功,但是在生成模型进展还很缓慢,主要原因是在最大似然估计时会遇到很多棘手的近似概率计算,因此作者提出一个新的生成模型来解决这些问题。
  • 第二段作者举了一个例子来解释对抗网络。生成模型好比是一个造假者,而判别模型好比是警察,警察需要能区分真币和假币,而造假者需要不断改进技术使警察不能区分真币和假币。
  • 第三段说生成模型可以通过多层感知机来实现,输入为一些随机噪声,可以通过反向传播来训练。
    在这里插入图片描述

然后是相关工作部分,这里有件有趣的事。当时GAN作者在投稿时,Jürgen Schmidhuber 恰好是论文审稿者,Jürgen Schmidhuber 就质问:“你这篇论文和我的 PM 论文很相似,只是方向相反了,应该叫 Inverse PM 才对”。然后Ian就在邮件中回复了,但是两人还在争论。

一直到NIPS2016大会,Ian 的 GAN Tutorial上,发生了尴尬的一幕。Jürgen Schmidhuber 站起来提问后,先讲自己在1992年提出了一个叫做 Predictability Minimization 的模型,它如何如何,一个网络干嘛另一个网络干嘛,接着话锋一转,直问台上的Ian:“你觉得我这个 PM 模型跟你的 GAN 有没有什么相似之处啊?” 似乎只是一个很正常的问题,可是 Ian 听完后反应却很激烈。Ian 表示:“Schmidhuber 已经不是第一次问我这个问题了,之前我和他就已经通过邮件私下交锋了几回,所以现在的情况纯粹就是要来跟我公开当面对质,顺便浪费现场几百号人听tutorial 的时间。然后你问我 PM 模型和 GAN 模型有什么相似之处,我早就公开回应过你了,不在别的地方,就在我当年的论文中,而且后来的邮件也已经把我的意思说得很清楚了,还有什么可问的呢?”

关于Jürgen Schmidhuber 和 Ian之间争论的更多趣事可以看这篇文章:从PM到GAN——LSTM之父Schmidhuber横跨22年的怨念。


3. 模型、理论

下面开始介绍 Adversarial nets。为了学习生成器在数据 x\boldsymbol{x}x 上的分布 pgp_gpg,我们定义输入噪声变量 pz(z)p_{\boldsymbol{z}}({\boldsymbol{z}})pz(z),数据空间的映射用 G(z;θg)G(\boldsymbol{z};\theta_g)G(z;θg) 表示,其中 GGG 是一个可微分函数(多层感知机),其参数为 θg\theta_gθg。我们再定义第二个多层感知机 D(x;θd)D(\boldsymbol{x};\theta_d)D(x;θd),其输出为标量。D(x)D(\boldsymbol{x})D(x) 表示数据 x\boldsymbol{x}x 来自真实数据的概率。

下面是训练策略,我们同时训练生成模型 GGG 和判别模型 DDD。对于判别模型 DDD,我们通过最大化将正确标签分配给训练样本和生成器生成样本的概率来训练;对于生成模型 GGG,我们通过最小化 log⁡(1−D(G(z)))\log (1-D(G(\boldsymbol{z})))log(1D(G(z))) 来训练,总结为:

  • D(x)D(\boldsymbol{x})D(x) 概率越大,判别器训练越好,log⁡D(x)\log D(\boldsymbol{x})logD(x) 越大;
  • D(G(z))D(G(\boldsymbol{z}))D(G(z)) 概率越小,判别器训练越好,log⁡(1−D(G(z)))\log (1-D(G(\boldsymbol{z})))log(1D(G(z))) 越大;
  • D(G(z))D(G(\boldsymbol{z}))D(G(z)) 概率越大,生成器训练越好,log⁡(1−D(G(z)))\log (1-D(G(\boldsymbol{z})))log(1D(G(z))) 越小;

在这里插入图片描述
下图是对抗网络训练的直观示意图,黑色曲线是真实样本,绿色曲线为生成样本,蓝色曲线为判别概率。可以看到在 (a) 阶段,真实样本和生成样本分布不一致,此时判别器能够正确区分真实样本和生成样本。到 (d) 阶段,真实样本和生成样本分布几乎一致,此时判别器很难再区分二者,此时判别器输出概率为 12\frac{1}{2}21
在这里插入图片描述
算法1是整个对抗网络的正式描述,对于判别器,我们通过梯度上升来训练;对于生成器,我们通过梯度下降来训练
在这里插入图片描述
在实际训练时,公式(1)往往不能提供足够的梯度让生成器去学习。因为在学习的早期阶段,生成器 GGG 性能很差,判别器 DDD 有着很高的置信度判别数据来源。在这种情况,log⁡(1−D(G(z)))\log (1-D(G(\boldsymbol{z})))log(1D(G(z))) 存在饱和现象。因此在这个时候,我们通过最大化 log⁡D(G(z))\log D(G(\boldsymbol{z}))logD(G(z)) 来训练生成器 GGG

在这里插入图片描述


下面是 Theoretical Results,对于任意给定的生成器 GGG,则最优的判别器 DDD 为:
DG∗(x)=pdata (x)pdata (x)+pg(x)D_{G}^{*}(\boldsymbol{x})=\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})} DG(x)=pdata (x)+pg(x)pdata (x)

下面是证明过程,对于给定的生成器 GGG,判别器 DDD 通过最大化期望 V(G,D)V(G,D)V(G,D) 来训练, V(G,D)V(G,D)V(G,D) 为:
V(G,D)=∫xpdata (x)log⁡(D(x))dx+∫zpz(z)log⁡(1−D(g(z)))dz=∫xpdata (x)log⁡(D(x))+pg(x)log⁡(1−D(x))dx\begin{aligned} V(G, D) &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x})) d x+\int_{\boldsymbol{z}} p_{\boldsymbol{z}}(\boldsymbol{z}) \log (1-D(g(\boldsymbol{z}))) d z \\ &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x}))+p_{g}(\boldsymbol{x}) \log (1-D(\boldsymbol{x})) d x \end{aligned} V(G,D)=xpdata (x)log(D(x))dx+zpz(z)log(1D(g(z)))dz=xpdata (x)log(D(x))+pg(x)log(1D(x))dx

已知 (a,b)∈R2(a, b) \in \mathbb{R}^{2}(a,b)R2,函数 y→alog⁡(y)+blog⁡(1−y)y \rightarrow a \log (y)+b \log (1-y)yalog(y)+blog(1y)aa+b\frac{a}{a+b}a+ba 处取得最大值。

在这里插入图片描述
根据上面的证明,在最优判别器处,则有最大期望值 −log⁡4-\log4log4
在这里插入图片描述


最后简单总结下,虽然在本文中,作者做的实验现在来看比较简单,但是整个工作是一个开创性的工作,GAN 属于无监督学习研究,而且作者是使用有监督学习的损失函数去训练无监督学习;而且本文的写作也是教科书级别的写作,作者的写作是很明确的,读者只看这一篇文章就能对GAN有足够的了解,不需要再去看其它更多的文献。

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

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

相关文章

一步步编写操作系统 62 函数调用约定

由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿。 函数调用约定是什么? 调用约定,calling co…

重读经典:《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》

ViT论文逐段精读【论文精读】这次李沐博士邀请了亚马逊计算机视觉专家朱毅博士来精读 Vision Transformer(ViT),强烈推荐大家去看本次的论文精读视频。朱毅博士讲解的很详细,几乎是逐词逐句地讲解,在讲解时把 ViT 相关…

给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!

lower_bound算法返回第一个大于等于给定值所在的位置。设置两个指针start和last,其中start指向数组的起始位置,last指向数组末尾位置之后的位置。当start和last指向相同位置时循环结束。mid指向[start,last)区间的中间位置,当中间位置元素值大…

详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments

本文介绍一篇 关于IMU 标定的经典论文,论文收录于 ICRA14,在论文中作者介绍了如何不适用外部设备标定 IMU 加速度和角速度偏差、尺度系数、轴偏移参数。 论文链接:https://readpaper.com/paper/2021503353、https://readpaper.com/paper/221…

重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》

MoCo 论文逐段精读【论文精读】这次论文精读李沐博士继续邀请了亚马逊计算机视觉专家朱毅博士来精读 Momentum Contrast(MoCo),强烈推荐大家去看本次的论文精读视频。朱毅博士和上次一样讲解地非常详细,几乎是逐词逐句地讲解,在讲…

【HRBUST - 1623】Relation(思维模拟,拆解字符串)

题干: 一天,ikki在看书的时候发现书上有个类似于家谱状的插图,突然ikki想到了一个有趣的现象:有时候用某个人一连串 的关系描述另一个人的时候,最后可能还是他本身。例如:小明的爸爸的爸爸和小明的爷爷是同…

一步步编写操作系统 67 系统调用的实现1-2 68

接上文: 系统调用的子功能要用eax寄存器来指定,所以咱们要看看有哪些系统调用啦,在linux系统中,系统调用是定义在/usr/include/asm/unistd.h文件中,该文件只是个统一的入口,指向了32位和64位两种版本。在a…

【HDU - 6662】Acesrc and Travel(树形dp,博弈dp)

题干: Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, along with Zhang and Liu, is going to travel to Hong Kong. There are nnspots in Hong Kong, and n−1n−1 bidirectional sightseeing bus routes …

一步步编写操作系统 69 汇编语言和c语言共同协作 70

由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用。 会两种不同语言的人,只是掌握了同一件事物的两种表达方式。人在学习一种新语言时,潜意识里是建立了语言符号与事物形象…

一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法。咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量。如今我们要写一个打印函数了&a…

【CodeForces - 208C 】Police Station(单源最短路条数,起点终点建图,枚举顶点)

题干: The Berland road network consists of n cities and of m bidirectional roads. The cities are numbered from 1 to n, where the main capital city has number n, and the culture capital — number 1. The road network is set up so that it is possi…

【Chrome浏览器】常用快捷键整理

标签页和窗口快捷键 1. Ctrl n 打开新窗口 2. Ctrl t 打开新的标签页,并跳转到该标签页 3. Ctrl Shift t 重新打开最后关闭的标签页,并跳转到该标签页 4. Ctrl Tab 跳转到下一个打开的标签页 5. Ctrl Shift Tab 跳转到上一个打开的标签页 6.…

【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别

读入数据与预处理 因为老师给的文件无法直接读取,故从官网导入数据: 官网链接:http://www.cs.nyu.edu/~roweis/data.html 导入数据之后要对MATLAB文件进行读入: datasio.loadmat(trainfile) 对文件type一下: ty…

一步步编写操作系统 77 内联汇编与ATT语法简介

内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它…

【Python学习】内置函数(不断更新)

关于常用在for循环中的range函数 python range() 函数可创建一个整数列表,一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range&#…

【Python学习】 简单语法与常见错误(持续更新)

关于单引号和双引号 当输出的字符串内部没有单引号的时候,外面可以用单引号, 但是如果内部有了单引号,那么外部只能用双引号。 dict {Name: Zara, Age: 7, Class: First} print(dict) print (dict[Name]: , dict[Name]) print ("dic…

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。 在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要…

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE,这是一篇比较新的文章,2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view,但是在英文社区,大家反应比较平淡一点,R…

【Python学习日志】 - Numpy包

NumPy是什么? 使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数(尺寸)…