论文地址:NICE模型
现在打算紧跟生成模型的步伐,看一下最近火起来的流模型,根据Paper_weekly的文章找到了glow模型最原始的论文,NICE模型。本文主要是该篇论文的笔记。
一、论文概述
摘要部分:
1、NICE全称为Non-linear Independent Component Estimation ,可以翻译为非线性独立分量估计。
2、在本文中,我们需要学得一个确定的非线性转换,能够将数据映射到隐空间,得到独立的隐变量。factorized distribution感觉可以理解为因式分解后的分布。注意这个过程是可逆的,NICE可以将高维数据映射到隐空间,同时可以从隐空间映射到高维数据。
因此,关键在于找到可逆的函数。
3、这个转换过程涉及到Jacobian(雅克比)矩阵和雅克比矩阵的逆。
雅克比矩阵是一阶偏导数以一定方式排列的矩阵,其行列式称为雅克比行列式。
具体而言,函数F为m*n的方程组:
这些函数的偏导数(如果存在)组成了一个m行n列的矩阵,为雅克比矩阵:
此矩阵表示为:.
当m=n时,存在雅克比行列式。雅克比矩阵的一个重要性质就是一个可逆函数的雅克比矩阵的逆矩阵为该函数的反函数的雅克比矩阵。
为什么要用到雅克比行列式呢?首先,一个矩阵的行列式就是一个平行多面体的“体积”,多面体的每条边对应着矩阵的列。用行列式可以描述一个线性变换对“体积”所造成的影响。雅克比行列式实际意义就是坐标系变换后单位微元的比值。
我的理解就是雅克比行列式的值代表了数据分布映射为隐空间数据分布
后二者的比值。
所以就有了:
f(x)代表了映射函数。
引言部分:
4、在论文中提出了映射函数的符号为h=f(x),映射所得分布是因式分解(factorized),每一个分量是独立的。
5、设计映射函数f的核心理念是将输入x分为两块(x1,x2),因此转换方式如下:
m可以为任意复杂的函数,文章中采用ReLU MLP的网络形式。但是对任意的m函数都有单位雅克比行列式,并且上述方程组是可逆的。
学习连续概率的bijective transformation(双射变换,一一对应)部分:
6、通过最大化似然函数提出学习的映射函数为以下形式:
其实就是第3点最后得出的公式的对数化。其中为先验分布,
结构部分:
Triangular Structure(三角结构,选择对角矩阵)
7、首先提出分层(a layered transformation)的理念,然后为了方便计算选择对角矩阵(diagonal matrices)。
lower triangular为下三角矩阵,upper triangular为上三角矩阵。
8、因为对输入x(x属于D维)进行了分块,分为了和
大小的两部分,
。对第5点列的公式进行求偏导,所以映射的雅克比矩阵变成的对角矩阵:
其中为大小为d的单位矩阵,而
为大小为D-d的单位矩阵,所以雅克布行列式的值为1。
Coupling Layer(耦合层)
9、介绍加法关系耦合层(additive coupling layer),意思就是分块的x1和x2通过加法进行耦合。并且强调m可以为任意函数。选择进行加法耦合是为了数学计算的稳定性。其实可以选择任意的耦合形式,文章中先给出了通用的耦合层关系,然后给出了文章使用的加法耦合层关系。
ps:unit matrix和identity matrix都是单位矩阵的意思。
10、交替使用耦合层,注意不是单纯地重复,需要打乱每次输入维度的顺序,可以采取简单地直接交换两部分的位置,保证信息充分混合。这个过程是交错前进的。同时就是这个过程就像流水一般,细水长流,成为一个flow。因为矩阵的乘积的行列式等于矩阵的行列式的乘积,每一层都是加法关系耦合层,所以这样的最终结果仍然为1。在文章中发现,至少需要3次交替使用耦合层才能保证每个维度都会对彼此产生影响,文章使用了4次。
Allowing Rescaling(允许重新调节,尺度变换层)
11、NICE是基于可逆函数来实现的,所以当模型训练完,我们会得到一个生成模型和一个编码模型,但此时的随机变量z和样本x的大小是相同的。x虽然是D维,但是x未必就能遍布整个D维空间,所以存在着维度浪费的情况。为了改善这一情况,作者在网络的最顶层设计了对角缩放矩阵S进行尺度变换。 保证在需要的维度给与更大的权重,不需要的维度少一点的权重。具体而言,s向量可以识别各个维度的重要性,越小代表越重要,当
趋近于无穷大,代表该维度不重要,整个数据样本的维度减一。
之前,已经算出雅克比矩阵的行列式的值为1,经过与S矩阵相乘后,要优化的目标函数就变成了以下形式:
为什么这样就可以识别特征的重要程度呢?可以这样理解:一开始设z为先验分布为标准正态分布,方差为1。训练结束后,方差有大有小,方差越小说明该特征的弥散程度越小,如果方差为0,代表该特征恒为均值0,其分布坍陷为一个点,意味着流形少了一维。
其实尺度变换层等价于将先验分布的方差(标准差)作为训练参数,。方差足够小,该维度所表示的流形坍陷为一点,总体流形的维度减少一维。
Prior Disturibution(先验分布,选择各分量独立的分布)大神的博客:https://spaces.ac.cn/archives/5776
12、在大神的博客中介绍了为什么要选择各分量独立的先验分布,是为了更好的实现学习解耦表示的特征。由于各个分量是独立的,编码得到的z的各个维度是解耦的,同样的,根据z生成图像时,各个维度也是独立的,理论上可以控制单个维度的变化实现图片的变化。
相关方法部分:
13、主要介绍NICE与VAE、GAN等生成模型的不同,具体自行看论文。
实验部分:
14、个人理解,对数似然值越大越好,代表合成的数据分布更接近真实数据的分布。
15、插值,分为图像内插值和图像间插值,其主要应用是对图像进行放大以及旋转等操作。图像内插值是据一幅较低分辨率图像再生出另一幅均具有较高分辨率的图像。图像间的插值,也叫图像的超分辨率重建,是指在一图像序列之间再生出若干幅新的图像。摘抄自百度。 在论文中,是在MNIST实现了插值,效果还可以。
二、感想
NICE是流模型的基础,之后的RealNVP和Glow是在其基础上进行了修改,相比VAE,流模型是直接计算似然函数。相比GAN,流模型对潜在变量进行了推断,更具有利用的空间。
模型很好,就是要看一下怎么能在pytorch上实现。