Flow系列论文小注:NICE, Real NVP, Glow

小注包括:

1)以个人视角,分析了作者提出的新框架的动机,做一些讨论;

2)给出了一些关键公式的简单证明或说明;

记号约定:

1)向量用小写粗体字母表示;2)矩阵用大写字母表示;3)函数用小写非粗体表示;4)随机向量用大写字母表示;5)用下标取向量、矩阵的元素时,使用对应的小写字母,例如取\boldsymbol x的第d个元素为x_d

动机

        在 VAE 模型中,我们通过优化对数似然函数的一个变分下界来进行训练;在 GAN 中,我们直接避免优化难处理的对数似然函数,转而训练一个判别网络产生误差信号来训练生成网络。而在这两篇文章中,作者返璞归真,从随机变量的可逆映射出发收获了一个生成式建模的新思路,即:已知X \sim p_X(x)Z=f(X),求p_Z(z)

        与 VAE 的思想类似,我们期望对一个可处理的概率分布p_H\left(\boldsymbol h\right)进行采样,并通过一个确定性神经网络来生成数据样本\boldsymbol x= g(\boldsymbol h;\theta_g),或者反过来有\boldsymbol h = f(\boldsymbol x; \theta_f);其中\theta_g,\theta_f为网络参数,为了保持简洁,下面的讨论将省去这些记号。由下面的变量变换公式,我们得到一个计算数据似然的公式:

p_X(\boldsymbol x) = p_H(f(\boldsymbol x))|{\rm det}(\frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x})| \tag 1

为了达到上面的变换,显然我们需要:

a)让随机向量X的定义空间与随机向量H的定义空间,即f的定义域(domain)和上域(codomain)具有 一样的维度,我们设维度均为D

b)我们需要f 是 \boldsymbol x 所在的空间到\boldsymbol h=f(\boldsymbol x)所在的空间的 微分同胚  (Diffeomorphism)。若f \in C^{(n)}(O(\boldsymbol x), \mathbb R^D)O(\boldsymbol x) \subset \mathbb R^D,n 至少大于等于 1;且需要雅可比行列式{\rm det}(\frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x})不为 0,即是一个局部满秩映射;根据 隐函数定理 我们就可以得到这样的一个 可微 双射(bijective) f


讨论:我们要求f是一个微分同胚,是否要求太高呢?

        在深度学习的后向传播框架下,我们使用的都是基于梯度的优化算法,因此网络一阶可导是最基本的要求;的确,网络中的线性变换或者仿射变换层显然是无穷次可导的,而大部分激活函数也都是无穷次可导的;即便是Relu函数也仅在0点不可导;拿某一个神经元来讲,它可以写为{\rm Relu}(\langle \boldsymbol x, \boldsymbol w \rangle),其中\langle \cdot ,\cdot \rangle为内积运算;

        若参数 \boldsymbol w 为 \boldsymbol 0 向量,则我们可以直接忽略对应的维度;否则,使得线性函数\langle \cdot ,\boldsymbol w \rangle等于 0 的集合构成了原空间的一个超平面,是原空间中测度为 0 的集合;因此有限个Relu单元的神经网络总体上还是几乎处处可导的,并且是连续可导的。因此,我们认为神经网络不可导的概率为 0,我们下面默认网络f是一个微分同胚。

        不过,我们无法保证一个神经网络在训练过程中始终保持非 0 的雅可比行列式,更甚是远离 0 的雅可比行列式;所以,作者在后面手动设计了一类 耦合层 ,只把不影响 雅可比矩阵的稳定性 的那部分参数交给神经网络来学习,所以只要神经网络不涉及 雅可比矩阵 对角线上的元素,则只要是连续可导的函数类即可,否则还是需要保证雅可比矩阵的满秩性

Proof of formula (1)

\boldsymbol h_0 = f(\boldsymbol x_0),而D_{\boldsymbol x_0},D_{\boldsymbol h_0}分别为\mathbb R^D空间中的包含\boldsymbol x_0, \boldsymbol h_0的区域,且f:D_{\boldsymbol x_0}\to D_{\boldsymbol h_0}为至少 1 阶的微分同胚,则:

