NLP系列學習:前向算法和后向算法

在上一篇文章里,我們簡單的概述了隱馬爾科夫模型的簡單定義

在<CRF-tutorial>這一篇文章里,我們可以看到HMM經過發展之后是CRF產生的條件,因此我們需要學好隱馬爾科夫模型.

在這一部分,我比較推薦閱讀宗成慶老師的<自然語言處理>這本書,這一部分宗老師寫的很不錯,相關的資源在我之前的文章中已經上傳,有興趣的小伙伴可以閱讀下.

回到正題,說起HMM,我們知道他是一個產生型模型.這樣我們可以把它看作為一個序列化判別器,比方說我們說一句話:

上邊是我們說的話,我們說一句話,其實就可以看作為一個狀態序列,而下邊對應的,我們其實就可以看作為一個判別器,假如我們把上邊的說的話和下邊的狀態序列加上一個符號,如下圖所示

再去求Si->Oj的概率,這樣我們寫成:

這樣我們就可以引申出隱馬爾克夫模型的三大問題:

①:估計問題

②:序列問題

③:訓練問題或參數估計問題

為了更加容易理解這三個問題,我發現之前有一個博客的擲骰子的例子很生動,便特地引用過來,方便自己理解:

假設手里有三個不同的骰子。第一個骰子是我們平常見的骰子(稱這個骰子為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

但是一般來說,我們用的馬爾科夫鏈都是隱含狀態鏈, 因為隱含狀態(骰子)之間存在轉換概率(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中的三大問題就會容易許多了:

第一個問題:

我們知道骰子有幾種(隱含狀態數量),每種骰子是什么(轉換概率),根據擲骰子擲出的結果(可見狀態鏈),我想知道每次擲出來的都是哪種骰子(隱含狀態鏈)。

第二個問題:

還是知道骰子有幾種(隱含狀態數量),每種骰子是什么(轉換概率),根據擲骰子擲出的結果(可見狀態鏈),我想知道擲出這個結果的概率.

第三個問題:

知道骰子有幾種(隱含狀態數量),但是并不知道每種骰子是什么(轉換概率),觀測到很多次擲骰子的結果(可見狀態鏈),我想反推出每種骰子是什么(轉換概率)。

1:估計問題:

在我們知道我們有幾種篩子的時候,并且知道篩子是什么,并且已知結果,這時候我們再去推測是哪一種篩子就會容易很多,是可以通過窮舉法進行解決的,說白話就是推測所有的隱含狀態序列,并且再去計算所以的可能觀測序列的概率,但是這樣的方法也有問題,如果你的可能,就跟上邊的三個篩子一樣,還比較OK,因為你的概率還是很大,比較容易猜得對,但是你有100個長度的話,不說多了,每個長度上對應的隱含狀態為2,這樣你的時間復雜度就是O(2的100方),這個復雜度是很高的,盡管很簡單,但是還是不實用的.就跟我們查找中的直接查找一樣,盡管簡單,但是實則更困難.這樣的話,我們就采用了前向算法和后向算法來去計算這個問題.

那下邊我們就去推一下這個公式:

首先,我們要假設一個變量at(i),這個變量的意義是說我們在t時刻(1<t<T-1),位于si的狀態下,HMM輸出了序列O1......Ot,這時候at(i)可以表示為:


而我們接下來要做的是計算這個at(i),然后就可以根據at(i)來去計算在T時刻的概率,最后也就計算出P(O|u),這時候O是0-T時刻的概率,我們自然就可以計算出所有時刻的概率.

在這里,我們要用歸納思想去計算在t+1時刻的at+1(i):

這時候我們通過一張圖去直觀的表示從i到j的狀態轉移過程:

最終的計算得到的概率為:

那后向算法其實就跟前向算法類似,過程圖如下:

那么由上述所知,前向和后向算法的時間復雜度均是O(N2T),這個相比起之前,已經優化了太多,其中N是隱藏狀態的長度,T是序列的長度.

下一篇文章,我們將去學習HMM中的第二個問題:估計序列問題

參考文章:

1:www.cnblogs.com/skyme/p/465…

2:HMM經典論文《A tutorial on Hidden Markov Models and selected applications in speech recognition》


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java日期處理 開始時間-結束時間查詢

//開始時間 timeBegin " 00:00:00"; //結束時間 timeEnd " 23:59:59"; //時間轉換 SimpleDateFormat format new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //Java時間類型轉換成Long類型(可封裝成工具類) public static Long stringToLong(St…

angular路由操作中'#'字符的解決辦法

var appangular.module("myapp",["ngRoute"]);app.controller("ctr",function($scope){});//angular1.6.0以上版本需要配置app.config(["$locationProvider",function($locationProvider){ $locationProvider.hashPrefix(""…

【TypeError: float() argument must be a string or a number, not ‘map’】

初始 相關系數過濾法調用函數 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

CvScalar

CvScalar定義可存放1—4個數值的數值&#xff0c;其結構如下。 typedef struct CvScalar { doubleval[4]; } CvScalar; CvScalar pt&#xff1b; 如果使用的圖像是1通道的&#xff0c;則pt.val[0]中存儲數據 如果使用的圖像是3通道的&#xff0c;則pt.val[0]&#xff0c;pt…

UVA1493 - Draw a Mess(并查集)

UVA1493 - Draw a Mess(并查集) 題目鏈接 題目大意:一個N * M 的矩陣&#xff0c;每次你在上面將某個范圍上色&#xff0c;不論上面有什么顏色都會被最新的顏色覆蓋&#xff0c;顏色是1-9&#xff0c;初始的顏色是0.最后輸出這個矩形中。每一個顏色有多少個。某個范圍這個分為了…

Hyper-v Server 2012 Release Candidate 部署體驗

很多人知道&#xff0c;Microsoft Hyper-V分為兩種類型&#xff1a;一種是作為Windows Server的一個組件&#xff0c;另一種是作為虛擬化產品的單獨服務器。雖然兩者都是技術上的Hyper-V&#xff0c;每個版本的特性和用例各不相同。 Hyper-V Server直接在物理機器硬件上運行&am…

Unity 讀取資源(圖片)

方法一&#xff1a; 采用Resource.Load方法讀取&#xff0c;讀取在Unity中Assets下Resources目錄下的資源名&#xff08;不采用后綴&#xff09;。 //圖片放在Asset/Resources/ Texture2D tex (Texture2D)Resources.Load("圖片名稱"); 方法二&#xff1a; 采用WWW類…

【Python3 SelectKBest 調用personer出現的錯誤】

初始 相關系數過濾法調用函數 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

ABB機器人的錯誤處理

ABB機器人的錯誤處理 errnum 數據類型 errnum用于描述在執行過程中&#xff0c;發生的所有可恢復的錯誤。例如程序執行時&#xff0c;被零除。 如果機器人程序執行過程中檢測到一個錯誤&#xff0c;錯誤非致命&#xff0c;可以被錯誤處理程序處理。 這類錯誤的典型例子是…

面向對象的七大原則

總脈絡圖&#xff1a; 一&#xff1a;單一職責原則(全稱&#xff1a;“Single-Responsibility Principle”)又稱 單一功能原則 核心&#xff1a;解耦和增強內聚性&#xff08;高內聚&#xff0c;低耦合&#xff09; 說明&#xff1a; 就一個類而言&#xff0c;應該只專注于做一…

福建工程學院寒假作業G題

漲姿勢題就是所謂的優化題&#xff0c;在組隊賽中&#xff0c;隊伍發現了一題水題&#xff0c;那么應該交給誰去處理&#xff1f;作為處理水題的代碼手&#xff0c;應該具備什么樣的素養&#xff1f;1&#xff0c;要快&#xff0c;水題拼的就是速度&#xff01;2&#xff0c;不…

excel 多列匹配相等后 引用值

2019獨角獸企業重金招聘Python工程師標準>>> 場景 如圖下&#xff0c;當A、B列與E、F列皮配上&#xff0c;C列則引用G列的值 原理 VLOOKUP只能查找單列值。我們可以把多列值拼接后形成一個虛擬列&#xff0c;然后VLOOKUP函數查找這個虛擬列進行匹配。 在C1處輸入下…

【BUG調試】——OSError: Caught OSError in DataLoader worker process 0

目錄 問題描述&#xff1a; 參考鏈接 問題分析 解決方案 出現情況 問題描述&#xff1a; 在使用pytorch搭建了VGG從頭開始訓練時出現了以下問題&#xff1a; OSError: Caught OSError in DataLoader worker process 0 參考鏈接 參考up主視頻&#xff1a;4.2 使用pytor…

cvAdd()和 cvAddS()函數的使用

函數原型如下&#xff1a; voidcvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* maskNULL ); src1 第一個原數組 src2 第二個原數組 dst 輸出數組 mask 操作的復蓋面, 8-bit單通道數組; 只有復蓋面指定的輸出數組被修改。 函數 cvAdd 加一個數…

設計模式之接口隔離原則

這個原則想必大家從字面就可以猜出大體的含義&#xff0c;其實這個原則可以說是依賴倒置原則的一種進化補充&#xff0c;因為依賴倒置原則告訴我們實現類的各種依賴關系應該盡量隔離在抽象里面&#xff0c;同時底層的接口協議不應該依賴上層協議的變更而變更&#xff0c;所以我…

iOS 圖解多線程

轉載于:https://www.cnblogs.com/OnNineMonkey/p/5385963.html

Egret之位圖字體

1 , 關于位圖字體的制作 2 , egret官方提供的資源 看看cartoon-font.fnt的內容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY&qu…

【機器視覺】——平面測量實際尺寸(像素尺寸轉物理尺寸)

目錄 方法一:比例尺法 方法:二:三角法 方法三:相機標定 以下方法均在平面的前提下進行 方法一:比例尺法 在一張紙上繪制一個帶刻度的直線,將紙張放在攝像頭下,抓取任意兩點的像素坐標,計算像素距離pd,再根據刻度讀取實際距離ad,根據兩者可以求出縮放比例,即地圖上…

圖像處理基本算法-濾波

線性濾波器的向量表示&#xff1a; W是一個大小為m*n的濾波器的系數&#xff0c;Z為由濾波器覆蓋的相應圖像的灰度值。 線性濾波器所能是實現的就是乘積求和操作。 幾種常見的濾波器&#xff1a; 平滑空間濾波器如均值濾波 統計排序濾波器如中值濾波 銳化空間濾波器如銳化…

20145122《Java面向對象程序設計》實驗二實驗報告

實驗名稱&#xff1a; Java面向對象程序設計 實驗內容&#xff1a; 初步掌握單元測試和TDD理解并掌握面向對象三要素&#xff1a;封裝、繼承、多態初步掌握UML建模熟悉S.O.L.I.D原則了解設計模式 PSP時間 步驟耗時百分比需求分析1h12.5%設計1h12.5%代碼實現3h37.5%測試1h12.5%分…