李宏毅机器学习笔记.Flow-based Generative Model(补)

news2024/11/22 12:03:11

文章目录

  • 引子
  • 生成问题回顾:Generator
  • Math Background
    • Jacobian Matrix
    • Determinant 行列式
    • Change of Variable Theorem
      • 简单实例
      • 一维实例
      • 二维实例
  • 网络G的限制
  • 基于Flow的网络构架
    • G的训练
    • Coupling Layer
      • Coupling Layer反函数计算
      • Coupling Layer Jacobian矩阵计算
      • Coupling Layer Stacking
    • 1×1 Convolution
  • GLOW效果
  • 其他工作

原视频见油管https://www.youtube.com/watch?v=uXY18nzdSsM
Latex编辑器

引子

之前有讲过三种生成模型:
1.Component-by-component (也叫:Auto-regressive Model):按component进行生成,如何确定最佳的生成顺序?而且一个个的生成会使得速度比较慢。特别是语音生成,一秒钟需要生成的采样点个数约为20万个,有人声称:生成一秒钟,合成90分。
2.Autoencoder(VAE):这个模型证明了是在优化似然的Lower bound,而非去maximize似然,这样的效果有多好还不好说。
3.Generative Adversarial Network(GAN):虽然很强,但是很难训练。

生成问题回顾:Generator

A generator G G G is a network. The network defines a probability distribution p G p_G pG
为什么说生成器网络定义了一个概率分布?看下面的流程:
在这里插入图片描述
图中 G G G吃一个向量 z z z得到一个表示 x = G ( z ) x=G(z) x=G(z),这个 x x x是一个高维向量,是一张图像, x x x里面每一个维度就是这个图像的每一个像素。
输入向量 z z z是用一个Normal Distribution中采样得来的:
在这里插入图片描述
因此经过多次采样经过 G G G后会得到一个比较复杂的分布 p G p_G pG
在这里插入图片描述
我们希望找到一个 G G G,使得其生成的分布 p G p_G pG与实际图像分布 p d a t a ( x ) p_{data}(x) pdata(x)越接近越好。

在这里插入图片描述
越接近越好就是要求最大似然,也就是要使得 p G ( x ) p_G(x) pG(x)的似然与 p d a t a ( x ) p_{data}(x) pdata(x)采样得到的样本越接近越好,用数学表示为:
G ∗ = a r g max ⁡ G ∑ i = 1 m log ⁡ p G ( x i ) , { x 1 , x 2 , ⋯   , x m }   f r o m   p d a t a ( x ) ≈ a r g min ⁡ G K L ( p d a t a ∣ ∣ p G ) \begin{aligned} G^*&=arg\max_G\sum_{i=1}^{m}\log p_G(x^i),\{x^1,x^2,\cdots,x^m\}\text{ } from\text{ } p_{data}(x)\\ &\approx arg\min_G KL(p_{data}||p_G)\end{aligned} G=argGmaxi=1mlogpG(xi),{x1,x2,,xm} from pdata(x)argGminKL(pdata∣∣pG)
上式中的求两个概率越接近越好也相当于求他们的KL散度越小越好。
由于 G G G是一个网络,因此其生成概率的最大似然非常难求,Flow-based Generative Model提出了一种可以直接求最大似然的方法,接下来进入难点,补充部分数学推导。

Math Background

三个东西:Jacobian, Determinant, Change of Variable Theorem

Jacobian Matrix

假如有一个函数 x = f ( z ) x=f(z) x=f(z),吃一个二维向量 z = [ z 1 z 2 ] z=\begin{bmatrix} z_1 \\ z_2 \end{bmatrix} z=[z1z2],得到输出: x = [ x 1 x 2 ] x=\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} x=[x1x2]。(Jacobian Matrix的输入和输出维度不一定一样,这里先简化来举例)
这里的函数可以看做上面提到的生成器 G G G
函数 x = f ( z ) x=f(z) x=f(z)的Jacobian Matrix J f J_f Jf可以写为输入和输出两两组合做偏导后形成的矩阵:
J f = [ ∂ x 1 ∂ z 1 ∂ x 1 ∂ z 2 ∂ x 2 ∂ z 1 ∂ x 2 ∂ z 2 ] (1) J_f=\begin{bmatrix} \cfrac{\partial x_1}{\partial z_1} & \cfrac{\partial x_1}{\partial z_2}\\ \cfrac{\partial x_2}{\partial z_1} &\cfrac{\partial x_2}{\partial z_2} \end{bmatrix}\tag1 Jf= z1x1z1x2z2x1z2x2 (1)


Jacobian Matrix小例子,假如有这样的函数:
[ z 1 + z 2 2 z 2 ] = f ( [ z 1 z 2 ] ) \begin{bmatrix} z_1+z_2 \\ 2z_2 \end{bmatrix}=f\left(\begin{bmatrix} z_1 \\ z_2 \end{bmatrix}\right) [z1+z22z2]=f([z1z2])
则根据上面的公式1可以求得:
J f = [ ∂ ( z 1 + z 2 ) ∂ z 1 ∂ ( z 1 + z 2 ) ∂ z 2 ∂ 2 z 2 ∂ z 1 ∂ 2 z 2 ∂ z 2 ] = [ 1 1 2 0 ] J_f=\begin{bmatrix} \cfrac{\partial (z_1+z_2)}{\partial z_1} & \cfrac{\partial (z_1+z_2)}{\partial z_2}\\ \cfrac{\partial 2z_2}{\partial z_1} &\cfrac{\partial 2z_2}{\partial z_2} \end{bmatrix}=\begin{bmatrix} 1 & 1\\ 2 &0 \end{bmatrix} Jf= z1(z1+z2)z12z2z2(z1+z2)z22z2 =[1210]


