规整化流笔记

规整化流 & NICE模型

参考:

统计学习建模p(xθ)p(x|\theta)的目标:

  1. 采样该结构,生成数据。
  2. 评估测试数据的似然概率。在拒绝采样或评估模型时有用。(unconditional likelihood estimation)
  3. 获得变量间的条件依赖关系。如p(x1x2)p(x_1|x_2)可以用来判别或者回归。(conditional likelihood estimation)
  4. 评判算法。如熵、互信息、高阶矩等指标。

以上四个目标,第一个研究的最充分。合成图像、声音,已在谷歌商用。但第二三四个,研究寥寥。仅举几例,GAN的解码器,支撑集(映射到非零值的自变量)不可得;DRAW模型乃至VAE模型,概率密度不可得;哪怕已解析地了解某分布,解析的度量(如KL距离,earth-mover距离)还是不可得。【译者按:这句话说的简单点就是:深度产生式模型不容易甚至不可能进行测试和度量】

规整化流

规整化流的主要目标:从一个简单的分布出发,构建出新分布:

  1. 足够复杂,容得下多个模式。
  2. 足够简单,能采样,能估计密度,能重参数化。

分布x经过变换形成y

经过这样的变化,p(x)p(x)周围的微元上的一个p(x)dxp(x)dx应当与变换后的p(y)dyp(y)dy相同,这样定义域上的所有微元积分到一起时能保证结果不变。

由于变换要求可逆,所以变换函数f()f( \cdot )应当是单调增函数或者单调减函数。

  1. 单调增函数的逆函数h()h( \cdot )也应当是单调增函数。因此:

FX(x)=p[Xx]=p[f(Z)x]=p[Zh(x)]=FZ(h(x))F_{X}(x)=p[X\leq x]=p[f(Z)\leq x]= p[Z\leq h(x)]=F_{Z}(h(x))

pX(x)=dFX(x)dx=dFZ(h(x))dx=pZ(h(x))h(x)p_{X}(x)=\frac{dF_{X}(x)}{dx}=\frac{dF_{Z}(h(x))}{dx}=p_{Z}(h(x))*h^{\prime}(x)

h(x)h^{\prime}(x)会是正数

  1. f()f( \cdot )是单调减函数,其反函数亦然。因此:

FX(x)=p[Xx]=p[f(Z)x]=p[Zh(x)]=1FZ(h(x))F_{X}(x)=p[X\leq x]=p[f(Z)\leq x]= p[Z\geq h(x)]= 1 - F_{Z}(h(x))

pX(x)=dFX(x)dx=(1dFZ(h(x)))dx=pZ(h(x))h(x)p_{X}(x)=\frac{dF_{X}(x)}{dx}=\frac{(1- dF_{Z}(h(x)))}{dx}=p_{Z}(h(x))*-h^{\prime}(x)

统一起来,可以简单表示为:

pX(x)=pZ(h(x))h(x)p_{X}(x)=p_{Z}(h(x))*|h^{\prime}(x)|

对于多元且非线性的变换:

y=f(x)\boldsymbol{y} = f(\boldsymbol{x})

则应当额外乘上逆变换对原变量的雅可比矩阵的行列式的绝对值:

p(y)=p(f1(y))detJ(f1(y))logp(y)=logp(f1(y))+logdet(J(f1(y)))\begin{aligned}p(y)&=p(f^{-1}(y))\cdot|detJ(f^{-1}(y))|\\\\\\logp(y)&=logp(f^{-1}(y))+log|det(J(f^{-1}(y)))|\end{aligned}

这样,通过多次的复合变换,即可将简单地分布变换为更有表达能力的复杂分布。

多次的复合变换

NICE模型

学习训练流程

存在一个数据集D\mathcal{D},将其中的每个样本输入进编码器,也就是将图像所对应的复杂的概率分布中采样出的样本,经过多重的可逆的变量转换,最终输出的同纬度编码。我们将其视为最终输出的复合的简单的隐变量zz

将这个隐变量输入正态的概率密度函数(所设定的先验)输出其似然,通过反向传播最大化该似然。

maxθlogpX(D;θ)=xDlogpZ(fθ1(x))+logdet(fθ1(x)x)\max_{\theta}\log p_{X}(\mathcal{D};\theta)=\sum_{x\in\mathcal{D}}\log p_{Z}\left(f_{\theta}^{-1}(x)\right)+\log\left|\det\left(\frac{\partial f_{\theta}^{-1}(x)}{\partial x}\right)\right|

推理采样流程

从相同维度的高斯分布中采样一个样本,通过编码器可逆变换形成的解码器解码。

NICE网络结构设计

分块耦合层

为了将上述的雅可比矩阵转换为下三角矩阵:将DD维的输入xx分为两个部分x1x_1x2x_2。分别是从xx的1 ~ d维度和d+1 ~ D维度。

且由于hh的定义是从xxzz定义的,因此以下变换即为上文提到的逆变换,求其雅可比矩阵的行列式。

h1=x1h2=x2+m(x1)\begin{aligned}&h_{1}=x_{1}\\&h_{2}=x_{2}+m(x_{1})\end{aligned}

mm是任意的变换函数,以上操作得到hh的过程称为“加性耦合层”(Additive Coupling)。

[hx]=(IdO[mx1]Id:D)\left[\frac{\partial h}{\partial x}\right]=\left(\begin{array}{cc}\mathbb{I}_d&\mathbb{O}\\\left[\frac{\partial m}{\partial x_1}\right]&\mathbb{I}_{d:D}\end{array}\right)

