HMM (隱馬爾可夫) 推導 (下) - 參數估計 (EM)
回顧 HMM
上篇介紹了HMM這樣的一種時序類模型, 即描述了一些觀測現象的產生, 是由我們很難觀測到的 "隱變量因子", 產生的, 同時這些隱變量因子之間的變化也有一個狀態轉移概率的過程.
HMM 的推導過程, 也就兩個部分, Z 過程 (推斷過程) 和 Estimation(參數估計)過程.
上篇對於 Z 過程, 有通過類似於 枚舉法 和 一種 DP (動態規划) 算法來求解最好的 Z, 其前提假設是模型的參數 (初始狀態, 狀態轉移概率矩陣, 發射概率) 已知 下來求解的. 嗯. 推導思路過程有點類似之前的 XGBoost 算法, 也是先假定, 再推導, 在證明假設前提這樣的套路, 過程又用到了 EM算法來求解.
如果我是面試官, 問HMM, 這相當於將 EM 和 DP 算法 同時問了, 這樣的問題就很有質量哦.
12月底恰好tableau老鐵跟我分享動態規划,果然數學系就是不一樣, 用爬n階樓梯來說明, 斐波那契數. DP的核心思想就是將問題規模不斷縮小求解, 不同於遞歸哈, 后面可以單獨舉個 DP 栗子.
so, 本篇就來整一波, 如何進行參數求解.
\(\theta = (\pi, A, B)\)
假設有5個狀態, 同樣是扔2個硬幣
\(\pi\) 表示初始狀態, 如: \(\pi = [0.8, b, c, d, e]\)
A 表示兩個狀態的轉移矩陣; 是一個 5x5 的方陣
B 表示發射概率 (隱含規則->觀測的概率值); 是一個 5x2 的矩陣
如果是詞性分析, 則矩陣就非常大了, 如果觀測是連續型 則需要用 概率分布來描述了.
對於, HMM, 要求解出這3個參數, 主要有兩個步驟, 或者說是2個關鍵點:
- 給定模型的參數, 找出最適合的 Z => Inference (推斷過程)
- 估計模型參數的 \(\theta\) => Parameter Estimation (估計過程)
Complete VS lncomplete "Z"
Z 就是隱變量, X 是對應的觀測值.
-
X 已知, Z 已知, 則通過簡單的 頻率 統計即可求解出參數
-
X 已知, Z 未知, 則通過 EM 算法求解. (E 步更新發射概率, M 步更新參數值, 這樣循環交替直到收斂, 即得參數
發射概率
就是 隱變量 z1 -> x1 (觀測值) 的概率. 可參考EM篇的扔硬幣, 上帝視角, 事先知道 試驗結果是由 哪個硬幣產生的, 或知道概率. (如第1次是 "正", 我知道有 70% 概率來自 A 硬幣, 30%概率來自 B硬幣, 這個概率矩陣 [0.7, 0.3] 就是 發射概率)
轉移概率
描述狀態之間的變化規律. 如還是扔硬幣, 每次對 A, B 硬幣的選擇策略不同, 如 AAB, ABA ... 的場景, 可通過轉移概率矩陣來描述.
ps: 老鐵昨天問我是數論強, 還是分析強...嗯, 我只想說, 作為文科生(商科), 只是熟練使用數學工具而已....
另外想分享一點工具論, 在我眼里, 數學符號, 公式, 代碼, 其實本質都是一樣的, 就是一個靠譜的工具, 目標都是為了對現實世界的另一種刻畫. 當然世界很大, 可以感性認知, 也可理性認知, 探索的過程是其樂無窮的. 我感覺自己內心還是一個文藝青年的特征, 追求內心的感受, 也有故作傷春悲秋....不說這些了..
Complete "Z"
假設有 3個觀測樣本, Z 是已知時:
s1:
z : 1, 1, 2, 2, 2, 3
x : a, b, a, c, c, b
s2:
z : 2, 1, 3, 3, 2
x : a, a, c, b, a
s3:
z : 1, 1, 3, 2
x : b, a, a, c
在 z 已知道的這種 上帝視角 下, 求解 參數 (初始狀態, 狀態轉移矩陣, 發射概率) 就是詞頻統計, 然后歸一化作為概率值 , 非常容易的.
為了方便簡單演示, 假設樣本空間 就是上面這3個樣本, 觀測值和其隱變量狀態都是已知的.
首先來估計 \(\pi\) (初始狀態) 即每一個樣本(向量 1x3) 的第一狀態分量的頻數統計, (約定先行后列哦)
狀態1 | 狀態2 | 狀態3 | |
---|---|---|---|
頻次 | 2 | 1 | 0 |
然后再 歸一化 得到 初始狀態 (向量) :
\(\pi = [\frac {2}{3}, \frac {1}{3}, \frac {0}{3}]\)
接着來估計 A (狀態轉移矩陣), 狀態與狀態間的, 即 3x3 的矩陣. 同時, 狀態要 橫向來看, 統計是 先行后列
---> | 狀態1 | 狀態2 | 狀態3 |
---|---|---|---|
狀態1 | 2 | 1 | 2 |
狀態2 | 1 | 2 | 1 |
狀態3 | 0 | 2 | 1 |
按行 進行歸一化即可得到概率 (嚴格來說, "頻率" 應該更適合, 但我們通常都是用 樣本估計總體, 也說得通哈)
---> | 狀態1 | 狀態2 | 狀態3 |
---|---|---|---|
狀態1 | 2/5 | 1/5 | 2/5 |
狀態2 | 1/4 | 2/4 | 1/4 |
狀態3 | 0/3 | 2/3 | 1/3 |
最后來估計 B (發射概率矩陣), 即每個狀態下, 每個觀測值的概率, 即可 3x3 的矩陣 (統計也是約定, 先行后列哈)
---> | a | b | c |
---|---|---|---|
狀態1 | 3 | 2 | 0 |
狀態2 | 3 | 0 | 3 |
狀態3 | 1 | 2 | 1 |
同樣 按行 做歸一化可得到 發射概率矩陣 B:
---> | a | b | c |
---|---|---|---|
狀態1 | 3/5 | 2/5 | 0/5 |
狀態2 | 3/6 | 0/6 | 3/6 |
狀態3 | 1/4 | 2/4 | 1/4 |
因此, 在已知 Z 的情況下, 要做的就是直接統計出了 模型的參數: 初始概率狀態(向量), 狀態轉移概率 (矩陣), 發射概率 (矩陣). 站在上帝視角, 果然爽歪歪. 此處突然想到了基本經濟社會問題. 就是, 你所掌握資源越多, 就越有發言權, 做事情成功的概率必然很大和相對輕松.
Incomplete "Z"
而我們身處的現實世界, 幾乎是沒有上帝視角的. 它只存在於理論的烏托邦世界. 於是在現世的洪流, 我們通常只是看到 觀測到的現象, 而無法得知現象背后的上帝,是如何扔骰子的, 即便如此, 我們依舊去進行一個逼近, 利用智慧, 嗯, 說得有高大上, 這里其實就用到 EM 算法來進行一個參數估計即可.
\((x, z) - 簡單統計 - \theta\) 而,
$ (x, ) - how - \theta$
F/B 算法 ( Forward And Backward)
就要要計算出 \(p(z_k | x)\) 即 在 給定 x 的情況下, 可以計算 任意時刻狀態下的 z 的期望
通過 F/B 算法, 可以計算出: \(p(z_k = 1 |x), p(z_k = 2 |x), ....p(z_k = m |x)\)
也就是說, 通過 觀測 X, 計算出了 Z, 然后簡單統計則可 估計出模型的參數, 再來捋一波條件
-
F / B : \(p(z|x)\)
-
Forward : 用來計算 \(p(z_k | x_{1...k})\)
-
Backward : 用來計算 \(p(x _{k+1, ...n} | z_k)\)
如何將它們關聯起來呢, , 涉及條件概率, 同時也會想到貝葉斯公式 呀.
\(p(z_k|x) = \frac {p(z_k, x)}{p(x)}\)
這里的 x 表示所有的 n 個樣本嘛, 因此為了和 F, B 產生聯系, 可以將 x 進行划分 (展開).
\(p(z_k, x) = p(z_k, x_{1...k}, x_{k+1...n})\)
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k, x_{1..k})\)
可以省略掉 \(x_{1...k}\) 考慮條件獨立的情況下, 其對條件概率是沒有影響的.
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k)\)
為啥是 條件獨立成立?
因為, directional separation 性質: (嗯, 就可理解為條件獨立的一種更高級的一個性質), 用處就是幫助我們來判斷多個變量中, 有哪一些變量之間, 是有條件獨立的性質的, 或者是把很多的變量看作一個集合.
我們在談條件獨立的時候, 通常是以單個變量來參照的. 然而涉及多個變量, 則需用的 D-separation 性質了呀. 嗯....舉個栗子, 假設我有兩波變量, 然后通過 D-separation 性質, 可以幫我們判斷, 其中一波變量, 是否對其條件概率產生了影響. 算是一個更加泛化的一個條件獨立性質.
在本例中, 我們把 X, 拆分成了 \(x_{1...k-1}, \ x_k, \ x_{k+1...n}\) 在 D-separation 性質中, \(x_k\) 這個分割點被稱為 Block , 如果當 存在變量 (可以多個) x - Block - y 且指向關系是 x -> Block -> y 的時候, 則可以認為, x(變量集合) 是條件獨立於 Block 的. 因此可以省略掉. (具體 D-separation 性質證明, 后面再補一波百度吧, 先用上再說)
最終 \(p(z_k, x) = p(z_k, x_{1...k}) \ p(x_{k+1...n}|z_k)\) 即通過計算 Forward 和 Backward 完成最終求解.
重要信息,再重復一遍: 我們為了計算 \(p(z|k)\) 其實只需要計算出 Forward 和 Backward 即可, 這也就是 通過 X 計算出了 Z, 從而依上 complete 的簡單統計, 求解出模型參數
然后關如何去定義 Z 的個數, 其實是一個超參數, 有點類似於 EM算法中, 最開始 E部的初始值, 人工可以根據經驗來控制的.
小結
然后好像有點大篇幅的在弄 F/B 算法, 而開篇主要想闡明參數估計的核心是 EM算法, 那體現在何處呢? 我們捋一波求解參數的過程:
首先, 我們是要通過在給定 X 的情況下, 求解出 Z 的期望, 這個求解過程用到了 F/B 算法;
其次, 我們通過已知 (X, Z) 來求解出了參數 \(\theta\)
這, 不就是 EM 算法的 E步 和 M 步了呀.
最后, 其實還遺留了一個問題, 就是如何求解 F/B 嗯, 想一波先. 框架是沒問題了, 這就跟寫代碼一樣, 邏輯結構, 模塊划分已經搭起來了, 然后就是慢慢去找別人的代碼來復制粘貼的過程, 先想一波哈.