\begin{aligned}P\{\boldsymbol x\in D_{\boldsymbol x_0}\} &= P\{f^{-1}(\boldsymbol h)\in D_{\boldsymbol x_0}\} \\&= P\{\boldsymbol h \in f(D_{\boldsymbol x_0})=D_{\boldsymbol h_0}\} \\&= \int_{D_{\boldsymbol h_0}} p_H(\boldsymbol h){\rm d}\boldsymbol h\\\end{aligned}

再对下式作变量变换\boldsymbol x=f^{-1}(\boldsymbol h),而根据 积分的变量变换公式 有:

\begin{aligned}P\{\boldsymbol x \in D_{\boldsymbol x_0}\} &= \int_{D_{\boldsymbol x_0}}p_X(\boldsymbol x){\rm d}\boldsymbol x\\&= \int_{D_{\boldsymbol h_0}} p_{X}(f^{-1}(\boldsymbol h)) \left | {\rm det}\left(\frac{\partial f^{-1}(\boldsymbol h)}{\partial \boldsymbol h}\right)\right | {\rm d}\boldsymbol h\\\end{aligned}

由于上两式对任意小的包含\boldsymbol h_0的 区域 D_{\boldsymbol h_0}都成立,令其体积|D_{\boldsymbol h_0}| \to 0 得:

\begin{aligned}p_H(\boldsymbol h_0) &= \lim_{\boldsymbol h \in D_{\boldsymbol h_0} \\ |D_{\boldsymbol h_0}|\to 0} \frac{1}{|D_{\boldsymbol h_0}|}\int_{D_{\boldsymbol h_0}} p_H(\boldsymbol h)  {\rm d}\boldsymbol h \\ &= \lim_{\boldsymbol h \in D_{\boldsymbol h_0} \\ |D_{\boldsymbol h_0}|\to 0} \frac{1}{|D_{\boldsymbol h_0}|}\int_{D_{\boldsymbol h_0}}  p_{X}(f^{-1}(\boldsymbol h)) \left | {\rm det} \left ( \frac{\partial f^{-1}(\boldsymbol h)}{\partial \boldsymbol  h} \right ) \right | {\rm d}\boldsymbol h\\&= p_{X}(f^{-1}(\boldsymbol h_0)) \left | {\rm det} \left ( \frac{\partial f^{-1}(\boldsymbol h_0)}{\partial \boldsymbol  h} \right ) \right | \end{aligned}

由于:

1)逆函数f^{-1}的雅可比矩阵等于函数f的雅可比矩阵的逆;

2)逆矩阵A^{-1}的行列式等于原矩阵A的行列式的逆(乘法逆,即倒数,这么说只是为了顺口点);

3)\boldsymbol h_0 = f(\boldsymbol x_0),\boldsymbol  x_0 = f^{-1}(\boldsymbol h_0)

因此:p_H(\boldsymbol h_0) = p_{X}(\boldsymbol x_0) \frac{1}{\left | {\rm det}\left( \frac{\partial f(\boldsymbol x_0)}{\partial \boldsymbol x} \right) \right |  }

即: p_{X}(\boldsymbol x_0)=  p_H(f(\boldsymbol x_0))\left| {\rm det} \left( \frac{\partial f(\boldsymbol x_0)}{\partial \boldsymbol x} \right) \right |


        有了上面的变量变换公式,我们的对数极大似然目标函数为:

\log( p_{X}(\boldsymbol x))=  \log (p_H(f(\boldsymbol x)) ) + \log (\left | {\rm det} (\frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x} )\right  | )  \tag 2

        就像 VAE 模型中只能优化对数似然的变分下界一样,现在我们必须对上(2)式中涉及到的组件作出一些限制,使得我们可以处理这样的目标函数,并同时保留较强的表示能力。

1)首先,我们希望先验分布 p_H(\boldsymbol h) 是容易采样的;显然,当它是各维度不相关的基础分布(如,标准多元高斯分布、isotropic多元高斯分布)时,我们可以直接对其采样;

2)其次,我们希望(2)式中的雅可比行列式是容易计算的;

3)再有,我们希望(2)式中的函数f的逆映射是容易计算的,以便可以轻易地采样;

如何达到上面的期望呢?


