潮科技行業入門指南 | 深度學習理論與實戰:提高篇(4)——基於HMM...

2021-01-09 36氪

編者按:本文節選自《深度學習理論與實戰:提高篇 》一書,原文連結http://fancyerii.github.io/2019/03/14/dl-book/。作者李理,環信人工智慧研發中心vp,有十多年自然語言處理和人工智慧研發經驗,主持研發過多款智能硬體的問答和對話系統,負責環信中文語義分析開放平臺和環信智慧機器人的設計與研發。

以下為正文。

我們可以根據說話的過程把語音識別的各個單元(unit)分成如下圖所示的層次結構。這是一個生成的過程。最上面是utterance,也就是一句話(不一定是語言學上的完整一句話),比如這裡的」No right」。往下一層是詞(word),比如這裡是兩個詞」No」和」right」。再往下是subword(比如因子),單詞」No」根據發音詞典可以分解為兩個因子[「n」, 「oh」]。再往下就是因子的HMM(比如用三狀態的HMM來表示一個因子)。最後一層是聲學模型,它根據狀態生成觀察。

發聲過程從上到下輸入是utterance W,輸出是聲學特徵X。而識別的過程正好反過來,我們需要尋找:

上式中()P(W)就是語言模型,而(|)P(X|W)就是聲學模型,通常會包括發音模型,HMM-GMM模型,當然也可以用DNN來替代GMM變成HMM-DNN模型。

圖:語音單元的層次結構

連續語音識別

簡介

前面介紹的HMM和GMM可以用來做孤立詞的識別,比如識別0-9十個數字,每個數字對應一個3狀態的HMM,發射概率可以是GMM模型。通過訓練數據我們可以使用前向後向算法訓練HMM-GMM的參數,而預測的時候我們可以對十個模型分別計算後驗概率:

(|)∝(|)(),=0,1,..,9

其中(|)P(O|Mi)可以通過前向算法計算出來,而()P(Mi)就是10個數字的先驗概率,可以簡單的認為它們是等概率的。然後我們選擇概率最大的i作為識別的結果。

那麼怎麼處理包含多個詞的句子呢?當然最簡單的是先進行詞的切分,然後分別識別每一個詞。但是這顯然不好,首先我們說話不是一個詞一個詞來說的,要正確切分每一個詞是很困難的;其次同音或者發音類似的詞很多,我們需要考慮整個句子根據上下文才能正確的識別每一個詞。

為了實現連續的識別,我們可以把每個詞的HMM拼接成大的HMM,訓練的時候我們是知道句子的每一個詞的,因此我們可以用詞的HMM拼接成句子的HMM。預測的時候也是類似的,根據語言模型,遍歷所有可能的句子,拼接得到這些句子的HMM。然後用HMM-GMM計算聲學模型概率,再加上語言模型的概率得到句子的最終概率,最後選擇概率最大的那個句子。當然這個搜索空間是非常大的,我們需要近似的搜索算法,後面的解碼器部分會介紹。這裡我們先只考慮聲學模型的訓練部分。

但是每個詞都使用一個HMM來建模有很多缺點:詞很多,這需要很多個HMM模型;很多詞在訓練數據中出現很少,也就是數據稀疏的問題;為了識別一個新詞需要重新訓練聲學模型,比如加入一個新的人名。

音子模型

為了解決上面的問題,我們通常對更細粒度的子詞單元進行HMM建模。雖然詞很多,但是組成詞的因素是不多的,比如英語的音素也就是四五十個左右。因此我們可以對每一個phone建立一個HMM模型,而詞的HMM就可以使用它的phone的HMM拼接起來。當然這就需要知道每個詞由哪些phone組成,最常見的是人工來編纂發音詞典,比如下面是CMU發音詞典的兩個詞:

這樣給定一個詞,我們就知道它的音子序列,然後我們通過把每個音子的HMM拼接起來就可以得到這個詞的HMM,類似的我們把很多詞的HMM拼接起來就可以得到一個句子的HMM。

使用發音詞典有新詞的問題,比如詞典裡沒有」balisong」這個詞,那麼我們無法識別這個詞。但是對於表音的語言(比如英語),我們是可以」猜測」出未知詞的發音的。這個時候我們可以使用一個模型來學習怎麼把詞變成因子序列,這個模型通常被成為Grapheme-to-Phoneme (G2P)模型。我們可以根據發音詞典來學習發音規律,這樣新詞來了之後就可以猜測可能的發音。這顯然可以使用我們熟悉的Seq2seq模型來解決,有興趣的讀者可以試試g2p-seq2seq。

