行列式的含义
借用参考文献中的图来简单解释一下,详细解释可以去查看参考文献。
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×d−2×21×a×b−2×c×b=a×d−c×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(f−1(y))∣dydx∣=p(f−1(y))∣det(J(f−1(y)))∣log(p(y))=log(p(f−1(y)))+log(∣det(J(f−1(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}}|}
det∣Jacobif∣=det∣Jacobif−1∣1根据第一部分计算得到的公式:
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(f−1(y)))+log(∣det(J(f−1(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(π(G−1(xi)))+log(∣det(JG−1)∣)
要求上式有两个问题:
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=1∑Klog∣det(JGK−1)∣在上述公式中你会发现只需要使用
G
−
1
G^{-1}
G−1,那么怎么计算
G
−
1
G^{-1}
G−1呢?
首先从真实数据集中采样得到真实样本,送入
G
−
1
G^{-1}
G−1会得到相应的
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=1Klog∣det(JGK−1)∣。针对第一项,由于
π
(
.
)
\pi(.)
π(.)是正太分布,当
z
i
z^i
zi取0的向量的时候第一项最大,然而第二项则因为行列式为0趋向负无穷大,无法优化,因此两项无法单独优化得联合优化。
G − 1 G^{-1} G−1如何巧妙求解
设计一个coupling layer,它有两部分构成:
z
1
−
z
d
z_1-z_d
z1−zd和
z
d
+
1
−
z
D
z_{d+1}-z_D
zd+1−zD。使其
z
1
−
z
d
z_1-z_d
z1−zd直接copy得到
x
1
−
x
d
x_1-x_d
x1−xd,同时将
z
1
−
z
d
z_1-z_d
z1−zd分别通过两个函数
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+1−zD点乘
β
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+1−xD
上一段讲的是如何通过
z
z
z得到
x
x
x,接下来将简述其逆过程。由于
z
1
−
z
d
z_1-z_d
z1−zd直接copy得到
x
1
−
x
d
x_1-x_d
x1−xd,因此反过来
x
1
−
x
d
x_1-x_d
x1−xd也可以直接copy得到
z
1
−
z
d
z_1-z_d
z1−zd。而针对
z
d
+
1
−
z
D
z_{d+1}-z_D
zd+1−zD上一段中通过
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}
G−1都可以求得了(太妙了)
雅可比矩阵的化简
接下来还剩一个雅可比矩阵的行列式问题需要解决:
有了上述的操作很容易理解为什么左上角是单位阵(直接copy),同时因为
z
d
+
1
−
z
D
z_{d+1}-z_D
zd+1−zD和
x
1
−
x
d
x_1-x_d
x1−xd没有任何关系,因此右上角是0,虽然
z
1
−
z
d
z_1-z_d
z1−zd和
x
d
+
1
−
x
D
x_{d+1}-x_D
xd+1−xD之间有很复杂的关系(
F
F
F和
H
H
H很复杂,但是由于分块矩阵的性质)左下角的这一块不在乎!!!气不气,管你多难,都没用。那么最终就只剩下右下角的部分。而这部分是
x
d
+
1
−
x
D
x_{d+1}-x_D
xd+1−xD和
z
d
+
1
−
z
D
z_{d+1}-z_D
zd+1−zD之间的关系,根据
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}
det∣JG∣=∂zd+1∂xd+1∂zd+2∂xd+2...∂zD∂xD=βd+1βd+2...βD妙,真的是妙。
stacking problem
由于
z
1
−
z
d
z_1-z_d
z1−zd直接复制得到
x
1
−
x
d
x_1-x_d
x1−xd,对于多个模型嵌套那他左上角将一直保持不变,这实际是不现实的。实际上交替改变复制位置来实现改变:
贴个李宏毅老师讲的图像生成实例,看图很容易理解这里就不再赘述了,有兴趣自己去看文章:
最后贴个图放松一下心情:
参考文献:
-李宏毅机器学习2019(国语):Flow-based Generative Model
-【学习笔记】生成模型——流模型(Flow)