基于流的生成式模型

目标

其中z是隐变量,z是可观测变量。z通过生成器之后会输出x。然后假设z是遵循正态分布的$\pi(\mathrm{z})$。正态分布的z经过G之后可能会形成一个复杂的分布记作$p_G(x)$

最终的目的是最大似然,然后让$p_G(x)$接近$P_{data}(x)$,也就是最小化他们的KL散度。

其中$\{x^{1},x^{2},...,x^{m}\}fromP_{data}(x)$

$$ G^{*}=arg\max_{G}\sum_{i=1}^{m}logP_{G}\big(x^{i}\big) \approx arg\min_GKL(P_{data}||P_G) $$

雅可比矩阵

在下面可以把f看做生成模型

把输入部分和输出部分俩俩去做偏微分(一共四种组合),形成一个矩阵叫做雅可比矩阵(Jacobian Matrix)

$$ \begin{aligned}&z=\begin{bmatrix}z_{1}\\z_{2}\end{bmatrix}\quad x=\begin{bmatrix}x_{1}\\x_{2}\end{bmatrix}\\&x=f(z)\\&J_{f}=\begin{bmatrix}\partial x_1/\partial z_1&\partial x_1/\partial z_2\\\partial x_2/\partial z_1&\partial x_2/\partial z_2\end{bmatrix}\end{aligned} $$

假设x可以通过一个反函数还原到z$z=f^{-1}(x)$那么其中它反函数的雅可比矩阵是

如果将这俩个矩阵相乘是恒等的。所以这个俩个矩阵是互为inverse的

$$ J_{f^{-1}}=\begin{bmatrix}\partial z_1/\partial x_1&\partial z_1/\partial x_2\\\partial z_2/\partial x_1&\partial z_2/\partial x_2\end{bmatrix} $$

行列式

平方矩阵的行列式是一个标量,提供了有关于矩阵的信息。det函数。所以可以得出:

$$ det(A)=1/det(A^{-1})\\det(J_{f_{0}})=1/det(J_{f^{-1}}) $$

它的几何意义是(在二维中)就是俩个向量组成的平行四边形的面积。同理三维就是立方体的体积。严格来说有可能是负的,所以加上绝对值才是体积。

change of variable Theorem

假如z中有一点z'他通过f之后会获得一个x'。我们要寻找他们之前的关系。

那一个简单的举例子

右边的俩个公式是概率密度函数。

换一种展现形式

其中蓝色和绿色有相同的面积也就是说

$$ \begin{aligned}&p(x^{\prime})\Delta x=\pi(z^{\prime})\Delta z\\&p(x^{\prime})=\pi(z^{\prime})\frac{\Delta z}{\Delta x}\end{aligned} $$

其中这个$\Delta$如果非常小的话也可以看做

$$ p(x^{\prime})=\pi(z^{\prime})\frac{dz}{dx}\\ 实际上要加上绝对值也就是\\ p(x^{\prime})=\pi(z^{\prime})\left|\frac{dz}{dx}\right| $$

如果是在2维空间中

公式为

$$ p(x^{\prime})\left|det\begin{bmatrix}\Delta x_{11}&\Delta x_{21}\\\Delta x_{12}&\Delta x_{22}\end{bmatrix}\right|=\pi(z^{\prime})\Delta z_{1}\Delta z_{2} $$

其中$\Delta_{11}是\Delta_{1}$改变的时候$x_1$的改变量。而$\Delta_{21}是\Delta_{1}$改变的时候$x_2$的改变量。

接下来对这个式子作整理