對於每個音子,我們通常使用三個狀態的HMM來建模。如下圖所示,音子/ih/可以用三狀態的HMM建模。這樣一個詞,比如six,我們就可以把4個音素/s ih k s/拼接得到一個大的HMM,如下圖所示。

圖:音子ih的HMM模型

圖:詞six的HMM模型

上下文相關的(Context Dependency/CD)音子模型

但是一個音子在不同的上下文會有不同的發音,這就是所謂的協同發音(Coarticulation)。為了解決這個問題,我們通常建立上下文相關的音子模型,最常見的就是考慮一個音子的左右兩個音子,這就是triphone模型。我們通常使用類似l-x+r來表示當前考慮的音子是x,它左邊的音子是l而右邊是r。根據triphone是否跨越詞的邊界又可以分類為詞內的(word-internal) triphones和跨詞的(cross-word) triphone。比如句子」don’t ask」,如果使用詞內的triphone,則可以表示為:

sil表示silence,我們可以理解為一個特殊的詞,它不考慮上下文。n-t表示當前音子是t而左邊是n,ah+s表示當前音子是ah而右邊是s。

如果使用跨詞的triphone,則應該可以表示:

那麼有多少個triphone呢?假設音子有40個,那麼理論上可能有403=64,000403=64,000,實際上英語可能出現的triphone會有50,000左右。假設我們使用3狀態的HMM,每個狀態使用10個分量的GMM模型,那麼總共有1.5M個高斯分布。再假設我們使用39維的MFCC特徵,高斯分布的協方差矩陣是對角陣,那麼每個高斯有39(均值)+39(協方差矩陣)=78個參數。78 * 10+10(GMM的混合參數)=790個參數。那麼總共有50,000 * 3 * 790=118M參數。

我們的訓練數據很難覆蓋這麼多的參數,很多參數對應的訓練數據沒有或者很少,因此很難準確的估計其參數。為了解決這個問題,我們會使用參數共享(Parameter Sharing)的方法。通常有兩種參數共享方法:共享模型(Sharing models)和共享狀態(Sharing states)。

共享模型就是把比較類似的triphone聚類在一起,得到的triphone通常叫做Generalized triphone,如下圖所示。

圖:共享模型

共享狀態就是更加細粒度的共享,它是把每個triphone的每個狀態進行聚類,如下圖所示。

圖:共享狀態

聚類通常使用語音決策樹(Phonetic Decision Tree)算法,這是一種自頂向下(分裂)的方法。剛開始同一個音素的所有triphone都在根節點,然後每個節點都會根據問題進行分類,常見的問題類似於:

左邊是不是一個鼻音?右邊是不是摩擦音?下圖是語音決策樹的一個示例。

圖:語音決策樹示例

決策樹可以一直分裂下去直到每個節點只包含一個triphone,這顯然沒有意義。我們需要有一個停止分裂的標準,一種標準就是分裂之後要比分裂前得到的模型要好?什麼叫好呢?那就是新模型在訓練數據上的似然概率要比分裂前好,而且增量ΔΔ越大越好,如果沒有增量那麼就停止分裂。另外就是問這些問題的順序,我們會選擇似然增量最大的那個問題。

HMM模型在語音識別系統中的應用

前面HMM模型原理的部分介紹了它在語音識別系統中的應用,下面我們從系統實現的架構來了解HMM在語音識別系統中的應用。HMM模型通常用於聲學模型的建模,而除了聲學模型,語音識別系統還包括語言模型以及更加關注工程實現的解碼器。

基於HMM的語音識別系統架構如下圖所示。來自麥克風的音頻波形被轉換成固定大小(比如39維的MFCC)的聲學特徵向量的序列1:=1…Y1:T=y1…yT,這個過程叫做特徵提取。然後解碼器(decoder)試圖找到最優的詞序列1:=1…w1:L=w1…wL使得後驗概率最大:

因為(|)P(w|Y)比較難於直接建模,因此我們使用貝葉斯公式,因為分母與w無關,因此可以得到:

圖:基於HMM的語音識別系統架構

(|)P(Y|w)通過聲學模型(Acoustic Model)來確定,而()P(w)由語言模型來確定。聲學模型的基本單元是音子(phone),比如單詞」bat」的音子是/b/ae/t/。

每個音子都會有一個聲學模型(HMM),那麼一個單詞的模型是由它的音子的模型拼接起來,比如上面的單詞」bat」就由/b/ae/t/三個音子的HMM拼接而成。而單詞與音子的對應關係就是發音詞典(Pronunciation Dictionary),有的單詞會有多種發音。每個音子的HMM通過訓練數據學習出來。而語言模型通常使用N-gram模型,當然也可以使用神經網絡語言模型,通常聲學模型和語言模型是獨立訓練的。預測的時候,解碼器理論上會嘗試所有可能的詞序列,然後找到後驗概率最大的詞序列。當然實際由於搜索空間太大,一般會在搜索中進行剪枝(prune),去掉當前看來概率比較低的路徑。