以上雅可比矩阵的行列式为1。

在后续的推理时,即可用相同的神经网络mm构建逆过程。

x1=h1x2=h2m(h1)\begin{aligned}&x_{1}=h_{1}\\&x_{2}=h_{2}-m(h_{1})\end{aligned}

单个变换不能达到非常强的非线性,所以我们需要多个简单变换的复合,以达到强非线性,增强拟合能力。

x=h(0)h(1)h(2)h(n1)h(n)=zx=h^{(0)}\leftrightarrow h^{(1)}\leftrightarrow h^{(2)}\leftrightarrow\cdots\leftrightarrow h^{(n-1)}\leftrightarrow h^{(n)}=z

[zx]=[h(n)h(0)]=[h(n)h(n1)][h(n1)h(n2)][h(1)h(0)]\left[\frac{\partial z}{\partial x}\right]=\left[\frac{\partial h^{(n)}}{\partial h^{(0)}}\right]=\left[\frac{\partial h^{(n)}}{\partial h^{(n-1)}}\right]\left[\frac{\partial h^{(n-1)}}{\partial h^{(n-2)}}\right]\cdots\left[\frac{\partial h^{(1)}}{\partial h^{(0)}}\right]

且因为“矩阵的乘积的行列式等于矩阵的行列式的乘积”,而每一层都是加性耦合层,因此每一层的行列式为 1,所以结果就是:

det[zx]=det[h(n)h(n1)]det[h(n1)h(n2)]...det[h(1)h(0)]=1\det\left[\frac{\partial z}{\partial x}\right]=\det\left[\frac{\partial h^{(n)}}{\partial h^{(n-1)}}\right]\det\left[\frac{\partial h^{(n-1)}}{\partial h^{(n-2)}}\right]...\det\left[\frac{\partial h^{(1)}}{\partial h^{(0)}}\right]=1

简单的耦合会导致第一部分一直未发生变化而平凡

因此,可以通过 交叉耦合 的方式使得信息充分混合达到更强的表示能力。

h1(1)=x1h1(2)=h1(1)+m2(h2(1))h2(1)=x2+m1(x1)h2(2)=h2(1)h1(3)=h1(2)h1(4)=h1(3)+m4(h2(3))h2(3)=h2(2)+m3(h1(2))h2(4)=h2(3)\begin{aligned} &h_{1}^{(1)} =x_1 && h_{1}^{(2)} && =h_1^{(1)}+m_2\big(h_2^{(1)}\big) \\ &h_2^{(1)} =x_2+m_1(x_1) && h_2^{(2)} && =h_2^{(1)} \\ &h_1^{(3)} =h_1^{(2)} && h_1^{(4)} && =h_1^{(3)}+m_4(h_2^{(3)}) \\ &h_2^{(3)} =h_2^{(2)}+m_3(h_1^{(2)}) && h_2^{(4)} && =h_2^{(3)} \end{aligned}

交叉耦合方式

尺度变换层

隐变量zz与输入xx是具有相同维度DD的,但是由于xx本身未必能占据DD维的空间。
这里NICE引入了尺度变换层用于探索降维的可能。

zz的先验分布开始

zz是均值为0,方差 不为 1的高斯分布,则:

q(z)=1(2π)D/2i=1Dσiexp(12i=1Dzi2σi2)q(z)=\frac{1}{(2\pi)^{D/2}\prod_{i=1}^{D}\sigma_{i}}\exp\biggl(-\frac{1}{2}\sum_{i=1}^{D}\frac{z_{i}^{2}}{\sigma_{i}^{2}}\biggr)

此时,样本xx的对数似然约为:

logq(x)12i=1Dfi2(x)σi2i=1Dlogσi\log q(x)\sim-\frac12\sum_{i=1}^D\frac{f_i^2(x)}{\sigma_i^2}-\sum_{i=1}^D\log\sigma_i

这里,我们可以将σi\sigma_i视作反应第ii维数据弥散程度的参数,如果σi\sigma_i值很小,接近于0,则可认为对于隐变量zzii维并不重要(分布坍缩成一个具体的值)。

因此尺度变换层即为对最终输出的隐变量zz再乘以ss

z=sh(n)z=s\otimes h^{(n)}

因此,最终似然变为如下形式(因为最后乘以ss操作的雅可比矩阵的行列式为(s1sD)(s_1 \dots s_D)的对角矩阵)

logq(x)12sf(x)2+ilogsi\log q(x)\sim-\frac{1}{2}\begin{Vmatrix}s\otimes f(x)\end{Vmatrix}^2+\sum_i\log s_i

最终的损失函数即为上式的相反数,最小化损失函数,最大化对数似然。

这里的ss不能完全等价于先验的标准差。但可以视作先验的标准差也作为训练参数,用来衡量每个维度弥散程度,为探索降维提供了可能。

特征解耦

  1. 一个好的特征,理想情况下各个维度之间应该是相互独立的,这样实现了特征的解耦,使得每个维度都有自己独立的含义。
  2. 先验分布为各分量独立的高斯分布,由于各分量的独立性,我们可以认为其各个维度的特征是解耦的(控制改变单个维度时,就可以看出生成图像是如何随着该维度的改变而改变,从而发现该维度的含义。)
  3. 也可以对两幅图像的编码进行插值(加权平均),得到过渡自然的生成样本。

规整化流笔记
https://fengxiang777.github.io/2024/07/31/规整化流笔记/
作者
FengXiang777
发布于
2024年7月31日
许可协议