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

文章目录

原视频见油管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=1∑mlogpG(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= ∂z1∂x1∂z1∂x2∂z2∂x1∂z2∂x2 (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)∂z1∂2z2∂z2∂(z1+z2)∂z2∂2z2 =\[1210


同理,若有 z = f − 1 ( x ) z=f^{-1}(x) z=f−1(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 Jf−1= ∂x1∂z1∂x1∂z2∂x2∂z1∂x2∂z2 (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/2x1−x2/2\]=f−1(\[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} Jf−1= ∂x1∂(x2/2)∂x1∂(x1−x2/2)∂x2∂(x2/2)∂x2∂(x1−x2/2) =\[011/2−1/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 JfJf−1=[1210][011/2−1/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)=ad−bc

对于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+a3a4a8−a3a5a7−a2a4a9−a1a6a8 行列式性质: d e t ( A ) = 1 d e t ( A − 1 ) det(A)=\\cfrac{1}{det(A\^{-1})} det(A)=det(A−1)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(Jf−1)1 行列式的几何含义是指行向量在高维空间形成的体积。对于低维,例如下面2×2的矩阵,其行列式就对应了其行向量所形成的面积 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/26fcab49a23128d2e404417b1c7679ee.webp) 对于3×3的矩阵,,其行列式就对应了其行向量所形成的体积 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/7ef88379f5fe90fcb0fb18ce0c4e1d81.webp) ### Change of Variable Theorem 变量变换定理。 #### 简单实例 假设有分布 π ( z ) \\pi(z) π(z),其图像如下: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/90d2061e3f960b12ead1a55676f833a2.webp) 另有函数可以以上面的分布作为输入 x = f ( z ) x=f(z) x=f(z),得到的结果是另外一个分布 p ( x ) p(x) p(x),其图像如下: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/941a5a903618a72f33bf9f1255fc5f91.webp) 现在要弄清楚 π ( z ) \\pi(z) π(z)和 p ( x ) p(x) p(x)两个分布之间的关系。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/9ccb7bef99e294ea1dd3c05eed519d9d.webp) 下面来看简单的例子,假设分布 π ( z ) \\pi(z) π(z)如下图: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/1c4939908145623803cabd28972f29ab.webp) 可以看到 π ( 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)的图像为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/2dac24839dc481e7335b04c7a7bbc5ff.webp) 由于 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,则可以德奥两个分布之间的关系: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/df6541602a06214a767f21dba3f27299.webp) 可以写成: 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′)。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/06129b616b33f7c57899497b329c3ff5.webp) 虽然我们不知道 π ( 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 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/adc2a2252b8821488548ba0ea6043d32.webp) 由于我们做的小小的变动,因此,从 z ′ z' z′到 z ′ + Δ z z'+\\Delta z z′+Δz对应的概率密度可以看做是均匀分布,同理,从 x ′ x' x′到 x ′ + Δ x x'+\\Delta x x′+Δx应的概率密度也可以看做是均匀分布: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/32c302a6b253fa628c3d5bb2a9611c3d.webp) 相当于将蓝色方块经过变形,得到绿色方块,二者的面积是相等的,二者长×宽应该结果一样。即: 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 由于上面的求导项可能有正负: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/e83664842315ed46d4a512174cd28e1a.webp) 因此要加上绝对值避免负值: p ( x ′ ) = π ( z ′ ) ∣ d z d x ∣ p(x')=\\pi(z')\\left\|\\cfrac{d z}{d x}\\right\| p(x′)=π(z′) dxdz #### 二维实例 对于二维的情况: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/cde405f2b53f522cb278e974b3ac12a8.webp) 同样的,现在有一个分布记为 π ( 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\]。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/0aa7c52c2c67ccc39f5f6534f36d4f14.webp) 最后就是写成: 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 ∂z1∂x1∂z2∂x1∂z1∂x2∂z2∂x2 =π(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 ∂z1∂x1∂z1∂x2∂z2∂x1∂z2∂x2 =π(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(Jf−1)∣(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=1∑mlogpG(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(JG−1)∣ 由已知的 x = G ( z ) x=G(z) x=G(z)可以得其反函数为: z i = G − 1 ( x i ) z\^i=G\^{-1}(x\^i) zi=G−1(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)=π(G−1(xi))∣det(JG−1)∣ 两边同时取对数,然后乘变加展开: 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\[π(G−1(xi))∣det(JG−1)∣\]=log(G−1(xi))+log∣det(JG−1)∣ 要求 G ∗ G\^\* G∗就是要求上式的最大值,如果要想用GD来求解,必须要计算两个东西: 1. d e t ( J G − 1 ) 或 d e t ( J G ) det(J_{G\^{-1}})或det(J_{G}) det(JG−1)或det(JG):这个还比较好算,就是要计算输入 z z z和输出 x x x的偏导即可,但是如果输入和输出各自有1000维,由于Jacobian Matrix是输入输出的各个维度的两两偏导,其大小就是:1000×1000,这个大小的矩阵求行列式的值计算量会很大。 2. G − 1 G\^{-1} G−1:主要是要确保 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: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/956a5b0b6fa60b3f70eb3ded6b5dc894.webp) 根据上面的公式,这些网络之间的输入输出关系如下: 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(JG1−1) )=π(zi)( det(JG1−1) )( det(JG2−1) )⋮=π(zi)( det(JG1−1) )⋯( det(JGK−1) ) 两边同时取对数,乘变加: 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=1∑Klog det(JGK−1) (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=G1−1(⋯GK−1(xi)) 现在要求的就是公式6的最大化。 ### G的训练 为了求公式6的最大化,这里先简化一下问题,先考虑只有一个 G G G情况: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/44821cc6c43663dee8edf2a925455d44.webp) 此时需要最大化的式子为: 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π(G−1(xi))+log∣det(JG−1)∣(7) 式子中只有出现 G − 1 G\^{-1} G−1,因此可以训练一个 G − 1 G\^{-1} G−1对应的网络,训练好后,将其输入输出反过来,就变成了 G G G。 具体训练过程是从真实数据 p d a t a ( x ) p_{data}(x) pdata(x)中采样一些样本 x i x\^i xi出来,丢进 G − 1 G\^{-1} G−1对应的网络,得到对应的 z i z\^i zi ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/518ee2986f18dfa559ecbdf7b1948a76.webp) 先看公式7中的前半部分: log ⁡ π ( G − 1 ( x i ) ) \\log \\pi \\left(G\^{-1}\\left(x\^i\\right )\\right ) logπ(G−1(xi)) 这里的 π \\pi π是正态分布,也就是当 z i = G − 1 ( x i ) = 0 z\^i=G\^{-1}\\left(x\^i\\right )=0 zi=G−1(xi)=0的时候,正态分布 π \\pi π会得到最大值(正态分布最正中的地方就是波峰); 如果 z i z\^i zi趋向于0或者说0向量的时候,其对应的Jacobian Matrix, J G − 1 J_{G\^{-1}} JG−1也会是0矩阵(因为该矩阵每个元素都是要求 z z z对 x x x的偏导),0矩阵的行列式 d e t ( J G − 1 ) = 0 det(J_{G\^{-1}})=0 det(JG−1)=0,再取对数会使得公式7中的后半部分趋向于负无穷大。 总之就是一项要使得 z i z\^i zi趋向于0,后一项使得 z i z\^i zi不为0。 ### Coupling Layer #### Coupling Layer反函数计算 这个设计可以参考两篇文章:[NICE: Non-linear Independent Components Estimation](https://arxiv.org/abs/1410.8516)、[Density estimation using Real NVP](https://arxiv.org/abs/1605.08803) 具体结构如下图: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/b8f77c16ba72f7672ed303d72b037c00.webp) 假设 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,看下图的红线及序号: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/39a82b4a8c59e67411d5f82ae594e5cd.webp) 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 结构简化成下面的样子,注意颜色: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/4d2986ccbb0574af437e40815255a210.webp) 将Jacobian矩阵的计算结果分为四个部分,这里的颜色和上面的简化模型颜色是对应的: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/1f520bb24c27179e1485427ac0161892.webp) 左上角是Identity矩阵,因为这里 x i \< d = z i \< d 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+1∂xd+1∂zd+2∂xd+2⋯∂zD∂xD 根据公式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如下图 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/1630453fe265e2ec5f5c6ef912ba1ea4.webp) 按照单个Coupling Layer的原理,我们发现它会把第一层浅黄色部分直接copy到最后一层,这样会使得最后的部分和原始输入的noise一样(原始输入是从搞屎分布中随机sample出来),这样没有啥意义。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/2cb5dfb55a522110d6a686d4c43e10a1.webp) 因此在堆叠的时候可以适当做一些反向,注意看函数的箭头: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/b0bdabb7a693af3a1418a63f947d7b65.webp) 经过Copy操作后变成: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/0594057543b7d0030367934ab1a329bf.webp) 在做图像生成实操的时候如何做反向?有两种方法: 第一种,按棋盘式的前后两两反向 ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/d9775c5ca14f4e9d880a8c89509bbf92.webp) 第二种,将图片的channel进行反接,一层做copy,一层做Transform: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/5256a279719f5fd7d6a9bc92ca636ef7.webp) 两种方法还可以混合使用。 ### 1×1 Convolution 另外一个技巧让基于Flow的网络构架对称的技巧就是1×1的卷积,这个是15年就提出来的概念,但是22年又用在了GLOW上面,使得我们在不使用GAN的情况下也能做图像生成。 [Glow: Generative Flow with Invertible 1x1 Convolutions](https://arxiv.org/abs/1807.03039) 假设输入为 z z z,输出为 x x x,由于是图像问题,图片中每个像素看做一个单位,且有RGB三个channel,1×1的卷积过程如下图所示: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/1faa6649525fa004ad25417d1d70c966.webp) 将 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} W−1。GLOW文章中没有证明 W W W一定可逆,仅提到使用了存在 W − 1 W\^{-1} W−1的 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/∂z1∂x2/∂z1∂x3/∂z1∂x1/∂z2∂x2/∂z2∂x3/∂z2∂x1/∂z3∂x2/∂z3∂x3/∂z3 = w11w21w31w12w22w32w13w23w33 =W 接下来看整个图片的Jacobian Matrix,假设图片大小是 d × d d\\times d d×d: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/0f82690500fcd416d9dd7b25c1b5f5bb.webp) 根据上面的图来看,只有对应位置上的像素点做了乘 W W W的操作,而与其他像素点是没有关系的,因而整个图片的Jacobian Matrix可以表示为下图: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/e56be953c00c5afaf1bb2b8e8d7399cd.webp) 只有对角线部分是由一个个 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模型效果](https://openai.com/blog/glow/),合成: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/a1ee36565d79e122b540d4ccf5228685.webp) 魔改笑脸,收集不笑的人脸和有笑容的人脸,通过 G − 1 G\^{-1} G−1求向量后,分别求两组人脸的平均,然后求差就得到从不笑到笑之间的向量为 z s i m l e z_{simle} zsimle: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/d8e3e4fdfcb7a88403db5099e8b907b9.webp) 找一张要改笑容的图片,通过 G − 1 G\^{-1} G−1求向量后,加上 z s i m l e z_{simle} zsimle,再过 G G G得到结果: ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/331c6689c055ffe320090ea56d035ae1.webp) ## 其他工作 语音合成 [Parallel WaveNet: Fast High-Fidelity Speech Synthesis](https://arxiv.org/abs/1711.10433) ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/3f5a37e4a02d42e35b5002ab621cd11c.webp) [WaveGlow: A Flow-based Generative Network for Speech Synthesis](https://arxiv.org/abs/1811.00002) ![在这里插入图片描述](https://file.jishuzhan.net/article/1720431870967025666/795367ef01861acc80493a603666ed37.webp)

相关推荐
newxtc25 分钟前
【指纹浏览器系列-chromium编译】
人工智能·安全
轻闲一号机29 分钟前
【机器学习】机器学习笔记
人工智能·笔记·机器学习
光锥智能38 分钟前
傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻
人工智能
恒拓高科WorkPlus1 小时前
一款安全好用的企业即时通讯平台,支持统一门户
大数据·人工智能·安全
天下琴川1 小时前
Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
人工智能·笔记
qq_365911601 小时前
中英文提示词对AI IDE编程能力影响有多大?
人工智能
jndingxin1 小时前
OpenCV 图形API(31)图像滤波-----3x3 腐蚀操作函数erode3x3()
人工智能·opencv·计算机视觉
GoMaxAi2 小时前
金融行业 AI 报告自动化:Word+PPT 双引擎生成方案
人工智能·unity·ai作画·金融·自动化·aigc·word
訾博ZiBo2 小时前
AI日报 - 2025年04月16日
人工智能
蹦蹦跳跳真可爱5892 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法