機率分佈估計一直是機器學習中的核心問題,不論是分類問題估計條件機率分佈$p(y|x)$,或是建立生成模型$p(x,z)$,我們都在從資料中建立與學習出一個機率分佈
基本上機率分佈能做到兩件事:
- 評估機率值,計算$p(x)$,給樣本空間的點都要能得出機率值
- 抽樣,計算$x \sim p(x)$,要能依機率密度來抽樣出樣本
近年來,深度學習能有效率的近似高維度的複雜函數,而且還有完整的訓練框架,再加上機率圖模型概念,能表示很多複雜的機率分佈,但雖然能訓練模型來估計複雜分佈,也不一定能做到上面說的兩件事,比如:GAN很容易生成新影像,但卻無法給一張影像估計其機率值
Normalizing Flows是一種能將機率分佈轉換到另一個分佈的數學工具,例如把簡單的高斯分佈轉換至另一個複雜的機率分佈上,且依然能有效率評估機率值與抽樣,最近很多論文也開始結合這類的方法,例如:
- Improving Variational Inference with Inverse Autoregressive Flow
- Masked Autoregressive Flow for Density Estimation
還有最近由OpenAI剛發佈的Glow: Generative Flow with Invertible 1x1 Convolutions,基於Normalizing Flows的一種生成模型,也能生成高品質影像與表徵解構
Normalizing Flows
假設隨機變量$x \in \mathbb{R}^d$且$x \sim p(x)$,與一個可逆函數$f:\mathbb{R}^d \mapsto \mathbb{R}^d$,我們用$f$來轉換$p(x)$,可以得到另一個經過轉換的隨機變量$y=f(x)$與其機率分佈:
$
p(y) = p(x) \left|
\mathrm{det} \frac{
\partial f^{-1}
}{
\partial x
}
\right|
= p(x) \left|
\mathrm{det} \frac{
\partial f
}{
\partial x
}
\right| ^{-1} \tag{1}
$
行列式直觀上是面積或是體積的縮放比例,機率為機率密度函數底下的面積,轉換函數$f$可是視為一種面積的縮放變形,所以$p(y)$由轉換前$p(x)$底下的面積,乘上行列式表示的面積縮放比例,因為是計算$f^{-1}$,這個面積縮放的比例係指$y$對於$x$影響,意思是說,給$y$來反推回去$x$,並調整$p(x)$底下的面積大小,但也可以計算向前過程的行列式來取倒數。
假設轉換由多個轉換函數$f_1 \dots f_K$組成,$z_k$為轉換過程的中間變量,最後得到的隨機變量$y = f_K \circ \dots\circ f_1(x)$,計算$\log p(y)$為:
$
\log p(y) = \log p(x) - \sum_{k=1}^K
\log
\left|
\mathrm{det} \frac{
\partial f_k
}{
\partial \mathbf{x}_{k-1}
}
\right| \tag{2}
$
綜上所述,NF有兩種計算,第一是向前抽樣計算,從$x$計算$y = f(x)$,第二是向後機率機算,給一個$y$要一步步往後做逆運算,計算轉換的行列式總和,最後求出$x$。
計算行列式最差時候需要$O(n^3)$,所以就需要設計比較容易計算行列式的轉換,例如 Masked Autoregressive Flow、Inversed Autoregressive Flow、RealNVP等等模型,有用到Autoregressive的特性,所以行列式會很容易計算,這些方法會在後續的文章中介紹。
Training and sampling
向後機率計算,我們可以直接對$\log p(y)$最大化機率似然,給$y$透過一系列反函數得到$x$與行列式總和
$$x = f_1^{-1} \circ \dots \circ f_K^{-1}(y)$$
最後計算$\log p(x)$減去轉換過程行列式總和(如式子2),就可以算出$\log p(y)$,當然也就能用上SGD等優化方法,一系列轉換函數就當成一層層神經網路來訓練,只是這裡要求要能計算反函數
向前抽樣計算,出新樣本很直觀,就從$p(x)$抽樣出$x$,經過轉換即可得到$y$,而且還能順便得到$p(y)$
$$y = f_K \circ \dots \circ f_1(x)$$
如果對NF有興趣,參考資料都很值得一看!
之後會放上一個實作例子,把簡單機率分佈轉換至一個複雜分佈,還有關於最近NF發展的論文的閱讀心得