同理,若有 z = f − 1 ( x ) z=f^{-1}(x) z=f1(x),则有函数 f f finverse 的Jacobian Matrix:
J f − 1 = [ ∂ z 1 ∂ x 1 ∂ z 1 ∂ x 2 ∂ z 2 ∂ x 1 ∂ z 2 ∂ x 2 ] (2) J_{f^{-1}}=\begin{bmatrix} \cfrac{\partial z_1}{\partial x_1} & \cfrac{\partial z_1}{\partial x_2}\\ \cfrac{\partial z_2}{\partial x_1} &\cfrac{\partial z_2}{\partial x_2} \end{bmatrix}\tag2 Jf1= x1z1x1z2x2z1x2z2 (2)
公式1和2的两个矩阵互逆,二者的乘积结果是Identity矩阵(对角线是1,其他都是0)。


反函数的Jacobian Matrix小例子,假如有这样的函数:
[ x 2 / 2 x 1 − x 2 / 2 ] = f − 1 ( [ x 1 x 2 ] ) \begin{bmatrix} x_2/2 \\ x_1-x_2/2 \end{bmatrix}=f^{-1}\left(\begin{bmatrix} x_1 \\ x_2 \end{bmatrix}\right) [x2/2x1x2/2]=f1([x1x2])
则根据上面的公式2可以求得:
J f − 1 = [ ∂ ( x 2 / 2 ) ∂ x 1 ∂ ( x 2 / 2 ) ∂ x 2 ∂ ( x 1 − x 2 / 2 ) ∂ x 1 ∂ ( x 1 − x 2 / 2 ) ∂ x 2 ] = [ 0 1 / 2 1 − 1 / 2 ] J_{f^{-1}}=\begin{bmatrix} \cfrac{\partial (x_2/2)}{\partial x_1} & \cfrac{\partial (x_2/2)}{\partial x_2}\\ \cfrac{\partial (x_1-x_2/2)}{\partial x_1} &\cfrac{\partial (x_1-x_2/2)}{\partial x_2} \end{bmatrix}=\begin{bmatrix} 0 & 1/2\\ 1 &-1/2 \end{bmatrix} Jf1= x1(x2/2)x1(x1x2/2)x2(x2/2)x2(x1x2/2) =[011/21/2]

两个小例子的结果相乘:
J f J f − 1 = [ 1 1 2 0 ] [ 0 1 / 2 1 − 1 / 2 ] = I J_fJ_{f^{-1}}=\begin{bmatrix} 1 & 1\\ 2 &0 \end{bmatrix}\begin{bmatrix} 0 & 1/2\\ 1 &-1/2 \end{bmatrix}=I JfJf1=[1210][011/21/2]=I


Determinant 行列式

The determinant of a square matrix is a scalar that provides information about the matrix.
对于2×2的矩阵:
A = [ a b c d ] A=\begin{bmatrix} a&b \\ c &d \end{bmatrix} A=[acbd]
有:
d e t ( A ) = a d − b c det(A)=ad-bc det(A)=adbc

对于3×3的矩阵:
[ a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 ] \begin{bmatrix} a_1 & a_2& a_3\\ a_4 & a_ 5&a_6 \\ a_7 & a_8 &a_9 \end{bmatrix} a1a4a7a2a5a8a3a6a9
有:
d e t ( A ) = a 1 a 5 a 9 + a 2 a 6 a 7 + a 3 a 4 a 8 − a 3 a 5 a 7 − a 2 a 4 a 9 − a 1 a 6 a 8 det(A)=a_1a_5a_9+a_2a_6a_7+a_3a_4a_8-a_3a_5a_7-a_2a_4a_9-a_1a_6a_8 det(A)=a1a5a9+a2a6a7+a3a4a8a3a5a7a2a4a9a1a6a8
行列式性质:
d e t ( A ) = 1 d e t ( A − 1 ) det(A)=\cfrac{1}{det(A^{-1})} det(A)=det(A1)1
对于Jacobian Matrix则有:
d e t ( J f ) = 1 d e t ( J f − 1 ) det(J_f)=\cfrac{1}{det(J_{f^{-1}})} det(Jf)=det(Jf1)1
行列式的几何含义是指行向量在高维空间形成的体积。对于低维,例如下面2×2的矩阵,其行列式就对应了其行向量所形成的面积
在这里插入图片描述
对于3×3的矩阵,,其行列式就对应了其行向量所形成的体积
在这里插入图片描述

Change of Variable Theorem

变量变换定理。

简单实例