HMM聲學(Acoustic)模型

前面提到過,每個詞w可以分解為Kw個基本因子(base phone)的發音單位,比如前面的bat可以分解成/b/ae/t/3個基本單元的序列。這個序列叫作這個詞的發音()1:=1,…,q1:Kw(w)=q1,…,qKw。因為有的詞有多個發音,因此我們在計算(|)P(Y|w)的時候需要遍歷詞的每一種發音:

上式中,Q是一條可能的詞序列的發音序列:

上式中,()q(wl)是詞wl的一種合法的發音,通常情況下一個詞只有一種發音,但是有些詞會有多種發音,因此(|)P(Y|w)會遍歷詞序列w的所有可能發音序列Q。

每個基本因子q由一個連續輸出的HMM來表示,如下圖所示。圖中有一個進入狀態和退出狀態,它是沒有輸出的,這兩個狀態是為了方便把不同詞的HMM串聯起來。每個因子q的HMM由兩個狀態aij和()bj(y)來表示,其中aij表示由狀態i跳轉到j的概率;bj表示在這個狀態j下輸出y的概率(分布/密度)。HMM的基於如下兩個獨立性的假設:

給定前一個時刻的狀態,當前狀態不依賴更早之前的狀態(一階馬爾科夫)給定當前時刻的狀態,當前時刻的輸出跟其它時刻的無關

圖:基於HMM的因子模型

這裡我們可以看出,通過狀態的自跳轉,HMM可以(一定程度的)解決說話人語速的問題。對於發射概率()bj(y),我們先假設它是最簡單的多變量單高斯的模型,後面我們會擴展到高斯混合模型(GMM),這就是最常見的HMM-GMM模型。它用HMM來建模狀態的跳轉,用GMM來建模一個狀態的輸出概率分布。

其中μj是狀態j的高斯分布的均值,而ΣΣj是協方差矩陣。因為y的維度通常比較高(比如39),我們通常假設ΣΣj是對角矩陣(Diagonal Matrix)。之前我們在介紹特徵提取的時候,MFCC的一個步驟就是DCT去除不同維度的相關性,從而使得這個假設能夠成立。

給定詞的發音序列Q,我們可以計算輸出Y的概率:

其中θ是給定發音序列Q時合理的狀態序列。

舉個例子,假設詞序列是兩個詞」a cat」,它的一種發音序列是/a/k/ae/t/,假設Y的長度是T=18,那麼兩種θ可能是

1θ1中音素a的中間狀態(2a2)持續了兩個時刻,而ae的中間狀態2ae2隻持續了一個時刻;而2θ2正好相反。當然上面我們只列舉了兩條路徑,實際的計算過程中,我們需要變量所有可能的θ,而任意一個狀態序列(路徑)0,1,…,+1θ0,θ1,…,θT+1(0時刻和T+1時刻是我們增加的進入和退出狀態,0θ0跳到1θ1是沒有輸出的)的概率計算如下:

在上式中0θ0和+1θT+1是進入(entry)和退出(exit)狀態,它們是沒有輸出的。它們的目的是為了方便把不同詞的HMM串聯起來。後面為了簡單,我們可以暫不考慮它們,而只關注1,…,θ1,…,θT。

聲學模型的參數=[(),(())]λ=[(aij),(bj(y))]可以使用前向後向(forward-backward)算法了估計,這是EM算法的一個例子。假設第r個訓練數據的特徵序列Yr的長度是Tr。因為我們有它對應的詞序列,那麼根據發音詞典(我們先假設一個詞只有一種發音)我們可以得到發音序列,從而可以把每個音素的HMM拼接成一個大的HMM。

比如上圖中的例子,我們把a cat的發音/a/k/ae/t/的HMM拼接起來。如果我們知道每一個時刻對應哪個因子的哪個狀態,那麼我們很容易最大似然估計出和()aij和bj(y)來。

當然我們可以用人來標註每個時刻對應哪個狀態,但是要人來標註這種對齊是非常困難而且容易出錯的。因為很多音素的邊界是很難區分,比如下圖,讓非專業的人通過看波形或者頻譜是很難準確的區分其邊界的。

圖:語音識別

假設我們知道t時刻對應的狀態的概率(當然如果認為一個時刻只能「屬於」某一個狀態,那麼它就是類似one-hot的——一個1其餘的是0)()γt(rj),這個概率表示(第r個訓練數據)t時刻的狀態是j的概率,我們通常把它叫作(狀態)佔用(occupation)概率。那麼我們很容易用如下公式最大似然估計和()aij和bj(y):