NICE准则

        既然我们假设p_H(\boldsymbol h)是可分解成若干组独立概率分布的乘积,我们不妨一步到位,假设每组只包含一个变量 h_d,相当于把建模压力基本上全部给到神经网络;即p_H(\boldsymbol h) = \prod_{d=1}^{D} p_{H_d}(h_d);则我们把f展开写为:[h_1,...,h_D]^T = f(\boldsymbol x) = [f_1(\boldsymbol x), ..., f_D(\boldsymbol x)]^T ,代入(2)式得:

\log( p_{X}(\boldsymbol x))=  \sum_{d=1}^{D}\log (p_{H_d}(f_d(\boldsymbol x)) ) + \log (\left | {\rm det} (\frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x} )\right  | ) \tag 3

我们称上式为 non-linear independent components estimation 准则,即 NICE 准则。

模型架构

        为了达到上面的(2)、(3)的期望,我们考虑那些容易计算雅可比行列式和逆阵的矩阵,先从下面两组视角来讨论作者提出目标架构的动机:

动机探讨1:线性代数

        从线性代数中,我们知道每个矩阵可以只通过左乘一系列基础矩阵得到行阶梯形矩阵(row echelon form);特别地,当A为方阵时,可以通过基础矩阵化为上三角矩阵U;即可逆方阵E_N\cdots E_2E_1A=UE_i为基础矩阵;作行变换时,这里的E_i除了交换两行外都是下三角矩阵,所以我们不妨把交换矩阵全部提到最前面,统一将A的行预排列好,即我们使用一个排列矩阵P,使得我们仅通过下三角变换就能将PA变为上三角阵;即,L^{\prime}(PA) = U;又下三角的逆阵也是下三角阵,因此有:PA = LU或者A = P^{-1}LU

        我们得到了矩阵A的LU分解;如果方阵A可逆,我们能将其分解为基础矩阵的乘积A=E_N\cdots E_2E_1;这里的每个基础矩阵E_i只对一行进行变换,更详细点我们可以认为在对向量作变换A\boldsymbol x时,用E_N\cdots E_2E_1 \boldsymbol x的视角来看,相当于在及联变换序列中,每次只对输入向量的一个维度进行变换;其中若E_i是交换两行的矩阵,则事实上它只是交换了两个变量,它对全局的行列式的贡献只是 +1 或是 -1 ,而我们的变量变换会使用绝对值,所以事实上这种交换并没有带来什么麻烦。

        所以我们可以对线性变换(对应的矩阵A)进行分解,使得我们得到一系列的可逆矩阵E_i,每个基础矩阵的行列式是容易计算的,并且基础矩阵的逆阵的计算也是平凡的。

        因此,我们有了一个处理复杂雅可比矩阵的方法。

动机探讨2:多元微分学

        由于我们处理的是更加一般的可微向量值函数,并不是简单的线性函数,因此不可避免地,我们需要微分学相关的推理。我们仍然期望向量值函数f \in C^{(n)}(D_x, \mathbb R^D)可以像线性变换那样化为若干个简单、易处理的函数的复合,这是否可以呢?不要忘了这里的函数f是微分同胚(即至少1次连续可导、可逆、逆函数也具有同样的光滑程度),多元微分学中的相关定理告诉我们,这是可以的:微分同胚可以化为若干个最简微分同胚的复合,每个最简微分同胚只对输入变量中的某一个维度进行变换,而保持其它的维度不变;即:f = f_L \circ\cdots \circ f_2\circ f_1,其中f_i只对一个维度进行变换;例如,我们将变换f_k详细写开来,如下:

\begin{aligned}y_1 &= x_1\\&\ \ \vdots\\y_{k-1} &= x_{k-1} \\y_k &=  g_k(x_1,x_2,...,x_D) \\y_{k+1} &= x_{k+1}\\& \ \ \vdots \\y_D &= x_D\end{aligned}

其对应的雅可比矩阵为:

