概率圖模型

機器學習最重要的任務是根據一些已觀察到的證據(如:訓練樣本)來對感興趣的位置變量(如類別標記)進行評估和預測。概率模型(probabilistic model)提供一種描述框架:將學習任務歸結爲計算變量的概率分佈。在概率圖模型中,利用已知變量推測未知變量的概率分佈爲”推斷”(inference),其核心是如何基於可觀測變量來推斷未知變量的分佈。具體:假定所關心的變量集合微Y ,可觀測變量爲O ,其他變量爲R ,生成模型考慮聯合分佈P(Y,R,O) ,”判別式”模型是考慮聯合分佈P(Y,R|O) .給定一組觀測變量值,推斷就是由P(Y,R,O)P(Y,R|O) 得到條件概率分佈P(Y|O) .
基於訓練樣本直接利用概率求和規則消去變量是不可行的,原因:即便每個變量僅有兩種取值,其複雜度至少是2|Y|+|R| ,另一方面屬性之間存在複雜的聯繫。
概率圖模型是以圖爲工具來表達變量相關關係的概率模型。最常見的是用一個結點表示一個或一組隨機變量,結點之間的邊表示變量間 的概率關係。概率圖模型大致分爲兩類:使用有向無環圖表示變量的依賴關係,稱爲有向圖模型或貝葉斯網,變量間存在顯示的因果關係時經常使用。另一種是使用無向圖表示變量間的相關關係,稱爲無向圖模型或馬爾可夫鏈,變量間存在相關關係卻難以獲得因果關係經常使用.

隱馬爾可夫模型

