基于流的生成式模型
目标
其中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它经常被用来做来做语音合成。