\frac{\partial f_k(\boldsymbol x)}{\partial \boldsymbol x} = \begin{bmatrix}       1 & \cdots & 0 &0&0  &\cdots &0 \\[0.3em]       \vdots & \ddots       &\vdots  &\vdots  &\vdots &\cdots &0 \\[0.3em]       0           &\cdots & 1 &0&0 &\cdots &0\\       \frac{\partial g_k}{\partial x_1} &\cdots & \frac{\partial g_k}{\partial x_{k-1}} &\frac{\partial g_k}{\partial x_{k}} &\frac{\partial g_k}{\partial x_{k+1}}  &\cdots & \frac{\partial g_k}{\partial x_D} \\0 &\cdots &0&0 &1&\cdots & 0 \\\vdots &\ddots &\vdots &\vdots &\vdots &\ddots & \vdots\\0 &\cdots &0&0&0 &\cdots & 1\\     \end{bmatrix}(\boldsymbol x) \tag 4

显然,这样简单矩阵的行列式是容易计算的。

根据复合映射求导定理:复合映射的雅可比矩阵等于各个映射的雅可比矩阵的复合,有:

其中:\boldsymbol x^{i+1} = f_i(\boldsymbol x^{i}), i=1,...,L-1\boldsymbol x^1 = \boldsymbol x

再根据行列式的性质:{\rm det}(AB) = {\rm det}(A) {\rm det}(B) ,若每个 \frac{\partial f_i}{\partial \boldsymbol x^i}( \boldsymbol x^i)容易计算,则复合函数的雅可比矩阵,也会容易计算。

另外,顺便提一下复合函数的逆等于各函数的逆的复合f^{-1} = f_1^{-1} \circ f_2^{-1} \circ \cdots \circ f_L^{-1},令其左乘和右乘f都能得到恒等映射,便可验证。

动机探讨3:耦合律

        为了引出下面的 耦合律(coupling law),我们分析一下上面的矩阵(4):若函数g_k和变量x_{k+1},...,x_{D}无关,则计算逆和行列式是 trivial 的。不过,矩阵(4)是一个极端情况,我们可以考虑稍微复杂一点的映射。其实,如果我们只想要雅可比矩阵容易求逆,容易计算行列式;则只要保证其是三角矩阵即可;据此启发,我们何不考虑这样的变换:

\begin{aligned}y_1 &= g_1(x_1)\\y_2 & = g_2(x_1,x_2) \\&\ \ \vdots\\y_k &=  g_k(x_1,x_2,...,x_k)  \\& \ \ \vdots \\y_D &= g_D(x_1,x_2,...,x_{D}) \end{aligned}

我们啰嗦一点,我们再来分析一下上式是个可行的方案,需要满足条件:

1)每个函数g_i关于x_i的偏导数不为0;

2)希望\boldsymbol y = g(\boldsymbol x)是个可逆映射,即给定\boldsymbol y反解出\boldsymbol x:当g_1可逆时,我们可以算出x_1 = g_1^{-1}(y_1),代入g_2得到一个关于x_2的函数,若给定x_1的情况下g_2关于x_2又是一个可逆函数,则我们同样能反解出x_2;依此类推,当给定x_1,...,x_{k-1}的条件下,g_k关于x_k是可逆的,则又能解出x_k

若有了上面的性质,则我们就可以得到一个可处理的方案,再例如下式:

\begin{aligned}y_1 &= m_1(x_1)\\y_2 & = g_2(x_1, x_2)  + m_2(x_2) \\&\ \ \vdots\\y_k &=  g_k(x_1,x_2,...,x_{k-1}) + m_k(x_k) \\& \ \ \vdots \\y_D &= g_D(x_1,x_2,...,x_{D-1}) + m_D(x_D)\end{aligned}

其中:只要保证 g_k(x_1,x_2,...,x_{k-1}) 是和x_{k+1},...x_{D}无关的连续可导函数;且连续可导函数m_k(x_k) 关于x_k的导数不为0,比如说单调函数。

        不过,像上面这样设计的可导映射,的确满足了可处理性,但如此细致的分解是不利于工程中的构造,比如:神经网络的设计。所以,一般情况下,我们可以考虑把变量分为若干组;比如说 2 组,就像作者所做的那样。

动机的总结:

        综上,不论从线性变换的矩阵分解的角度,还是从微分同胚分解的角度,我们的目标都是把复杂的函数分解为可逆的、简单的函数组的复合,不过我们上面讨论的是极端的情况,即:把函数彻底分解为最简单的函数的复合;不过,跟作者类似地,我们把变元分解的更细一点,然后堆叠的模块更多一点会有什么不一样的效果呢,留作以后再分析吧。

