HMM(隱馬爾科夫模型)是自然語言處理中的一個基本模型,用途比較廣泛,如漢語分詞、詞性標註及語音辨識等,在NLP中佔有很重要的地位。網上關於HMM的介紹講解文檔很多,我自己當時開始看的時候也有點稀裡糊塗。後來看到wiki上舉得一個關於HMM的例子才如醍醐灌頂,忽然間明白HMM的三大問題是怎麼回事了。例子我藉助中文wiki重新翻譯了一下,並對三大基本問題進行說明,希望對讀者朋友有所協助:
Alice 和Bob是好朋友,但是他們離得比較遠,每天都是通過電話瞭解對方那天作了什麼.Bob僅僅對三種活動感興趣:公園散步,購物以及清理房間.他選擇做什麼事情只憑當天天氣.Alice對於Bob所住的地方的天氣情況並不瞭解,但是知道總的趨勢.在Bob告訴Alice每天所做的事情基礎上,Alice想要猜測Bob所在地的天氣情況.
Alice認為天氣的運行就像一個馬爾可夫鏈. 其有兩個狀態 “雨”和”晴”,但是無法直接觀察它們,也就是說,它們對於Alice是隱藏的.每天,Bob有一定的機率進行下列活動:”散步”, “購物”, 或 “清理”. 因為Bob會告訴Alice他的活動,所以這些活動就是Alice的觀察資料.這整個系統就是一個隱馬爾可夫模型HMM.
Alice知道這個地區的總的天氣趨勢,並且平時知道Bob會做的事情.也就是說這個隱馬爾可夫模型的參數是已知的.可以用程式語言(Python)寫下來:
// 狀態數目,兩個狀態:雨或晴
states = (‘Rainy’, ‘Sunny’)
// 每個狀態下可能的觀察值
observations = (‘walk’, ‘shop’, ‘clean’)
//初始狀態空間的機率分布
start_probability = {‘Rainy’: 0.6, ‘Sunny’: 0.4}
// 與時間無關的狀態轉移機率矩陣
transition_probability = {
’Rainy’ : {‘Rainy’: 0.7, ‘Sunny’: 0.3},
’Sunny’ : {‘Rainy’: 0.4, ‘Sunny’: 0.6},
}
//給定狀態下,觀察值機率分布,發射機率
emission_probability = {
’Rainy’ : {‘walk’: 0.1, ‘shop’: 0.4, ‘clean’: 0.5},
’Sunny’ : {‘walk’: 0.6, ‘shop’: 0.3, ‘clean’: 0.1},
}
在這些代碼中,start_probability代表了Alice對於Bob第一次給她打電話時的天氣情況的不確定性(Alice知道的只是那個地方平均起來下雨多些).在這裡,這個特定的機率分布並非平衡的,平衡機率應該接近(在給定變遷機率的情況下){‘Rainy’: 0.571, ‘Sunny’: 0.429}。 transition_probability 表示馬爾可夫鏈下的天氣變遷情況,在這個例子中,如果今天下雨,那麼明天天晴的機率只有30%.代碼emission_probability 表示了Bob每天作某件事的機率.如果下雨,有
50% 的機率他在清理房間;如果天晴,則有60%的機率他在外頭散步。
Alice和Bob通了三天電話後發現第一天Bob去散步了,第二天他去購物了,第三天他清理房間了。Alice現在有兩個問題:這個觀察序列“散步、購物、清理”的總的機率是多少?(註:這個問題對應於HMM的基本問題之一:已知HMM模型λ及觀察序列O,如何計算P(O|λ)?) 最能解釋這個觀察序列的狀態序列(晴/雨)又是什嗎?(註:這個問題對應HMM基本問題之二:給定觀察序列O=O1,O2,…OT以及模型λ,如何選擇一個對應的狀態序列S = q1,q2,…qT,使得S能夠最為合理的解釋觀察序列O?)
至於HMM的基本問題之三:如何調整模型參數, 使得P(O|λ)最大?這個問題事實上就是給出很多個觀察序列值,來訓練以上幾個參數的問題。
註:原創文章,轉載請註明出處“我愛自然語言處理”:www.52nlp.cn