UC Berkeley非监督学习--流模型(Flow Models)

Luna
Written by Luna on

    翻译整理一下UC Berkeley非监督学习的课程。这篇翻译第三讲Flow Models,流模型

    这个课程总共十二讲,官方链接:

https://sites.google.com/view/berkeley-cs294-158-sp20/home

    目前已整理过:

        Lecture 1:UC Berkeley非监督学习–介绍

        Lecture 2:UC Berkeley非监督学习–自回归模型

        Lecture 7:自监督学习(Self Supervised Learning)

1. 1-D

    先看一维空间。样本都是一个值,生成也只需要生成一个值。 

    上一篇讲自回归模型,一直在求概率分布函数,这一节我们来求概率密度函数。本质上他们是一回事,只是前者是用来求离散值的概率,后者是用来求连续值的概率。

    如果我们要预测的值是个连续值,而不是离散值,那么理论上一般情况下任何一个特定值发生的概率都趋近于0。所以如果是连续值,那么通常求的是在某个区间发生的概率,p(x)是概率密度函数,如上图右边公式求的是x在[a, b]这个区间的概率。概率密度函数一般满足以下条件:

    那怎么基于概率密度函数产生极大似然函数:

    求解时可以假设概率密度函数服从高斯分布。

    但是很可惜,上面那种方法对高维数据,效果很差。

    流模型中输出不再是概率密度函数,而是一个潜在变量latent variables),我还是喜欢理解为特征向量。

再通过改变潜在向量来让计算机创造图片。

那么如何训练模型:

由于p(x|z)是很难求出来的,因为z可以是无穷的,所以只能换个思路:

概率密度函数的特性,全域积分为1,根据这个特性:

上面公式中得是可微且可逆的。可逆才可以根据潜在变量进行生成:

极大似然函数则可以转换为:

来看z遵循不同分布的训练结果(这里讨论的z只有一个值,即在一维空间中即可定位):

比如均匀分布(Uniform):

比如Beta(5,5):

比如高斯分布:

那除了训练模型,有没有其他方法可以得到x->z的函数,当x和z都只有一个变量的时候,是可以的。比如下面这个方法Cumulative Density Function (CDF):

这样的话,z服从均匀分布,这种转换和采样的方式和上一个Lecture中Hostogram采样的方式理论上是一致的,只是CDF用于连续值,Hostogram用于离散值:

可以发现CDF可以把任何分布通过一个可逆可微函数转换成均匀分布,而可逆可微函数的逆函数依然可逆可微,因此均匀分布可以被转换成任意其他的分布。因此CDF可以实现将一个分布通过两次转换转换成任意其他分布的功能。

以上是z是单变量的情况,如果z是一个长度为2的向量呢?长度为n呢?

1. 2-D

    在上个Lecture中我们详细描述了自回归模型的原理,自回归的原理也可以用在流模型上,称之为自回归流模型Autoregressive Flow)。既然是自回归的模型,那么就如上图,z1,z2依赖的值是不一样的。

    看一些实验效果:

    上图中右上角的图是x在二维空间的分布情况,注意一下,颜色只是一个分群的效果,不论紫色或者黄色都是x的样本。转换成z,且在二维空间中均匀分布,那么训练后得到z的分布情况则如右下角组图中左边的图所示。黄色和紫色的点没有区别,也都是样本,只是这样可以和x中的样本表达一个对应关系。

    这张也是一样理解,任意分布都可以转换为均匀分布。

1. n-D

    那么更高维呢?自回归流模型是否还能做到一样的事情。

    如果使用流模型,基于的是逆函数的原理来生成,那么x和z的维度需要一致,左边的图片有多少个值,z就也得有多少个值。(注意:这里的维度概念和我们通常理解的矩阵维度,空间维度是不一样的概念)。

Autoregressive Flows (AF)

    如果是自回归流模型,先看看是怎么进行生成的:

    可以发现和自回归模型是一致的,先由由逆函数通过z1得到x1,再基于z2,x1得到x2,这样一直下去。而训练过程中的似然函数,和自回归模型中的也是一致的:

其中绝对符内的是雅可比矩阵(Jacobian determinant),关于它的计算方式,可以参考[1]。必须是可微的,因此像一些不可微的激励函数比如ReLU,是不可以在这类模型中用的。另外,增加模型的深度可以直接将Flows接起来:

Inverse Autoregressive Flows** (IAF)**

    新的算法IAF,和AF不一样的地方很容易发现,生成的时候,只依赖z了,所以可以一下子就根据z把图片生成出来,而不需要一个像素点一个像素点顺序生成了,但是训练的时候,却需要一个像素点一个像素点把完整的z计算出来。也就是说AF是训练可并行,生成得顺序,而IAF是训练得顺序,生成可并行。

Affine Flows

Affine Flows的参数就是一个可以把x->z的矩阵和一个偏置向量。训练就是求这个矩阵和这个偏置向量的值。

Elementwise Flows

这种方式可以大大减少计算量。

NICE/RealNVP

上面的公式很容易理解,就是把x分两半,前面一半直接给z,后面一半本质上是经过了一个Elementwise Affine Transformation。s和t都可以直接计算出来,s和t应该都是长度为d/2的向量。

因此,计算量大大减少了。

上图是RealNVP的效果,可以发现还是不错的。

那怎么把输入分两半呢:

如上图所示,可以不同位置分,但其实还可以不同通道分,可以不止分一种,可以分很多很多种,一起训练。另外就是RealNVP也会像其他神经网络一样,在一层一层网络推进的时候,减小每个通道的尺寸,增加通道的数量来更好地进行特征提取。如下图所示:

输入是3232c,通过第一层网络后,输出为两个16162c,通过第二层后输出为两个884c,再通过第三层,最后输出为4416c。

由上图可以发现,把图片分两半的方式是很重要的,左边是通过checkerboard去分,右边则是上下左右分,可以发现,右边这样粗暴的分法带来的结果并不如左边精细的来得效果好。

Flow++ = MoL transformation + self-attention in NN

bits/dim越低越好

Glow (Invertible 1x1 convolutions + Large-scale training)

    Glow是OpenAI的作品,可以生成十分真实的人脸。还是那句话,图像生成,不止GAN可以做到。

Continuous time flows (FFJORD)

    允许不受限的架构,且保证了快速的概率计算。

反量化(Dequantization)

    如果把概率密度函数应用在离散数据的数据集上,会出现一些问题:

理论上来说,密度值可以无穷大,所以很容易出现上图中间的情况,出现和周边密度值完全脱离的特别大的密度值,这样也可以loss很小,但很明显是不合理的。解决办法之一是把概率密度函数转换成概率分布函数来做这件事情:

但这样很麻烦,简单的是给数据集增加噪音,进行反量化(Dequantization)

老实说上面公式没看懂,感兴趣的可以找论文看,本质上就是把离散分布转换得连续一点:

还是之前的数据集,经过反量化转换后,就不容易在概率密度函数上产生很突兀的峰值了。

结语:

    流模型就到这里了,那么这类模型其实还有很多工作可以做,从上面的内容来看,关于她的工作还是比较少的,她还是有很大潜力可以变得更好,比如更快地生成更好的图片,更快地推理,更快地训练,更好地压缩图片等等。

声明:文中所有图片和原理均来自课程和参考。

参考:

[1] Lil’Log, Flow-based Deep Generative Models, 2018

Comments

comments powered by Disqus