Normalizing Flows学习

行列式的含义

借用参考文献中的图来简单解释一下,详细解释可以去查看参考文献。 X X X服从0-1的均匀分布,其 Y = 2 X + 1 Y=2X+1 Y=2X+1,绿色正方形和蓝色长方形分别表示两个分布 p ( x ) p(x) p(x) p ( y ) p(y) p(y)的概率分布,由于任何一个概率分布的积分均为1,所以他们的面积都是1。也因此可得下图:
在这里插入图片描述
若考虑 X X X上的极小变化 d x dx dx, Y Y Y也相应发生变化 d y dy dy, 如下所示:
在这里插入图片描述
由于要保证二者的变化量相等,则有:
p ( x ) d x = p ( y ) d y p(x)dx=p(y)dy p(x)dx=p(y)dy
化简可得:
p ( y ) = p ( x ) d x d y p(y)=p(x)\frac{dx}{dy} p(y)=p(x)dydx
当有两个变量时,给定一个边长为1的小方块,给它乘以矩阵 [ a b c d ] \begin{bmatrix} {a}&{b}\\ {c}&{d}\\ \end{bmatrix} [acbd]之后,就变成了一个平行四边形,如图所示:
四个点的坐标分别是:
[ 0 0 ] \begin{bmatrix} {0}&{0}\\ \end{bmatrix} [00] [ 0 1 ] ∗ [ a b c d ] = [ c d ] \begin{bmatrix} {0}&{1}\\ \end{bmatrix}*\begin{bmatrix} {a}&{b}\\ {c}&{d}\\ \end{bmatrix}=\begin{bmatrix} {c}&{d}\\ \end{bmatrix} [01][acbd]=[cd] [ 1 0 ] ∗ [ a b c d ] = [ a b ] \begin{bmatrix} {1}&{0}\\ \end{bmatrix}*\begin{bmatrix} {a}&{b}\\ {c}&{d}\\ \end{bmatrix}=\begin{bmatrix} {a}&{b}\\ \end{bmatrix} [10][acbd]=[ab] [ 1 1 ] ∗ [ a b c d ] = [ a + c b + d ] \begin{bmatrix} {1}&{1}\\ \end{bmatrix}*\begin{bmatrix} {a}&{b}\\ {c}&{d}\\ \end{bmatrix}=\begin{bmatrix} {a+c}&{b+d}\\ \end{bmatrix} [11][acbd]=[a+cb+d]
该平行四边形的面积为 ( a + c ) ( b + d ) − 2 × 1 2 × c × d − 2 × 1 2 × a × b − 2 × c × b = a × d − c × b = d e t ∣ [ a b c d ] ∣ (a+c)(b+d)-2 \times \frac{1}{2} \times c \times d - 2 \times \frac{1}{2} \times a \times b - 2 \times c \times b = a \times d - c \times b = det|\begin{bmatrix} {a}&{b}\\ {c}&{d}\\ \end{bmatrix}| (a+c)(b+d)2×21×c×d2×21×a×b2×c×b=a×dc×b=det[acbd]

在这里插入图片描述
三维的情况时,“转换为平行四边形”就对应为“转换为平行六面体”,或者更高维的情况也是以此类推,“转换为平行n维体”。行列式的道理也还是如此,线性变换后的体积,正好对应于变换矩阵的行列式。
在高维情况时上述情况依旧成立,即线性变换之后的体积等于转换矩阵的行列式。
y = f ( x ) p ( y ) = p ( f − 1 ( y ) ) ∣ d x d y ∣ = p ( f − 1 ( y ) ) ∣ d e t ( J ( f − 1 ( y ) ) ) ∣ l o g ( p ( y ) ) = l o g ( p ( f − 1 ( y ) ) ) + l o g ( ∣ d e t ( J ( f − 1 ( y ) ) ) ∣ ) y=f(x)\\ p(y)=p(f^{-1}(y))|\frac{dx}{dy}|=p(f^{-1}(y))|det(J(f^{-1}(y)))|\\ log(p(y))=log(p(f^{-1}(y)))+log(|det(J(f^{-1}(y)))|) y=f(x)p(y)=p(f1(y))dydx=p(f1(y))det(J(f1(y)))log(p(y))=log(p(f1(y)))+log(det(J(f1(y))))综上所述:行列式就是局部线性转换的体积变化率。