假设有分布 π ( z ) \pi(z) π(z),其图像如下:
在这里插入图片描述
另有函数可以以上面的分布作为输入 x = f ( z ) x=f(z) x=f(z),得到的结果是另外一个分布 p ( x ) p(x) p(x),其图像如下:
在这里插入图片描述
现在要弄清楚 π ( z ) \pi(z) π(z) p ( x ) p(x) p(x)两个分布之间的关系。
在这里插入图片描述
下面来看简单的例子,假设分布 π ( z ) \pi(z) π(z)如下图:
在这里插入图片描述
可以看到 π ( z ) \pi(z) π(z)是一个简单的均匀分布,它在0~1之间有分布。根据概率的定义:
∫ 0 1 π ( z ) d z = 1 \int_0^1\pi(z)dz=1 01π(z)dz=1
因此可以知道该分布的高度为1。
令假设有函数
x = f ( z ) = 2 z + 1 x=f(z)=2z+1 x=f(z)=2z+1
则可以得到函数生成的分布 p ( x ) p(x) p(x)的图像为:
在这里插入图片描述
由于 p ( x ) p(x) p(x)是概率分布,因此其也要满足:
∫ 1 3 p ( x ) d x = 1 \int_1^3p(x)dx=1 13p(x)dx=1
则绿色分布的高度为0.5,则可以德奥两个分布之间的关系:
在这里插入图片描述
可以写成:
p ( x ′ ) = 1 2 π ( z ′ ) p(x')=\cfrac{1}{2}\pi(z') p(x)=21π(z)

一维实例

下面再推广到更一般的情况。
现在有一个分布记为 π ( z ) \pi(z) π(z),它经过一个变换(或者按上面的说法经过一个函数)后,得到另外一个分布 p ( x ) p(x) p(x),对于下图而言, z ′ z' z通过变换后就到 x ′ x' x的位置,对应的概率密度从 π ( z ′ ) \pi(z') π(z)变成了 p ( x ′ ) p(x') p(x)
在这里插入图片描述
虽然我们不知道 π ( z ) \pi(z) π(z) p ( x ) p(x) p(x)具体的公式,但是我们如果知道变换所涉及的函数,是可以写出二者的关系的,这就是通过Change of Variable Theorem来找到这个关系的过程。
先将 z ′ z' z做一个小小的变动,成为: z ′ + Δ z z'+\Delta z z+Δz,相应的,根据变换函数,可以得到对应的 x ′ + Δ x x'+\Delta x x+Δx
在这里插入图片描述
由于我们做的小小的变动,因此,从 z ′ z' z z ′ + Δ z z'+\Delta z z+Δz对应的概率密度可以看做是均匀分布,同理,从 x ′ x' x x ′ + Δ x x'+\Delta x x+Δx应的概率密度也可以看做是均匀分布:
在这里插入图片描述
相当于将蓝色方块经过变形,得到绿色方块,二者的面积是相等的,二者长×宽应该结果一样。即:
p ( x ′ ) Δ x = π ( z ′ ) Δ z p(x')\Delta x=\pi(z')\Delta z p(x)Δx=π(z)Δz
移项办得到二者的关系可以写为:
p ( x ′ ) = π ( z ′ ) Δ z Δ x p(x')=\pi(z')\cfrac{\Delta z}{\Delta x} p(x)=π(z)ΔxΔz
由于 Δ \Delta Δ是很小的值,因此根据导数的概念,上式可以写为:
p ( x ′ ) = π ( z ′ ) d z d x p(x')=\pi(z')\cfrac{d z}{d x} p(x)=π(z)dxdz
由于上面的求导项可能有正负:
在这里插入图片描述
因此要加上绝对值避免负值:
p ( x ′ ) = π ( z ′ ) ∣ d z d x ∣ p(x')=\pi(z')\left|\cfrac{d z}{d x}\right| p(x)=π(z) dxdz

二维实例

对于二维的情况:
在这里插入图片描述
同样的,现在有一个分布记为 π ( z ) \pi(z) π(z),它经过一个变换后,得到另外一个分布 p ( x ) p(x) p(x),对于下图而言, z ′ z' z通过变换后就到 x ′ x' x的位置,对应的概率密度从 π ( z ′ ) \pi(z') π(z)变成了 p ( x ′ ) p(x') p(x)
还是给 z ′ z' z做一个小小的变动,蓝色方形和绿色菱形的对应的概率密度体积应该相等。这里的体积就是底面积×概率密度,蓝色底面积好求,绿色菱形底面积用上面的行列式的几何概念来求,可以看到下图中菱形可以写为成两个向量的表示 [ Δ x 11 , Δ x 21 ] [\Delta x_{11}, \Delta x_{21}] [Δx11,Δx21] [ Δ x 12 , Δ x 22 ] [\Delta x_{12},\Delta x_{22}] [Δx12,Δx22]
在这里插入图片描述
最后就是写成:
p ( x ′ ) ∣ d e t [ Δ x 11 Δ x 21 Δ x 12 Δ x 22 ] ∣ = π ( z ′ ) Δ z 1 Δ z 2 (3) p(x')\left| det\begin{bmatrix} \Delta x_{11}&\Delta x_{21} \\ \Delta x_{12} &\Delta x_{22} \end{bmatrix} \right|=\pi(z')\Delta z_{1}\Delta z_{2}\tag3 p(x) det[Δx11Δx12Δx21Δx22] =π(z)Δz1Δz2(3)

