本篇文章为Goodfellow提出的GAN算法的开山之作"Generative Adversarial Nets"的学习笔记,若有错误,欢迎留言或私信指正。

1. Introduction

GAN模型解决的问题

作者在首段指出了本课题的意义——能够避免深度生成模型中的两个局限性:

(1)最大似然估计等相关策略中难以处理的概率计算;

(2)在生成环境中难以利用分段线性单元的优势。

PS:深度生成模型是为了从原始的样本数据中模拟出数据分布,进而产生符合这一分布的新的样本。

GAN模型的构成

GAN模型主要分为两个部分:生成模型\(G\)(generative model)和判别模型\(D\)(discriminative model)。作者将这两个部分的关系类比为假币制造商和警察。判别模型(警察)来判断一个样本究竟是来自于数据分布还是模型分布,而生成模型(假币制造商)则是为了生成假的样本来骗过判别模型(警察)。这样产生的竞争驱使两方都不断更新自己的方法,直到假样本与真样本完全无法区分。框架中的生成模型通过将随机噪声输入多层感知机进而得到假样本,而判别模型则是将样本输入多层感知机来判断样本是否为真实样本。作者指出,同时训练这两个模型的方法是使用反向传播算法(backpropagation algorithm)和丢弃算法(应该是“随机失活算法”,之前表述有所错误)(dropout algorithm)

ps:多层感知机(Multi Layer Perceptron) 为如下图所示的包括至少一个隐藏层(除去一个输入层和一个输出层以外)的多层神经元网络。

2. Related work

作者在这一部分介绍了有关深度生成网络的相关工作,由于还没有系统掌握深度学习,暂且跳过。。。

3. Adversarial nets

作者定义了两个函数:

  • \(G\left(\boldsymbol{z} ; \theta_{g}\right)\)表示从噪音\(\boldsymbol{z}\)到数据样本空间的映射函数,其中\(\theta_{g}\)表示多层感知机的参数。
  • \(D(\boldsymbol{x};\theta_d)\)表示对于输入样本\(\boldsymbol{x}\)输出判断为真实数据的概率(为一个标量)

GAN的目标

作者将GAN的目标定义为下面这个优化公式:

\[\min_G \max_D V(D,G)=\mathbb{E}_{\mathbf{x}\sim p_{data}(x)}[\log D(x)]+\mathbb{E}_{\mathbf{z}\sim p_z}[\log (1-D(G(z)))]
\]

这个公式由两部分构成,前一部分 \(\mathbb{E}_{\mathbf{x}\sim p_{data}(x)}[\log D(x)]\) 可以理解为判别模型正确判定真实数据的对数期望,后一部分\(\mathbb{E}_{\mathbf{z}\sim p_z}[\log (1-D(G(z)))]\)可以理解为判别模型正确识别假样本的对数期望。

相对熵?

后面重新看这个公式的时候突然想到一个问题:为什么公式中求期望时要在概率值的外面再套一个log函数呢?

还没有完全想明白,感觉有点像是交叉熵和相对熵的概念,但是又无法将上述公式和相对熵的公式定义一一对应起来。

可以先可以参考这个链接:机器学习中的各种“熵”(这个博客页面是真的卡)

后面作者在Theoretical Results部分果然用到了交叉熵的概念,用来证明这个公式的目标就是实现\(p_g=p_{data}\)

图形理解

下面这张图我看了一晚上没看懂,今天早上才明白是什么意思。

图中蓝色的虚线表示判别模型的概率分布,黑色的点线表示原始数据的概率分布,绿色实线表示生成模型的生成概率分布。

  • 图(a)中表示训练还未开始或刚开始一段时间时,判别模型和生成模型都还没有经过大量的训练,因此判别概率分布还有些波动,生成分布距离真实数据生成分布还有不小的距离。
  • 图(b)表示经过一段时间的训练后,判别模型可以较好的判别出原始样本和生成样本,蓝色虚线的高度表示当前位置对应横坐标的样本为真实数据样本的概率,越高表示为真实样本的概率越大。
  • 图(c)表示继续训练一段时间之后,原始样本和生成样本更加接近,判别模型还是有相对不错的判别效果。
  • 图(d)表示经过足够的训练之后,原始样本与生成样本的概率分布特征基本一致,判别模型失去判别效果。

算法1

算法1原文描述

算法1中文python伪代码描述(这是个什么鬼东西)

for i in range(训练的迭代次数)):
for j in range(k步):
从噪音分布中取出m个噪音样本
从数据分布中取出m个样本
利用随机梯度上升法更新判别器D
从噪音分布中取出m个噪音样本
利用随机梯度下降法更新生成器G

