翻译整理一下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,根据这个特性:
上面公式中f 得是可微且可逆的。可逆才可以根据潜在变量进行生成:
极大似然函数则可以转换为:
来看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,这样一直下去。而训练过程中的似然函数,和自回归模型中的也是一致的:
其中绝对符内的是f 的雅可比矩阵(Jacobian determinant),关于它的计算方式,可以参考[1]。f 必须是可微的,因此像一些不可微的激励函数比如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