【機器學習】李宏毅——Flow-based Generative Models

FavoriteStar發表於2022-12-22

前文我介紹了部分關於生成學習的內容,可以參考我這篇博文點此
前面介紹的各個生成模型,都存在一定的問題:

  • 對於PixelRNN這類模型來說,就是從左上角的畫素開始一個個地進行生成,那麼這個生成順序是否合理,每一個畫素是否只與它前面的畫素有關,這就是其問題
  • VAE的問題在前文就已經提到,它只能夠學會模仿訓練集中的例子,無法真正做到“創造”
  • 對於GAN來說可能是生成方面最好的模型,但是實在是太難訓練了

因此我們接下來要介紹的流形生成模型,就是用多個比較簡單的生成器進行串聯,來達到用簡單的分佈轉換成複雜的分佈的效果。

Generator

一般來說,生成器是一個神經網路,其定義了一個機率分佈。例如我們有一個生成器G如下圖,那麼我們輸入一個z,就可以得到輸出x;而z我們可以看成是從簡單的正態分佈中取樣得來的,而最終得到的x的分佈則可以認為跟生成器G相關,因此定義該分佈為\(P_G(x)\)。這裡可以將x稱為觀測變數,也就是我們實際能夠得到的樣本;將z稱為隱變數,其對於樣本的生成式至關重要的。因此可以認為觀測變數x的真實分佈為\(P_{data}(x)\),如下圖:
在這裡插入圖片描述

那麼我們調整生成器的目的就是希望\(P_G(x)\)\(P_{data}(x)\)能夠越接近越好,即:

\[G^*=argmax_G\sum_{i=1}^mlogP_G(x^i)\Leftrightarrow argmin_GKL(P_{data}\mid \mid P_G) \]

其中,\(x^i\)是從分佈\(P_{data}\)中取樣得到的。那麼求解生成器G也就是極大似然的求解,也就是最大化每個樣本被取樣得到的機率,這相當於極小化那兩個分佈的KL散度,是滿足我們的預期的

Math Background

Jacobian Matrix

雅可比矩陣可以透過下圖來簡單理解:

在這裡插入圖片描述

那麼存在一個重要的性質是:

\[J_f\times J_{f^{-1}}=I\\ det(J_f)=\frac{1}{det(J_{f^{-1}})} \]

即它們互為逆矩陣,且行列式也存在互為倒數的關係。而行列式還有另外一個含義,就是將矩陣的每一行都當成一個向量,並在對應維度的空間中展開,那麼形成的那個空間的“體積“就是行列式的絕對值,如下圖的二維的面積和三維的體積:
在這裡插入圖片描述

Change of Variable Theorem

根據前面的描述,我們已知了z的分佈,假設當前也知道了x的分佈,那麼我們想要的是求出來生成器G,或者說求出來怎麼從z的分佈轉換到x的分佈,如下圖:

在這裡插入圖片描述

我們先從最簡單的情形來介紹我們具體解決問題的方式。

假設當前z滿足的分佈為一個0到1之間的均勻分佈,而z和x之間的關係已知,為\(x=f(z)=2z+1\),那麼就可以得到下面的圖形。而由於兩者都是機率分佈,因此兩者的積分都應該為1(面積相同),因此可以解出來x的分佈對應的高度為0.5。

在這裡插入圖片描述

那麼假設z和x的分佈都為更加複雜的情況,那我們可以在某點\(z'\)上取一定的增量\(\Delta z\),那麼對應對映到x的分佈上就也有\(x'\)\(\Delta x\)。那麼假設\(\Delta z\)很小,可以使得在該段之內的\(p(z)\)都相同,\(p(x)\)也同理相等,再根據這兩部分的面積相同即可得到
在這裡插入圖片描述

需要注意的是轉換成微分之後需要加上絕對值,因為微分可正可負。