下面开始数学上的化简,假设变换函数为: x = f ( z ) x=f(z) x=f(z),则公式3可以写为:
p ( x ′ ) ∣ 1 Δ z 1 Δ z 2 d e t [ Δ x 11 Δ x 21 Δ x 12 Δ x 22 ] ∣ = π ( z ′ ) p(x')\left|\cfrac{1}{\Delta z_{1}\Delta z_{2}} det\begin{bmatrix} \Delta x_{11}&\Delta x_{21} \\ \Delta x_{12} &\Delta x_{22} \end{bmatrix} \right|=\pi(z') p(x) Δz1Δz21det[Δx11Δx12Δx21Δx22] =π(z)
根据线代的指数,将分数项放入行列式:
p ( x ′ ) ∣ d e t [ Δ x 11 Δ z 1 Δ x 21 Δ z 1 Δ x 12 Δ z 2 Δ x 22 Δ z 2 ] ∣ = π ( z ′ ) p(x')\left|det\begin{bmatrix} \cfrac{\Delta x_{11}}{\Delta z_1} &\cfrac{\Delta x_{21}}{\Delta z_1} \\ \cfrac{\Delta x_{12}}{\Delta z_2} &\cfrac{\Delta x_{22}}{\Delta z_2} \end{bmatrix} \right|=\pi(z') p(x) det Δz1Δx11Δz2Δx12Δz1Δx21Δz2Δx22 =π(z)
由于:
Δ x 11 \Delta x_{11} Δx11 Δ z 1 \Delta z_{1} Δz1 x 1 x_1 x1上的改变量;
Δ x 21 \Delta x_{21} Δx21 Δ z 1 \Delta z_{1} Δz1 x 2 x_2 x2上的改变量;
Δ x 12 \Delta x_{12} Δx12 Δ z 2 \Delta z_{2} Δz2 x 1 x_1 x1上的改变量;
Δ x 22 \Delta x_{22} Δx22 Δ z 2 \Delta z_{2} Δz2 x 2 x_2 x2上的改变量。
上面的式子可以写成:
p ( x ′ ) ∣ d e t [ ∂ x 1 ∂ z 1 ∂ x 2 ∂ z 1 ∂ x 1 ∂ z 2 ∂ x 2 ∂ z 2 ] ∣ = π ( z ′ ) p(x')\left|det\begin{bmatrix} \cfrac{\partial x_{1}}{\partial z_1} &\cfrac{\partial x_{2}}{\partial z_1} \\ \cfrac{\partial x_{1}}{\partial z_2} &\cfrac{\partial x_{2}}{\partial z_2} \end{bmatrix} \right|=\pi(z') p(x) det z1x1z2x1z1x2z2x2 =π(z)
将矩阵进行Transpose不会改变行列式的值,上式可以写成:
p ( x ′ ) ∣ d e t [ ∂ x 1 ∂ z 1 ∂ x 1 ∂ z 2 ∂ x 2 ∂ z 1 ∂ x 2 ∂ z 2 ] ∣ = π ( z ′ ) p(x')\left|det\begin{bmatrix} \cfrac{\partial x_{1}}{\partial z_1} &\cfrac{\partial x_{1}}{\partial z_2} \\ \cfrac{\partial x_{2}}{\partial z_1} &\cfrac{\partial x_{2}}{\partial z_2} \end{bmatrix} \right|=\pi(z') p(x) det z1x1z1x2z2x1z2x2 =π(z)
上面行列式中的句子和公式1中的Jacobian Matrix形式一样,因此可以写成:
p ( x ′ ) ∣ d e t ( J f ) ∣ = π ( z ′ ) (4) p(x')\left|det(J_f) \right|=\pi(z')\tag4 p(x)det(Jf)=π(z)(4)
也可以写为:
p ( x ′ ) = π ( z ′ ) ∣ 1 d e t ( J f ) ∣ = π ( z ′ ) ∣ d e t ( J f − 1 ) ∣ (5) p(x')=\pi(z')\left|\cfrac{1}{det(J_f) }\right|=\pi(z')|det(J_{f^{-1}})| \tag5 p(x)=π(z) det(Jf)1 =π(z)det(Jf1)(5)

网络G的限制

先把上面最大似然的式子copy下来
G ∗ = a r g max ⁡ G ∑ i = 1 m log ⁡ p G ( x i ) , { x 1 , x 2 , ⋯   , x m }   f r o m   P d a t a ( x ) G^*=arg\max_G\sum_{i=1}^{m}\log p_G(x^i),\{x^1,x^2,\cdots,x^m\}\text{ } from\text{ } P_{data}(x) G=argGmaxi=1mlogpG(xi),{x1,x2,,xm} from Pdata(x)
根据上面公式5,可以把 p G p_G pG写成:
p G ( x i ) = π ( z i ) ∣ d e t ( J G − 1 ) ∣ p_G(x^i)=\pi (z^i)|det(J_{G^{-1}})| pG(xi)=π(zi)det(JG1)
由已知的 x = G ( z ) x=G(z) x=G(z)可以得其反函数为: z i = G − 1 ( x i ) z^i=G^{-1}(x^i) zi=G1(xi),带入上式:
p G ( x i ) = π ( G − 1 ( x i ) ) ∣ d e t ( J G − 1 ) ∣ p_G(x^i)=\pi \left(G^{-1}(x^i)\right )\left|det(J_{G^{-1}})\right | pG(xi)=π(G1(xi))det(JG1)
两边同时取对数,然后乘变加展开:
log ⁡ p G ( x i ) = log ⁡ [ π ( G − 1 ( x i ) ) ∣ d e t ( J G − 1 ) ∣ ] = log ⁡ ( G − 1 ( x i ) ) + log ⁡ ∣ d e t ( J G − 1 ) ∣ \begin{aligned} \log p_G(x^i)&=\log \left[\pi \left(G^{-1}(x^i)\right )\left|det(J_{G^{-1}})\right |\right]\\ &= \log \left(G^{-1}(x^i)\right )+\log\left|det(J_{G^{-1}})\right |\end{aligned} logpG(xi)=log[π(G1(xi))det(JG1)]=log(G1(xi))+logdet(JG1)
要求 G ∗ G^* G就是要求上式的最大值,如果要想用GD来求解,必须要计算两个东西:
1. d e t ( J G − 1 ) 或 d e t ( J G ) det(J_{G^{-1}})或det(J_{G}) det(JG1)det(JG):这个还比较好算,就是要计算输入 z z z和输出 x x x的偏导即可,但是如果输入和输出各自有1000维,由于Jacobian Matrix是输入输出的各个维度的两两偏导,其大小就是:1000×1000,这个大小的矩阵求行列式的值计算量会很大。
2. G − 1 G^{-1} G1:主要是要确保 G G G有反函数,由于 G G G是一个网络,因此其构架要精心设计才会有反函数。

根据上面的两点,如果要输出一张100×100×3的图片,那么输入也要100×100×3,这个是确保 G G G有反函数的必要条件。
显然,网络 G G G不可以是简单的、任意的类似CNN、RNN等网络架构,于是就有了流式设计。

基于Flow的网络构架

一个网络 G G G不够,因此考虑像流水一样设计多个网络进行concat:
在这里插入图片描述
根据上面的公式,这些网络之间的输入输出关系如下:
p 1 ( x i ) = π ( z i ) ( ∣ d e t ( J G 1 − 1 ) ∣ ) p 2 ( x i ) = π ( z i ) ( ∣ d e t ( J G 1 − 1 ) ∣ ) ( ∣ d e t ( J G 2 − 1 ) ∣ ) ⋮ p K ( x i ) = π ( z i ) ( ∣ d e t ( J G 1 − 1 ) ∣ ) ⋯ ( ∣ d e t ( J G K − 1 ) ∣ ) \begin{aligned} p_1(x^i)&=\pi \left(z^i\right )\left(\left|det(J_{G^{-1}_1})\right |\right )\\ p_2(x^i)&=\pi \left(z^i\right )\left(\left|det(J_{G^{-1}_1})\right |\right )\left(\left|det(J_{G^{-1}_2})\right |\right )\\ &\quad\vdots\\ p_K(x^i)&=\pi \left(z^i\right )\left(\left|det(J_{G^{-1}_1})\right |\right )\cdots\left(\left|det(J_{G^{-1}_K})\right |\right ) \end{aligned} p1(xi)p2(xi)pK(xi)=π(zi)( det(JG11) )=π(zi)( det(JG11) )( det(JG21) )=π(zi)( det(JG11) )( det(JGK1) )
两边同时取对数,乘变加:
log ⁡ p K ( x i ) = log ⁡ π ( z i ) + ∑ h = 1 K log ⁡ ∣ d e t ( J G K − 1 ) ∣ (6) \log p_K(x^i)=\log \pi \left(z^i\right )+\sum_{h=1}^K\log\left|det(J_{G^{-1}_K})\right |\tag6 logpK(xi)=logπ(zi)+h=1Klog det(JGK1) (6)
其中:
z i = G 1 − 1 ( ⋯ G K − 1 ( x i ) ) z^i=G^{-1}_1\left(\cdots G^{-1}_K\left(x^i\right )\right ) zi=G11(GK1(xi))
现在要求的就是公式6的最大化。

G的训练

为了求公式6的最大化,这里先简化一下问题,先考虑只有一个 G G G情况:
在这里插入图片描述
此时需要最大化的式子为:
log ⁡ p G ( x i ) = log ⁡ π ( G − 1 ( x i ) ) + log ⁡ ∣ d e t ( J G − 1 ) ∣ (7) \log p_G(x^i)=\log \pi \left(G^{-1}\left(x^i\right )\right )+\log\left|det(J_{G^{-1}})\right |\tag7 logpG(xi)=logπ(G1(xi))+logdet(JG1)(7)
式子中只有出现 G − 1 G^{-1} G1,因此可以训练一个 G − 1 G^{-1} G1对应的网络,训练好后,将其输入输出反过来,就变成了 G G G
具体训练过程是从真实数据 p d a t a ( x ) p_{data}(x) pdata(x)中采样一些样本 x i x^i xi出来,丢进 G − 1 G^{-1} G1对应的网络,得到对应的 z i z^i zi

在这里插入图片描述
先看公式7中的前半部分:
log ⁡ π ( G − 1 ( x i ) ) \log \pi \left(G^{-1}\left(x^i\right )\right ) logπ(G1(xi))
这里的 π \pi π是正态分布,也就是当 z i = G − 1 ( x i ) = 0 z^i=G^{-1}\left(x^i\right )=0 zi=G1(xi)=0的时候,正态分布 π \pi π会得到最大值(正态分布最正中的地方就是波峰);
如果 z i z^i zi趋向于0或者说0向量的时候,其对应的Jacobian Matrix, J G − 1 J_{G^{-1}} JG1也会是0矩阵(因为该矩阵每个元素都是要求 z z z x x x的偏导),0矩阵的行列式 d e t ( J G − 1 ) = 0 det(J_{G^{-1}})=0 det(JG1)=0,再取对数会使得公式7中的后半部分趋向于负无穷大。
总之就是一项要使得 z i z^i zi趋向于0,后一项使得 z i z^i zi不为0。

Coupling Layer

Coupling Layer反函数计算

这个设计可以参考两篇文章:NICE: Non-linear Independent Components Estimation、Density estimation using Real NVP
具体结构如下图:
在这里插入图片描述
假设 z z z D D D维,先将其分成两部分,分别是: z 1 , ⋯   , z d z_1,\cdots,z_d z1,,zd z d + 1 , ⋯   , z D z_{d+1},\cdots,z_D zd+1,,zD
1.将 z z z的第一部分 z 1 , ⋯   , z d z_1,\cdots,z_d z1,,zd直接复制,成为 x x x的第一部分: x 1 , ⋯   , x d x_1,\cdots,x_d x1,,xd
2.将 z z z的第一部分 z 1 , ⋯   , z d z_1,\cdots,z_d z1,,zd分别丢进两个网络 F F F H H H(两个网络没有invertiable的限制,可以是深度CNN),分别得到 β d + 1 , ⋯   , β D \beta_{d+1},\cdots,\beta_D βd+1,,βD γ d + 1 , ⋯   , γ D \gamma_{d+1},\cdots,\gamma_D γd+1,,γD
3.将 z z z的第二部分 z d + 1 , ⋯   , z D z_{d+1},\cdots,z_D zd+1,,zD先和 β d + 1 , ⋯   , β D \beta_{d+1},\cdots,\beta_D βd+1,,βD点积,然后再加上 γ d + 1 , ⋯   , γ D \gamma_{d+1},\cdots,\gamma_D γd+1,,γD,得到 x x x的第二部分: x d + 1 , ⋯   , x D x_{d+1},\cdots,x_D xd+1,,xD
x i > d = β i z i + γ i x_{i>d}=\beta_iz_i+\gamma_i xi>d=βizi+γi

Coupling Layer之所以这样设计,就是可以计算反函数,现在利用 x x x来算 z z z,看下图的红线及序号:
在这里插入图片描述

1.将 x x x的第一部分: x 1 , ⋯   , x d x_1,\cdots,x_d x1,,xd直接复制,成为 z z z的第一部分 z 1 , ⋯   , z d z_1,\cdots,z_d z1,,zd
2.和上面的步骤2一样,将 z z z的第一部分 z 1 , ⋯   , z d z_1,\cdots,z_d z1,,zd分别丢进两个网络 F F F H H H,分别得到 β d + 1 , ⋯   , β D \beta_{d+1},\cdots,\beta_D βd+1,,βD γ d + 1 , ⋯   , γ D \gamma_{d+1},\cdots,\gamma_D γd+1,,γD
3.根据以下公式计算 z i > d z_{i>d} zi>d
z i > d = x i − γ i β i z_{i>d}=\cfrac{x_i-\gamma_i}{\beta_i} zi>d=βixiγi

Coupling Layer Jacobian矩阵计算

先把上面的Coupling Layer 结构简化成下面的样子,注意颜色:
在这里插入图片描述

将Jacobian矩阵的计算结果分为四个部分,这里的颜色和上面的简化模型颜色是对应的:
在这里插入图片描述
左上角是Identity矩阵,因为这里 x i < d = z i < d x_{i<d}=z_{i<d} xi<d=zi<d,浅蓝对浅绿的偏导结果除了对角线其他位置都是0;
右上角结果是0,因为这里浅蓝部分 x 1 , ⋯   , x d x_1,\cdots,x_d x1,,xd与深绿部分 z d + 1 , ⋯   , z D z_{d+1},\cdots,z_D zd+1,,zD无关,求偏导后均为0;
左下角的内容不需要考虑,因为左上角是Identity矩阵和右上角是0,整个灰色大矩阵的行列式的值等于右下角的行列式的值,这个是行列式的某个推论;
右下角就是要看深绿和深蓝部分的关系,他们的关系在上面有写:
x i > d = β i z i + γ i (8) x_{i>d}=\beta_iz_i+\gamma_i\tag8 xi>d=βizi+γi(8)
从这个式子可以看到, x d + 1 x_{d+1} xd+1只与 z d + 1 z_{d+1} zd+1有关,与 z d + 2 , ⋯   , z D z_{d+2},\cdots,z_D zd+2,,zD无关,因此,右下角只有对角线上有值(但不为1),是一个对角线矩阵。
现在问题变成要求右下角矩阵行列式的值,由于右下角是一个对角线矩阵,因此其行列式的值等于对角线上的所有值的乘积(行列式定义简单推导即可得到该结论),可写为:
d e t ( J G ) = ∂ x d + 1 ∂ z d + 1 ∂ x d + 2 ∂ z d + 2 ⋯ ∂ x D ∂ z D det(J_G)=\cfrac{\partial x_{d+1}}{\partial z_{d+1}}\cfrac{\partial x_{d+2}}{\partial z_{d+2}}\cdots\cfrac{\partial x_D}{\partial z_D} det(JG)=zd+1xd+1zd+2xd+2zDxD
根据公式8可以将每一项偏导求出来:
d e t ( J G ) = β d + 1 β d + 2 ⋯ β D det(J_G)=\beta_{d+1}\beta_{d+2}\cdots\beta_D det(JG)=βd+1βd+2βD

Coupling Layer Stacking

下面来看Coupling Layer如何叠加,假设有多个Coupling Layer如下图
在这里插入图片描述
按照单个Coupling Layer的原理,我们发现它会把第一层浅黄色部分直接copy到最后一层,这样会使得最后的部分和原始输入的noise一样(原始输入是从搞屎分布中随机sample出来),这样没有啥意义。
在这里插入图片描述
因此在堆叠的时候可以适当做一些反向,注意看函数的箭头:
在这里插入图片描述
经过Copy操作后变成:
在这里插入图片描述

在做图像生成实操的时候如何做反向?有两种方法:
第一种,按棋盘式的前后两两反向
在这里插入图片描述
第二种,将图片的channel进行反接,一层做copy,一层做Transform:
在这里插入图片描述
两种方法还可以混合使用。

1×1 Convolution

另外一个技巧让基于Flow的网络构架对称的技巧就是1×1的卷积,这个是15年就提出来的概念,但是22年又用在了GLOW上面,使得我们在不使用GAN的情况下也能做图像生成。
Glow: Generative Flow with Invertible 1x1 Convolutions

假设输入为 z z z,输出为 x x x,由于是图像问题,图片中每个像素看做一个单位,且有RGB三个channel,1×1的卷积过程如下图所示:
在这里插入图片描述
z z z中的每一个像素对应的3个channel与大小为3×3的矩阵 W W W相乘,得到x相同位置上的一个像素的3个channel。
x = f ( z ) = W z (9) x=f(z)=Wz\tag9 x=f(z)=Wz(9)
矩阵 W W W是通过训练学习得来,其作用为将3个channel进行shuffle,例如:
[ 0 0 1 1 0 0 0 1 0 ] W [ 1 2 3 ] = [ 3 1 2 ] \overset{W}{\begin{bmatrix} 0& 0&1 \\ 1 & 0&0 \\ 0 & 1 &0 \end{bmatrix}}\begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}=\begin{bmatrix} 3 \\ 1 \\ 2 \end{bmatrix} 010001100 W 123 = 312
这样就可以使得在用Coupling Layer stacking的时候,不需要进行反接,而是让模型自己学习 W W W,决定如何来交换channel的位置。将 W W W加入Generator构架 G G G中后,也必须是是invertiable的,即: W W W必须存在 W − 1 W^{-1} W1。GLOW文章中没有证明 W W W一定可逆,仅提到使用了存在 W − 1 W^{-1} W1 W W W进行初始化,并希望在模型自动学习收敛后, W W W还是可逆。当然三阶矩阵不可逆的条件比较苛刻(除非该矩阵对应的行列式值为0),一般三阶矩阵都可以满足可逆这一条件。