下面,我们引出作者的构想:


耦合层

        为了引入下面的耦合层(coupling layer),设{\boldsymbol x},{ \boldsymbol y }\in \mathbb R^DI_1,I_2为索引集\{ 1,2,...,D\}的一个划分,即:I_1 \cup I_2 = \{1,2,...,D\}I_1 \cap I_2 = \emptyset,其中|I_1| = d。记\boldsymbol x = (x_{I_1} ,x_{I_2} ),\boldsymbol y = (\boldsymbol y_{I_1} ,\boldsymbol y_{I_2} ),则映射为:

\begin{aligned}
&y_{I_1} = x_{I_1}\\
&y_{I_2} = g(x_2, m(x_{I_1}))  \\ 
\end{aligned}   \quad \cdots (5) 

其中:g:\mathbb R^{D-d} \times m(\mathbb R^{d}) \to \mathbb R^{D-d}满足给定第二个参数的条件下,关于第一个参数是可逆映射,称之为耦合律

        不妨对方程组(5)进行重排,使得I_1中对应的变量全部排到前面(因为这个操作仅仅对应着一个线性变换,更确切地说,是一个置换矩阵P),则方程组(5)对应的雅可比矩阵为:

\frac{\partial \boldsymbol y}{\partial \boldsymbol x} = \left [\begin{array}{c|c}  I_{d\times d} & 0_{d\times (D-d)} \\   \hline  \frac{\partial y_{I_2}}{\partial x_{I_1}} &   \frac{\partial y_{I_2}}{\partial x_{I_2}} \end{array} \right ]

        显然,当\frac{\partial y_{I_2}}{\partial x_{I_2}}为对角矩阵时,有{\rm det}(\frac{\partial \boldsymbol y}{\partial \boldsymbol x}) = {\rm det}(I_{d\times d}){\rm det}(\frac{\partial y_{I_2}}{\partial x_{I_2}});不过我将在一般的情况下简单证明一下这个结论:


命题:A = \left [\begin{array}{c|c}  B & O \\   \hline  *&  C \end{array} \right ],则:{\rm det}(A) = {\rm det}(B){\rm det}(C),其中:B \in {\mathcal M}_{d\times d} Od\times (D-d)阶 0 矩阵,* \in {\mathcal M}_{(D-d)\times d}  ,\  C\in {\mathcal M}_{(D-d)\times (D-d)}

Proof:

        我想,正儿八经的证明应该使用数学归纳法,比较简单清晰;不过我尝试用眼瞪+口述法从行列式的展开式定义来说明这个结果是对的,考虑矩阵 A 的行列式的多项式展开定义:

{\rm det}A = \sum_{\pi \in S_D} \sigma_{\pi}a_{1\pi_1}a_{2\pi_2}\cdots a_{D\pi_D}\quad  \cdots (6)

其中:S_D为 D 元对称群,也就是所有长度为 D 的排列全体;\sigma_{\pi}为排列\pi对应的符号;a_{j\pi_j}为矩阵的第j行,第\pi_j列的元素。

        因为矩阵A的右上角的d\times (D-d)的子矩阵为 0 矩阵,所以定义(6)中的单项式a_{1\pi_1}a_{2\pi_2}\cdots a_{D\pi_D},只要前 d 项有一个包括在 0 矩阵中,则该项直接为 0;因此,我们只能考虑那些前 d 项在子矩阵B中选的单项式a_{1\pi_1}a_{2\pi_2}\cdots a_{D\pi_D}

        由行列式的定义,每行每列只能挑选一个元素;因此,后 D-d 项也只能从子矩阵C中挑选了。由此,我们发现可以将所有的单项式a_{1\pi_1}a_{2\pi_2}\cdots a_{D\pi_D}进行因式分解:因为每个固定的单项式前 d 个元素的乘积a_{1\pi_1}a_{2\pi_2}\cdots a_{d\pi_d}都对应着子矩阵C的所有可能的单项式,利用乘法关于加法的分配律得:

