Unsupervised Learning - Deep Generative Model (Part II)

在这里插入图片描述
为什么会使用auto-encoder?一个直观的理由是,当训练模型的,当一个满月的图片输入到auto-encoder模型,我们会希望得到一个满月。同理,当是一个半满月的时候,我们希望得到一个半满月的。不过当直接模型预测的时候,月亮介于满月和半满月之间的时候,我们会希望得到一个介于两者之间的图像。但是实际输出往往不是这样。当使用VAE的时候,会有一个noise,当一个满月进去的时候,会在一个范围内得到满月,当一个半满月进去的时候,会在一个范围内得到半满月。这个单位会有重叠,所以你有一整当在这个重叠范围来预测的时候,就是如果你输入介于两者之前的图,来输出一个新图的时候。由于又要像满月,又要像半满月,这时候你可以得到一个可以介于满月和半满月的结果。
在这里插入图片描述
我们试试说一下模型结构。我们现在是这样,通过NN Encoder来产生对应的 m 1 m_1 m1 m 2 m_2 m2 m 3 m_3 m3,这个是之前的auto-encode产生的原始的Code。在VAE,还产生 σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2 σ 3 \sigma_3 σ3,这个就是noise的方差,是通过自动学习得到的,为了让这个方差是正的(为什么让方差是正的还不明白),所以加上了exp,这样可以确保方差是正的。但是仅仅是这样是不够的,因为这个方差是自己学的,这样模型会让学习到的方差都是0来得到最小的reconstruction error,所以需要对方差加一些限制,就是右下角的公式。

在这里插入图片描述
公式的第一项是蓝色的线,第二项是红色的线,这样reconstruction error就是成了那条线,这时候最小的时候,就是 σ i \sigma_i σi等于0的时候, σ i \sigma_i σi等于0就是 e x p ( σ i ) exp(\sigma_i) exp(σi)等于1。\sigma_i$等于0的时候,loss最低,就相当于variance等于1。右边那个就相当于L2 regularization。

在这里插入图片描述
回到我们当初的需求。我们把各个宝可梦映射到高维空间(图上的两维只是为了方便展示),然后P(x)代表图像属于宝可梦的概率,高的说明这个图像很可能属于宝可梦,低的相反