下面根据公式9来求单个像素点对应的Jacobian Matrix,将该公式写开:
[ x 1 x 2 x 3 ] = [ w 11 w 12 w 13 w 21 w 22 w 23 w 31 w 32 w 33 ] [ z 1 z 2 z 3 ] \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} x1x2x3 = w11w21w31w12w22w32w13w23w33 z1z2z3
Jacobian Matrix计算结果就为:
j f = [ ∂ x 1 / ∂ z 1 ∂ x 1 / ∂ z 2 ∂ x 1 / ∂ z 3 ∂ x 2 / ∂ z 1 ∂ x 2 / ∂ z 2 ∂ x 2 / ∂ z 3 ∂ x 3 / ∂ z 1 ∂ x 3 / ∂ z 2 ∂ x 3 / ∂ z 3 ] = [ w 11 w 12 w 13 w 21 w 22 w 23 w 31 w 32 w 33 ] = W 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 jf= x1/z1x2/z1x3/z1x1/z2x2/z2x3/z2x1/z3x2/z3x3/z3 = w11w21w31w12w22w32w13w23w33 =W

接下来看整个图片的Jacobian Matrix,假设图片大小是 d × d d\times d d×d
在这里插入图片描述

根据上面的图来看,只有对应位置上的像素点做了乘 W W W的操作,而与其他像素点是没有关系的,因而整个图片的Jacobian Matrix可以表示为下图:
在这里插入图片描述
只有对角线部分是由一个个 W W W组成,其他位置都是0,根据线性代数的推论,整个矩阵的行列式的值为:
( d e t ( W ) ) d × d \left(det(W)\right)^{d\times d} (det(W))d×d
由于 W W W是3×3的矩阵,其行列式的值很容易算(可参加上面有公式)。