a_{1\pi_1}a_{2\pi_2}\cdots a_{d\pi_d}\sum_{\phi \in S_{(D-d)}} a_{(d+1)\phi_{(d+1)}}a_{(d+2)\phi_{(d+2)}}\cdots a_{D\phi_D}

        由于对于所有的\pi_1,...,\pi_d的可能组合,都能提取到相同的因子\sum_{\phi \in S_{(D-d)}} a_{(d+1)\phi_{(d+1)}}a_{(d+2)\phi_{(d+2)}}\cdots a_{D\phi_D};而\pi_1,...,\pi_d的所有可能的组合就是:\sum_{\psi \in S_{(d)}} a_{1\psi_{1}}a_{2\psi_{2}}\cdots a_{d\psi_d}

余下的就是确认符号\sigma_{\pi} = \sigma_{\phi}\sigma_{\psi}是否成立了,从符号的逆叙数定义来看:

        设\pi的逆序数为r,则\sigma(\pi) = (-1)^{r};而\phi,\psi的逆序数分别为r_1,r_2,即:\sigma(\phi) = (-1)^{r_1}, \sigma(\psi) = (-1)^{r_2};但是对于那些不为 0 的单项式,它的前 d 个元素保持在前 d 列之中,后 D-d 个元素保持在后 D-d 列之中;也就是前 d 个元素的任何一个都排在后 D-d 个元素之后,不会对逆序数有任何贡献;即,的确有r = r_1 + r_2成立,因此有\sigma_{\pi} = \sigma_{\phi}\sigma_{\psi}成立,最终有下式成立:

\begin {aligned}{\rm det}A &= \sum_{\pi \in S_D} \sigma_{\pi}a_{1\pi_1}a_{2\pi_2}\cdots a_{D\pi_D}  \\&= \left ( \sum_{\psi \in S_{(d)}} \sigma(\psi) a_{1\psi_{1}}a_{2\psi_{2}}\cdots a_{d\psi_d}\right )\left ( \sum_{\phi \in S_{(D-d)}} \sigma(\phi)a_{(d+1)\phi_{(d+1)}}a_{(d+2)\phi_{(d+2)}}\cdots a_{D\phi_D} \right)\\&= {\rm det}(B) {\rm det}(C)\end{aligned}


加性耦合层

        有了上面的公式,我们的耦合层所定义的映射的雅可比行列式就能简单写为:{\rm det}(\frac{\partial \boldsymbol y}{\partial \boldsymbol x}) ={\rm det}(\frac{\partial y_{I_2}}{\partial x_{I_2}}),并且当我们考虑加性耦合层y_{I_2} = x_{I_2} + m(x_{I_1})时,我们的行列式就是 1 ,即对 NICE 准则的贡献为 0。此时,耦合层的f定义为:

\begin{aligned}&y_{I_1} = x_{I_1} \\&y_{I_2} = x_{I_2} + m(x_{I_1})\end{aligned}

该耦合层的逆映射f^{-1}为:

\begin{aligned}&x_{I_1} =  y_{I_1}\\&x_{I_2} = y_{I_2} - m(y_{I_1})\end{aligned}

        所以,计算该层的前向映射f与计算该层的逆映射f^{-1}的复杂度是一样的。另外,我们没有对函数m:\mathbb R^{d} \to \mathbb R^{D-d}作出任何限制,因此我们可以使用输入为 d 个单元,输出为 D-d 个单元的任何神经网络来充当。

        以上,我们仅对 D 个变量中的 D-d 个变量作了复杂的变换,而保持另外 d 个维度不变;因此要想获得更一般的变换,我们至少还需要对前 d 个维度进行类似的变换,但是同样为了得到可处理性,我们反过来要另外 D-d 个维度保持不变,即:

\begin{aligned}&z_{I_2} = y_{I_2} \\&z_{I_1} = y_{I_1} + m_2(y_{I_1})\end{aligned}