4. Theoretical Results

全局最优\(p_g=p_{data}\)

作者给出了第一个命题:当生成模型\(G\)固定时,最优判别器为:$$D^*G(x)=\frac{p{data}(x)}{p_{data}(x)+p_g(x)}$$

并且作者也给出了证明,证明的思路很简单,形如\(y \rightarrow a \log (y)+b \log (1-y)\)的式子在\([0,1]\)区间内有固定的最大值为\(\frac{a}{a+b}\)。

这样一来,原公式就可以替换成下式:

\[\begin{aligned} C(G) &=\max _{D} V(G, D) \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{z} \sim p_{z}}\left[\log \left(1-D_{G}^{*}(G(\boldsymbol{z}))\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \left(1-D_{G}^{*}(\boldsymbol{x})\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \frac{p_{g}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right] \end{aligned}
\]

再利用KL散度(相对熵)公式:

\[D_{KL}(P||Q)=\sum_{i=1}^np_i\log (\frac{p_i}{q_i})
\]

可以将刚刚的式子替换为

\[C(G)=V(G^*,D)=-\log (4)+K L\left(p_{\text {data }} \| \frac{p_{\text {data }}+p_{g}}{2}\right)+K L\left(p_{g} \| \frac{p_{\text {data }}+p_{g}}{2}\right)
\]

进一步可以利用JS散度公式进行替换:

\[C(G)=-\log (4)+2 \cdot J S D\left(p_{\mathrm{data}} \| p_{g}\right)
\]

由JS散度公式的性质——即取值范围为\([0,1]\)因此可知\(C(G)\)的最小值为\(-\log (4)\),此时JS散度公式取0,并且此时唯一解为\(p_g=p_{data}\)

5. Experiments

6. Advantages and disadvantages

作者指出,生成式对抗网络有以下四个优势:

  • 根据实验结果来看,比其他模型产生了更锐利、清晰的样本。
  • 生成式对抗网络能够被用来训练任何一种生成器网络。
  • 不需要设计遵循任何种类的因式分解的模型。
  • 无需利用马尔可夫链反复采样,回避了棘手的近似计算的概率问题。

GAN目前存在的主要问题是:

  • 解决不收敛的问题

GAN算法笔记的更多相关文章

  1. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  2. 算法笔记--数位dp

    算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...

  3. 算法笔记--lca倍增算法

    算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...

  4. 算法笔记--STL中的各种遍历及查找(待增)

    算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...

  5. 算法笔记--priority_queue

    算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...

  6. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  7. 算法笔记——C/C++语言基础篇(已完结)

    开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...

  8. 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...

  9. 算法笔记(c++)--回文

    算法笔记(c++)--回文 #include<iostream> #include<algorithm> #include<vector> using namesp ...

随机推荐

  1. js中的循环方式及各种遍历的方法

    for循环  1.for有三个表达式:①声明循环变量:②判断循环条件:③更新循环变量:三个表达式之间,用;分割, for循环三个表达式都可以省略,但是两个“;”缺一 不可. 2.for循环的执行特点: ...

  2. Git暂存本地代码,强制获取远程最新代码

    一:git stash  // 把本地修改的代码压到git栈中去 二:git pull  // 本地代码压栈之后,pull远程代码会完全覆盖本地代码 三:git stash list  // 可以查看 ...

  3. 使用php安装pcntl模块

    想添加个php多进程任务,突然发现服务器上php不支持pcntl扩展,再看了下也没有phpize这个模块 首先看下当前php版本 [root@htest ~]# php -v PHP 5.3.3 (c ...

  4. FreeSql (十五)查询数据

    FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...

  5. cssrelative

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. JVM类加载器以及双亲委派模型

    从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...

  7. NGUI_基础入门学习

    目录 1. Control Widgets 控制部件2. Anchors 锚3. Interaction 交互4. Menu 菜单5. Controller Input 控制器的输入6. Lights ...

  8. 工业控制或办公局域网中的192.168.X.X网段

    IPv4地址分为A.B.C.D.E五类,除去特殊作用的D.E两类,剩下的A.B.C三类地址是我们常见的IP地址段.A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机, ...

  9. jsp作用域总结

    我们在定义每一个变量,每一个属性的时候,都会考虑这个变量.属性的作用范围,也就是作用域. JSP的四大作用域 作用域对象 作用域范围 page 只在当前页面有效 request 一次请求的生命周期内有 ...

  10. Day 13 linux 的输入输出与管道的使用

    1.重定向概述 1.什么是重定向 将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中.比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中.这样第二天通过查看文件的内容就知道昨天备份 ...