⑴ 糾錯碼的基本原理和性能參數
糾錯碼能夠檢錯或糾錯,主要是靠碼字之間有較大的差別。這可用碼字之間的漢明距離d(x,y)來衡量。它的定義為碼字x與y之間的對應位取不同值的碼元個數。一種糾錯碼的最小距離d定義為該種碼中任兩個碼字之間的距離的最小值。一種碼要能發現e個錯誤,它的最小距離d應不小於e+1。若要能糾正t個錯誤,則d應不小於2t+1。一個碼字中非零碼元的個數,稱為此碼字的漢明重量。一種碼中非零碼字的重量的最小值,稱為該碼的最小重量。對線性碼來說,一種碼的最小重量與其最小距離在數值上是相等的。
在構造線性碼時,數字上是從n維空間中選一k維子空間,且使此子空間內各非零碼字的重量盡可能大。當構造循環碼時,可進一步將每一碼字看成一多項式,將整個碼看成是多項式環中的理想,這一理想是主理想,故可由生成多項式決定;而多項式完全可由它的根規定。這樣,就容易對碼進行構造和分析。這是BCH碼等循環碼構造的出發點。一般地說,構造一種碼時,均設法將它與某種代數結構相聯系,以便對它進行描述,進而推導它的性質,估計它的性能和給出它的解碼方法。若一種碼的碼長為n,碼字數為M,或信息位為h,以及最小距離為d,則可把此碼記作【n,M,d】碼。若此碼為線性碼,常簡記作(n,k)或(n,k,d)碼。人們還常用R=log2M/n表示碼的信息率或簡稱碼率,單位為比特/碼元。R越大,則每個碼元所攜帶的信息量越大,編碼效率越高。 糾錯碼實現中最復雜的部分是解碼。它是糾錯碼能否應用的關鍵。根據式(1),採用的碼長n越大,則誤碼率越小。但n越大,編譯碼設備也越復雜,且延遲也越大。人們希望找到的解碼方法是:誤碼率隨碼長n的增加按指數規律下降;解碼的復雜程度隨碼長n的增加接近線性地增加;解碼的計算量則與碼長n基本無關。可惜,已經找到的碼能滿足這樣要求的很少。不過由於大規模集成電路的發展,即使應用比較復雜的但性能良好的碼,成本也並不太高。因此,糾錯碼的應用越來越廣泛。
糾錯碼傳輸的都是數字信號。這既可用硬體實現,也可用軟體實現。前者主要用各種數字電路,主要是採用大規模集成電路。軟體實現特別適合計算機通信網等場合。因為這時可以直接利用網中的計算機進行編碼和解碼,不需要另加專用設備。硬體實現的速度較高,比軟體可快幾個數量級。
在傳信率一定的情況下,如果採用糾錯碼提高可靠性,要求信道的傳輸率增加,帶寬加大。因此,糾錯碼主要用於功率受限制而帶寬較大的信道,如衛星、散射等系統中。糾錯碼還用在一些可靠性要求較高,但設備或器件的可靠性較差,而餘量較大的場合,如磁帶、磁碟和半導體存儲器等。
在分組碼的研究中,譜分析的方法受到人們的重視。糾同步錯誤碼、算術碼、不對稱碼、不等錯誤糾正碼等,也得到較多的研究。 分組碼是對信源待發的信息序列進行分組(每組K位)編碼,它的校驗位僅同本組的信息位有關。自20世紀50年代分組碼的理論獲得發展以來,分組碼在數字通信和數據存儲系統中已被廣泛應用。
分組碼的碼長n和碼字個數M是一個碼的主要構造參數。碼長為n的碼中所有碼字的位數均為n;若要用一個碼傳送k比特信息,則碼字的個數M必須滿足。典型的分組碼是由k位信息位和r位監督位組成的,這樣構成的碼一般稱為系統碼。
分組碼中應用最廣的線性分組碼。線性分組碼中的M個碼字之間具有一定線性約束關系,即這些碼字總體構成了n維線性空間的一個k維子空間。稱此k維子空間為(n,k)線性分組碼。線性系統碼的特點是每個碼字的前k位均由這個碼字所對應的信息位組成,並通過對這k位信息位的線性運算得到後面n—k是位監督位。
線性分組碼中應用最廣的是循環碼,循環碼的主要特徵是任何碼字在循環移位後個碼字。循環碼的優點在於其編碼和解碼手續比一般線性碼簡單,因而易於在設備上實現。在循環碼中,碼字可表示為多項式。循環碼的碼字多項式都可表示成為循環碼的生成多項式與這個碼字所代表的信息多項式的乘積,即,因此一個循環碼可以通過給出其生成多項式來規定。常用的循環碼有BCH碼和RS碼。
網格碼有多種描述方法,網格圖是常用方法之一,它能表示出編碼過程。一個碼率為1/2、包含四種狀態的網格碼的網格圖如圖所示。圖1中00,01,10,11表示編碼器所具有的四種狀態,以「·」示出,從每一狀態出發都存在兩條支路,位於上面的一條支路對應於編碼器輸入為「0」的情況,位於下面的一條支路對應於編碼器輸入為「1」的情況,而每一支路上所列出的兩個二進位碼則表示相應的編碼輸出。因而可知,編碼輸出不僅決定於編碼器的當前輸入,還決定於編碼器的狀態,例如在圖中從「00」狀態出發;,若輸入的二進制數據序列為1011,則編碼器的狀態轉移過程為00→01→10→01→11,而相應的編碼輸出序列為11010010。在網格圖中任意兩條從同一狀態出發;,經不同的狀態轉移過程後又歸於另一相同狀態(該狀態也可與初始狀態相同)的路徑間的距離的最小值稱為碼的自由距離。如該圖中的為5。對於卷積碼來說,的計算可簡化為始於且終於零狀態的非全零路徑與全零路徑間距離的最小值。是表徵網格碼糾錯能力的重要參數。維特比演算法是廣泛採用的網格碼的解碼方法。由於網格碼的狀態越多,解碼越復雜,所以狀態個數是度量網格碼解碼復雜性的重要參數。一般說來可以通過增大解碼復雜性來增加,從而提高碼的糾錯能力。
BCH碼、網格碼已被廣泛地應用於移動通信、衛星通信和頻帶數據傳輸中。RS碼也被廣泛應用於光碟的存儲中。
大多數糾錯碼是設計來糾隨機誤碼的,可以通過交織的方法使它適用於對突發誤碼的糾錯。交織是一種使得集中出現的突發誤碼在解碼時進行分散化的措施,從而使其不超出糾錯碼的糾錯能力范圍。 卷積碼不對信息序列進行分組編碼,它的校驗元不僅與當前的信息元有關,而且同以前有限時間段上的信息元有關。卷積碼在編碼方法上尚未找到像分組碼那樣有效的數學工具和系統的理論。但在解碼方面,不論在理論上還是實用上都超過了分組碼,因而在差錯控制和數據壓縮系統中得到廣泛應用。
⑵ crf模型原理及解釋
在明白crf之前,首先我們來看看概率圖。概率圖是用圖來表示變數概率依賴關系,是概率論和圖論的結合。從概率圖衍生而來的演算法有很多,包括樸素貝葉斯、最大熵、hmm、條件隨機場、主題模型等。
概率圖分為有向概率圖,又叫貝葉斯網路,其中的有向代表的是單邊依賴關系;無向概率圖,又叫馬爾科夫網路,其中的無向代表的是雙邊依賴關系。
上面已經說了馬爾科夫就是說當前狀態只跟上一狀態有關,而跟其他狀態無關。
設X與Y是隨機變數,P(Y∣X)是在給定X的條件下Y的條件概率分布。若隨機變數Y構成一個由無向圖G=(V,E)表示的馬爾可夫隨機場,即
對任意結點v成立,則稱條件概率分布P(Y∣X)為條件隨機場。其中w~v表示與v相連的節點w≠v表示除v外的所有節點,這就是條件獨立的概念。
實際上,我們通常考慮線性鏈的情況,並且X和Y具有相同的結構,這個可以理解為隱藏狀態和觀察狀態,X就是我們能觀察到的,但是Y我們觀察不到:
條件隨機場最終求的都是一個聯合概率,根據馬爾科夫性,我們可以把聯合概率表示成相鄰節點的函數。
Z(x)就是exp那一坨的求和,tk和sl是特徵函數,這個我們可以自己定義,剩下的是權重。
這樣一來相乘的問題我們化簡成相加的問題了。
這樣寫不太好理解和推導,需要化簡,於是我們假設有K1個轉義特徵和K2個狀態特徵,定義一個分段函數:
然後定義一個分段的權重:
矩陣是最容易計算的了,因此進一步表示為矩陣形式。首先定義一個m階矩陣,這個好理解,就是m個y可能的取值。
這個式子呢,從後往前看,最下面那個是不是眼熟,就是條件隨機場向量化表達公式的前半部分,然後取exp以後就可以得到m階矩陣了,這個懶得解釋自己想一下就行了。提示一下m階的意思是呢,yi-1有m種表達,yi有m種表達,最後綜合起來就是m階了。
最終矩陣相乘就表示一個概率的可能性,然後規范化以後就可以得到概率分布。
要時刻記得這事一個判別式模型,是要直接計算P(x|y)的。
我們都知道條件隨機場有一個轉移特徵和狀態特徵,這些都可以事先定義好。我們定義好特徵函數後,從模型表達式上來看就剩一個wk序列的參數需要計算了。參數求解方法有很多,牛頓法、擬牛頓法等等,這些都是運籌里的優化演算法,需要了解的話我會單獨的寫一個專題出來。這里不展開了。
其實就是兩個遞推公式,具體不展開了,不太好理解:
目標函數,參考極大似然估計,跟邏輯回歸類似,取下邊這個:
然後採用擬牛頓法求解,太難了,不說了,知道怎麼回事就行。
預測過程簡而言之就是找到概率最大的那個狀態序列,採用維特比演算法,用到了動態規劃,可以減少計算量。具體也不多說,因為這篇文章偏向於讓大家都懂計算流程,不太考慮細節,可以參考下邊這個文章。 https://www.cnblogs.com/bei/p/9391014.html
基本上碎碎念的就這么多,大家一般用crf都是用在Bilstm之後,巧的是tensorflow已經封裝好crf層,同志們直接用好了。
⑶ 程序員必須掌握哪些演算法
A搜索演算法——圖形搜索演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,A*搜索演算法是最佳優先搜索的範例。
集束搜索(又名定向搜索,BeamSearch)——最佳優先搜索演算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。
二分查找(BinarySearch)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。
分支界定演算法(BranchandBound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。
Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。
數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。
Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。
Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。
離散微分演算法(Discretedifferentiation)
動態規劃演算法(DynamicProgramming)——展示互相覆蓋的子問題和最優子架構演算法
歐幾里得演算法(Euclideanalgorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。
期望-最大演算法(Expectation-maximizationalgorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值。
快速傅里葉變換(FastFouriertransform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。該演算法應用范圍很廣,從數字信號處理到解決偏微分方程,到快速計算大整數乘積。
梯度下降(Gradientdescent)——一種數學上的最優化演算法。
哈希演算法(Hashing)
堆排序(Heaps)
Karatsuba乘法——需要完成上千位整數的乘法的系統中使用,比如計算機代數系統和大數程序庫,如果使用長乘法,速度太慢。該演算法發現於1962年。
LLL演算法(Lenstra-Lenstra-Lovaszlatticerection)——以格規約(lattice)基數為輸入,輸出短正交向量基數。LLL演算法在以下公共密鑰加密方法中有大量使用:背包加密系統(knapsack)、有特定設置的RSA加密等等。
最大流量演算法(Maximumflow)——該演算法試圖從一個流量網路中找到最大的流。它優勢被定義為找到這樣一個流的值。最大流問題可以看作更復雜的網路流問題的特定情況。最大流與網路中的界面有關,這就是最大流-最小截定理(Max-flowmin-cuttheorem)。Ford-Fulkerson能找到一個流網路中的最大流。
合並排序(MergeSort)
牛頓法(Newton'smethod)——求非線性方程(組)零點的一種重要的迭代法。
Q-learning學習演算法——這是一種通過學習動作值函數(action-valuefunction)完成的強化學習演算法,函數採取在給定狀態的給定動作,並計算出期望的效用價值,在此後遵循固定的策略。Q-leanring的優勢是,在不需要環境模型的情況下,可以對比可採納行動的期望效用。
兩次篩法(QuadraticSieve)——現代整數因子分解演算法,在實踐中,是目前已知第二快的此類演算法(僅次於數域篩法NumberFieldSieve)。對於110位以下的十位整數,它仍是最快的,而且都認為它比數域篩法更簡單。
RANSAC——是「RANdomSAmpleConsensus」的縮寫。該演算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。其基本假設是:數據包含非異化值,也就是能夠通過某些模型參數解釋的值,異化值就是那些不符合模型的數據點。
RSA——公鑰加密演算法。首個適用於以簽名作為加密的演算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。
Schönhage-Strassen演算法——在數學中,Schönhage-Strassen演算法是用來完成大整數的乘法的快速漸近演算法。其演算法復雜度為:O(Nlog(N)log(log(N))),該演算法使用了傅里葉變換。
單純型演算法(SimplexAlgorithm)——在數學的優化理論中,單純型演算法是常用的技術,用來找到線性規劃問題的數值解。線性規劃問題包括在一組實變數上的一系列線性不等式組,以及一個等待最大化(或最小化)的固定線性函數。
奇異值分解(Singularvaluedecomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdeterminedlinearsystems)、矩陣逼近、數值天氣預報等等。
求解線性方程組()——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordanelimination),或是柯列斯基分解(Choleskydecomposition)。
Strukturtensor演算法——應用於模式識別領域,為所有像素找出一種計算方法,看看該像素是否處於同質區域(homogenousregion),看看它是否屬於邊緣,還是是一個頂點。
合並查找演算法(Union-find)——給定一組元素,該演算法常常用來把這些元素分為多個分離的、彼此不重合的組。不相交集(disjoint-set)的數據結構可以跟蹤這樣的切分方法。合並查找演算法可以在此種數據結構上完成兩個有用的操作:
查找:判斷某特定元素屬於哪個組。
合並:聯合或合並兩個組為一個組。
維特比演算法(Viterbialgorithm)——尋找隱藏狀態最有可能序列的動態規劃演算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。
⑷ 大數據最常用的演算法有哪些
奧地利符號計算研究所(Research Institute for Symbolic Computation,簡稱RISC)的Christoph Koutschan博士在自己的頁面上發布了一篇文章,提到他做了一個調查,參與者大多數是計算機科學家,他請這些科學家投票選出最重要的演算法,以下是這次調查的結果,按照英文名稱字母順序排序。
大數據等最核心的關鍵技術:32個演算法
1、A* 搜索演算法——圖形搜索演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,A*搜索演算法是最佳優先搜索的範例。
2、集束搜索(又名定向搜索,Beam Search)——最佳優先搜索演算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。
3、二分查找(Binary Search)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。
4、分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。
5、Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。
6、數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。
7、Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。
8、Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。
9、離散微分演算法(Discrete differentiation)。
10、動態規劃演算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構演算法
11、歐幾里得演算法(Euclidean algorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。
12、期望-最大演算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值。
13、快速傅里葉變換(Fast Fourier transform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。該演算法應用范圍很廣,從數字信號處理到解決偏微分方程,到快速計算大整數乘積。
14、梯度下降(Gradient descent)——一種數學上的最優化演算法。
15、哈希演算法(Hashing)。
16、堆排序(Heaps)。
17、Karatsuba乘法——需要完成上千位整數的乘法的系統中使用,比如計算機代數系統和大數程序庫,如果使用長乘法,速度太慢。該演算法發現於1962年。
18、LLL演算法(Lenstra-Lenstra-Lovasz lattice rection)——以格規約(lattice)基數為輸入,輸出短正交向量基數。LLL演算法在以下公共密鑰加密方法中有大量使用:背包加密系統(knapsack)、有特定設置的RSA加密等等。
19、最大流量演算法(Maximum flow)——該演算法試圖從一個流量網路中找到最大的流。它優勢被定義為找到這樣一個流的值。最大流問題可以看作更復雜的網路流問題的特定情況。最大流與網路中的界面有關,這就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一個流網路中的最大流。
20、合並排序(Merge Sort)。
21、牛頓法(Newton』s method)——求非線性方程(組)零點的一種重要的迭代法。
22、Q-learning學習演算法——這是一種通過學習動作值函數(action-value function)完成的強化學習演算法,函數採取在給定狀態的給定動作,並計算出期望的效用價值,在此後遵循固定的策略。Q-leanring的優勢是,在不需要環境模型的情況下,可以對比可採納行動的期望效用。
23、兩次篩法(Quadratic Sieve)——現代整數因子分解演算法,在實踐中,是目前已知第二快的此類演算法(僅次於數域篩法Number Field Sieve)。對於110位以下的十位整數,它仍是最快的,而且都認為它比數域篩法更簡單。
24、RANSAC——是「RANdom SAmple Consensus」的縮寫。該演算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。其基本假設是:數據包含非異化值,也就是能夠通過某些模型參數解釋的值,異化值就是那些不符合模型的數據點。
25、RSA——公鑰加密演算法。首個適用於以簽名作為加密的演算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。
26、Sch?nhage-Strassen演算法——在數學中,Sch?nhage-Strassen演算法是用來完成大整數的乘法的快速漸近演算法。其演算法復雜度為:O(N log(N) log(log(N))),該演算法使用了傅里葉變換。
27、單純型演算法(Simplex Algorithm)——在數學的優化理論中,單純型演算法是常用的技術,用來找到線性規劃問題的數值解。線性規劃問題包括在一組實變數上的一系列線性不等式組,以及一個等待最大化(或最小化)的固定線性函數。
28、奇異值分解(Singular value decomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdetermined linear systems)、矩陣逼近、數值天氣預報等等。
29、求解線性方程組(Solving a system of linear equations)——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。
30、Strukturtensor演算法——應用於模式識別領域,為所有像素找出一種計算方法,看看該像素是否處於同質區域( homogenous region),看看它是否屬於邊緣,還是是一個頂點。
31、合並查找演算法(Union-find)——給定一組元素,該演算法常常用來把這些元素分為多個分離的、彼此不重合的組。不相交集(disjoint-set)的數據結構可以跟蹤這樣的切分方法。合並查找演算法可以在此種數據結構上完成兩個有用的操作:
查找:判斷某特定元素屬於哪個組。
合並:聯合或合並兩個組為一個組。
32、維特比演算法(Viterbi algorithm)——尋找隱藏狀態最有可能序列的動態規劃演算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。
以上就是Christoph博士對於最重要的演算法的調查結果。你們熟悉哪些演算法?又有哪些演算法是你們經常使用的?
⑸ 聲學模型GMM-HMM
在語音識別中,HMM的每個狀態都可對應多幀觀察值,觀察值概率的分布不是離散的,而是連續的,適合用GMM來進行建模。HMM模塊負責建立狀態之間的轉移概率分布,而GMM模塊則負責生成HMM的觀察值概率。
模型自適應: 由於各地口音、採集設備、環境雜訊等音素的差異,已訓練過的GMM-HMM很可能和新領域的測試數據不匹配,導致識別效果變差,需要做自適應訓練。
MAP(最大後驗概率估計): 演算法本質是重新訓練一次,並且平衡原有模型參數和自適應數據的估計。
MLLR(最大似然線性回歸): 演算法核心思想是將原模型的參數進行線性變換後再進行識別,其優點是使用少量語音即可以對所有模型進行自適應訓練,只要得到線性變換矩陣即可。
每個音素(或三音素)用一個 HMM 建模,每個 HMM 狀態的發射概率對應一個 GMM。GMM-HMM 的目的即是找到每一幀屬於哪個音素的哪個狀態。GMM-HMM 的訓練使用自我迭代式的 EM 演算法,更直接的方式是採用維特比訓練,即把EM演算法應用到GMM參數的更新上,要求顯示的輸入每一幀對應的狀態,使用帶標注的訓練數據更新GMM的參數,這種訓練方法比Baum-Welch演算法速度更快,模型性能卻沒有明顯損失。
1、首次對齊時把訓練樣本按該句的狀態個數平均分段。
2、每次模型參數的迭代都需要成對的使用gmm-acc-stats-ali和gmm-est工具。
3、進行多輪迭代訓練後使用gmm-align-compiled工具通過其內部的維特比演算法生成對齊結果。
單因子模型的基本假設是:一個音素的實際發音,與其左右相鄰或相近的音素(上下文音素)無法。三因子結構中的每一個音素建模實例,都由其中心音素及其左右各一個上下文音素共同決定。無論是單因子還是三因子,通常都使用三狀態的HMM結構來建模。為了解決三因子模型參數爆炸問題,將所有的三因子模型放到一起進行相似性聚類(決策樹),發音相似的三因子被聚類到同一個模型,共享參數。訓練腳本:steps/train_deltas.sh,目標訓練一個10000狀態的三因子系統:
1、以單因子為基礎,訓練一個5000狀態的三因子模型
2、用5000狀態的模型重新對訓練數據進行對齊,其對齊質量必然比單因子系統對齊質量高
3、用新的對齊再去訓練一個10000狀態的三因子系統
phone-id:音素的 ID,參見 data/lang/phones.txt,強制對齊的結果不含 0(表示<eps>)和消歧符 ID;
hmm-state-id:單個 HMM 的狀態 ID,從 0 開始的幾個數,參見 data/lang/topo;
pdf-id:GMM 的 ID,從 0 開始,總數確定了 DNN 輸出節點數,通常有數千個;
transition-index:標識單個 Senone HMM 中一個狀態的不同轉移,從 0 開始的幾個數;
transition-id:上面四項的組合 (phone-id,hmm-state-id,pdf-id,transition-index),可以涵蓋所有可能動作,表示哪個 phone 的哪個 state 的哪個 transition 以及這個 state 對應的 pdf 和這個 transition 的概率,其中元組 (phone-id,hmm-state-id,pdf-id) 單獨拿出來,叫 transition-state,與 transition-id 都從1開始計數。
關系:transition-id可以映射到唯一的transition-state,而transition-state可以映射到唯一的pdf-id,因此transition-id可以映射到唯一的pdf-id。pdf-id不能唯一的映射成音素,因此kaldi使用transition-id表示對齊的結果。
語音識別過程是在解碼空間中衡量和評估所有的路徑,將打分最高的路徑代表的識別結果作為最終的識別結果。傳統的最大似然訓練是使正確路徑的分數盡可能高,而區分性訓練則著眼於加大這些路徑之間的打分差異,不僅要使正確路徑的分數僅可能高,還要使錯誤路徑尤其是易混淆路徑的分數盡可能低。
常用的區分性訓練准則有最大互信息、狀態級最小貝葉斯風險、最小音素錯誤。
分子:對於某條訓練數據,其正確標注文本在解碼空間中對應的所有路徑的集合。
分母:理論上值整個搜索空間。通常會通過一次解碼將高分路徑過濾出來,近似整個分母空間,從而有效的減小參與區分性優化的分母規模。
詞格(Lattice):分子、分母其實都是解碼過程中一部分解碼路徑的集合,將這些路徑緊湊有效的保存下來的數據結構就是詞格。
⑹ Turbo碼的解碼演算法
如前所述,turbo碼需要一種軟輸入軟輸出的解碼演算法。軟輸出解碼器的輸出不僅應包含硬判決值,而且包括做出這種判斷的可信程度。解碼演算法應該考慮到三方面的問題,及外信息的引入;如何在迭代解碼中充分利用各類信息,防止簡單正反饋的形成,確保演算法收斂;充分利用碼原件的相關信息。常見的演算法有一下幾種: 其運算量為標准維特比演算法的兩倍。維特比演算法是最大似然序列估計演算法,但由於在它的每一步都要刪除一些低似然路徑,為每一狀態只保留一條最優路徑,它無法提供軟輸出。為了給他輸出的每個比特賦予一個可信度,需要在刪除低似然路徑是做一些修正,以保留必要的信息。其基本思想是利用最優留存路徑和被刪路徑的度量差,這個差越小意味著這次算去的可靠性越好。然後用這個差去修正這條路徑上各個比特的可信度。
⑺ 隱馬爾可夫模型
隱馬爾可夫模型是關於時序的概率模型,描述由一個隱藏的馬爾科夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測從而產生觀測隨機序列的過程。
隱馬爾可夫模型的形式定義如下:
設 是所有可能 狀態的集合 , 是所有可能 觀測的集合 :
其中 為可能狀態數, 為可能觀測數。
是長度為 的 狀態序列 , 是對應的 觀測序列 :
是 狀態轉移概率矩陣 :
其中:
是 觀測概率矩陣 :
其中:
是 初始狀態概率向量 :
其中:
隱馬爾可夫模型由初始狀態概率向量 、狀態轉移概率矩陣 和觀測概率矩陣 決定。 因此隱馬爾可夫模型 可表示為:
具體來說,長度為 的觀測序列的生成過程如下:按照初始狀態分布 產生狀態 ,按狀態 的觀測概率分布 生成 ,按狀態 的狀態轉移概率分布 產生狀態 ,依次遞推。
(1) 齊次馬爾可夫性假設 ,即隱藏的馬爾科夫鏈在任意時刻 的狀態只依賴於其前一時刻的狀態,與其他時刻狀態及觀測無關,也與時刻 無關。
(2) 觀測獨立性假設 ,即任意時刻的觀測只依賴於該時刻的馬爾科夫鏈狀態,與其它觀測狀態無關。
(1) 概率計算問題 :給定模型 和觀測序列 ,計算在模型 下序列 出現的概率 。
(2) 學習問題 :已知觀測序列 ,估計模型 參數,使得在該模型下觀測序列 最大。
(3) 預測問題 :已知模型 和觀測序列 ,求使得 最大的狀態序列 。
接下來分別闡述這三個問題的解決方法。
狀態 的概率是:
對固定的 觀測序列 的概率是:
同時出現的聯合概率為:
從而:
可以看到,上式是對所有可能的 序列求和,而長度為 的 序列的數量是 數量級的,而 的計算量是 級別的,因此計算量為 ,非常大, 這種演算法在實際中不可行 。
首先定義 前向概率 :給定隱馬爾可夫模型 ,定義到時刻 部分觀測序列為 且狀態為 的概率為前向概率,記作:
觀測序列概率的前向演算法 如下:
(1)初值:
(2)遞推,對 :
(3)終止:
前向演算法高效的關鍵是 局部計算前向概率,然後利用路徑結構將前向概率遞推到全局,得到 。前向概率演算法計算量是 級別的。
首先定義 後向概率 :給定隱馬爾可夫模型 ,定義在時刻 狀態為 的條件下,從 到 部分觀測序列為 的概率為後向概率,記作:
觀測序列概率的後向演算法 如下:
(1)初值:
(2)遞推,對 :
(3)終止:
若有 個長度相同觀測序列和對應狀態序列 則可利用極大似然估計得到隱馬爾可夫模型參數:
設樣本中時刻 處於狀態 時刻 轉移到狀態 的頻數為 ,那麼狀態轉移概率 的估計為:
設樣本中狀態為 觀測為 的頻數為 ,那麼觀測概率 的估計為:
初始狀態 的估計 為 個樣本中初始狀態為 的頻率。
假設給定訓練數據只包含 個長度為 的觀測序列 而沒有對應狀態序列,我們可以把狀態數據看作不可觀測的隱數據 ,則隱馬爾可夫模型事實上是一個含有隱變數的概率模型:
其參數可由EM演算法實現。
近似演算法的思想是,在每個時刻 選擇在該時刻最有可能出現的狀態 ,從而得到一個狀態序列 。
近似演算法的優點是計算簡單,缺點是不能保證預測的狀態序列整體是最有可能的狀態序列,因為預測的狀態序列可能有實際不發生的部分,比如存在轉移概率為0的相鄰狀態。盡管如此,近似演算法還是有用的。
維特比演算法實際上是用動態規劃解隱馬爾可夫模型預測問題,即用動態規劃求概率最大路徑(最優路徑),此路徑對應一個狀態序列。
定義 在時刻 狀態為 的所有單個路徑 中概率最大值 為:
由定義得遞推式:
定義 在時刻 狀態為 的所有單個路徑 中概率最大路徑的第 個結點 為:
維特比演算法 如下:
(1)初始化:
(2)遞推,對 :
(3)終止:
(4)回溯,對 :
最優路徑為
⑻ Python實現viterbi演算法原理流程是什麼樣的
維特比演算法說白了就是動態規劃實現最短路徑,只要知道「動態規劃可以降低復雜度」這一點就能輕松理解維特比演算法
維特比演算法是一個特殊但應用最廣的動態規劃演算法,利用動態規劃,可以解決任何一個圖中的最短路徑問題。而維特比演算法是針對一個特殊的圖——籬笆網路的有向圖(Lattice )的最短路徑問題而提出的。 它之所以重要,是因為凡是使用隱含馬爾可夫模型(Hidden Markov Model,HMM)描述的問題都可以用它來解碼,包括今天的數字通信、語音識別、機器翻譯、拼音轉漢字、分詞等。——《數學之美》 ps 多處摘錄此書,不再贅述。
籬笆網路有向圖的特點是同一列節點有多個,並且和上一列節點交錯地連接起來。同一列節點代表同一個時間點上不同的狀態的並列,大概因為這種一列一列整齊的節點和交錯的邊很像籬笆而得名。
假設上圖每一列分別有n1……nn個節點,如果不使用動態的話,那麼計算復雜度就是O(n1*n2……nn)。
而維特比演算法的精髓就是,既然知道到第i列所有節點Xi{j=123…}的最短路徑,那麼到第i+1列節點的最短路徑就等於到第i列j個節點的最短路徑+第i列j個節點到第i+1列各個節點的距離的最小值。
這是一句大白話,所謂中文偽碼。
分析一下復雜度,假設整個籬笆有向圖中每一列節點最多有D個(也就是圖的寬度為D),並且圖一共有N列,那麼,每次計算至多計算D*D次(從i列的D個節點中挑一個計算到i+1列D個節點的距離)。至多計算N次。那麼復雜度驟減為O(ND2),遠遠小於窮舉O(DN)。