GLOW效果

接下来演示了OpenAI的GLOW模型效果GLOW模型效果,合成:
在这里插入图片描述
魔改笑脸,收集不笑的人脸和有笑容的人脸,通过 G − 1 G^{-1} G1求向量后,分别求两组人脸的平均,然后求差就得到从不笑到笑之间的向量为 z s i m l e z_{simle} zsimle
在这里插入图片描述
找一张要改笑容的图片,通过 G − 1 G^{-1} G1求向量后,加上 z s i m l e z_{simle} zsimle,再过 G G G得到结果:
在这里插入图片描述

其他工作

语音合成
Parallel WaveNet: Fast High-Fidelity Speech Synthesis
在这里插入图片描述
WaveGlow: A Flow-based Generative Network for Speech Synthesis
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.6 TCP可靠传输的实现

思维导图&#xff1a; 5.6.1 TCP可靠传输的实现笔记概述 在TCP/IP模型中&#xff0c;第5.6节讨论了TCP如何通过滑动窗口机制来实现可靠传输。以下是对本节内容的笔记概括&#xff0c;以及关键点的简化解释&#xff1a; 滑动窗口&#xff08;Sliding Window&#xff09; 基本概…

按顺序判断对象a和b中第一个不同之处ax和bx【1】ax是否小于等于bx【2】不同处ax是否为空operator.le()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 按顺序判断对象a和b中 第一个不同之处ax和bx 【1】ax是否小于等于bx 【2】不同处ax是否为空 operator.le() [太阳]选择题 下列代码执行输出结果为True的个数为? import operator pr…

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容&#xff0c;还可以根据我们…