隱馬爾可夫模型(Hidden Markov Model 或HMM)是結構簡單的動態貝葉斯網,這時一種著名的有向圖模型,主要應用於時序數據建模,再語音識別、自然語言處理等領域有廣泛應用。
隱馬爾可夫模型的變量分爲兩組,第一組是狀態變量{y1,y2,,yn} ,其中yiY 表示第i 時刻的狀態。通常假設狀態變量是隱藏的,不可觀測的,即隱變量。第二組變量{x1,,xn ,其中xiX 表示第i 時刻的觀測值。在隱馬爾可夫模型中,系統通常在多個狀態{s1,,sN 之間轉換,Y 通常是有N 個可能取值的李離散空間。觀測變量可能是離散的,可能是連續的。本文僅考慮離散觀測變量X={o1,,oM}
這裏寫圖片描述
馬爾可夫鏈(Markov chain)是系統下一時刻的狀態僅有當前狀態決定,不依賴以往的任何狀態,觀測變量只依賴當前的狀態,與其他變量無關。基於這種關係,所有變量的聯合分佈是

P(x1,y1,,xn,yn)=P(y1)P(x1|y1)

除了結構信息,隱馬爾可夫模型還需要其他三個參數:
  1. 狀態轉移矩陣,通常記爲A=[aij]N×N ,其中

    aij=P(yt+1=sj|yt=si),1i,jN

    表示在任意時刻,若狀態爲si ,在下一時刻狀態爲sj
  2. 輸出概率矩陣,記爲B=[bij]N×M ,其中

    bij=P(yt+1=oj|yt=si),1iN,1jM

    表示在任意時刻t ,若狀態爲si ,觀測值爲oj 的概率。
  3. 初始狀態概率,通常記爲π=(π1,π2,,πN) ,其中
    πi=P(y1=si)

    其中模型的初始狀態爲si 的概率
    通常指定狀態空間Y ,觀測空間X 和參數λ=[A,B,π] 就能確定一個馬爾可夫模型,按如下過程產生觀測序列:
    (1). 設置t=1 ,並根據初始狀態概率π 選擇初始狀態y1 .
    (2).根據狀態yt 和輸出觀測概率B 選擇觀測變量取值xt .
    (3).根據狀態yt 和狀態轉移概率A 轉移模型狀態,即確定狀態yt+1
    (4). 若t<n ,設置t=t+1 ,轉到第(2)步,否則停止。
    其中Yt{s1,s2,,sN}xt{o1,o2,,oM} 分別爲第i 時刻的狀態和觀測值.
    在實際應用中,常常關注三個基本問題:
    (1). 如何評估模型與觀測序列之間的匹配程度?即給定模型\lambda =[A,B,\pi]λ=[A,B,π] ,如何有效計算其產生觀測序列x={x1,x2,,xn} 的概率。
    (2).如何根據觀測序列推斷出隱藏的模型狀態?即給定參數λ=[A,B,π] 和觀測序列x={x1,x2,,xn} ,如何找出與此觀測序列最匹配的狀態序列y={y1,y2,,yn} .
    (3).如何訓練模型使其能夠最好地描述觀測數據?即給定觀測序列x={x1,x2,,xn} ,如何調整模型參數λ=[A,B,π] 使得該序列出現的概率P(x|λ) 最大。
    上述問題在應用中非常重要,如在許多任務中根據以往的觀測序列{x1,x2,,xn1} 來推斷當前時刻最有可能的觀測值xn ,即是第一個問題。在語音識別任務中,觀測值爲語音信號,隱藏狀態是文字,目標是根據觀測信號來推斷最有可能的狀態序列,即是第二個問題。在大多數應用中,如何根據訓練樣本學得最有的模型參數,即是第三個問題。

例子

擲骰子。

假設我手裏有三個不同的骰子。第一個骰子是我們平常見的骰子(稱這個骰子爲D6),6個面,每個面(1,2,3,4,5,6)出現的概率是1/6。第二個骰子是個四面體(稱這個骰子爲D4),每個面(1,2,3,4)出現的概率是1/4。第三個骰子有八個面(稱這個骰子爲D8),每個面(1,2,3,4,5,6,7,8)出現的概率是1/8。
這裏寫圖片描述
假設我們開始擲骰子,我們先從三個骰子裏挑一個,挑到每一個骰子的概率都是1/3。然後我們擲骰子,得到一個數字,1,2,3,4,5,6,7,8中的一個。不停的重複上述過程,我們會得到一串數字,每個數字都是1,2,3,4,5,6,7,8中的一個。例如我們可能得到這麼一串數字(擲骰子10次):1 6 3 5 2 7 3 5 2 4

這串數字叫做可見狀態鏈。但是在隱馬爾可夫模型中,我們不僅僅有這麼一串可見狀態鏈,還有一串隱含狀態鏈。在這個例子裏,這串隱含狀態鏈就是你用的骰子的序列。比如,隱含狀態鏈有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8
一般來說,HMM中說到的馬爾可夫鏈其實是指隱含狀態鏈,因爲隱含狀態(骰子)之間存在轉換概率(transition probability)。在我們這個例子裏,D6的下一個狀態是D4,D6,D8的概率都是1/3。D4,D8的下一個狀態是D4,D6,D8的轉換概率也都一樣是1/3。這樣設定是爲了最開始容易說清楚,但是我們其實是可以隨意設定轉換概率的。比如,我們可以這樣定義,D6後面不能接D4,D6後面是D6的概率是0.9,是D8的概率是0.1。這樣就是一個新的HMM。
同樣的,儘管可見狀態之間沒有轉換概率,但是隱含狀態和可見狀態之間有一個概率叫做輸出概率(emission probability)。就我們的例子來說,六面骰(D6)產生1的輸出概率是1/6。產生2,3,4,5,6的概率也都是1/6。我們同樣可以對輸出概率進行其他定義。比如,我有一個被賭場動過手腳的六面骰子,擲出來是1的概率更大,是1/2,擲出來是2,3,4,5,6的概率是1/10。
這裏寫圖片描述
這裏寫圖片描述
其實對於HMM來說,如果提前知道所有隱含狀態之間的轉換概率和所有隱含狀態到所有可見狀態之間的輸出概率,做模擬是相當容易的。但是應用HMM模型時候呢,往往是缺失了一部分信息的,有時候你知道骰子有幾種,每種骰子是什麼,但是不知道擲出來的骰子序列;有時候你只是看到了很多次擲骰子的結果,剩下的什麼都不知道。如果應用算法去估計這些缺失的信息,就成了一個很重要的問題。這些算法我會在下面詳細講。
HMM模型相關的算法主要分爲三類,分別解決三種問題:
1)知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換概率),根據擲骰子擲出的結果(可見狀態鏈),我想知道每次擲出來的都是哪種骰子(隱含狀態鏈)。
這個問題呢,在語音識別領域呢,叫做解碼問題。這個問題其實有兩種解法,會給出兩個不同的答案。每個答案都對,只不過這些答案的意義不一樣。第一種解法求最大似然狀態路徑,說通俗點呢,就是我求一串骰子序列,這串骰子序列產生觀測結果的概率最大。第二種解法呢,就不是求一組骰子序列了,而是求每次擲出的骰子分別是某種骰子的概率。比如說我看到結果後,我可以求得第一次擲骰子是D4的概率是0.5,D6的概率是0.3,D8的概率是0.2.
2)還是知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換概率),根據擲骰子擲出的結果(可見狀態鏈),我想知道擲出這個結果的概率。
看似這個問題意義不大,因爲你擲出來的結果很多時候都對應了一個比較大的概率。問這個問題的目的呢,其實是檢測觀察到的結果和已知的模型是否吻合。如果很多次結果都對應了比較小的概率,那麼就說明我們已知的模型很有可能是錯的,有人偷偷把我們的骰子給換了。
3)知道骰子有幾種(隱含狀態數量),不知道每種骰子是什麼(轉換概率),觀測到很多次擲骰子的結果(可見狀態鏈),我想反推出每種骰子是什麼(轉換概率)。
這個問題很重要,因爲這是最常見的情況。很多時候我們只有可見結果,不知道HMM模型裏的參數,我們需要從可見結果估計出這些參數,這是建模的一個必要步驟。
1.看見不可見的,破解骰子序列——解最大似然路徑問題。
舉例來說,我知道我有三個骰子,六面骰,四面骰,八面骰。我也知道我擲了十次的結果(1 6 3 5 2 7 3 5 2 4),我不知道每次用了那種骰子,我想知道最有可能的骰子序列。
其實最簡單而暴力的方法就是窮舉所有可能的骰子序列,然後把每個序列對應的概率算出來。然後我們從裏面把對應最大概率的序列挑出來就行了。如果馬爾可夫鏈不長,當然可行。如果長的話,窮舉的數量太大,就很難完成了。
另外一種很有名的算法叫做Viterbi algorithm. 要理解這個算法,我們先看幾個簡單的列子。
首先,如果我們只擲一次骰子:
看到結果爲1.對應的最大概率骰子序列就是D4,因爲D4產生1的概率是1/4,高於1/6和1/8.
這裏寫圖片描述
把這個情況拓展,我們擲兩次骰子:
這裏寫圖片描述
結果爲1,6.這時問題變得複雜起來,我們要計算三個值,分別是第二個骰子是D6,D4,D8的最大概率。顯然,要取到最大概率,第一個骰子必須爲D4。這時,第二個骰子取到D6的最大概率是
這裏寫圖片描述
同樣的,我們可以計算第二個骰子是D4或D8時的最大概率。我們發現,第二個骰子取到D6的概率最大。而使這個概率最大時,第一個骰子爲D4。所以最大概率骰子序列就是D4 D6。
繼續拓展,我們擲三次骰子:
這裏寫圖片描述
同樣,我們計算第三個骰子分別是D6,D4,D8的最大概率。我們再次發現,要取到最大概率,第二個骰子必須爲D6。這時,第三個骰子取到D4的最大概率是
這裏寫圖片描述
同上,我們可以計算第三個骰子是D6或D8時的最大概率。我們發現,第三個骰子取到D4的概率最大。而使這個概率最大時,第二個骰子爲D6,第一個骰子爲D4。所以最大概率骰子序列就是D4 D6 D4。
寫到這裏,大家應該看出點規律了。既然擲骰子一二三次可以算,擲多少次都可以以此類推。我們發現,我們要求最大概率骰子序列時要做這麼幾件事情。首先,不管序列多長,要從序列長度爲1算起,算序列長度爲1時取到每個骰子的最大概率。然後,逐漸增加長度,每增加一次長度,重新算一遍在這個長度下最後一個位置取到每個骰子的最大概率。因爲上一個長度下的取到每個骰子的最大概率都算過了,重新計算的話其實不難。當我們算到最後一位時,就知道最後一位是哪個骰子的概率最大了。然後,我們要把對應這個最大概率的序列從後往前推出來。
2.誰動了我的骰子?
比如說你懷疑自己的六面骰被賭場動過手腳了,有可能被換成另一種六面骰,這種六面骰擲出來是1的概率更大,是1/2,擲出來是2,3,4,5,6的概率是1/10。你怎麼辦麼?答案很簡單,算一算正常的三個骰子擲出一段序列的概率,再算一算不正常的六面骰和另外兩個正常骰子擲出這段序列的概率。如果前者比後者小,你就要小心了。
比如說擲骰子的結果是:
這裏寫圖片描述
要算用正常的三個骰子擲出這個結果的概率,其實就是將所有可能情況的概率進行加和計算。同樣,簡單而暴力的方法就是把窮舉所有的骰子序列,還是計算每個骰子序列對應的概率,但是這回,我們不挑最大值了,而是把所有算出來的概率相加,得到的總概率就是我們要求的結果。這個方法依然不能應用於太長的骰子序列(馬爾可夫鏈)。
我們會應用一個和前一個問題類似的解法,只不過前一個問題關心的是概率最大值,這個問題關心的是概率之和。解決這個問題的算法叫做前向算法(forward algorithm)。
首先,如果我們只擲一次骰子:
這裏寫圖片描述
看到結果爲1.產生這個結果的總概率可以按照如下計算,總概率爲0.18:
這裏寫圖片描述
把這個情況拓展,我們擲兩次骰子:
這裏寫圖片描述
看到結果爲1,6.產生這個結果的總概率可以按照如下計算,總概率爲0.05:
這裏寫圖片描述
繼續拓展,我們擲三次骰子:

看到結果爲1,6,3.產生這個結果的總概率可以按照如下計算,總概率爲0.03:

同樣的,我們一步一步的算,有多長算多長,再長的馬爾可夫鏈總能算出來的。用同樣的方法,也可以算出不正常的六面骰和另外兩個正常骰子擲出這段序列的概率,然後我們比較一下這兩個概率大小,就能知道你的骰子是不是被人換了。

3.擲一串骰子出來,讓我猜猜你是誰
(答主很懶,還沒寫,會寫一下EM這個號稱算法的方法)

上述算法呢,其實用到了遞歸,逆向推導,循環這些方法,我只不過用很直白的語言寫出來了。如果你們去看專業書籍呢,會發現更加嚴謹和專業的描述。畢竟,我只做了會其意,要知其形,還是要看書的。

發佈了20 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章