0%

读论文:NICE:Non-linear Independent Components Estimation

为了使自己对流模型、可逆网络有更深刻的理解,选择了NICE这篇流模型开山之作(之一)来读。

引言

如何捕获具有未知结构的复杂数据分布,是无监督学习里的重要任务。而本文考虑了这样一种特殊情况,即要求学习者寻找数据到一个新的空间的变换\(h = f(x)\),且\(h\)的各个分布组件\(h_d\)是独立的。

考虑变量的变化h = f(x),假设f是可逆的,h的维数与x的维数相同,来拟合一个分布ph。变量的变化规律为: \[ p_{X}(x)=p_{H}(f(x))\left|\operatorname{det} \frac{\partial f(x)}{\partial x}\right| \]

这样,我们就能通过可逆结构\(f\)来在\(x\)域中采样: \[ \begin{array}{l} x \sim p_{H}(h) \\ x=f^{-1}(h) \end{array} \] 这篇论文的一个关键的idea是设计了这样一个变换\(f\),它可以得到的这两个性质

  • 能够简单得到雅可比行列式
  • 能够简单得到其逆过程

学习连续概率的双向变化

通过最大似然,学习一个连续的,几乎处处可微的非线性转换\(f\)的参数分布,公式如下: \[ \log \left(p_{X}(x)\right)=\log \left(p_{H}(f(x))\right)+\log \left(\left|\operatorname{det}\left(\frac{\partial f(x)}{\partial x}\right)\right|\right) \] 在此公式中,变换\(f\)的雅可比行列式在高密度区域(即在数据点处)惩罚收缩,鼓励扩张。(意思是保证生成的多样性)

网络结构

三角结构

如果把变化\(f\)看做多个变换的合成\(f=f_{L} \circ \ldots \circ f_{2} \circ f_{1}\),则最终的雅克比行列式就是这些子变换的雅克比的乘积,于是作者优先设计这些子变换的结构。

首先,作者考虑仿射变换。对于仿射变换的系数矩阵来说,三角矩阵的行列式易于计算。许多方阵M也可以表示为上下三角矩阵的M = LU的乘积。由于这些变换可以组合,所以有效的雅可比矩阵是对角的、下三角形的或上三角形的。

基于上述观察,一种方法是用三角权矩阵和可逆的激活函数建立一个神经网络,但这高度限制了架构,限制了对深度和非线性的选择。

所以换一种思路,我们可以考虑具有三角雅可比矩阵的函数族。通过保证雅可比矩阵的对角元素易于计算,使得雅可比矩阵的行列式也易于计算。

耦合层

在本节中,描述了一类具有三角形雅可比矩阵的双射变换,因此雅可比行列式是可处理的。它将成为变换\(f\)的基础。

耦合层的一般表示形式(General coupling layer)

\[ \begin{array}{l} y_{I_{1}}=x_{I_{1}} \\ y_{I_{2}}=g\left(x_{I_{2}} ; m\left(x_{I_{1}}\right)\right) \end{array} \]

这样一来,雅克比矩阵变成: \[ \frac{\partial y}{\partial x}=\left[\begin{array}{cc} I_{d} & 0 \\ \frac{\partial y_{I_{2}}}{\partial x_{I_{1}}} & \frac{\partial y_{I_{2}}}{\partial x_{I_{2}}} \end{array}\right]=\operatorname{det} \frac{\partial y_{I_{2}}}{\partial x_{I_{2}}} \] 我们需要保证,变换\(g\)是可逆的,那么逆过程可以表示为: \[ \begin{array}{l} x_{I_{1}}=y_{I_{1}} \\ x_{I_{2}}=g^{-1}\left(y_{I_{2}} ; m\left(y_{I_{1}}\right)\right) \end{array} \]

加法耦合层(Additive coupling layer)

将一般形式中的\(g\)变换写成如下的形式: \[ x_{I_{1}}=y_{I_{1}} \\ y_{I_{2}}=x_{I_{2}}+m\left(x_{I_{1}}\right) \] 由于\(\frac{\partial y_{I_{2}}}{\partial x_{I_{2}}}=1\),代表其雅克比行列式为1.

其实除了加法之外,还能使用其他的耦合层,比如乘法耦合层\(g(a ; b)=a \odot b, b \neq 0\),仿射耦合层\(g(a ; b)=a \odot b_{1}+b_{2}, b_{1} \neq 0\)

由于耦合层保留其部分输入不变,因此我们需要在交替层中交换分区中两个子集的角色,以便两个耦合层的组合可以修改每个维度。(也就是通道随机排列的思想)

H域的分布选择

可以选高斯分布、逻辑斯提分布等: $$ \[\begin{aligned} &\log \left(p_{H_{d}}\right)=-\frac{1}{2}\left(h_{d}^{2}+\log (2 \pi)\right)\\ &\log \left(p_{H_{d}}\right)=-\log \left(1+\exp \left(h_{d}\right)\right)-\log \left(1+\exp \left(-h_{d}\right)\right) \end{aligned}\]

$$

实验结果

作者分别在MNIST、TFD、SVHN、CIFAR-10中执行生成任务:

image-20201101220130658

总结与思考

  • 这篇文章算是流模型与可逆网络的最初的雏形,但是后面工作的大体思想都是基于这篇工作的,只不过改善了耦合层的结构、增加了损失函数等
  • 这个最初的耦合层结构比较简单,在者限于当时2015年网络结构的发展,这个可逆网络的表示能力也不是很强,但是后面follow的工作的确有很多,算是一个比较有开创性的有意义的工作(比如Glow、Real NVP等,下周也打算找来精读一下)