生成对抗网络GAN

GAN属于生成模型,使用生成数据分布PGP_{G}去无限逼近数据的真实分布PdataP_{data}。衡量两个数据分布的差异有多种度量,例如KL散度等,但是前提是得知道PGP_{G}。GAN利用discriminator巧妙地衡量了PG,PdataP_{G},P_{data}的差异性,利用discriminator和generator的不断竞争(minmax)得到了好的generator去生成数据分布PGP_{G}。

背景

很多时候,我们想输入一类数据,然后让机器学习这一类数据的模式,进而产生该类型新的数据。例如:

  • 输入唐诗三百首,输出机器写的唐诗
  • 输入一堆动漫人物的照片,输出机器生成的动漫人物照片

该问题的核心是原数据有其分布PdataP_{data},机器想要学习新的分布PGP_{G}去无限逼近PdataP_{data}。

一个简单的解决办法是采用异常检测的模型,通过输入大量的正常数据,让机器学习正常数据的内在规律。例如:自编码器模型如下。通过训练数据学习到数据的内在模式code。学习到code后,随机输入新的code便可以产生数据。

对于mnist数据,设code为2维,训练之后输入code得到的图片如下:

但是这种情况下,机器学习到的只是这个数据大概长什么样,而不是数据的真实分布。例如下图的两个7,在人看来都是真的图片7,但是机器却不这么认为。

结构

GAN由generator和discriminator两部分组成:

z -> G -> x' ->  D -> 01
          x  ->
  • generator:输入随机的zz,输出生成的x′x'
  • discriminator:二分类器,输入生成的x′x'和真实的xx,输出01(是否是真的数据)

GAN的训练,也包括generator和discriminator两部分:

  • discriminator的训练,设generator不变,通过调整discriminator的参数让discriminator尽可能区分开x,x′x,x'。
  • generator的训练,设discriminator不变,通过调整generator的参数让discriminator尽可能区分不开x,x′x,x'。

整体来看,generator和discriminator构成了一个网络结构,通过设置loss,保持某一个generator和discriminator参数不变,通过梯度下降更新另外一个的参数即可。

训练

最大似然估计

已知两个分布Pdata(x)P_{data}(x)和PG(x;θ)P_{G}(x;\theta),目标是找到GG的θ\theta使两个分布尽量接近。

采用最大似然估计,有:

θ∗=argmaxθ∏i=1mPG(xi;θ)=argmaxθ∑i=1mlogPG(xi;θ)≈argmaxθEx∼Pdata(x)[logPG(x;θ)]=argmaxθ∫Pdata(x)logPG(x;θ)dx−∫Pdata(x)logPdata(x)dx=argminθKL(Pdata(x)||PG(x;θ))

\begin{split} \theta^* &= \arg \max_{\theta} \prod_{i=1}^m P_{G}(x^i;\theta) \\ &= \arg \max_{\theta} \sum_{i=1}^m \log P_{G}(x^i;\theta) \\ &\approx \arg \max_{\theta} E_{x \sim P_{data}(x)} [\log P_{G}(x;\theta) ] \\ &= \arg \max_{\theta} \int P_{data}(x) \log P_{G}(x;\theta) dx - \int P_{data}(x) \log P_{data}(x)dx \\ &= \arg \min_{\theta} KL(P_{data}(x) || P_{G}(x;\theta)) \end{split}

也就是说,最大似然PG(x;θ)P_{G}(x;\theta)的概率等价于:最小化基于PG(x;θ)P_{G}(x;\theta)的编码来编码Pdata(x)P_{data}(x)所需的额外位元数。也就是最小化KL散度。

下面只需要计算出PG(x;θ)P_{G}(x;\theta),一切问题似乎都解决了。事实确实这样,不过对于不同的GG,PG(x;θ)P_{G}(x;\theta)计算的难易程度不同。如果GG是高斯混合模型(GMM)那么很好计算,但是通常数据的分布不是GMM那么简单,需要更复杂的GG。通常,GG是神经网络。这样的话,PG(x;θ)P_{G}(x;\theta)的计算便很困难,如下:

PG(x;θ)=∫Pprior(z)I[G(z)=x]dz

P_{G}(x;\theta) = \int P_{prior} (z) I_{[G(z)=x]} dz

这样来看,传统的最大似然是走不通呢,有没有别的出路呢?

考虑最大似然法真正解决的问题。最大似然就是提供了某种手段,去衡量两个分布Pdata(x)P_{data}(x)和PG(x;θ)P_{G}(x;\theta)的相近程度。此路不通另寻他路即可。因此便引出了下文的V(G,D)V(G,D)。

V(G,D)取代最大似然估计

V(G,D)V(G,D)是衡量两个分布Pdata(x)P_{data}(x)和PG(x;θ)P_{G}(x;\theta)相近程度的一种手段,其不同于最大似然,是通过一个额外的discriminator识别的好坏做评估的。其核心是:discriminator判别数据是真的数据(1)还是采样的数据(0)。如果两个分布很接近,那么discriminator分辨不清,效果比较差;如果两个分布很远,那么discriminator分辨清,效果比较好。

V(G,D)=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]

V(G,D) = E_{x \sim P_{data}} [\log D(x)] + E_{x \sim P_{G}} [\log (1-D(x))]

整个训练策略,是先固定GG选择D∗D^*去最大化V(G,D)V(G,D) ;然后固定D∗D^*选择GG去最大化V(G,D∗)V(G,D^*)。

G∗=argminGmaxDV(G,D)

G^* = \arg \min_{G} \max_{D} V(G,D)

D的训练

这部分解决的是:对于特定的G,如何训练得到更好的D。

D∗=maxDV(G,D)

D^* = \max_{D} V(G,D)

首先,对V(G,D)V(G,D)做进一步分解:

V(G,D)=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]=∫PdatalogD(x)dx+∫PGlog(1−D(x))dx=∫[Pdata(x)logD(x)+PG(x)log(1−D(x))]dx

\begin{split} V(G,D) &= E_{x \sim P_{data}} [\log D(x)] + E_{x \sim P_{G}} [\log (1-D(x))] \\ &= \int P_{data} \log D(x) dx + \int P_{G} \log (1-D(x)) dx \\ &= \int [P_{data}(x) \log D(x) + P_{G}(x) \log (1-D(x)) ]dx \end{split}

所以有:

D∗=argmaxDPdata(x)logD(x)+PG(x)log(1−D(x))

D^* = \arg \max_{D} P_{data}(x) \log D(x) + P_{G}(x) \log (1-D(x))

对上述式子求导得到:

D∗(x)=Pdata(x)Pdata(x)+PG(x)

D^*(x) = \frac{P_{data}(x) }{P_{data}(x) + P_{G}(x)}

每个D∗(x)D^*(x)对应的V(G,D∗)V(G,D^*)实际上衡量了特定GG下面两个分布Pdata(x)P_{data}(x)和$P_{G}差距。

将D∗(x)D^*(x)代入V(G,D∗)V(G,D^*),有:

所以:固定G优化D的过程,相当于计算两个分布的距离:

maxDV(G,D)=−2log2+2JSD(Pdata(x)||PG(x))

\max_{D} V(G,D) = -2\log 2 + 2JSD(P_{data}(x) || P_{G}(x) )

得到两个分布的距离之后,便转化成最小化两个分布的距离的问题, 也就是:

G∗=argminGmaxDV(G,D)

G^* = \arg \min_{G} \max_{D} V(G,D)

G的训练

固定G优化D得到D∗D^*便得到了两个分布的距离V(G,D∗)V(G,D^*),固定D∗D^*优化G,采用梯度下降即可。

算法

问题

G的更新优化不一定朝着最小的方向

优化G之后,原来的D对应的就不一定是maxV(G,D)\max V(G,D)最大的GG了,这样与我们的假设不同。 解决办法是:就像梯度更新的时候迈的步子不能太大;更新G的时候迈的步子也不要太大。

通过抽样估计分布

G中的目标函数