上面的公式看起來很複雜,其實它表達的意思很簡單:我們要估計狀態j對應的高斯分布的均值,那麼我們找到所有屬於這個狀態的時刻t(()γt(rj)),然後把它們平均起來就行,不過這裡因為我們認為某個時刻可能有一定的概率屬於狀態j,所以我們需要加權上概率()γt(rj)。如果我們考慮特殊情況——一個時刻t只屬於一個狀態j,那麼上面的公式會更加明顯。Σ ()Σ^(j)的估計公式其實也是類似的。

類似的我們可以估計狀態的跳轉:

這個公式可以這樣來讀:分母是變量所有的時刻,找到狀態為i的(概率),然後加起來;而分子表示t時刻是狀態i並且t+1時刻是j的概率,兩者一除就是跳轉概率。關於分子的計算——也就是t時刻是狀態i並且t+1時刻是狀態j的概率,需要理解後面要介紹的前向概率(α)和後向概率(β),請讀者熟悉這兩個概率之後再來閱讀這個公式。

前面介紹了如果我們知道()γt(rj)(其實是前向和後向概率)時,我們可以最大似然估計模型的參數,Σ,μ,Σ,aij。現在的問題是我們怎麼前向和後向概率呢?下面我們會介紹:如果知道了模型參數,Σ,μ,Σ,aij,那麼我們可以估計出這兩個概率。這樣就很有趣:我們如果知道a,那麼就可以估計b;同樣我們知道b就可以估計a。這很像雞生蛋和蛋生雞的問題。我們可以用所謂的EM算法來估計它們:首先隨機的初始化參數,Σ,μ,Σ,aij,然後用它們來估計前向後向概率,然後再用前向後向概率估計新的參數,Σ,μ,Σ,aij,然後用新的參數,Σ,μ,Σ,aij估計前向後向概率,直到模型收斂。

那麼接下來的問題就是:如果我們知道了模型的參數=(,Σ,)λ=(μ,Σ,aij),我們怎麼估計前向後向概率並且怎麼用前向後向概率來就是狀態佔用概率(State Occupation Probability)?

在介紹前向後向概率前我們先來看一下如果不使用動態規划算法,我們應該怎麼計算t時刻屬於狀態i的概率?假設有3個狀態1、2和3。這個序列的長度是T,那麼總共有33T種可能的狀態序列(路徑)(當然有些狀態之間的跳轉是不可能的,另外我們的狀態序列要受發音序列約束,而發音序列又由詞序列約束)。 我們把t時刻固定為狀態i,那麼總共還有313T1中可能的路徑,如果模型的參數已知,那麼每一條狀態序列輸出y的概率都可以簡單的計算出來,我們把所有這些概率加起來就得到t時刻狀態為i的概率。但是這樣計算的實際複雜度是指數級的,實際根本無法使用。如果我們仔細觀察,會發現裡面很多的計算是重複的,因此我們可以使用動態規劃來減少重複計算。這就是下面我們要介紹的前向-後向算法。

我們首先定義前向概率=(1:,=;)αtrj=P(Y1:tr,θt=sj;λ),它的意思是t時刻的狀態為j並且1到t時刻輸出為1:Y1:tr的聯合概率。而後向概率=(()+1:()|=;)βtri=P(Yt+1:T(r)(r)|θt=si;λ),它的意思是t時刻狀態為i的條件下t+1到T時刻的輸出為+1:Yt+1:Tr的條件概率。注意這兩個概率的區別,一個是聯合概率一個是條件概率。

這兩個概率都可以用遞推公式計算:

我們可以這樣「讀」第一個公式:t時刻處於狀態j,那麼可以是t-1時刻屬於狀態i,然後從狀態i跳到j(aij),並且t時刻從狀態j輸出(發射)()yt(rj)((())bj(yt(r)))。第二個公式也是類似的,不過它是從後往前的。

另外我們需要遞推公式的初始化條件()1α1(rj)和()βT(ri)。對於經典的HMM文獻,除了狀態之間的跳轉概率之外還有一個初始狀態概率——也就是在第一個時刻時處於這個狀態的概率。但是我們這裡介紹的HMM沒有這個初始狀態概率,而是新增加了兩個特殊狀態0s0和+1sN+1。前者只能跳轉到狀態1,…,s1,…,sN,而後者只能有狀態1,…,s1,…,sN跳入,並且它們都沒有輸出。這兩個特殊狀態與1,…,s1,…,sN的跳轉概率可以等價的實現初始狀態概率的作用。