维度的思考

        另外,上面我们忽略了一个细节;假设上面的d < D-d,则事实上光滑映射m(x_{I_1})即便是满秩映射,它的像也只能构成了空间\mathbb R^{(D-d)}的一个子流形;也就是在局部看来,映射y_{I_2} = x_{I_2} + m(x_{I_1}) 只对 D-d 个维度中的 d 个有效维度进行变换,剩余的 D-2d 个有效维度并没有得到变换。

        为此,我认为要么使用 d = D-d 的配置,要么使用 I_1 \cap I_2 \neq \emptyset 的配置(即维度之间有重叠);这样保证 特征的变换 能覆盖到y_{I_2}的整个空间。事实上,作者就是按前者来配置的,令I_1为奇数下标,I_2为偶数下标。

        作者也提了一句,说根据观察训练过程,发现需要至少 3 个耦合层,才能很好地让所有维度之间互相影响,并且作者使用了 4 层;这其实很好理解,因为理论归理论,就像神经网络虽然具有普适性,也不能学习到任意想要的网络一样。

        虽然我们通过构造让\frac{\partial y_{I_2}}{\partial x_{I_2}}具有非 0 雅可比行列式,但不意味着神经网络 m(x_{I_1}) 就能学习到满秩映射。所以,为了能让输入、输出的维度之间能充分影响彼此,实际工程中,应该多叠几层 耦合层。不过,换个角度看,当神经网络 m(x_{I_1}) 不能学习到满秩映射的时候,只要最终拟合成功了,那么可以认为网络在学习一个更加紧凑的特征,毕竟我们的输入的所有维度中也存在着大量的冗余维度。

        说到这里,其实我想到了作者提到的,我们可以通过 对角矩阵 加上一个 秩-1校正矩阵 来构造线性变换矩阵,并且这种矩阵可以通过通过公式计算 行列式;在这里,虽然不能像可逆线性变换存在全局的逆矩阵一样,我们仍然可以在局部存在可逆映射,用上面的术语,在这里我们构造的映射就好比是:对角映射 加一个 秩-k校正映射 其中k \leq \min(d, D-d)


尺度缩放

        本篇最后讨论一下作者一开始提到的观点就是变量变换过程中的 体积 缩放问题,回到最开始我们得到的公式:

 p_{X}(\boldsymbol x)=  p_H(f(\boldsymbol x))\left| {\rm det} \left( \frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x} \right) \right |

        众所周知,一个方阵的行列式是以这个方阵的行(列)向量为边的平行六面体(parallelogram)的有向体积。而可逆映射f(\boldsymbol x)仅仅通过压缩数据在空间中的体积,就能使得似然值变大;比如:模型可以不用努力地学习样本集在空间中的分布结构,而仅仅通过把整个样本空间往p_H的 mode 处收缩,就能提高逆向概率p_X的值;但是,在这里还有一个 体积 \left| {\rm det} \left( \frac{\partial f(\boldsymbol x)}{\partial \boldsymbol x} \right) \right | ,优化该项使得向量\boldsymbol h = f(\boldsymbol x)占据更大的体积,因此就抵消了简单地收缩数据空间带来的无效优化。

        但是,在上面的 加性耦合层 中,我们的行列式恒为 1 ;因此作者提出了,再增加一层线性缩放层,即:\boldsymbol y = {\rm diag}([s_{1},...,s_D])\boldsymbol x,来弥补上面构造的模型的缺陷,该缩放层的雅可比行列式显然为 {\rm det }({\rm diag}([s_1,...,s_D])) = s_1\cdots s_D。最终,我们的 NICE 准则变为:

\begin{aligned}\log( p_{X}(\boldsymbol x)) &=  \sum_{d=1}^{D} \left [ \log (p_{H_d}(f_d(\boldsymbol x)) ) + \log(|s_i|) \right ] \\& =  \sum_{d=1}^{D} \left [ \log (|s_i| \cdot p_{H_d}(f_d(\boldsymbol x)) ) \right ] \end{aligned}

        这说明,|s_i|越大,对应的数据维度越收到极大似然的挤压,因此也就是越不重要;相反那些重要的维度,比如说共k个,可以视为模型学到的\mathbb R^D空间的子流形,该流形的维数就是k

好吧,本篇先到此为止了,到目前还没涉及到 Real NVP 论文,放到下篇写吧。(TODO)


我们接着在本篇稍微讨论一下后面两篇论文吧,就不单独写一篇了,因为大概看了一下,感觉都差不多。

