Generative Models - 一文理解Variational Autoencoder
目录 |
- 2. Variational Autoencoder (VAE) - 2.1 引言 - 3. GAN 概述 无监督学习进阶,VAE和GAN的简单介绍。 |
可能稍微有点过时的东西,算是Gan之前的概述。
1. PixelRNN
简单来说,把pixel直接当成一维序列数据,用RNN学习序列特征,用RNN生成,这件事是真的work的。
这个实在没什么好讲的,它最后的重构的结果是比encoder还要更好。例如它可以遮住一半图片,让模型生成另一半。
1.1 一个有趣的Trick
2. Variational Autoencoder (VAE)
这个是对autoencoder的改进版本,Gan出现之前performance比较好的model。
VAE给autoencoder引入了噪声, 使得decoder对于随机sample的样本也能生成出较好的结果。无法理解没有关系,先看看autoencoder(AE)模型的问题。
2.1 引言
VAE是一个解释起来蛮复杂,实现起来蛮简单的model,不用害怕。下面会先介绍一下AE的缺点,VAE的大致情况和改进,然后给出一个直觉解释,最后才是理论解释。
2.1.1 AE的缺点
图中红线是我们encoder生成的code(假设一维)。给定满月AE生成满月,给定半月AE生成半月,我们会期待说,如果在两者之间的code空间中sample随机点,能生成慢慢圆满的月亮。但事实上,AE很难变成这样。原因在于,AE学到的code空间中,只有某些特定的点AE很熟悉,能重构图片,但其他点学得很差。
我们先从整体上来看看VAE究竟是什么,做到什么改进,然后再来解释这个模型。
2.1.2 VAE一览
下图是Auto-Encoder和VAE的对比
- 它让Encoder输出两个vector:m和σ,然后在用normal distribution生成vector:e,按下图的形式运算然后求出新的code vector:c。
- 其次,它在loss中加入了图最下方那一项。
你可能一脸问号,为什么要这么算?先不管,后文会解释,这里面的理论知识还是蛮多的。
先来看看VAE的改进
2.1.3 VAE的改进
上面说了AE的缺点——sample的样本很难很好的重构,VAE中改进了这一点,你可以说它使得重构变得平滑。你可以在code vector c中固定某些维度,对任意维度做sample,会得到类似下图的结果。你会看到,宝可梦从站着变成躺着(从上到下),颜色变化(左右)
2.2 VAE的解释
现在你可能有一堆疑问,特别是为什么改变了encoder的output和loss就能达到这种结果。以下先给出一种直觉的解释,然后再用混合高斯分布试图handle这个model。
2.2.1 Intuitive
还记得上文提到的AE的缺点吗?VAE的改进相当于再code中加入了噪声,使得code空间中原本单一的点能很好重构图片,变成某些范围的点要学会重构图片。那么就会有很多不同样本之间的交叉部分,例如图中,全月和半月之间的交叉部分,它们即会学到要生成全月,也要学到如何生成半月,于是,就很可能产生一些渐变的例子。
当然,这只是我们期望的,实际上就是加入噪声之后,使得code空间中映射能力变得更加平滑。
再来看看VAE模型的直观解释。
首先σ指的就是噪声,加了一个exp使得噪声只会为正数不会出现负数。噪声又从encoder中学得,让模型自己决定要什么噪声。
但这有个问题,就是你的σ是要引入variance,但如果只有这一部分,模型就会觉得加入的variance = 0那就最好,这时候σ等于一个负数,exp(σ)接近0,loss最小,于是它就又会退化成AE。所以,这里就加入了normal distribution的vector,e。为什么它会有效呢?我们来看看loss function中加入的部分。
图中蓝色的线是exp(σ),红色的线是(1+σ),两者想蹭就变成绿色的线。绿色的线在σ=0的时候整个公式的值最小。这时候整个loss的值就会最小。也就是说,model会学习到尽可能使得σ=0。
你可能会说,“你不是说σ=0的时候会退化吗”。是的,前面确实会退化,但在这里即使σ = 0,我们发现我们exp(σ)=1,也就是说,引入的variance为1。
最后m那项只视为正则项即可。
2.2.2 理论解释
这里Gaussian Mixture Model来解释这整个模型,VAE模型中的Encode服从高斯分布生成出code vector z,而Decoder又使用z,服从高斯分布生成最终的结果。你会发现这是一个高斯套高斯的模型,就像图中所示,可以生表示出非常复杂的函数(应该就是一个随机过程了)。这里不会解释得太详细……实在太难全用文字表达了,感兴趣可以去看老师的视频以及VAE的paper。
L是max likelihood,P是decoder的function,为了和encoder联系,下面公式引入q,这是encoder的function。可以推导出,L实际上等于一个KL散度,它约束p和q的相关性,必定大于0,加上前面的部分,这时候我们只要最大化前面的部分就行。
前面这一项,又可以拆成两项。
前面那项,实际上是KL散度,两个分布之间尽可能要相近,KL散度才会小,而后面那项,就是原来的AE模型了。如图,换句话说,因为在loss中加入了新的这一部分,使得原来的模型变成符合Gaussian Mixture Model。
3. GAN
事实上,VAE作为生成模型是有缺陷的。如图,我们知道,我们是用mse来最小化损失的,用来近似“让模型生成的图片符合现实情况”这个目标。但问题在于mse并不怎么好,例如图中给出两个样本,mse会生成类似fake类型的样本——很容易被人识别出来,因为不符合现实。换句话说,在mse下,模型只能学到它看到的sample的fake类似的样本,这并不是我们想要的:让机器真正生成新的样本。所以就有了gan。这里只做简单的引入。
GAN的基本思想是,从随机输入开始,用generator生成样本,然后用一个Discriminator二分类器辨别这些样本和真实带标签样本,不断迭代,最后让generator骗过discriminator。注意,这里输入不再是真实样本,而是sample出来的输入。
Gan的训练必须fix住discriminator,否则它会坏掉,就无法进行判断。GAN同样有个有点,你可以改变你的sample点来观察结果的变化。可以做到类似下图的定向改变某些属性。 https://www.bilibili.com/video/BV1xJ411u7wK
Gan的效果(2016)取决于discriminator的好坏,很多时候必须由人来判断好坏,以及调整,所以Gan非常难train。现在应该有很多进展了!