在这里插入图片描述
上面的黑色的线是高斯分布(蓝色的线)叠合起来得到的分布,只要数量多就可以得到一个复杂的高斯分布。然后每个高斯分布都会有对应的权重,来组成Gaussian Mixture Model。怎么得到这个P(x)呢,通过左上的公式来计算p(m)是高斯分布,m是0,1……m,p(m)是选择这个高斯分布的几率,p(x|m)是从这一个高斯分布选出一个x的几率。
Gaussian Mixture Model有种种问题,例如你要决定mixture的数目。在决定mixture数目的前提下,根据拥有的data、x,来estimate 这些高斯分布和这些分布对应的weight、mean和variance是很简单的,用EM algorithm就可以解决了。
現在每一個 x,它都是從某一個 mixture 被 sample 出來的,這件事情其實就很像是在做 classification 一樣,每一個我們所看到的 x,它都是來自於某一個分類,它都是來自於某一個 class(这番话不是很能理解
把 data 做 classification,做 clustering 其實是不夠的,更好的表示方式是用Distributed 的 representation,也就是說,每一個 x,它並不是屬於某一個 class或者某一个cluster,而是有对应的vector表示,來描述它的各個不同面相的 attribute、描述它各個不同面向的特質,所以 ,VAE 其實就是 Gaussian mixture model 的distributive representation 的版本。

在这里插入图片描述
做法就是:从一个normal distribution随机抽出一个z,z代表的是normal distribution的一个向量,z的每一维都是达标了一个attribute,然后我们会训练一个函数根据z来产生出对应的mean和方差,这个函数就可以是neural network。这样 P ( x ) = ∫ z p ( z ) p ( x ∣ z ) d z P(x)=\int_{z} p(z)p(x|z) dz P(x)=zp(z)p(xz)dz,注意是积分,因为z是连续的。p(z)就是抽取z的函数,p(x|z) 就是根据z来抽取x的函数。另外z不一定是normal distribution的,即使z很简单,P(x)也可以很复杂

在这里插入图片描述
这个式子上面解释过,如右上所示。我们需要求出 μ ( x ) \mu(x) μ(x) σ ( x ) \sigma(x) σ(x),来让 L = ∑ x K 2 L=\sum_{x} K^2 L=xK2最大化。我们就是调NN的参数来实现。现在我们又引进一个新的distribution q(z|x),就是根据给出的x来求出对应的 μ ′ ( x ) \mu^\prime(x) μ(x) σ ′ ( x ) \sigma^\prime(x) σ(x)。这个函数对应的就是encoder,z那个就是decoder。

在这里插入图片描述
我们先看回公式,其中logP(x)可以表示成 ∫ z q ( z ∣ x ) l o g p ( x ) d z \int_{z} q(z|x)logp(x)dz zq(zx)logp(x)dz(这个 ∫ z q ( z ∣ x ) d z \int_{z} q(z|x)dz zq(zx)dz=1),然后如上图,经过一系列的推导,在式子倒数第二个的右边那项就是KL divergence就是测量两个分布的距离(q(z|x), p(z|x)都是一个分布),所以这个是大于等于0,毕竟没有等于0的距离。 所以式子最后那个就是logP(x)的下限。

在这里插入图片描述
上面就是推导好的式子。P(z)是已知的,p(x|z)是我们想要求的来最大化 L b L_b Lb,q(z|x)现在也顺便求出来。因为我们想要通过调节那个下限的大小来提高 L b L_b Lb,因为logP(x)和L(b)的差距不知道,所以有可能出现即使下限高了,logP(x)会低,即使下限还是低于logP(x)。现在如果我们通过调节q(z|x),就可以固定住logP(x),但是 L b L_b Lb还是可以不断提高。最后提高 L b L_b Lb就可以提高logP(x),最后q(z|x)会是p(z|x)的approximation。

在这里插入图片描述
这个就是公式的一系列的推导。

在这里插入图片描述
总结起来就是上面的最小化一个式子和最大化一个式子。KL(q(z|x)||p(z))的最小化就是右上的式子最小化。再结合下面的式子就构成了损失函数的式子。
最后实际就是要让 μ ( x ) \mu(x) μ(x)和x最接近。这个就是auto-encoder在做的事情。

在这里插入图片描述
还有conditional VAE,就是模范一个style,让其他的图像都是根据这个style。看看每一行

在这里插入图片描述

在这里插入图片描述
VAE的问题是只是在模仿已经存在的图片,不能产生新的图片。

在这里插入图片描述
这个需要GAN

在这里插入图片描述

在这里插入图片描述
这个是Yann LeCun对GAN的描述

在这里插入图片描述
可以看看这个来理解,有个昆虫,昆虫有一个天敌,昆虫为了避免天敌的追杀,而不断演化,天敌与此同时也是不断演化来识别出这个昆虫,直到天敌完全不能识别这个昆虫。

在这里插入图片描述
昆虫对应的是Generator,Generator v1就是随机生成一些图片,然后Discriminator v1会根据这些图片和真实图片来调整它的参数,来判断这些图片是true 或者False,然后Generator v1会根据Discriminator v1的反馈来演化成Generator v2来输出新的图,然后Discriminator v1会根据这些图片和真实图片来更新它的参数变成Discriminator v2,再来判断这些图片是true 或者False。然后反馈产生Generator v3。(注意:Generator v3产生的图片可以骗了Discriminator v2,Generator v2产生的图片可以骗了Discriminator v1。),然后再演化Discriminator v3,Generator从来没有见过真正的数字,做的只是产生图片来骗了Discriminator。所以可以产生database没有的数据,这个正好是我们想要的。

在这里插入图片描述
就像这样,上面的Generator v1就是VAE的Decoder,从一个分布随机产生一个向量输入到里面,产生图片。Discriminator就是就是根据输入的图片,来输出0/1,通过sigmoid这样激活函数这样。输入的图片,真正的图片为1,Generator 产生的图片标为0,来训练这个Discriminator来更新参数。这个是Discriminator的演化

在这里插入图片描述
至于Generator 的演化,是这样。我们把Generator 和Discriminator合成一个network,输入是随机的一个vector,我们想让这个vector产生的图片的概率是1。就是通过gradient descent进行更新参数,注意要固定好discriminator的参数,不然如果一起训练,那只要discriminator的w为0,b为1就好。

在这里插入图片描述
这个是GAN的原始paper的Toy Example。那个z是decoder的input,是一个one dimensional 的东西,丢在generator那边会产生另外一个one dimension的东西。就是z(例如从一个normal distribution中sample出来),通过一个neural network来产生x,x的分布就是那个绿色分布,我们希望那个绿色的点的分布和黑色的点的分布越接近越好。
按照gan的概念,就是把绿色的点和黑色的真实的点放进Discriminator来判断。然后会调整参数,那个蓝色的线就是把x送到Discriminator的对应的output。
在这里插入图片描述
我们可以看看上图的上面的第二个图的蓝色的线,就是Generator 产生的output。他认为左边的x就是认为是真实的,右边的x就认为是假的。

在这里插入图片描述
然后Generator就是根据Discriminator反馈出来的结果来更新参数,毕竟Generator就是要产生的图来骗了Discriminator。既然Discriminator认为左边的点是,所以Generator的output就会向左边偏移。注意:有可能移动太多,全部移动到左边去了,所以GAN是比较难train的,需要小心调参数。Discriminator会根据新的输入图片来更新那个绿色的线。
在这里插入图片描述
然后不断反复,直到Discriminator完全没有办法分辨。
train Gan最大的问题就是你不知道Discriminator是不是对的。Discriminator的效果很好,可能Generator太废了。Discriminator的效果很差,可能Discriminator太差了。现在一般的方法是根据训练的时候,看着对应的输入。

在这里插入图片描述
OpenAI尝试的实例

在这里插入图片描述
还有这样,找很多房间的照片来让machine来train GAN。然后随机找五个vector,分别对应第一列的五个图片,然后从第一个vector不断地偏移到第二个、第三个。。。偏移途中会产生不一样的点。看上图,从左往右看,慢慢地变化。

在这里插入图片描述
在这里插入图片描述
还有日本人来画漫画
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值