前言
上一篇文章投了之后,一直想试水深度学习,刚好由于研究需要接触到图像生成技术,以及当下最火的GAN。目前GAN有好多变种,但自己先学好这种Genarative Adversarial的思想,变种的理解就会很简单,也可以根据规律创建出自己的变种。这个笔记主要是整理台大Prof. 李宏毅的讲课视频,原链接在Generative Adversarial Network 好了,废话不多说,我们直接进入正题。
1.1 GAN的简介
直观的说,我们要讲的GAN[1]有点道高一尺魔高一丈的感觉,举一个不恰当的例子就是魔术师跟观众,新手魔术师和新手观众刚入行时专业技能还不够高,新手魔术师一变戏法就被新手观众识破,新手魔术师不甘心,去苦练魔术技巧,终于可以骗过新手观众,观众不服被骗也开始学习魔术知识,就这样此消彼长,魔术师练就成为顶尖大师,做到以假乱真!
GAN的基本结构如下:
GAN其实可以看成是AE的一个横向的扩展,生成图像不是一蹴而就的,要有个过程。同样,机器判断对生成图像的判别能力逐步提高的,一代Generator生成image, 一代Discriminator可以成功判断出这张image是real还是fake,为了不让Discriminator判别出生成image的这就,Generator evolution到下一代,生成更real的image,这时可以骗过一代Discriminator,但无法骗过二代…..以此类推, Generator和Discriminator的各种的会随着evolution的次数增加而不断增强,最后一代Generator生成他图片
Gn(z)
G
n
(
z
)
已经以真实图片接近,Discriminator无法分辨生成图片和真实图片,也就是达到纳什均衡!这篇笔记先对GAN的前世今生做一个简单的回顾,最后从概率统计的角度分析GAN的原理,最后指出原生GAN存在的缺陷,下一篇文章会将,针对这些缺陷有哪些改进思路和一些衍生的GAN
1.2 Why GAN?
其实在GAN之前,图像生成技术已经有:AE,VAE等
AE思想简单的说就是,先用NN把输入的image编码成一串code,再用NN把code解码成一张image,训练的时候保证输入和输出尽量接近。使用时,直接拿出解码器,输入任意串code就能生成一张图片。很简单,对不对?可是,这种方法生成的图片更像是已有图片的平均,很不真实。为了生成更real的图片,researcher提出了VAE[1]:
其中 σ1,σ2,σ3 σ 1 , σ 2 , σ 3 是噪声,VAE的详细原理这里不细讲。但我们有个重要的思想就是: 在原有的AE的结构上增加一定的噪声就会训练出更Robust的解码器,VAE的有一个问题呢,就是机器的判断准则会影响实验结果,如下:
我们人来判断的话,右边的图就比左边的图更真实一些,但对机器来说,都是多一个像素,两种图片的真实性是一样的!出现这个情况的原因是机器分辨图片的能力是固定的(我们事先设定好的一个标准),有一种自然的想法就是,机器要是可以像人一样,能力随着阅历的增加而增强。这句话,熟悉吧,就是机器学习要做的东西。这里我们引入第二个重要的思想, 就是逐步求精的思想,到后边你就会发现,这种思想真的好用。上述提到的两种思想可以说是GAN的雏形。为了进一步了解生成模型,我们说一下生成的思想
1.3 用分布来描述生成
统计机器学习中,这个世界是从分布中抽样产生的,也就是说上帝是一个distribution function,这个世界中的所有object都是sample。具体到图像中就是,用
Pdata(x)
P
d
a
t
a
(
x
)
描述某一类图像,
{x1,x2,...,xm}
{
x
1
,
x
2
,
.
.
.
,
x
m
}
是这类图像中的samples,因为我们不知道
Pdata(x)
P
d
a
t
a
(
x
)
到底是什么,就只好用一个已知的分布(如Gaussian distribution)
PG(x;θ)
P
G
(
x
;
θ
)
逼近
Pdata(x)
P
d
a
t
a
(
x
)
,找这个已知分布
PG(x;θ)
P
G
(
x
;
θ
)
就是要找出不同的参数
θ
θ
,有点统计学知识的童鞋应该就知道怎么做了吧,就是极大似然估计(Maximum likelihood estimation),找出来的
θ
θ
就是
真正求解的时候就可以用样本均值代替期望。把上式的期望按照定义展开,并加一个与 θ θ 无关的项
这就是说,找到让 PG(x;θ) P G ( x ; θ ) 最接近 Pdata(x) P d a t a ( x ) 的参数 θ∗ θ ∗ ,其实就是KL divergence最小的 θ θ ,KL divergence是用来衡量两个distribution差异的,如果两个分布完全相同,这KL divergence为0。后边的推导就会发现,GAN中的discriminator要做的就是计算生成分布与真实分布的与KL divergence相关的一个散度。
有了这些基础,我们就可以把生成任务尤其是图像生成任务描述成:用一个已知的参数
θ
θ
为分布
PG(x;θ)
P
G
(
x
;
θ
)
去逼近未知的分布
Pdata(x)
P
d
a
t
a
(
x
)
,divergence用来评价逼近的好坏,为了能最大程度的逼近,我们取
θ
θ
为divergence最小的分布
PG(x;θ∗)
P
G
(
x
;
θ
∗
)
然而,这个世界是相当复杂的,我们要解决的问题也不可能用一些简单的已知分布就能轻易描述出来。还好,我们有Neural Network,不管多复杂的函数都能用NN逼近,可以证明,一个distrubution输入到NN中,输出的也是distribution。如下:
我们说NN可以生成一个分布:
但是,新生成的分布 PG(x;θ) P G ( x ; θ ) 是无法用maximum likelihood estimation来计算的!我们需要一个新的能判断 PG(x;θ) P G ( x ; θ ) 与 Pdata(x) P d a t a ( x ) 接近程度的方法。这时,我们就引入GAN。
1.4 GAN的原理
上边指出,用NN把一个简单的distribution映射成复杂的distribution后,无法用MLE计算复杂distribution的参数,也就是无法用KL divergence估计两个distribution的差异。GAN提出的目的就是为了找出一种新的衡量distribution差异的方法。基本思路就是:
其中,V(G,D)称为value function(价值函数)
解释这个式子之前要先明白一个道理:GAN中, generator的目的是为了生成尽可能骗过discriminator的照片,discriminator的目标是尽可能不被骗。discriminator的输出越接近1,则说明图片越real,越接近0则说明图片越fake
现在详细解释value function的含义:给定generator,从已有data中(真实图片)sample一些点出来丢进discriminator中去判断,因为是真实图片,我们肯定希望discriminator能完全判断为真,也就是**希望**discriminator输出值越接近1越好,我们把价值定义为真实性判别值的对数
logD(x)
log
D
(
x
)
,图片越真,价值越大。因此要最大化价值的期望
Ex∼Pdata[logD(x)]
E
x
∼
P
d
a
t
a
[
log
D
(
x
)
]
,反过来说,从G中(生成图片)中sample一些点出来丢进discriminator中去判断,因为是生成图片,我们肯定希望discriminator能判断为假,对于假照片,肯定是价值越小越好,因此要最小化期望
Ex∼PG[logD(x)]
E
x
∼
P
G
[
log
D
(
x
)
]
,也就是最大化
Ex∼PG[log(1−D(x))]
E
x
∼
P
G
[
log
(
1
−
D
(
x
)
)
]
,综合起来就是
同样的,给定discriminator后,generator的目标就是要骗过discriminator,就是要生成价值很小的image,所以要
我们分开来看,给定generator后,如何 maxV(G,D) max V ( G , D ) ? 把 V(G,D) V ( G , D ) 按期望的定义展开
利用微元思想,整个函数的最大值等于每个微元最大值的累加,所以微元取最大值的点与整个积分取最大值的点一样,即:
这就变成一个很简单的求函数极值的问题,哈哈,有初等数学的知识童鞋都知道这个怎么求!求导呗!令 f(D)=0 f ( D ) = 0 , blablabla…. 具体就不写啦,直接给出答案:
所以,给定 G G ,上式可以算出最好的,那给定不同的 G1,G2,...,Gn G 1 , G 2 , . . . , G n 就可以算出不同的 D∗1,D∗2,...D∗n D 1 ∗ , D 2 ∗ , . . . D n ∗ 如下:
接下来,把求出的这个 D∗ D ∗ 带回到 V(G,D) V ( G , D ) 中,用期望的定义展开:
JSD(∙||∙) J S D ( ∙ | | ∙ ) 称为Jensen-Shannon divergence,取值范围是 [0,log2] [ 0 , log 2 ] 。我们就得出,与MLE不同,GAN中discriminator其实估计两个分布的J-S divergence,到目前为止,我们要解决的问题就是:
GAN中有G和D,我们要寻找 G∗ G ∗
使得G∗=minGmaxDV(G,D) G ∗ = min G max D V ( G , D )
为了求 G∗ G ∗ ,给定 G G 后求出
求出最优的 D∗ D ∗ ,再给定 D∗ D ∗ 用
minGL(D∗) min G L ( D ∗ )
求 G∗ G ∗
对于最优化问题,大家熟悉的就是gradient descend方法啦,这里要注意的是与传统ML中的GD方法不同,GAN中有discriminator和generator,我们要给定一个,用GD求另一个。另外,要注意一下,积分运算在用计算机解时转化成sample的离散化方法,即用样本均值代替期望:
连续化表示的上式就离散化成
其中 x1,x2,...,xm x 1 , x 2 , . . . , x m 为 Pdata P d a t a 的样本, x̃ 1,x̃ 2...,x̃ 3 x ~ 1 , x ~ 2 . . . , x ~ 3 为 PG P G 的样本,很像二分类器的loss吧!具体算法如下图:
主要思路就是,固定G,先用梯度下降算法更新D的参数,再固定D,用梯度下降更新G。
1.5 GAN存在的问题
实测时,Goodfellow并没有选择
Ex∼PG[log(1−D(x))]
E
x
∼
P
G
[
log
(
1
−
D
(
x
)
)
]
而是选择
Ex∼PG[log(−D(x))]
E
x
∼
P
G
[
log
(
−
D
(
x
)
)
]
,这个原因就是说:
刚开始 [log(1−D(x))] [ log ( 1 − D ( x ) ) ] 的梯度下降的很慢,导致D很强。另一个在实测中出现的问题是,训练很多次后最强的D依然比最强的G,强很多
这个图说明,随着训练次数的增加D已经接近可以完全分分辨出那些是fake那些是real,这显然不是我们要的结果(分不清real&fake)
这个图是说,尽管loss(loss 使用J-S divergence衡量)上已经接近0了,但用不同类型的G生成不同的image质量差距很大。出现D过强和loss很小,G质量不高的原因就是: J-S divergence 并不是最好的衡量两个分布的标准。(下一节解释如何改进)
原生GAN最大的还有一个问题就是mode collapse(模式坍塌) 一个简单的栗子说明一下collaps,如下所示:
假设某个data distribution有两个模式,generator可能就学到一个mode,另一个mode则完全没学到。或者有一个mode,只能学到该mode的一部分!比如说data中的数据主要是室内和室外场景,但我们训练出的GAN可能只产生室内场景的图片。
下一节重点分析,针对原生GAN存在的问题,我们可以做哪些改进,以及这些改进目前的一些成果。
参考文献
[1] Goodfellow I J, Pougetabadie J, Mirza M, et al. Generative Adversarial Nets[C]. neural information processing systems, 2014: 2672-2680.
[2] Kingma D P, Welling M. Auto-Encoding Variational Bayes[J]. 2013.