有了初始條件和遞推公式,我們就可以很容易的計算前向概率和後向概率了,它的時間複雜度是(2)O(N2T)。但是等等!我們的目的似乎不是求這樣兩個有些奇怪的概率,我們的目的是想知道狀態佔用概率()γt(rj),也就是t時刻屬於狀態j的概率。我們可以這樣用前向和後向概率來計算這個概率:

這裡不詳細推導這個公式,我們可以這樣來「理解」:t時刻處於狀態j的概率是所有1到t時刻的輸出是1:Y1:t並且t時刻狀態是j的聯合概率(()αt(rj))和在t時刻狀態為j的條件下t+1到T時刻的輸出是+1:Yt+1:T的條件概率(()βt(rj))的乘積,而()P(r)是一個歸一化的因子,使得()γt(rj)是一個概率,也就是∑()=1∑jγt(rj)=1,因此:

其中我們可以把上式的t換成1到T中的任何一個時刻,它們算出來都是()P(r),它也是輸出的概率(;)P(Y;λ)。

回顧一下,有了()γt(rj)之後,我們就可以用公式來估計高斯分布的參數和Σμj和Σj。但是我們還需要用公式來估計跳轉概率aij,當時因為沒有介紹前向和後向概率,所以沒有詳細介紹這個公式。現在我們再來回顧一下這個公式。

這個公式看起來有些複雜,其實它的意思很簡單:我們要計算從狀態i跳轉到狀態j的概率,那麼分母就是所有處於狀態i的加起來,因為一個時刻不是屬於一個狀態,而是概率的屬於,因此分母是把所有的()γt(rj)加起來;而分子是兩個求和,首先是下標r,遍歷所有訓練數據,然後是下標t,遍歷一個訓練數據的所有時刻,然後找到t時刻屬於狀態i(()αt(ri))並且t+1時刻屬於狀態j(()+1βt+1(rj)),當然還要乘以兩個發射概率(())bj(yt(r))和(+1())bj(yt+1(r))。

我們再來回顧一下怎麼用一個訓練數據訓練HMM模型的過程。假設訓練數據w=」a cat」,Y是對應的輸出序列,假設長度是20幀,那麼每一個時刻t的Yt是一個39維的(MFCC特徵)向量。根據發音詞典,詞序列w可以轉換成發音序列/a/k/ae/t/,然後每個因子(a/k等)都對應一個HMM,我們把這4個因子的HMM拼接起來就得到了這個訓練數據的HMM,然後我們隨機初始化(通常均值和方差用全局的均值和方差來初始化)這些HMM的參數=(,Σ,)λ=(μ,Σ,aij),根據這些參數計算前向後向概率,然後用前向後向概率更新參數,不斷的迭代直到收斂(模型的參數變化很小)。

這種方法不需要更細粒度的標註,因此也通常叫作flat start。這個方法主要的問題在於假設同一個因子(phone)在所有的上下文的發音都是一樣的,但是在語音中,很多因子的發音是依賴與它的上下文的。比如wood和cool這兩個詞,oo的發音是相同的元音,但是由於其前後的因子不同,它們的發音差別是很大的。之前我們假設的與上下文無關的因子我們通常把它叫作monophone。

為了加入上下文的信息,我們通常使用triphone,也就是把這個因子的前後的因子也考慮進來組合成一個triphone。假設基本的因子有N個,那麼理論上的triphone個數是3N3個(當然實際某些組合是在訓練數據中沒有出現過的)。因為triphone很多,這會導致數據稀疏的問題,因此我們通常類似的triphone聚類在一起。

圖:考慮上下文的因子建模

如圖上圖所示,W代表詞序列,Q代表發音序列,L代表triphone序列,而P代表HMM模型的序列。這裡的triphone我們用x-q+y的形式來表示,比如s-t+oh,表示中心的因子是t,它的左邊是s右邊是oh。注意stop that的p,在圖中是oh-p+th,p所在的詞是stop,而它的右方上下文是that的th,這種跨越詞邊界的triphone叫crossword triphone。也有triphone的建模是不跨越詞邊界的。

前面我們說到為了避免數據稀疏,我們通常會對triphone進行聚類,一種最簡單的聚類是直接對所有的triphone進行聚類。但是通常triphone的每個因子都有3個狀態,分別表示這個音的開始部分、中間部分和結尾部分。我們也可以更加細粒度的對狀態進行聚類,這樣的效果會更好。聚類的結果如下圖所示,屬於不同的triphone的類似狀態會聚類在一起,這些狀態是綁定(tie)在一起的,我們在參數更新是修改任何一個的時候也會等價於修改其它的(實際實現的時候就是一個共享的狀態)。

圖:狀態聚類(tied-state)的因子建模

