前向定時演算法
① 分析HMM前向演算法的原理和作用
前向演算法
前向演算法用於HMM的模型評估問題。假如我們已知HMM的三元組。假如共有N種狀態,那麼對於觀測序列O,共有N的T次方種路徑。
希望回答能夠幫助到你。
② HMM 前向後向演算法是怎麼回事啊,最好帶個例子。
前向就是把當前狀態之前的可觀測序列搞成一個概率,後向就是把當前狀態之後的搞成一個概率,這樣HMM參數就可以通過迭代的方法求解了,有個叫An introction to Hidden Markov Model的文章不錯,可以看下
③ GBDT演算法
對於AdaBoost,可以將其視為一個將多個弱分類器線性組合後對數據進行預測的演算法,該模型可以表示為:
為基函數(即單個弱分類器), 為基函數的參數(即弱分類器中特徵的權重向量), 為基函數的系數(即弱分類器在線性組合時的權重), 就是基函數的線性組合。
給定訓練數據和損失函數 的條件下,構建最優加法模型 的問題等價於損失函數最小化:
這個公式展現了AdaBoost演算法的核心過程。
我們可以利用前向分布演算法來求解上一個式子的最優參數。前向分布演算法的核心是 從前向後,每一步計算一個基函數及其系數,逐步逼近優化目標函數式 ,就可以簡化優化的復雜度。
M-1個基函數的加法模型為:
M個基函數的加法模型:
由上面兩式得:
由這個公式和公式(2)得極小化損失函數:
演算法思路如下:
1. 初始化
2. 對m=1,2,...,M:
a. 極小化損失函數: 得到參數
b. 更新:
3. 得到加法模型:
這樣,前向分布演算法將同時求解從m=1到M所有參數 的優化問題化簡為逐次求解各個 的優化問題。
Freidman提出了梯度提升演算法,演算法的核心是利用損失函數的負梯度將當前模型的值作為回歸問題提升樹演算法中的殘差的近似值,去擬合一個回歸樹。
GBDT的思想就是不斷去擬合殘差,使殘差不斷減少。用一個通俗的例子來講假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。(參考 集成學習之Boosting-gbdt )GBDT中每次迭代構造的Cart樹都是用前一輪的殘差擬合的。
第t輪第i個樣本的損失函數的負梯度表示為:
利用 我們可以擬合一顆CART回歸樹,得到了第t顆回歸樹,其對應的葉節點區域 其中J為葉子節點個數。
針對每一個葉子節點里的樣本,我們求出使損失函數最小的 輸出值 :
這樣我們就得到了本輪的決策樹擬合函數:
從而本輪最終得到的強學習器的表達式如下:
通過損失函數的負梯度來擬合,是一種通用的擬合損失誤差的辦法。無論是分類問題還是回歸問題,我們都可以通過其損失函數的負梯度的擬合,從而用GBDT來解決我們的分類和回歸問題。區別僅僅在於損失函數不同導致的負梯度不同而已。
d. 分位數損失:它對應的是分位數回歸的損失函數。
輸入: 訓練樣本
迭代次數(基學習器數量): T
損失函數: L
輸出: 強學習器H(x)
演算法流程
對於二元GBDT,其對數損失函數在之前已經給出:
其中 此時的負梯度誤差為:
對於生成的決策樹,各個葉子節點的最佳負梯度擬合值為:
由於這個式子不易優化,一般使用近似值代替:
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,二分類GBDT與GBDT回歸演算法過程相同。
多分類GBDT的損失函數在之前也已經給出過:
樣本屬於第k類的概率 的表達式為:
結合上面兩個式子可以求出第t輪第i個樣本對應類別 l 的負梯度誤差為:
可以看出,其實這里的誤差就是樣本i對應類別l的真實概率和t-1輪預測概率的差值。
對於生成的決策樹,各個葉子節點的最佳負梯度擬合值為:
由於上式比較難優化,一般用近似值代替:
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多分類GBDT與二分類GBDT以及GBDT回歸演算法過程相同。
為了防止GBDT過擬合,需要對其進行正則化。主要有三種方式:
1. 給每棵樹的輸出結果乘上一個步長(學習率) a 。之前的弱學習器的迭代式改為:
2. 通過子采樣比例進行正則化。GBDT每一輪建樹時樣本從原始訓練集中採用無放回隨機抽樣的方式產生。若采樣比例取1,則採用全部樣本進行訓練。為了防止過擬合,同時又要防止樣本擬合偏差較大(欠擬合),要合理取值,常用 [0.5, 0.8]
3. 對弱學習器(CART)進行正則化剪枝:控制樹的最大深度、節點最少樣本數、最大葉子節點數、節點分支的最小樣本數等。
優點 :
缺點 :
由於弱學習器之間存在依賴關系,難以並行訓練數據
boosting框架相關參數 :
弱學習器參數 :
GBDT的適用面非常廣,幾乎可以用於所有回歸問題(線性/非線性),也可以用於分類問題。
④ Task10-向前分布演算法和梯度提升決策樹
前項分布演算法可以解決分類問題,也可以解決回歸問題。
(1)Adaboost的加法模型:
在Adaboost的基礎上,將多個基分類器合並為一個復雜分類器,是通過計算每個基分類器的加權和。通常情況下這是一個復雜的優化問題,很難通過簡單的凸優化的相關知識進行解決。而前向分步演算法可以用來求解這種方式的問題,它的基本思路是:因為學習的是加法模型,如果從前向後,每一步只優化一個基函數及其系數,逐步逼近目標函數,那麼就可以降低優化的復雜度。
(2)前向分布演算法:
給定數據集 。損失函數 ,基函數集合 ,我們需要輸出加法模型 。
這樣,前向分步演算法將同時求解從m=1到M的所有參數 , 的優化問題簡化為逐次求解各個 , 的問題。
(3) 前向分步演算法與Adaboost的關系:
Adaboost演算法是前向分步演算法的特例,Adaboost演算法是由基本分類器組成的加法模型,損失函數為指數損失函數。
(1) 基於殘差學習的提升樹演算法:
接下來我們來探討下如何使用加法模型+前向分步演算法的框架實現回歸問題。
在使用加法模型+前向分步演算法的框架解決問題之前,我們需要首先確定框架內使用的基函數是什麼,在這里我們使用決策樹分類器。前面第二章我們已經學過了回歸樹的基本原理,樹演算法最重要是尋找最佳的劃分點,分類樹用純度來判斷最佳劃分點使用信息增益(ID3演算法),信息增益比(C4.5演算法),基尼系數(CART分類樹)。但是在回歸樹中的樣本標簽是連續數值,可劃分點包含了所有特徵的所有可取的值。所以再使用熵之類的指標不再合適,取而代之的是平方誤差,它能很好的評判擬合程度。基函數確定了以後,我們需要確定每次提升的標準是什麼。回想Adaboost演算法,在Adaboost演算法內使用了分類錯誤率修正樣本權重以及計算每個基本分類器的權重,那回歸問題沒有分類錯誤率可言,也就沒辦法在這里的回歸問題使用了,因此我們需要另闢蹊徑。模仿分類錯誤率,我們用每個樣本的殘差表示每次使用基函數預測時沒有解決的那部分問題。因此,我們可以得出如下演算法:
輸入數據集 ,輸出最終的提升樹
(2) 梯度提升決策樹演算法(GBDT):
提升樹利用加法模型和前向分步演算法實現學習的過程,當損失函數為平方損失和指數損失時,每一步優化是相當簡單的,也就是我們前面探討的提升樹演算法和Adaboost演算法。但是對於一般的損失函數而言,往往每一步的優化不是那麼容易,針對這一問題,我們得分析問題的本質,也就是是什麼導致了在一般損失函數條件下的學習困難。對比以下損失函數:
觀察Huber損失函數:
針對上面的問題,Freidman提出了梯度提升演算法(gradient boosting),這是利用最速下降法的近似方法,利用損失函數的負梯度在當前模型的值 作為回歸問題提升樹演算法中的殘差的近似值,擬合回歸樹。 與其說負梯度作為殘差的近似值,不如說殘差是負梯度的一種特例。
以下開始具體介紹梯度提升演算法:
輸入訓練數據集 和損失函數 ,輸出回歸樹
運行結果:
運行結果:
⑤ 隱馬爾可夫模型
隱馬爾可夫模型是關於時序的概率模型,描述由一個隱藏的馬爾科夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測從而產生觀測隨機序列的過程。
隱馬爾可夫模型的形式定義如下:
設 是所有可能 狀態的集合 , 是所有可能 觀測的集合 :
其中 為可能狀態數, 為可能觀測數。
是長度為 的 狀態序列 , 是對應的 觀測序列 :
是 狀態轉移概率矩陣 :
其中:
是 觀測概率矩陣 :
其中:
是 初始狀態概率向量 :
其中:
隱馬爾可夫模型由初始狀態概率向量 、狀態轉移概率矩陣 和觀測概率矩陣 決定。 因此隱馬爾可夫模型 可表示為:
具體來說,長度為 的觀測序列的生成過程如下:按照初始狀態分布 產生狀態 ,按狀態 的觀測概率分布 生成 ,按狀態 的狀態轉移概率分布 產生狀態 ,依次遞推。
(1) 齊次馬爾可夫性假設 ,即隱藏的馬爾科夫鏈在任意時刻 的狀態只依賴於其前一時刻的狀態,與其他時刻狀態及觀測無關,也與時刻 無關。
(2) 觀測獨立性假設 ,即任意時刻的觀測只依賴於該時刻的馬爾科夫鏈狀態,與其它觀測狀態無關。
(1) 概率計算問題 :給定模型 和觀測序列 ,計算在模型 下序列 出現的概率 。
(2) 學習問題 :已知觀測序列 ,估計模型 參數,使得在該模型下觀測序列 最大。
(3) 預測問題 :已知模型 和觀測序列 ,求使得 最大的狀態序列 。
接下來分別闡述這三個問題的解決方法。
狀態 的概率是:
對固定的 觀測序列 的概率是:
同時出現的聯合概率為:
從而:
可以看到,上式是對所有可能的 序列求和,而長度為 的 序列的數量是 數量級的,而 的計算量是 級別的,因此計算量為 ,非常大, 這種演算法在實際中不可行 。
首先定義 前向概率 :給定隱馬爾可夫模型 ,定義到時刻 部分觀測序列為 且狀態為 的概率為前向概率,記作:
觀測序列概率的前向演算法 如下:
(1)初值:
(2)遞推,對 :
(3)終止:
前向演算法高效的關鍵是 局部計算前向概率,然後利用路徑結構將前向概率遞推到全局,得到 。前向概率演算法計算量是 級別的。
首先定義 後向概率 :給定隱馬爾可夫模型 ,定義在時刻 狀態為 的條件下,從 到 部分觀測序列為 的概率為後向概率,記作:
觀測序列概率的後向演算法 如下:
(1)初值:
(2)遞推,對 :
(3)終止:
若有 個長度相同觀測序列和對應狀態序列 則可利用極大似然估計得到隱馬爾可夫模型參數:
設樣本中時刻 處於狀態 時刻 轉移到狀態 的頻數為 ,那麼狀態轉移概率 的估計為:
設樣本中狀態為 觀測為 的頻數為 ,那麼觀測概率 的估計為:
初始狀態 的估計 為 個樣本中初始狀態為 的頻率。
假設給定訓練數據只包含 個長度為 的觀測序列 而沒有對應狀態序列,我們可以把狀態數據看作不可觀測的隱數據 ,則隱馬爾可夫模型事實上是一個含有隱變數的概率模型:
其參數可由EM演算法實現。
近似演算法的思想是,在每個時刻 選擇在該時刻最有可能出現的狀態 ,從而得到一個狀態序列 。
近似演算法的優點是計算簡單,缺點是不能保證預測的狀態序列整體是最有可能的狀態序列,因為預測的狀態序列可能有實際不發生的部分,比如存在轉移概率為0的相鄰狀態。盡管如此,近似演算法還是有用的。
維特比演算法實際上是用動態規劃解隱馬爾可夫模型預測問題,即用動態規劃求概率最大路徑(最優路徑),此路徑對應一個狀態序列。
定義 在時刻 狀態為 的所有單個路徑 中概率最大值 為:
由定義得遞推式:
定義 在時刻 狀態為 的所有單個路徑 中概率最大路徑的第 個結點 為:
維特比演算法 如下:
(1)初始化:
(2)遞推,對 :
(3)終止:
(4)回溯,對 :
最優路徑為
⑥ 隱馬爾可夫模型(二)-骰子的故事
整理自: http://www.cnblogs.com/skyme/p/4651331.html
隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數。然後利用這些參數來作進一步的分析,例如模式識別。
下面用一個簡單的例子來闡述:
假設我手裡有三個不同的骰子。第一個骰子是我們平常見的骰子(稱這個骰子為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。
這串數字叫做可見狀態鏈。但是在隱馬爾可夫模型中,我們不僅僅有這么一串可見狀態鏈,還有一串隱含狀態鏈。在這個例子里,這串隱含狀態鏈就是你用的骰子的序列。比如,隱含狀態鏈有可能是: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.
把這個情況拓展,我們擲兩次骰子:
同樣,我們計算第三個骰子分別是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)。
所以我們根據下表計算出得到該序列的概率:
同樣的,我們一步一步的算,有多長算多長,再長的馬爾可夫鏈總能算出來的。用同樣的方法,也可以算出不正常的六面骰和另外兩個正常骰子擲出這段序列的概率,然後我們比較一下這兩個概率大小,就能知道你的骰子是不是被人換了。
⑦ 形式化的描述一個二階馬爾可夫模型
摘要 介紹(introction)
⑧ 隱馬爾可夫模型(基礎)
假設t時刻的狀態只與t-1時刻的狀態有關,與更早的時刻無關,這一假設稱為一階馬爾可夫假設。如果狀態有n種取值,在t時刻取任何一個值與t-1時刻取任何一個值的條件概率構成了一個n×n的矩陣A,稱為狀態轉移概率矩陣。無論t時刻的狀態值是什麼,在下一時刻一定會轉向n個狀態種一個,因此他們的轉移概率和必須為1。
在實際應用種,人們不能直接觀察到狀態的值,即狀態的值是隱含的,只能得到觀測的值。因此對模型進行擴充,得到隱馬模型。
觀測序列是能得到的值。
狀態序列是因,觀測序列是果,因為處於某種狀態才有了某一觀測值。
定義狀態觀測矩陣B,表示t時刻狀態值為s時的觀測值為v的概率
t時刻的狀態z=i的概率最大狀態序列中,t-1時刻的狀態值,有了這兩個變數,就可以得到維特比演算法。
訓練時給定一組樣本,確定狀態轉移矩陣和觀測矩陣,通過最大似然估計實現。如果已知訓練樣本集中每個觀測序列對應的狀態序列,給定初始狀態如:p0=[0.5, 0.2, 0.3], k步轉化過程為:p0=p0*pk。計算機程序需要利用迭代變數,藉助循環實現。經過多步轉化p0收斂於固定值(穩態)。可以通過最大似然估計得到模型參數。
狀態空間:隱狀態S的取值范圍
觀測空間:觀測狀態O的取值范圍
轉移概率:矩陣各元素都是用概率表示。其值非負,並且各行元素之和等於1。在一定條件下是互相轉移的,故稱為轉移概率矩陣。矩陣中的行數與列數可以相等,也可以不等。當它們相等時,矩陣就是一個方陣。由轉移概率組成的矩陣就是轉移概率矩陣。也就是說構成轉移概率矩陣的元素是一個個的轉移概率不同狀態之間的轉移概率,可以用轉移矩陣表示,記做a
發射概率:初始狀態的概率分布,在知道當前標簽的情況下,發射的概率,記做π
輸出概率:基於當前狀態,不同輸出的概率分布,記做b
模型參數λ = (a, b, π)
1、 齊次假設:即馬爾科夫假設
2、 觀測獨立性假設:觀測值只取決於對應的狀態值,與其他狀態無關
(1)首先, HMM模型表示為: lambda = HMM(A, B, pi), 其中A, B, pi都是模型的參數, 分別稱作: 轉移概率矩陣, 發射概率矩陣和初始概率矩陣.
(2)接著, 我們開始訓練HMM模型, 語料就是事先准備好的一定數量的觀測序列及其對應的隱含序列, 通過極大似然估計求得一組參數, 使由觀測序列到對應隱含序列的概率最大.
(3)在訓練過程中, 為了簡化計算, 馬爾可夫提出一種假設: 隱含序列中每個單元的可能性只與上一個單元有關. 這個假設就是著名的隱含假設.
(4)訓練後, 我們就得到了具備預測能力的新模型: lambda = HMM(A, B, pi), 其中的模型參數已經改變.
(5)之後給定輸入序列(x1, x2, ..., xn), 經過模型計算lambda(x1, x2, ..., xn)得到對應隱含序列的條件概率分布.
(6)最後, 使用維特比演算法從隱含序列的條件概率分布中找出概率最大的一條序列路徑就是我們需要的隱含序列: (y1, y2, ..., yn).
狀態轉移矩陣通過訓練樣本學習得到,採用最大似然估計。
初始狀態取每種值的概率Π,狀態轉移概率矩陣A,觀測概率矩陣B
隱馬爾可夫模型需要解決以下三個問題:
(1)估值問題(觀測序列出現的概率)。給定隱馬爾可夫模型的參數A和B,計算一個觀測序列x出現的概率值p(x)。前向後向演算法
(2)解碼問題(觀測序列最大化的隱含序列)。給定隱馬爾可夫模型的參數A和B以及一個觀測序列x,計算最有可能產生此觀測序列的狀態序列z。
已知一個觀測序列,尋找最有可能產生它的狀態序列。維特比演算法
(3)學習問題。給定隱馬爾可夫模型的結構,但參數未知,給定一組訓練樣本,確定隱馬爾可夫模型的參數A和B。
保姆韋爾奇演算法
隱馬爾可夫模型對條件概率p(x|z)建模,因此是一個生成式模型。
⑨ 神經網路中的前向和後向演算法
神經網路中的前向和後向演算法
看了一段時間的深度網路模型,也在tf和theano上都跑了一些模型,但是感覺沒有潛下去,對很多東西的理解都只停留在「這個是干什麼的」層次上面。昨天在和小老師一起看一篇文章的時候,就被問到RNN裡面的後向傳播演算法具體是怎麼推。當時心裡覺得BP演算法其實很熟悉啊,然後在推導的過程中就一臉懵逼了。於是又去網上翻了翻相關內容,自己走了一遍,准備做個筆記,算是個交代。
准備一個神經網路模型,比如:
其中,[i1,i2]
代表輸入層的兩個結點,[h1,h2]代表隱藏層的兩個結點,[o1,o2]為輸出。[b1,b2]
為偏置項。連接每個結點之間的邊已經在圖中標出。
來了解一下前向演算法:
前向演算法的作用是計算輸入層結點對隱藏層結點的影響,也就是說,把網路正向的走一遍:輸入層—->隱藏層—->輸出層
計算每個結點對其下一層結點的影響。
?? 例如,我們要算結點h1
的值,那麼就是:
是一個簡單的加權求和。這里稍微說一下,偏置項和權重項的作用是類似的,不同之處在於權重項一般以乘法的形式體現,而偏置項以加法的形式體現。
??而在計算結點o1時,結點h1的輸出不能簡單的使用neth1的結果,必須要計算激活函數,激活函數,不是說要去激活什麼,而是要指「激活的神經元的特徵」通過函數保留並映射出來。以sigmoid函數為例,h1的輸出:
於是
最後o1的輸出結果,也就是整個網路的一個輸出值是:
按照上面的步驟計算出out02,則[outo1,outo2]就是整個網路第一次前向運算之後得到的結果。
後向演算法:
??在實際情況中,因為是隨機給定的權值,很大的可能(幾乎是100%)得到的輸出與實際結果之間的偏差非常的大,這個時候我們就需要比較我們的輸出和實際結果之間的差異,將這個殘差返回給整個網路,調整網路中的權重關系。這也是為什麼我們在神經網路中需要後向傳播的原因。其主要計算步驟如下:
1. 計算總誤差
2. 隱藏層的權值更新
在要更新每個邊的權重之前,必須要知道這條邊對最後輸出結果的影響,可以用整體誤差對w5求偏導求出:
具體計算的時候,可以採用鏈式法則展開:
在計算的時候一定要注意每個式子裡面哪些自變數是什麼,求導千萬不要求錯了。
??需要講出來的一個地方是,在計算w1的權重時,Etotal中的兩部分都需要對它進行求導,因為這條邊在前向傳播中對兩個殘差都有影響
3. 更新權重 這一步裡面就沒什麼東西了,直接根據學習率來更新權重:
至此,一次正向+反向傳播過程就到此為止,接下來只需要進行迭代,不斷調整邊的權重,修正網路的輸出和實際結果之間的偏差(也就是training整個網路)。