$$ \begin{aligned} &p(x^{\prime})\left|det\begin{bmatrix}\Delta x_{11}&\Delta x_{21}\\\Delta x_{12}&\Delta x_{22}\end{bmatrix}\right|=\pi(z^{\prime})\Delta z_{1}\Delta z_{2}\quad\mathrm{x}=f(z) \\ &\left.p(x^{\prime})\left|\frac{1}{\Delta z_{1}\Delta z_{2}}det\left[\begin{matrix}{\Delta x_{11}}&{\Delta x_{21}}\\{\Delta x_{12}}&{\Delta x_{22}}\\\end{matrix}\right.\right]\right|=\pi(z^{\prime}) \\ &p(x^{\prime})\left|det\begin{bmatrix}\Delta x_{11}/\Delta z_{1}&\Delta x_{21}/\Delta z_{1}\\\Delta x_{12}/\Delta z_{2}&\Delta x_{22}/\Delta z_{2}\end{bmatrix}\right|=\pi(z^{\prime}) \\ &p(x^{\prime})\left|det\begin{bmatrix}\partial x_1/\partial z_1&\partial x_2/\partial z_1\\\partial x_1/\partial z_2&\partial x_2/\partial z_2\end{bmatrix}\right|=\pi(z^{\prime}) \\ &p(x')\left|\det\begin{bmatrix}\partial x_1/\partial z_1&\partial x_1/\partial z_2\\\partial x_2/\partial z_1&\partial x_2/\partial z_2\end{bmatrix}\right|=\pi(z') \end{aligned} $$

最后得到了(重点)

$$ p(x^{\prime})|det(J_{f})|=\pi(z^{\prime})\\p(x^{\prime})=\pi(z^{\prime})|det(J_{f^{-1}})| $$

这样我们可以将之前的式子进行改写。

$$ G^{*}=arg\max_{G}\sum_{i=1}^{m}logp_{G}(x^{i})\\p_{G}(x^{i})=\pi(z^{i})|det(J_{G^{-1}})| $$

而$z^i$是$x^i$带入生成函数的反函数。也就是$z^{i}=G^{-1}(x^{i})$带入上式然后俩边取log得

$$ logp_{G}\big(x^{i}\big)=log\pi\left(G^{-1}\big(x^{i}\big)\right)+log|det(J_{G^{-1}})| $$

要计算上式我们要算$det(J_{G^{-1}})$或者$det(J_{G})$也就是计算z对x变化就可以得到了

但是这个结果可能很大比如输入和输出都是1000维。要算这样的det是很花时间的

所以我们要设计network架构G。让G的inverse好算。为了确保G是可逆的,所以Z和X的维度都会是一样的

比如我输出的图片为100x100x3 (100个像素三通道)那么输入的也要是100x100x3的。当然他们一样不代表G一定是可逆的,但是如果不一样G就不可能是可逆的。所以我们

对于G的选择

如果一个G不够,可以加多个G。

$$ \begin{aligned} &p_{1}(x^{i}) =\pi\big(z^{i}\big)\left(\left|det\left(J_{G_{1}^{-1}}\right)\right|\right) \\ &p_2(x^{i}) =\pi\big(z^{i}\big)\left(\left|det\left(J_{G_{1}^{-1}}\right)\right|\right)\left(\left|det\left(J_{G_{2}^{-1}}\right)\right|\right) \\ &\text{...} \\ &p_K(x^i) =\pi\Big(z^{i}\Big)\Big(\Big|det\Big(J_{G_{1}^{-1}}\Big)\Big|\Big)\cdots\Big(\Big|det\Big(J_{G_{K}^{-1}}\Big)\Big|\Big) \end{aligned} $$

然后取让相乘变成相加,也就是最大化

$$ logp_{K}\big(x^{i}\big)=log\pi\big(z^{i}\big)+\sum_{h=1}^{K}log\big|det\big(J_{G_{K}^{-1}}\big)\big| $$

实际的时候用的是G的inverse。

如果先只考虑一项的话

$$ logp_{G}\big(x^{i}\big)=log\pi\left(G^{-1}\big(x^{i}\big)\right)+log|det(J_{G^{-1}})| $$

所以训练的时候,训练的是G的反函数。也就是说输入$x^i$输出$z^i$。然后推理的时候使用的G本身。

那么我们分别来看俩项,左边这项如何增大。其中的$\pi$是正态分布,那么输入为0向量的情况下这个值越大。也就是输入x,输出都为0,显然有非常大的问题。因为0向量的雅可比矩阵也是0。而如果把0带入第二个式子就会得到负无穷。也就是永远无法收敛。

耦合层

假如input是一个向量叫做z,输出是一个向量叫做x,然后我们把z拆成俩组,前d维为一组,后d维为一组(一共D个元素)。

x的前d维是z的前d维复制过去,这是为了让反函数非常容易被计算。然后将z的前d维通过俩个函数叫做F和H,这个F和H可以是任意的函数(RNN,CNN等),不需要是可逆的。F的计算结果记为$\beta$,H的计算结果为$\gamma$。

