2020年6月9日 星期二

一把 Gaussian:高斯混合模型與 EM 演算法 Gaussian Mixture Model & Expectation-Maximization Algorithm

在寫前一篇文章 Kernel Density Estimation 時一直在想這不也是一把 Gaussian 嗎? 那跟以前李琳山老師上課所講的一把 Gaussian 差別在哪裡呢?原來在李琳山老師數位語音處理概論中的一把 Gaussian 是指這篇文章將會介紹的高斯混合模型 Gaussian Mixture Model,目的是要從一堆給定資料中找出這些高斯分布的參數 \(\mu\) 及 \(\sigma\);而上一篇 Kernel Density Estimation 中我們學到的是有 N 筆資料就用 N 個高斯分布來近似整個資料的機率分布,因此雖然他們都用了高斯分布的線性組合,Gaussian Mixture Model 是 Parametric statistics,而 Kernel Density Estimation 完全沒有對資料做任何的模型假設,屬於 Non-parametric statistics

高斯混合模型 Gaussian Mixture Model 簡介

高斯混合模型顧名思義就是將 K 個高斯分布湊在一起成為一個新的機率分布。每個高斯分布出現的機率為 \(\pi_k\) ,另外每個高斯分布都有其參數 \(\mu_k\) 及 \(\Sigma_k\)。可以寫成以下數學式子: \[ p(x) = \sum_{k=1}^{K}\pi_k\ N(x|\mu_k, \Sigma_k), \\ \sum_{k=1}^{K} \pi_k = 1 \] 因此高斯混合模型直覺的概念是將 K 個高斯分布以各自 \(\pi_k\) 的權重加總在一起。

Gaussian Mixture Model 的參數

首先要知道高斯混合模型的參數有哪些。我們假設高斯混合模型是由 K 個高斯分布組合而成(可以把 K 當成一個 hyper-parameter),每個高斯分布都有一組 \([\pi_k, \mu_k, \Sigma_k]\),這些就是我們想要從給定資料中來估計的參數。

一說到估計參數大家可能馬上就會想到最大似然估計 Maximum likelihood estimation(請參考前文),但這個方法在高斯混合模型中並不實用,為什麼呢?主要原因是有了每個高斯分布的權重 \(\pi_k\) 的限制讓整個問題變得很複雜,因此實務上都使用 EM(Expectation-Maximization)演算法來找出高斯混合模型的參數。EM 演算法的精神仍然是使用 Maximum likelihood,但是與 Maximum likelihood estimation 不同的是 EM 演算法是一步步去優化找到最佳的參數,而 Maximum likelihood estimation 只適用於能直接找出最佳參數公式解的情形。


用 Expectation-Maximization 演算法估計 Gaussian Mixture Model 的參數

在高斯混合模型中我們不斷地提到 \(\pi_k\),也提到所有的權重相加等於 1。因此我們可以用另一個隨機變數 z 來描述 \(\pi_k\)。z 總共有 K 種可能性,\(z_k\) 代表是否第 k 個高斯分布被選中,而第 k 個高斯分布被選中的機率為 \(\pi_k\)。因此可以寫成以下式子: \[ p(z_k = 1) = \pi_k, \\ p(x|z_k = 1) = N(x|\mu_k, \Sigma_k) \] 在 EM 演算法中我們想要一步步地交互更新所有的參數,Expectation 步驟中利用所有的高斯分布找出最佳的 z,也就是最佳的 \(\pi_k^*\) ,然後再利用這組 \(\pi_k^*\) 來求出最好的高斯分布參數 \(\mu_k\) 及 \(\Sigma_k\)。看到這讀者可能會問為什麼這麼做能得到最佳的參數呢?證明的部分有點複雜,有興趣的讀者可以閱讀參考資料 [1][2]。

在這邊寫出 EM 演算法大致的流程,詳細的證明推導也請參閱參考資料。

Expectation Step:利用給定的資料估計出 z 的機率

假設一個函數 \(\gamma (z_k) \equiv p(z_k = 1|x) \),則我們可以由貝氏定理來解出 \(\gamma (z_k)\): \[ p(z_k=1|x)=\frac{p(z_k=1)p(x|z_k=1)}{p(x)} \\ = \frac{\pi_k \ N(x|\mu_k, \Sigma_k)}{\sum_{j=1}^{K}\pi_j\ N(x|\mu_j, \Sigma_j)} \] 因此對於第 i 個樣本來說,其 \(\gamma (z_{ik})\) 便是: \[ \gamma (z_{ik}) = \frac{\pi_k \ N(x_i|\mu_k, \Sigma_k)}{\sum_{j=1}^{K}\pi_j\ N(x_i|\mu_j, \Sigma_j)} \]

Maximization Step:利用上一步的 z 估計出最佳高斯分布的參數

用以下公式來更新每個高斯分布的參數 \(\mu_k\) 及 \(\Sigma_k\)(註:詳細證明請看參考資料): \[ \mu_k^{new} = \frac{1}{N_k}\sum_{i=1}^{N}\gamma(z_{ik})x_i \\ \Sigma_k^{new} = \frac{1}{N_k}\sum_{i=1}^{N}\gamma(z_{ik})\ (x_i - \mu_k^{new})(x_i - \mu_k^{new})^T \\ \pi_k^{new} = \frac{N_k}{N} \\ N_k = \sum_{i=1}^{N}\gamma(z_{ik}) \]
當滿足收斂條件時 EM 演算法就完成了!

小結:兩種「一把 Gaussian」的不同

Kernel Density Estimation 完全沒有做任何的模型參數假設,而 Gaussian Mixture Model 必須先假設機率分布由 K 個高斯分布所組成,並且用 EM 演算法估計出所有的參數。兩種方法都能從給定資料得到機率密度函數:當給定資料數目 N 很大時,Kernel Density Estimation 將會由 N 個高斯分布來組成,而 Gaussian Mixture Model 搭配 EM 演算法仍然是由 K 個高斯分布來組成。

沒有留言:

張貼留言