那麼接下來擴充到二維空間,假設當前的\(\pi(z')\)處對於兩個方向都進行了增量,那麼對映到x之中將會有四個增量:其中\(\Delta x_{11}\)表示\(z_1\)改變的時候\(x_1\)的改變數,\(\Delta x_{12}\)表示\(z_1\)改變的時候\(x_2\)的改變數,以此類推,因此在x的空間中就擴充套件為一個菱形。

在這裡插入圖片描述

那麼它們之間存在的關係從面積相等擴充到了體積相等,即:

\[p(x')\lvert det\left[ \begin{matrix} \Delta x_{11}~ \Delta x_{21} \\ \Delta x_{12}~\Delta x_{22} \end{matrix} \right] \rvert =\pi(z')\Delta z_1 \Delta z_2 \]

也就是兩個圖形的面積和在對應點的取值的乘積相等。那麼對上式進行推導:

在這裡插入圖片描述

可以發現兩者分佈之間相差為雅克比矩陣的行列式的絕對值

Flow-based Model

經過上面的各種推導,我們可以將目標函式進行轉換:

在這裡插入圖片描述

而我們如果要最大化最下面的式子,我們首先需要知道怎麼算雅克比矩陣的行列式,這在當矩陣的大小很大的時候是非常耗時的;其次是要知道怎麼算生成器G的逆\(G^{-1}\),這個會要求輸入的維度和輸出的維度必須是一樣的,因此我們要巧妙地設計網路的架構,使其能夠方便計算雅克比矩陣的行列式和生成器的逆\(G^{-1}\)。而在實際的Flow-based Model中,G可能不止一個。因為上述的條件意味著我們需要對G加上種種限制。那麼單獨一個加上各種限制就比較麻煩,我們可以將限制分散於多個G,再透過多個G的串聯來實現,這也是稱為流形的原因之一:

在這裡插入圖片描述

因此要最大化的目標函式也變成了:

\[logp_K(x^i)=log\pi(G^{-1}(x^i))+\sum_{h=1}^Klog\lvert det(J_{G_h^{-1}}) \rvert \]

可以發現上述要最大化的目標函式中只有\(G^{-1}\)因此在訓練的時候我們可以只訓練\(G^{-1}\),其接受x作為輸入,輸出為z;而在訓練完成後就將其反過來,接受z作為輸入,輸出為x

因為我們在訓練的時候就會從分佈中取樣得到x,然後代入得到z,並且根據最大化上式來調整\(G^{-1}\)。那麼如果只看上式的第一項,因為\(\pi(t)\)是正態分佈,因此當t取零向量的時候其會達到最大值,因此如果只求第一項的最大化的話會使得我們輸出的z向量都變成零向量。但是這會導致雅克比矩陣全為0(因為z都是零向量,因此沒有變化的梯度),那麼第二項將會衝向負無窮,因此這兩項之間是相互約束的關係!第一項使得所有的z向量都往零向量附近靠近,第二項使得z向量都全部為零向量

Coupling Layer

為了能夠方便計算雅克比矩陣,因此我們採用Coupling Layer這種思想,即我們假設z和x之間滿足這種關係:

在這裡插入圖片描述

其中F和H是兩個函式,進行向量的變換而已,它有多複雜都是可以的。而上圖是正向的過程,因為我們訓練的時候是訓練\(G^{-1}\),因此我們需要負向的過程,即如下:

在這裡插入圖片描述

因此滿足了上述關係之後,雅克比矩陣的計算就變得很方便了:

在這裡插入圖片描述

首先解釋一下為什麼左下角那個複雜的塊矩陣我們不用注意:因為右上角是零矩陣,因此在計算行列式的時候只會關注右下角矩陣的值而不會管左下角矩陣的值是多少

因此對於這種關係的變換我們就可以很方便的求出雅克比矩陣行列式的值。

再接下來我們就可以將多個Coupling Layer串在一起,但如果正向直接串的話就會發現前d維度的值是直接複製的,從頭到尾都相同,這並不是我們想要的結果,我們不是希望前d維度的值一直保持不變:

在這裡插入圖片描述

那麼可能的解決辦法是反向串:

在這裡插入圖片描述

相關文章