2023年【山东省安全员C证】考试资料及山东省安全员C证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试资料是安全生产模拟考试一点通生成的&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材汇编出山东省安全员C证仿真模拟考试。2023年【山东省安全员C证】考试资料及山东省…

免费记课时小程序-全优学堂

1. 教师使用小程序记上课 使用步骤 创建了员工账号&#xff0c;员工需设置为教师为班级进行排课使用系统账号绑定小程序&#xff0c;记上课 #1.1 创建员工账号 通过系统菜单’机构设置->员工管理‘&#xff0c;添加本机构教师及其他员工。 添加过程中&#xff0c;可设置…

excel制作透视表

场景描述&#xff1a; 有一张excel表&#xff0c;存在多条记录&#xff0c;现在需要把相同名称的商品的数量求和&#xff0c;放在一起展示 操作步骤&#xff1a; 删除最后一行数据 选中不显示分类汇总 以表格形式展示

Apache Pulsar 在腾讯云上的最佳实践

导语 由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕&#xff0c;本次活动大咖云集&#xff0c;来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起&#xff0c;深入探讨 Pulsar 在生产环境中的最佳应用实践&#x…

收藏 | 如何撰写数据分析报告?(附案例及数据源下载)

▲点击上方卡片关注我&#xff0c;回复“8”&#xff0c;加入数据分析领地&#xff0c;一起学习数据分析&#xff0c;持续更新数据分析学习路径相关资料~&#xff08;精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~&#xff09;回复“小飞象”&…

