[算法分析]GAN的数学原理 - 从生成模型到信息熵

生成模型

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。它给观测值和标注数据序列指定一个联合概率分布。在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布(带标签的数据)。条件概率分布可以由生成模型根据贝叶斯定理形成[1]。

生成模型的定义与判别模型相对应:生成模型是所有变量的全概率模型,而判别模型是在给定观测变量值前提下目标变量的条件概率模型。因此生成模型能够用于模拟(即生成)模型中任意变量的分布情况,而判别模型只能根据观测变量得到目标变量的采样。判别模型不对观测变量的分布建模,它不能够表达观测变量与目标变量之间更复杂的关系。因此,生成模型更适用于无监督的任务,如分类和聚类[1]。

如果观测数据是由生成模型中采样的,那么最大化数据似然概率是一个常见的方法。但是,大部分统计模型只是近似于真实分布,如果任务的目标是在已知一部分变量的值的条件下,对另一部分变量的推断(例如图像分类问题,已知图像推断其标签),那么可以认为这种模型近似造成了一些对于当前任务来说不必要的假设。在这种情况下,使用判别模型对条件概率函数建模可能更准确,尽管具体的应用细节会最终决定哪种方法更为适用[1]。

典型的生成模型包括[1]:

  • 高斯混合模型和其他混合模型;
  • 隐马尔可夫模型;
  • 随机上下文无关文法;
  • 朴素贝叶斯分类器;
  • AODE分类器;
  • 潜在狄利克雷分配模型;
  • 受限玻尔兹曼机.

为什么需要GAN[2]

GAN: Generative Adversarial Network,生成对抗网络。

对于生成模型,例如图像生成,模型通过学习一些数据,然后生成类似的数据,例如让机器看一些动物图片,然后自己来产生动物的图片,可以基于Auto-Encoder、VAE(实现很简单,推导很复杂)等。

(AutoEncoder,端到端训练。由于中间code的分布我们无法知道,因此难以直接在code的空间中采样,必须要特殊处理才行。)

然而,如果采用MSE(极大似然估计)作为loss,会导致生成的图像比较糊,这是因为我们人类对图像好坏的判断,与MSE是不一致的,例如下面两个图的MSE是一样的,但是我们认为第一个图会好一些(他们的区别是图像中多余的那个点的位置)。

GAN可以解决这个问题,它是基于MLE(极大似然估计)的,同时GAN还可以生成从来不存在的图像(通过采样),从而构造很多有趣的应用,例如图像复原、风格迁移、给人物加上眼镜什么的。VAE从另一个角度也实现了生成模型,且生成的效果更不容易发生混乱(逻辑错位等),但是VAE生成的图比较糊,如果把GAN和VAE结合,将取得更好的效果,本文只介绍GAN的数学原理。

GAN的结构

GAN 有两个网络,一个是生成器generator(G),一个是判别器discriminator(D),从二人零和博弈中受启发,通过两个网络互相对抗来达到最好的生成效果[2]。流程如下:

generator用来生成图片,discriminator用来判断图片是否是生成的。

训练是交替进行的,首先固定discriminator,训练generator,使discriminator无法区分generator生成的图片与样本集中的图片;然后固定generator,训练discriminator,使之能区分generator生成的图片与样本集中的图片,这样完成了第一代训练。然后仍然按照这个过程,反复交替训练generator和discriminator,直到算法收敛,此时generator生成的图像几乎就没法与样本图像区分了。

那么,generator与discriminator的结构是怎么样的呢?如下图所示[3]:

generator: 输入低维的随机噪声(先不要困惑,后面解释为什么),输出图像;
discriminator: 输入图像,输出一个标量,二分类,靠近1表示真,靠近0表示假。

GAN的数学推导过程

数据集中图像的密度函数(目标分布)为: P d a t a ( x ) P_{data}(x) Pdata(x)
生成器生成的图像分布: P G ( x ; θ ) P_{G}(x;\theta) PG(x;θ) θ \theta θ是生成器的参数。

为了能够让我们生成各种图像X,我们需要依概率 P G ( x ; θ ) P_{G}(x; \theta) PG(x;θ)在图像空间采样,这是比较困难的,因为我们很难表示、求取、采样这么复杂的分布,但是我们可以这样操作:对于Encoder-Decoder结构,我们只保留Decoder部分。这样,Decoder输入code,我们记code为随机变量Y,输出X,就是我们生成器产生的图像;我们可以假定Y服从某简单分布,例如:标准高斯分布,这样我们可以依高斯分布的概率在Y空间中采样(分布已知、维度较低),然后由于X=G(Y),我们设G是这个Decoder所表示的函数,则X的分布由Y与G的参数决定,从数学上讨论,我们可以先写出分布函数 F G ( X &lt; X 0 ) = F ( G ( Y ) &lt; X 0 ) = F ( Y &lt; G − 1 ( X 0 ) ) F_{G}(X&lt;X_{0})=F(G(Y)&lt;X_{0})=F(Y&lt;G^{-1}(X_{0})) FG(X<X0)=F(G(Y)<X0)=F(Y<G1(X0)),由于Y的分布是已知的,因此我们就得到了 F G ( X ) F_{G}(X) FG(X),然后对这个式子求导,我们就得到了 P G ( X ) P_G(X) PG(X),这个分布由G的参数确定。