然后将F的结果按元素和d+1-D之间的元素按元素相乘,H的结果和d+1-D之间的元素按元素相加。

所以最终的结果就是$x_{i>d}=\beta_{i} z_{i} +\gamma_{i}$。那么如果需要找前面z的前d维,只需要把x复制过来就好。

剩下的$z_d+1到Z_D$就可以通过$x_d+1到x_D$减去$\gamma$除以$\beta$ 就可以得到了$z_D$也就是$z_{i>d}=\frac{x_{i} -\gamma_{i}}{\beta_{i}}$

除此之外我们还要计算雅可比矩阵的det。我们来看雅可比矩阵。计算每一个部分对于每个部分的雅可比矩阵。

这是因为上面提到的

$p(x^{\prime})|det(J_{f})|=\pi(z^{\prime})\\p(x^{\prime})=\pi(z^{\prime})|det(J_{f^{-1}})|$

左上角是恒等的,因为是直接复制过去的。右上角是0因为改变的影响。左下角不需要关心,因为计算行列式的时候乘的是0,最重要的就是右下角的矩阵了。是整个矩阵的行列式结果。其中右下角部分$x_{i>d}=\beta_{i} z_{i} +\gamma_{i}$

为什么是对角矩阵呢。因为$z_{d+1}只和x_{d+1}有关系$。因为它是按元素乘和按元素相加。

右下角的矩阵是一个对角(Diagonal)矩阵所以最终

$$ \begin{aligned}&det(J_{G})\\&=\frac{\partial x_{d+1}}{\partial z_{d+1}}\frac{\partial x_{d+2}}{\partial z_{d+2}}\cdots\frac{\partial x_{\mathrm{D}}}{\partial z_{\mathrm{D}}}\\&=\beta_{d+1}\beta_{d+2}\cdots\beta_{D}\end{aligned} $$

它是能被轻易算出来的。

然后我们把这些coupling layer叠起来。变成一个完整的生成模型。

但是有个问题就是第一层会永远延续到最后,所以我们做一下变换。

举个例子,如果是做图像生成的话,可以拿其中某几个通道做复制,某个通道做变换。

1x1卷积

还是图片为例如果卷积是3x3的,那么输入和输出就可以做到一个维度。它们可以把不同的通道之间的关系对调(在适当的时机)。

那么w是一个可逆的矩阵吗?不一定,但是这是大概率事件。因为正好算出来是0才会不可逆。

假设我们进行卷积,那么公式为

$$ x=f(z)=Wz $$

也就是

$$ \begin{bmatrix}x_{1}\\x_{2}\\x_{3}\end{bmatrix}=\begin{bmatrix}w_{11}&w_{12}&w_{13}\\w_{21}&w_{22}&w_{23}\\w_{31}&w_{32}&w_{33}\end{bmatrix}\begin{bmatrix}z_{1}\\z_{2}\\z_{3}\end{bmatrix} $$

那么它的雅可比矩阵就是

$$ J_{f}=\begin{bmatrix}\partial x_1/\partial z_1&\partial x_1/\partial z_2&\partial x_1/\partial z_3\\\partial x_2/\partial z_1&\partial x_2/\partial z_2&\partial x_2/\partial z_3\\\partial x_3/\partial z_1&\partial x_3/\partial z_2&\partial x_3/\partial z_3\end{bmatrix}=\begin{bmatrix}w_{11}&w_{12}&w_{13}\\w_{21}&w_{22}&w_{23}\\w_{31}&w_{32}&w_{33}\end{bmatrix}=W $$

1x1卷积它的生成的雅可比矩阵也是一个对角矩阵。

所以最后的雅可比矩阵就是W的行列式

$$ \left(det(W)\right)^{d\times d} $$

很明显是可以轻松计算的。

比如计算俩个人小孩的样子。

受限输入图片A过$G^{-1}$输出$z_1$。同理图B拿到对应的$z_2$然后$0.5z_1+0.5z_2$经过G就得到了结果。

flow它经常被用来做来做语音合成。

Last modification:November 14, 2024
如果觉得我的文章对你有用,请随意赞赏