pycharm 断点调试python Flask

以flask框架为例&#xff0c;其启动命令为 python app.py runserver 后面需要拼接runserver 点击开始断点 参考&#xff1a;https://www.cnblogs.com/bigtreei/p/14742015.html

Mac之NVM|通过brew安装、更新、卸载、重新安装nvm

文章目录 导文通过brew安装NVM通过brew更新NVM通过brew卸载NVM通过brew重新安装NVM 导文 Mac之NVM 通过brew安装、更新、卸载、重新安装 通过brew安装NVM brew install nvm通过brew更新NVM brew upgrade nvm通过brew卸载NVM brew uninstall nvm通过brew重新安装NVM brew re…

Python 内嵌函数:它们有什么用处?

目录 创建 Python 内部函数使用内部函数&#xff1a;基础知识 提供封装构建助手内部函数使用内部辅助函数与私有辅助函数使用内部函数保留状态&#xff1a;闭包 在闭包中保留状态修改关闭状态使用内部函数添加行为&#xff1a;装饰器结论 一、说明 内部函数&#xff0c;也称为嵌…

分析订单每日营收、流量数据:

曝光率----》流量----->订单数 点击率&#xff1a;1000次广告展示&#xff0c;点击率10%意味着你可以获得100个流量&#xff08;就是访问产品页的人数&#xff09; &#xff08;下单&#xff09;转化率&#xff1a;转化率5%意味着你可以获得&#xff1a;流量的%5&#xff…

有方N58 HTTP POST 请求连接 TDengine

串口调试软件&#xff1a;格西调试精灵 第一步先注册网络获取IP地址 建立PPP连接 ATXIIC1\r PPP链路建立成功&#xff0c;查询IP地址 ATXIIC?\r 设置网络APN ATCREG?\r 运行结果&#xff0c;红线处是获…

跨境商城源码怎么部署

随着全球电子商务的快速发展&#xff0c;跨境商城已成为一种重要的商业模式。然而&#xff0c;要成功运营一个跨境商城&#xff0c;除了要有优秀的源码开发技术外&#xff0c;还需要进行合理的源码部署。本文将为您提供一份全面的跨境商城源码部署指南。 二、跨境商城源码选择 …

API管理平台搭建过程问题总结

API管理的定义和好处 API管理是指对应用程序编程接口&#xff08;API&#xff09;进行集中管理、监控和维护的过程。API是用于不同软件之间进行通信和交互的编程接口&#xff0c;通过API管理可以有效地管理和控制API的使用、访问和安全性。 API管理的好处包括&#xff1a; 1…

配送中心信息系统建设

配送中心信息系统的网络构成 配送中心最主要的信息系统为“物流管理信息系统”(WarehouseManagementsystem简称WMS)&#xff0c;物流管理信息系统的网络构成主要由主机系统设备、资料库主机、终端系统设备、无线终端网络设备和网络系统设备组成。将这些设备通过现代网络技术有…

[概述] 获取点云数据的仪器

这里所说的获取点云的仪器指的是可以获取场景中物体距离信息的相关设备&#xff0c;下面分别从测距原理以及适用场景来进行介绍。 一、三角测距法 三角测距原理 就是利用三角形的几何关系来测量物体的距离。想象一下&#xff0c;你站在一个地方&#xff0c;你的朋友站在另一…

乐分享五五公排,整合资源打造全新消费生态

​小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 分…

【云原生基础】了解云原生,什么是云原生?

&#x1f4d1;前言 本文主要讲了云原生的基本概念和原则的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#x…

Unity 粒子特效-第六集-圆圈循环UI特效

一、特效预览 二、制作原理 1.素材介绍 我们停下来看一下这个球&#xff0c;是有无数个小圆圈形成的。 小圆圈素材资源 链接&#xff1a;https://pan.baidu.com/s/1cNMOgYQJnzWJ_uOuqhTpnQ?pwd48y5 提取码&#xff1a;48y5 2.步骤介绍 1.小球动画的时间大概在1秒 2.小球…