我们的训练样本 x i x^{i} xi为在 P d a t a ( x ) P_{data}(x) Pdata(x)中的采样,似然为:

L = ∏ i = 1 m P G ( x i ; θ ) L=\prod_{i=1}^{m}P_G(x^i;\theta) L=i=1mPG(xi;θ)

最大化这个似然,有:

可见最小化 P d a t a ( x ) P_{data}(x) Pdata(x) P G ( x ; θ ) P_{G}(x;\theta) PG(x;θ)的KL散度即可得到在图像集上参数 θ \theta θ的极大似然估计。

那么,训练函数如何设计呢?这也是GAN最有技巧性的地方。

构造训练函数如下:

V ( G , D ) = E x ∼ P d a t a [ l o g ( D ( x ) ) ] + E x ∼ P G [ 1 − l o g ( D ( x ) ) ] V(G, D)=\mathbb{E}_{x\sim P_{data}}\left[ log(D(x)) \right] + \mathbb{E}_{x\sim P_{G}}\left[ 1-log(D(x)) \right] V(G,D)=ExPdata[log(D(x))]+ExPG[1log(D(x))]

其中G表示生成器,D表示判别器。我们下面证明,固定G,调整D,最大化这个函数,则得到的就是上面推导的似然;然后在此基础上固定D,调整G,最小化这个函数,则为极大似然估计。交替进行,则实现逐渐优化,下面证明固定G的情况,如果成立则固定D的情况由上面的推导保证正确。

给定G,调整D最大化 V ( G , D ) V(G, D) V(G,D),记为 D ∗ D^* D,我们先求出 D ∗ D^* D的表达式:

如果对于任何x这个被积分的式子都是最大的,那么这个积分也就是最大的:

我们把 D ∗ D^* D的表达式代入 V ( G , D ) V(G, D) V(G,D),有:

我们想办法凑出JS散度(后面单独介绍什么是JS散度)的形式:

JS散度类似KL散度,同样表现了两个分布之间的差异,同样都是两个分布相同的时候最小,但具有更优异的性质,因此固定G时,调整D以最大化V,我们就得到了数据集的MLE表达式,然后我们固定D,调整G,最小化V,就是求MLE的过程。两者相互交替,即可逐渐收敛。

(关于GAN训练中可能遇到的问题,请参考[2]。)

算法流程

最大化或者最小化loss函数,可以采用任何梯度优化方法。算法流程很清晰,不做过多解释。

GAN的数学基础 - 散度

信息熵

首先给出信息量的考量,共三点[6~7]:

  1. 如果一个事情发生的概率较低,那么当它发生的时候,带来的信息就比较多,我们考虑信息 h ( x ) ∝ 1 p ( x ) h(x)\propto\frac{1}{p(x)} h(x)p(x)1
  2. 信息量满足可加性,事件x和y同时发生,则包含的信息量是h(x)+h(y),也就是h(x, y) = h(x) + h(y)。
  3. 根据上面两条,x和y同时发生,其概率为p(x, y)。如果两者独立,则p(x, y)=p(x)+p(y)。因此, h ( x , y ) ∝ 1 p ( x , y ) h(x, y)\propto\frac{1}{p(x, y)} h(x,y)p(x,y)1

通过这三条,香农构造了 h ( x ) = l o g ( 1 p ( x ) ) = − l o g ( p ( x ) ) h(x)=log(\frac{1}{p(x)})=-log(p(x)) h(x)=log(p(x)1)=log(p(x))
它表示从未知到已知所需信息的含量。这个构造是很巧妙的,如果我们以2为底,则这个定义恰好对应计算机单位bit。我们举一个例子[8]:

ex1:
随机变量具有四个值 A=[a1, a2, a3, a4],如果我们想要编码这个变量,则必须保证能描述四个不同的状态,如果用二进制编码,用两个bit就足以:00, 01, 10, 11。如果四个事件发生的概率相等,则我们可以计算每个事件的信息量 h ( x ) = l o g ( 1 1 / 4 ) = 2 h(x)=log(\frac{1}{1/4})=2 h(x)=log(1/41)=2,我们发现恰好为2。如果怀疑这个结论,你可以增加A的值,然后计算试验。因此我们把h(x)叫做编码长度,因此信息量和编码长度是等效的。

如果四个事件发生的概率不同呢?那我们衡量每个事件的信息量意义就不大了,我们希望对A有一个整体的评估。那么,我们干脆依概率取期望:

H ( X ) = Σ p ( x ) l o g 1 p ( x ) H(X)=\Sigma p(x)log\frac {1} {p(x)} H(X)=Σp(x)logp(x)1

H(X)表示X这个随机变量的平均信息量,我们把它叫做熵(信息熵)。下面来看它的实际意义[10]。