Real NVP , Glow 相关讨论

        后面这两篇论文,基本上就是在 NICE 论文的基础上,做一些进一步的探索:1)在 Real NVP 中提出用能力更强的 affine coupling layer,而在 Glow 中使用的也是  仿射耦合层,可以看作前面讨论的一般耦合层的一个具体案例;2)而Real NVP 和 Glow 中均提到了的 输入向量的维度排列 问题,这个问题在后者被当作一个重要问题来探索。

        本质上,上面这两种探索均属于 耦合律 的具体实现,下面我们稍微再讨论一下 Glow 中的一些主要的改进。

可逆 1 \times 1 卷积

        如同我在前面所讨论的一样,Glow 的作者同样也认为变量之间的互相作用是否能高效地实现,对网络捕获随机变量X 与 Z 之间的关系非常重要。但是 Glow 的作者果然技高一筹,直接使用一个1 \times 1卷积,来进行所谓的 general permutation;相对这种广义的变量维度的排列,NICE 文中相当于仅仅在两组固定的变量之间作 轮流交换,因此不是最优的。

        在深度学习早期的 NIN 这一系列论文中,就有人提出 “使用一个小的 MLP 替代线性卷积核 等价于 直接用线性卷积核 再加上一个1\times 1卷积层“(当然每层都需要加上非线性激活函数),这是容易理解的。类似地,这里作者把1\times 1\times c \times c的卷积核 W 视为c\times c的方阵,意味着在通道维度作线性变换;当W 为 标准正交矩阵 时,就是一个坐标轴 旋转变换,所以作者认为这是 坐标轴之间的 Permutation 的一种推广。

        不过,这里的维度之间的融合仅仅发生在每个像素点对应的那些通道之间,并不涉及不同像素点 之间的融合;因此,全局的维度之间的互相作用还是要靠 coupling layer 来实现,而作者仅仅是用了按通道划分为两组 交替变量 的方式。


步长为1\times 1的 可逆1\times 1卷积层 定义的映射为:

y_{i,j} = Wx_{i,j}, 1 \le i \le w,1\le j \le h,其中:y_{i,j},x_{i,j}是长度为c的通道构成的向量;

因为\frac{\partial y_{i,j}}{\partial x_{k,l}} = W_{k,l} \delta(k,l), \ \forall k, l,其中:\delta(k,l) = \begin{cases}1, & \text{ if } k=j, \text{and } j = l\\0, & \text{otherwise}  \end{cases}

则该卷积层的雅可比行列式为:

\frac{\partial \boldsymbol y}{\partial \boldsymbol x} = \left [\begin{array}{cc}  W & 0 & \cdots &0 \\  0 & W &\cdots & 0 \\\vdots &\vdots &\ddots  &\vdots \\0 &0 &\cdots &W\end{array} \right ]

其中:0c\times c零矩阵,\boldsymbol y, \boldsymbol x为按长、宽、通道 展开的长为h \times w \times c的向量;

根据之前的命题中的 分块上三角矩阵 行列式的证明,我们显然可以由归纳得出:{\rm det}(\frac{\partial \boldsymbol y}{\partial \boldsymbol x} ) = [{\rm det}(W)]^{w\times h}


一个细节

        只要矩阵 W 保持满秩,则即便W不是 标准正交矩阵,我们也可以认为它 是在局部的通道维度之间作融合(广义排列);但是在训练过程中,未必始终能保持满秩状态,作者好像没有作出相关的讨论。所以,关于这篇论文的核心模块的这个细节,作者似乎是回避了这个问题。

        不过,从线性代数中,我们知道那些所有 不可逆的n阶方阵全体 仅仅构成全体n阶方阵的 边界。举个例子:让你随机从平面挑选两个向量,那么这两个向量几乎一定是不相关的;同样,在 n 维空间中,随机挑选出 n 个向量,那么这些向量几乎一定是不相关的,即它们构成空间的一个基,即它们构成的矩阵是可逆的。


参考:

1. Laurent Dinh, David Krueger, Yoshua Bengio, 《NICE: NON-LINEAR INDEPENDENT COMPONENTS ESTIMATION》

2. Laurent Dinh, Jascha Sohl-Dickstein, Samy Bengio, 《DENSITY ESTIMATION USING REAL NVP》

3. Diederik P. Kingma, Prafulla Dhariwal, 《Glow: Generative Flow with Invertible 1×1 Convolutions》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容