参考文献:
-Normalization Flow (标准化流) 总结
-对雅可比矩阵的理解
-标准化流(Normalizing Flow)教程(一)
-Normalizing Flows Tutorial, Part 1: Distributions and Determinants

Normalizing Flows

对于一个生成人脸的任务,我们通过将数据 z z z输入一个生成器 G G G中得到一张图片 x x x,即 x = G ( z ) x=G(z) x=G(z),其中这个原始数据 z z z可能是服从某一分布的,常见的如正态分布。而生成的 x x x则是另一个分布。该生成器的目的即为使生成器 G G G生成的分布尽可能和真实人脸分布尽可能相近。这一过程如下图所示:
在这里插入图片描述
那么如何产生好的生成器 G G G呢,就是从真实的人脸数据采样一些人脸图片,使生成器 G G G生成这样的图片的极大似然概率最大(这个个人觉得不太好理解)。也近似为使 P d a t a P_{data} Pdata P G P_G PG的KL散度尽可能小。(这个很好理解)
插播个雅可比矩阵和其逆矩阵的关系: d e t ∣ J a c o b i f ∣ = 1 d e t ∣ J a c o b i f − 1 ∣ det|Jacobi_f|=\frac{1}{det|Jacobi_{f^{-1}}|} detJacobif=detJacobif11根据第一部分计算得到的公式:
y = f ( x ) l o g ( p ( y ) ) = l o g ( p ( f − 1 ( y ) ) ) + l o g ( ∣ d e t ( J ( f − 1 ( y ) ) ) ∣ ) y=f(x)\\ log(p(y))=log(p(f^{-1}(y)))+log(|det(J(f^{-1}(y)))|) y=f(x)log(p(y))=log(p(f1(y)))+log(det(J(f1(y))))这里 x = G ( z ) x=G(z) x=G(z)所以有:
l o g ( p G ( x i ) ) = l o g ( π ( G − 1 ( x i ) ) ) + l o g ( ∣ d e t ( J G − 1 ) ∣ ) log(p_{G}(x^i))=log(\pi (G^{-1}(x^i)))+log(|det(J_{G^{-1}})|) log(pG(xi))=log(π(G1(xi)))+log(det(JG1))
在这里插入图片描述
要求上式有两个问题:
1.如何来计算生成器 G G G的逆。因为要可逆,这里输入和输出的维度必须保持一致。
2.如何计算生成器 G G G的雅可比矩阵,因为如果输入输出都是高维,那么其雅可比矩阵的计算量将非常大。
由于有了上述约束,生成器 G G G不像GAN一样容易设计,接下来的部分将介绍如何设计生成器 G G G
既然一个生成器 G G G生成分布的能力有限,那么就套娃使其得到复杂的分布:
在这里插入图片描述
那么图片中套娃的公式也就比较好理解了,相当于把前一个的输出当作输入再次待入公式。取log以后将连乘变成连加。
l o g p K ( x i ) = l o g ( π ( z i ) ) + ∑ h = 1 K l o g ∣ d e t ( J G K − 1 ) ∣ log_{p_K}(x^i)=log(\pi (z^i))+\sum_{h=1}^{K}{log|det(J_{G_K^{-1}})|} logpK(xi)=log(π(zi))+h=1Klogdet(JGK1)在上述公式中你会发现只需要使用 G − 1 G^{-1} G1,那么怎么计算 G − 1 G^{-1} G1呢?
在这里插入图片描述
首先从真实数据集中采样得到真实样本,送入 G − 1 G^{-1} G1会得到相应的 z i z^i zi,看 l o g p K ( x i ) log_{p_K}(x^i) logpK(xi),其有两项构成: l o g ( π ( z i ) ) log(\pi (z^i)) log(π(zi)) ∑ h = 1 K l o g ∣ d e t ( J G K − 1 ) ∣ \sum_{h=1}^{K}{log|det(J_{G_K^{-1}})|} h=1Klogdet(JGK1)。针对第一项,由于 π ( . ) \pi(.) π(.)是正太分布,当 z i z^i zi取0的向量的时候第一项最大,然而第二项则因为行列式为0趋向负无穷大,无法优化,因此两项无法单独优化得联合优化。