ex1_extend:
回到刚才的例子,我们设A的四个事件发生的概率分别是[1/8, 1/8, 1/4, 1/2],则它的熵为: H ( X ) = 1 / 8 ∗ 3 ∗ 2 + 1 / 4 ∗ 2 + 1 / 2 ∗ 1 = 7 4 H(X)=1/8*3*2+1/4*2+1/2*1=\frac{7}{4} H(X)=1/832+1/42+1/21=47。我们把H(X)叫做平均编码长度,它表示一个编码方案最好能达到的效果。如果我们还是都编码为2bit,则根据概率计算实际的平均编码长度: l e n = 1 / 8 ∗ 2 + 1 / 8 ∗ 2 + 1 / 4 ∗ 2 + 1 / 2 ∗ 2 = 2 len=1/8*2+1/8*2+1/4*2+1/2*2=2 len=1/82+1/82+1/42+1/22=2,这显然不是最好的。因此人们开发了很多能够达到最优的达到最优的编码方案,例如huffman编码(符合 1 2 n \frac{1}{2^n} 2n1的情形),它把h(x)作为其编码长度:

很容易看到,虽然编码长度不同,但是不会相互影响的,例如,从头开始的话,如果第一bit是0,则这一定是a4,如果第一位是1,则我们不能断定,得看第二位,如果第二位是0,则这是a2;然后如果还有第三位,则又是一个新的信息。

平均编码长度为: 1 / 2 ∗ 1 + 1 / 4 ∗ 2 + 1 / 8 ∗ 3 + 1 / 8 ∗ 3 = 7 / 4 1/2*1 + 1/4*2 + 1/8*3 + 1/8*3 = 7/4 1/21+1/42+1/83+1/83=7/4

这样我们就清晰了熵的定义,扩展到连续变量也是一样的。可以证明,huffman编码是最优编码。

交叉熵[9]

现在,我们有随机变量X=[x1, x2, x3, x4],其真实概率为p(X=xi)。如果我们不知道这个真实概率,我们只能对它进行猜测,我们假设我们猜测的概率为q(X=xi)。这样,我们只能用我们猜测的概率进行最优编码, h ( x ∣ q ) = l o g 1 q ( x ) h(x|q)=log\frac{1}{q(x)} h(xq)=logq(x)1是我们对每个情况的编码长度,因此实际的平均编码长度为: H ( p , q ) = Σ p ( x ) l o g 1 q ( x ) H(p, q) = \Sigma p(x) log\frac{1}{q(x)} H(p,q)=Σp(x)logq(x)1,我们把这个叫做交叉熵,它表示我们对X估计的平均信息量。

散度:分布的不相似度[11]

我们用信息熵和交叉熵的差值定义分布的不相似程度(可以认为是实际编码长度与最优编码长度之间的差值),基本形式为KL散度: K L ( p ∣ ∣ q ) = Σ p ( x ) l o g p ( x ) q ( x ) = H ( p , q ) − H ( p ) KL(p||q)=\Sigma p(x)log\frac {p(x)}{q(x)}=H(p, q) - H(p) KL(pq)=Σp(x)logq(x)p(x)=H(p,q)H(p)

接下来我们证明,KL散度一定是大于等于0的:

令t=q(x)/p(x), f(t)=-ln(t), 由于f(t)是强凸的,因此由Jensen不等式:

∫ p ( x ) f ( t ) d x &gt; = f ( ∫ t p ( x ) d x ) \int p(x)f(t)dx &gt;= f(\int tp(x)dx) p(x)f(t)dx>=f(tp(x)dx)

因而有:

从而证明,当q=p时,也就是当我们估计的分布与实际分布一致时,具有最小的KL散度,也可以说具有最小的交叉熵。

最优编码和概率分布密切相关,h(x|p)就是x对应的最优编码长度;如果我们用h(x|q)编码,则只有当q(x)=p(x)时,才能得到最优编码。

但是KL散度的一个重大缺陷是,它不对称,也就是KL(p||q)不等于KL(q||p),因此提出了JS散度来解决这个问题:

它具有性质:
(1)值域范围JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。
(2)对称性即 JS(P||Q)=JS(Q||P),从数学表达式中就可以看出。

参考文献

(GAN原理部分)
[1].https://zh.wikipedia.org/wiki/生成模型
[2].http://www.cnblogs.com/bonelee/p/9166084.html
[3].https://zhuanlan.zhihu.com/p/33752313
[4].https://openai.com/blog/generative-models/
[5].https://www.zhihu.com/question/43609045

(散度的部分)
[6].https://zhuanlan.zhihu.com/p/26486223
[7].(这里的视频非常好)https://www.zhihu.com/question/22178202
[8].https://www.zhihu.com/question/30828247
[9].https://blog.csdn.net/tsyccnh/article/details/79163834
[10].https://blog.csdn.net/Hearthougan/article/details/77774948
[11].https://zhuanlan.zhihu.com/p/39682125

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值