本博文主要讲解和总结生成对抗神经网络,也即是耳熟能详的GAN神经网络原理,将从数学层面详细的进行总结和分析。
GAN神经网络大致原理
整体learn过程

我们可以这样理解上图:首先随机初始化第一代的generator v1,利用generator v1生成的sample 作为负样本,真实的sample 作为正样本,训练出第一代的Discriminator v1,这里可以将所有的Discriminator 视为Binary classifier,这样第一代的分类器就能辨别出第一代的生成器所生成的样本;随之我们可以由第一代的分类器,使得generator v1 能够演化成generator v2,也就是第二代的生成器,第二代生成器生成的样本能够够顺利的骗过Discriminator v1,也就是Discriminator v1可能会将 generator v2生成的sample错误的判别为正类,由此我们再以generator v2生成的sample作为负样本,真实样本作为正样本,再训练出第二代的分类器Discriminator v2;由此一直进行下去,我们可以不断的迭代更新分类器,生成器。
GAN - Discriminator
上面简单的总结了下整个的learn 的过程,这里稍微详细的讲下Discriminator 是如何learn 的。

初代生成器generator v1通过Randomly sample a vector 生成一些样本标记为0,将real sample 标记为1,由此构建出了正负样本数据集,可以训练出第一代的生成器 Discriminator v1,以后每代的生成器都是如此learn 出来的。
GAN - Generator
那么generator 具体是如何learn 迭代更新的呢?

第一代的生成器generator v1生成的样本,肯定比较 fake,与真实样本差距较大,那么第一代的 Discriminator v1 就会 output 出一个比较低的分数来反映该生成样本的真实程度,接下来要做的就是update generator v1 的参数,得到第二代generator v2,这个新的生成器产生的样本要很realistic ,就是要能骗过第一代生成器,那么该generator v2 是如何learn 生成呢?
Generator + Discriminator = a network
我们将上一代的
Generator 和
Discriminator 看做一个
network,并且固定住
Discriminator,利用
gradientdescent 更新
Generator参数,使之
Discriminator 的
output 越接近
1 越好。
GAN数学原理
上面只是大致的讲了下其原理,下面将从数学层面详细的进行总结分析。
最大似然估计
- 给出真实样本集的分布:Pdata(x)
- 由生成器生成的样本集分布:PG(x;θ) parameterized by θ
如果 PG(x;θ)是 Gaussian Mixture Model,则θ 表示均值和方差。
我们希望 PG(x;θ) 与 Pdata(x)越相像越好。
我们可以从Pdata(x) 中随机sample 出几个样本 {x1,x2,...,xm},假定θ 已经给定,那么我们可以计算出上面sample 出的xi 在生成样本集中的机率。
那么我们可以有最大似然函数得到从Pdata(x) 中随机sample 出的这几个样本 {x1,x2,...,xm} 在生成样本集中的概率:
L = ∏i=1mPG(xi;θ)
并且计算
θ∗ 使得上式子取最大。
可以对上式进行简单的推导如下:

KL散度
这里需要稍微讲下 KL 散度相关知识。
相对熵,又称KL散度( Kullback–Leibler divergence),是描述两个概率分布P和Q差异的一种方法。它是非对称的,这意味着D(P||Q) ≠ D(Q||P)。特别的,在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布,相对熵越小表示拟合的越好。
设 P(X) 和 Q(X) 是X 取值的两个离散概率分布,则 P(X) 对 Q(X) 的相对熵为:
D(P||Q)=∑xϵXP(x)logP(x)Q(x)=∫P(x)logP(x)Q(x)
在最开始时,大家把Gaussian Mixture Model 当做 PG(x;θ),可能由于模型过于简单,或者又是Gaussian Mixture Model 与 Pdata(x) 差太多,没有办法真正的模拟 Pdata(x),生成的样本与真实样本差距太大。
那么PG(x;θ) 可以很复杂,所以现在广泛用nerual network 当做 PG(x;θ),θ 就是nerual network 的参数。理论上说单隐层神经网络可以逼近任何连续函数。但是因为nerual network很复杂,所以对从Pdata(x) 中随机sample 出几个样本 {x1,x2,...,xm},比较难的求出其概率,则difficult to compute the likelihood。
那么问题来了,怎么样更新G的参数,使其能拟合Pdata(x)呢?
Basic Idea of GAN
Generator G (Hard to learn by maximum likelihood)
- G是一种任意的函数,输入Z,输出X
- 计算PG(x;θ)
Discriminator D
- D是一种函数,输入X,输出标量
-
Evaluate PG(x;θ) 与 Pdata(x) 的 difference
那么D是如何检测G与Pdata(x),定义一个函数V(G,D),
G∗=argminGmaxDV(G,D)
那么V 是如何定义呢?
V = Ex∼Pdata[logD(x)] + Ex∼PG[log(1−D(x))]
x∼Pdata:表示从
Pdata 的分布中随机抽取样本
x。
x∼PG:表示从
PG 的分布中随机抽取样本
x。
在给定G 时,maxV(G,D) 可以表示 PG和PD之间的差异程度(原因看下面),那么要找出D∗,使得V(G,D) 最大:

继续推导:

由此可见,求得的 D∗能衡量Pdata与PG相似程度。再将 D∗ 代入到 V 中得:


需要注意的是KL散度是非对称的,这里需要介绍下Jensen−Shannon divergence(对称性):

由此可见,maxV(D,G)可以表示 PG和PD之间的差异程度,在求得D∗和V(G,D∗)后,剩下的问题就是求G∗了。

也就是求下式:

我们可以 user gradient descent 求 G∗:

G、D更新流程
算法整体目标就是:

- 给定G0
求出D∗1,使得V(G0,D)最大。
V(G0,D) is the JS divergence between PG and Pdata
在给定D∗1情况下,求θG←θG−η ∂V(G,D∗1),求得G1
这一步需要注意:在固定D∗时,在use gradient descent更新G时,其V不一定在减小啊,甚至可能会比之前的V(G0,D)还要大?

上图中,横坐标表示D,纵坐标表示V,故在update G时,步伐不能太大。
在给定G1情况下,求得D∗1,使得V(G1,D)最大
- 以此类推,不断迭代更新G,D
实际train流程
V = Ex∼Pdata[logD(x)] + Ex∼PG[log(1−D(x))]
x∼Pdata:表示从
Pdata 的分布中随机抽取样本
x。
x∼PG:表示从
PG 的分布中随机抽取样本
x。
我们需要Maximize上面的V,由此上式可以转变成求:

上式中的xi是从Pdata中sample出来的;x˜i是从PG中sample出来的。
上式可等价于:

可以将D看着一个二分类器,那么xi是从Pdata中sample出来的,为正类样本;x˜i是从PG中sample出来的,为负类样本。也即是:

那么其损失函数为:

注意下:L为损失函数,其两项之前应有负号。
整体算法流程

需要注意:在learn D时,需要train多次,就是训练多个epoch,而在learn G时,只需要一次。