G − 1 G^{-1} G1如何巧妙求解

在这里插入图片描述
设计一个coupling layer,它有两部分构成: z 1 − z d z_1-z_d z1zd z d + 1 − z D z_{d+1}-z_D zd+1zD。使其 z 1 − z d z_1-z_d z1zd直接copy得到 x 1 − x d x_1-x_d x1xd,同时将 z 1 − z d z_1-z_d z1zd分别通过两个函数 F F F H H H得到 β d + 1 − β D \beta_{d+1}-\beta_{D} βd+1βD γ d + 1 − γ D \gamma_{d+1}-\gamma_D γd+1γD,并将 z d + 1 − z D z_{d+1}-z_D zd+1zD点乘 β d + 1 − β D \beta_{d+1}-\beta_{D} βd+1βD再加上 γ d + 1 − γ D \gamma_{d+1}-\gamma_D γd+1γD得到 x d + 1 − x D x_{d+1}-x_D xd+1xD
上一段讲的是如何通过 z z z得到 x x x,接下来将简述其逆过程。由于 z 1 − z d z_1-z_d z1zd直接copy得到 x 1 − x d x_1-x_d x1xd,因此反过来 x 1 − x d x_1-x_d x1xd也可以直接copy得到 z 1 − z d z_1-z_d z1zd。而针对 z d + 1 − z D z_{d+1}-z_D zd+1zD上一段中通过 x i > d = z i > d × β i > d + γ i > d x_{i>d}=z_{i>d} \times \beta_{i>d} + \gamma_{i>d} xi>d=zi>d×βi>d+γi>d反过来就有 z i > d = x i > d − γ i > d β i > d z_{i>d}= \frac{x_{i>d} - \gamma_{i>d}}{\beta_{i>d}} zi>d=βi>dxi>dγi>d
经过上述操作以后, G G G G − 1 G^{-1} G1都可以求得了(太妙了)

雅可比矩阵的化简

接下来还剩一个雅可比矩阵的行列式问题需要解决:
在这里插入图片描述
有了上述的操作很容易理解为什么左上角是单位阵(直接copy),同时因为 z d + 1 − z D z_{d+1}-z_D zd+1zD x 1 − x d x_1-x_d x1xd没有任何关系,因此右上角是0,虽然 z 1 − z d z_1-z_d z1zd x d + 1 − x D x_{d+1}-x_D xd+1xD之间有很复杂的关系( F F F H H H很复杂,但是由于分块矩阵的性质)左下角的这一块不在乎!!!气不气,管你多难,都没用。那么最终就只剩下右下角的部分。而这部分是 x d + 1 − x D x_{d+1}-x_D xd+1xD z d + 1 − z D z_{d+1}-z_D zd+1zD之间的关系,根据 x i > d = z i > d × β i > d + γ i > d x_{i>d}=z_{i>d} \times \beta_{i>d} + \gamma_{i>d} xi>d=zi>d×βi>d+γi>d可得 d e t ∣ J G ∣ = ∂ x d + 1 ∂ z d + 1 ∂ x d + 2 ∂ z d + 2 . . . ∂ x D ∂ z D = β d + 1 β d + 2 . . . β D det|J_G|=\frac{\partial x_{d+1}}{\partial z_{d+1}}\frac{\partial x_{d+2}}{\partial z_{d+2}}...\frac{\partial x_{D}}{\partial z_{D}}=\beta_{d+1}\beta_{d+2}...\beta_{D} detJG=zd+1xd+1zd+2xd+2...zDxD=βd+1βd+2...βD妙,真的是妙。

stacking problem

在这里插入图片描述
由于 z 1 − z d z_1-z_d z1zd直接复制得到 x 1 − x d x_1-x_d x1xd,对于多个模型嵌套那他左上角将一直保持不变,这实际是不现实的。实际上交替改变复制位置来实现改变:
在这里插入图片描述
贴个李宏毅老师讲的图像生成实例,看图很容易理解这里就不再赘述了,有兴趣自己去看文章:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后贴个图放松一下心情:
在这里插入图片描述

参考文献:
-李宏毅机器学习2019(国语):Flow-based Generative Model
-【学习笔记】生成模型——流模型(Flow)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值