那具體怎麼把這些狀態聚類(tie)起來呢?通常會使用決策樹聚類的方法。如圖所示,aw為中心因子的所有triphone比如s-aw+n、t-aw+n等等都放到一棵樹的根節點上。我們的示例是聚類這些triphone的第2個狀態(如前所述,通常triphone有3個狀態),它會通過問一些問題來分裂決策樹,樹的葉子節點對於一個物理的狀態,同一個葉子節點的狀態是tie在一起的。問題通常是人來提供的,後面介紹的Kaldi也提供了自動構建問題的方法。這些問題一般都是語音學相關的問題,比如一個問題是「它的左邊是否是鼻音?」。

我們最後總結一些使用訓練HMM-GMM聲學模型的過程:

首先初始化一個flat-start的monophone的單高斯模型用EM(前向後向)算法估計參數把訓練數據的monophone擴展到triphone,把單高斯的monophone模型的參數作為triphone參數的初始值用EM算法重新估計triphone模型的參數使用決策樹對triphone的狀態進行聚類,然後再用EM算法對聚類後的狀態再進行參數重估計所謂的GMM就是用多個高斯模型的線性組合來建模更加複雜的發射概率分布(()bj(yt)),理論上GMM可以擬合任何概率密度函數。我們這裡不詳細介紹GMM以及它的參數估計,有興趣的讀者可以參考相關資料。

通過上述的步驟,最終我們就得到了許多tie-state的triphone模型。

語言模型

給定詞序列1,…,w1,…,wK,語言模型會計算這個序列的概率,根據條件概率的定義,我們可以它聯合概率分解為如下的條件概率:

實際的語言模型很難考慮特別長的歷史,通常我們會限定當前詞的概率值依賴與之前的N-1個詞,這就是所謂的N-Gram語言模型:

在實際的應用中N的取值通常是2-5。我們通常用困惑度(Perplexity)來衡量語言模型的好壞:

N-Gram語言模型可以通過最大似然方法來估計參數,假設(21)C(wk2wk1wk)表示3個詞(21(wk2wk1wk連續出現在一起的次數,類似的(21C(wk2wk1表示兩個詞21wk2wk1連續出現在一起的次數。那麼:

最大似然估計的最大問題是數據的稀疏性,如果3個詞沒有在訓練數據中一起出現過,那麼概率就是0,但不在訓練數據裡出現不代表它不是合理的句子。實際一般會使用打折(Discount)和回退(Backoff)等平滑方法來改進最大似然估計。打折的意思就是把一些高頻N-Gram的概率分配給從沒有出現過的N-Gram,回退就是如果N-Gram沒有出現過,我們就用(N-1)-Gram來估計。比如Katz平滑方法的公式如下:

上式中C』是一個閾值,頻次高於它的概率和最大似然估計一樣,但是對於低於它(但是至少出現一次)的概率做一些打折,然後把這些概率分配給沒有出現的3-Gram,怎麼分配呢?通過回退到2-Gram的概率(|1)P(wk|wk1)來按比例分配。

當然語言模型是一個很大的話題,在後面的章節我們會更深入的討論,這裡就簡單的介紹到這。

解碼器(Decoder)

訓練好模型之後,我們就可以使用解碼器來搜索所有可能的狀態空間(如果沒有語言模型的約束,理論上任何因子的組合都是可能的),然後找到最可能的狀態序列,使得輸出的概率(這個概率包括聲學和概率和語言模型概率)最大。搜索過程可以使用Vertebi算法。但是在實際的識別過程中,由於搜索空間太大,我們通常在搜索的過程中就需要進行剪枝(pruning),把不太可能的路徑提前去掉,除了聲學模型得分,也會在搜索的過程中把語言模型考慮進來。我們一般把這個搜索過程叫作解碼(decoding),完成解碼過程的模塊叫作解碼器(decoder)。一個好的解碼器既要速度快,又要保證較優的路徑不被剪枝掉。後面也會介紹基於加權有限狀態轉錄機(WFST)的解碼器。解碼器除了輸出最優路徑(以及對於概率)之外也可以輸出N-best的結果,N通常是100-1000。這樣我們可以用一個較小的語言模型來進行第一遍的搜索,找到N-best結果,然後使用更加複雜的語言模型來進行第二遍解碼。為了在第二遍解碼時不重複計算,我們會在N-best結果中保留更多的一些信息,我們會使用更加高效和緊湊的數據結構來存儲搜索路徑,我們一般把它叫作word lattice。word lattice有一些點和邊表示,點按照時間排列,邊表示兩個點(時間)對應的詞。下圖a是一個示例,除了詞(ID)之外,邊上也可以存儲一些其它信息,比如聲學模型得分和語言模型得分等。有了這些信息之後,我們就可以用更加複雜的語言模型來對N-best結果進行重新算分(rescoring),從而跳出更好的路徑。

我們也可以把word lattice表示成更加緊湊的confusion network,如下圖b所示。圖中」-「表示空跳轉。在confusion network中,點並不嚴格表示時間順序,因此平行的邊(起點和終點都相同的邊)不代表它們的開始時間或結束時間相同。但是大多數時候,我們可以認為平行的邊代表它們對應的詞是一種競爭關係,比如圖中的HAVE和MOVE。confusion network保證:對於lattice中的每一條路徑,在confusion network中都有一條對應的路徑。confusion network中的邊上一般會有一個與邊上詞相關的一個後驗概率,它是通過在word lattice中使用前向後向算法計算出來概率,然後把平行邊的概率歸一化了。

相關焦點

  • 推薦算法系統/人臉識別/深度學習對話機器人高級實戰課
    包含了推薦算法系統實戰、深度學習人臉識別實戰、深度學習對話機器人實戰等高級前沿的精品課程,下面分別介紹下各個實戰項目:1、推薦算法系統實戰首先推薦系統不等於推薦算法,更不等於協同過濾。2、深度學習人臉識別實戰人臉識別,是基於人的臉部特徵信息進行身份識別的一種生物識別技術。
  • 直播預告|IATF16949汽車行業質量管理MSA實戰解讀
    MSA實戰解讀九州雲播、京東、噹噹、百度 同步直播***《測量系統分析(MSA)實用指南》作者:楊朝盛售價:99.00上市時間:2020年5月本書的內容分為上、中、下三篇。上篇為入門與管理,中篇為理論與提高,下篇為應用與實戰。「入門與管理」包括兩部分的內容,其一在於糾正對MSA的錯誤認知,明確MSA的實際價值和意義,其二在於提出MSA所需要的管理資源配置以及具體的管理思路。「理論與提高」是對MSA理論體系的歸納、總結和升華,著重剖析MSA理論背後的原理,以便使讀者不僅知其然,更能知其所以然,為活學活用MSA奠定紮實的理論基礎。
  • 資料|圖靈程序設計叢書:深度學習入門:基於Python的理論與實現
    from=leiphonecolumn_res0727內容簡介 · · · · · ·1.日本深度學習入門經典暢銷書,原版上市不足2年印刷已達100 000冊。長期位列日亞「人工智慧」類圖書榜首,超多五星好評。 2.使用Python ,儘量不依賴外部庫或工具,從零創建一個深度學習模型。
  • 古瓷鑑定入門學習方法-視頻教程(實戰經驗總結
    謹記搜索「伍秋鵬去偽存真古瓷學院」  ① 聘請名師授課  伍秋鵬:實戰古瓷鑑定家、大學教師。長期從事文物考古、收藏鑑定和教學培訓。開創了開片、火石紅、磨損痕跡、保存環境、傷殘、彩料、紋飾、燒造工藝等獨具特色的古瓷鑑定方法。在文物考古、收藏類刊物發表研究及鑑定論文50多篇。出版有專著《中國古陶瓷鑑定學》(北京出版社)。教學內容易學易懂,實戰性強。
  • 8篇論文深入學習深度估計:深度預測;自我運動學習;觀看《冰雪奇緣...
    原文作者:Derrick Mwiti翻譯:慄峰校對:Camel原文標題:Research Guide for Depth Estimation with Deep Learning雷鋒網 AI 科技評論編者按:這篇文章介紹了幾篇具有指導意義的論文,助你深入了解何為深度估計。
  • 金指南基於MS-Project項目管理實戰班圓滿收官
    2020年12月19日~20日,金指南舉辦的基於MS-Project項目管理實戰班,在松山湖宏遠新智匯圓滿舉行。加強大家項目管理實戰經驗分享與交流,幫助項目管理者快速方便地學會如何使用Project進行項目管理,明確如何使用Project進行進度計劃制定、成本管理統計以及進行項目的實時跟蹤。
  • 3D視覺從入門到精通系統學習教程
    目前我們的星球嘉賓已經陸續為我們的星球成員帶去了線上課程,包括:基於深度學習物體抓取位置估計、相機標定的基本原理與經驗分享...後期會陸續針對星球裡的內容,進行進一步講解與指導。正文我們生活在三維空間中,如何智能地感知和探索外部環境一直是個熱點難題。
  • 插畫零基礎怎麼學習?新手必看的插畫入門指南
    插畫零基礎怎麼學習?新手必看的插畫入門指南!說到插畫,相信屏幕前的你一定不會陌生,可以說插畫在我們生活中所到之處,幾乎無處不在,應用很廣泛,同時很多都覺得插畫行業非常有錢景,所以也就想習插畫,那麼如何開始零基礎學習插畫?零基礎怎麼學習插畫?
  • Java工程師入門深度學習(三):輕鬆上手Deep Java Library_科技...
    DJL(Deep Java Library )是亞馬遜在2019年宣布推出的開源Java深度學習開發包,它是在現有深度學習框架基礎上使用原生Java概念構建的開發庫。它為開發者提供了深度學習的最新創新和使用前沿硬體的能力,例如GPU、MKL等。簡單的API抽象並簡化了開發深度學習模型所涉及的複雜性,使得DJL更易於學習和應用。
  • 晶片精品文章合集(500篇!)
    晶片春秋·arm傳中國芯酸往事印度芯酸往事國防軍工晶片行業深度報告一位美國晶片公司華人高管對中國晶片行業的思考一文了解 FPGA 發展之路【乾貨】騰訊雲FPGA的深度學習算法雲中的機器學習:FPGA 上的深度神經網絡網友吐槽:9年FPGA工作總結,苦海無涯,窮逼多
  • 學習《易經》如何才能快速入門
    要想學習易經,首先,目的要明確。也就是說,你學習易經的根本目的是什麼,是想提高自己的思想理論水平,還是想著學習實戰技能,這一點很關鍵,因為關於《易經》的理論和實戰是兩個完全不同的理論體系。如果只是想提高一下自己的思想理論水平,那麼就找一些學院派的理論書籍讀一讀,聽一聽那些大學教授們的講座,就會有所收穫。因為學院派關於《易經》的理論是純哲學範疇的文字,和實戰沒有一丁點的聯繫。想用這些易經理論來斷卦,或者來勘查地理,百分之百是沒有任何實際意義的。
  • 還在為入門深度學習發愁嗎?其實你只需要一周的時間
    大年初八,百度飛槳組織了一個神奇的「深度學習 7 日打卡營」。由百度深度學習認證布道師親自授課,只用了 7 天時間,就幫助 1000 多名小白開發者,高效的入門了深度學習。學習期間,開發者們每日實踐、打卡如火如荼,不少同學為了提高精度刷榜到深夜,我們的布道師也奉陪到底,起早貪黑的為大家答疑與批改作業。隨著上一期 7 日打卡營的落幕,同學們紛紛表示:不過癮、要繼續!應大家所願,作為最寵粉的我們必須安排!時隔一周,我們再次啟動了最新一期的深度學習 7 日打卡營(Pro 版)。保障課程質量與服務的同時,還新增案例,讓知識更加豐富!
  • 一個超乾貨的3D視覺學習社區
    雙目視覺,對於遮擋區域的視差估計或者遮擋區域的深度補全,有比較新的論文推薦嗎?有沒有雙目三維目標檢測的實戰算法?雙目視覺三維重建時,想要獲得點雲是左右視差圖都要用到嗎?雙目視覺的瓶頸在哪裡?如何改進?你好,最近看到一些基於深度學習方式的雙目重建,速度很快,這種方式有應用價值嗎?立體視覺的匹配速度有哪些改進的方式?
  • 基於Nida理論探討科技英語中句子的翻譯與寫作
    科技英語的翻譯和寫作是相通的,適用於科技英語的翻譯技巧和理論,同樣是適用於科技英語的寫作。科技英語的寫作技巧和理論,同樣也適用於科技英語的翻譯。它們之間是相輔相成,互為支撐的。科技英語的翻譯和寫作中表達的特點是準確、客觀的,並且邏輯性強。
  • 報名|聯邦學習入門第4課:基於Kubernetes構建FATE聯邦學習環境
    3 月 17 日,機器之心聯合微眾銀行開設的公開課《聯邦學習 FATE 入門與應用實戰》第三講結課,微眾銀行人工智慧部算法研究員譚明超為我們分享了《聯邦學習 FATE 算法模塊梳理及建模演示》。3 月 19 日(本周四),我們將迎來本系列公開課的第 4 講,詳情如下:公開課第4講(附 Live Demo)課程主題:使用 KubeFATE 部署生產環境的聯邦學習 Kubernetes 集群
  • Java工程師入門深度學習(三):輕鬆上手Deep Java Library
    Java工程師入門深度學習(三):輕鬆上手Deep Java Library 2020-11-04 17:08 來源:澎湃新聞·澎湃號·湃客
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • 貴州發布全國首個大數據與實體經濟深度融合實施指南
    本文轉自【貴州日報】;本報訊 (記者 曾帥)11月18日,記者從省大數據局獲悉,《貴州省大數據與實體經濟深度融合實施指南》於近日在全國兩化融合暨工業網際網路平臺大會上發布,這是全國首個大數據與實體經濟深度融合實施指南。