实际训练G的时候,目标函数需要做一些修改,修改的原因是:在刚开始训练的时候,DD能够很好的区分真实数据与模拟数据,这样P(G)P(G)中D(x)D(x)的值比较小。如果采用原来的目标函数,比较小的D(x)D(x)对应目标函数的斜率比较低,不容易学习。通过改变目标函数,使比较小的D(x)D(x)对应目标函数的斜率比较高,加快了学习速率,使模型更容易学习。

利用D去评估分布差异

理论上,可以用D去评估分布差异(G的好坏),D越好表明G越差,D越差表明G越好。但是实际中,这样评价的效果不好,不论G的好坏,D都比较好。

可能的原因之一:D太强大了。直观的解决办法是让D变弱一些,但是这样得到的D可否真正的计算JS divergence是个问题。

可能的原因之二:数据的本质是高维空间的manifold,很少有重叠。没有重叠的话,js距离永远都是最大值,不容易学习更新。

通常的解决办法是:给D的输入增加人为的噪声,这样真实数据与人造数据就会有重叠,D不能很好地区分真实数据与人造数据。同时要注意噪声要随时间减少。

mode collapse

mode collapse值的是GAN只学到了数据多个形态中的某一种。

可能的原因是优化式使GAN趋向如此:

其他GAN

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

TensorFlow从0到1 | 第九章“驱魔”之反向传播大法

上一篇8 万能函数的形态:人工神经网络解封了人工神经网络,如果用非常简短的语言来概括它,我更喜欢维基百科的诠释: 人工神经网络是一种模仿生物神经网络(动物的中...

2708
来自专栏机器人网

图解机器学习(清晰的路线图)

每当提到机器学习,大家总是被其中的各种各样的算法和方法搞晕,觉得无从下手。确实,机器学习的各种套路确实不少,但是如果掌握了正确的路径和方法,其实还是有迹可循的,...

4049
来自专栏数据处理

最大似然函数最大似然原理小结:最大似然估计法的一般步骤:例子:

1.1K2
来自专栏机器之心

业界 | 谷歌全新神经网络架构Transformer:基于自注意力机制,擅长自然语言理解

选自Google Research Blog 机器之心编译 参与:路雪、黄小天、蒋思源 近日,继论文《Attention Is All You Need》之后,...

5207
来自专栏深度学习之tensorflow实战篇

贝叶斯的概率推到,朴素贝叶斯分类器及Python实现

在了解贝叶算法前:要有一定的概率与数理统计基础以及注意事项 条件概率 首先,理解这两个公式的前提是理解条件概率,因此先复习条件概率。 P(A|B)=P(AB...

3496
来自专栏专知

【干货】机器学习中的五种回归模型及其优缺点

【导读】近日,机器学习工程师 George Seif 撰写了一篇探讨回归模型的不同方法以及其优缺点。回归是用于建模和分析变量之间关系的一种技术,常用来处理预测问...

4166
来自专栏PPV课数据科学社区

机器学习系列:(六)K-Means聚类

K-Means聚类 前面几章我们介绍了监督学习,包括从带标签的数据中学习的回归和分类算法。本章,我们讨论无监督学习算法,聚类(clustering)。聚类是用于...

4316
来自专栏专知

基于 word2vec 和 CNN 的文本分类 :综述 &实践

▌导语 ---- 传统的向量空间模型(VSM)假设特征项之间相互独立,这与实际情况是不相符的,为了解决这个问题,可以采用文本的分布式表示方式(例如 word ...

3999
来自专栏人工智能

机器学习实战-线性回归提高篇之乐高玩具套件二手价预测

作者:崔家华 编辑:王抒伟 线性回归 零 前言: 本篇文章讲解线性回归的缩减方法,岭回归以及逐步线性回归,同时熟悉sklearn的岭回归使用方法,对乐高玩具套件...

2067
来自专栏社区的朋友们

基于 word2vec 和 CNN 的文本分类 :综述 & 实践

于词向量和卷积神经网络的文本分类方法不仅考虑了词语之间的相关性,而且还考虑了词语在文本中的相对位置,这无疑会提升在分类任务中的准确率。

7.4K4

扫码关注云+社区