1. 程式人生 > >基於深度學習的語音識別研究-CTC理論推導(四)

基於深度學習的語音識別研究-CTC理論推導(四)

  有時候學習真的得循序漸進,並沒有速成的方法,本小白在經歷了大約一個月終於把CTC的從頭到尾大致看完了,下面講一下我的理解,歡迎各位朋友批評指正。

  首先,我們得知道為什麼要引入CTC,前面部落格講到,之前在做語音的聲學模型的時候,我們的資料形式是幀與標籤的分別對齊,以Thchs30為例,訓練集大約25小時的資料集,經過kaldi的GMM-HMM對齊之後,大約分為917w多幀的語音資料,標籤經過後處理成one-hot形式的標籤,具體可以看本人前面的文章,由於文章大多數是筆記的形式記錄,還望各位體諒,以後有時間再做總結。

   CTC(connectionist temporal classification)從字面的意思是連線時序分類,個人認為沒必要糾結於中文的含義,只要知道他是幹什麼的就行了,以往我們做DL-HMM訓練聲學模型的時候,我們都需要把幀與標籤進行對齊之後才能進行訓練神經網路,但是此方法多了一步採用傳統方法GMM-HMM對語音的資料進行對齊的操作,採用對齊的缺點是:對齊效果不好,以Thchs30為例,在kaldi中10000句語料也僅僅對齊了9999句,集這麼多人的力量仍然有對齊的漏洞,由此可知改方法是不太友好的,有沒有一種方法無需對齊就可以實現語音識別聲學模型的構建呢?答案是肯定的,下面就引入了端對端語音識別模型,端對端現階段有三種,一種是DL-CTC,另一種是Attention-DL,還有最後一種是二者的組合,有論文資料顯示,二者混合系統可能有著更好的效果。

  下面來簡單說明一下CTC的作用,說白了CTC就是構建在神經網路頂層的損失函式,以往我們比較喜歡用交叉熵等損失函式來刻畫我們的模型,採用最小化損失函式來提高我們模型的準確率,在之後我會詳細的講解CTC的損失函式。下面由一幅圖來引出CTC是如何進行“對齊(alignment)”的。


  此圖來源於CTC模型的提出者Graves教授,第一行是我們真正的語音波形圖,第二行是我們採用HMM-GMM方法將語音分幀結果和語音的標籤進行對齊,但是CTC不一樣,他是採用的spike來對齊幾幀連續的語音。實際上他的意思就是一段相同的分幀語音對應一個spike。這樣就會減少很多對齊操作,個人是這樣理解的。

  下面以論文裡面的CAT英文單詞為例,來推導CTC的推導過程.首先,先簡述一下CTC中需要使用的符號:

  1:ykt:代表輸出序列在第t步的輸出為k的概率。舉個簡單的例子:當輸出的序列為(a-ab-)時,y3aya3 代表了在第3步輸出的字母為a的概率;
  2:p(π∣x)p(π∣x):代表了給定輸入x,輸出路徑為 ππ 的概率;
  由於假設在每一個時間步輸出的label的概率都是相互獨立的,那麼 p(π∣x)p(π∣x) 用公式來表示為 p(π∣x)=∏Tt=1(ytk)p(π∣x)=∏t=1T(ykt),可以理解為每一個時間步輸出路徑 ππ 的相應label的概率的乘積。
  3:F:代表一種多對一的對映,將輸出路徑 ππ 對映到 標籤序列 ll 的一種變換。
  舉個簡單的例子 F(a−ab−)=F(−aa−−abb)=aabF(a−ab−)=F(−aa−−abb)=aab (其中-代表了空格)
  4: p(l∣x) :代表給定輸入x,輸出為序列 ll 的概率。

因此輸出的序列為 ll 的概率可以表示為所有輸出的路徑 ππ 對映後的序列為 ll 的概率之和,用公式表示為 p(l∣x)=∑π∈F−1(l)p(π∣x)。

  CTC的創新之處在於他引入了Blank這個概念,以音素級別的語音識別為例,空格的作用就是把語音的音素分開。但是空格有兩個顯而易見的缺點:(1)空格無法預測出兩個連續的相同的音素,因為在論文中,Graves明確指出空格會栓除連續相同的第一個字母;(2)無法預測出一整句話,意思就是最後CTC在去除空格的時候,無法表示單詞與單詞之間的停頓的部分。

  由於我公式不太好打,下面我自己手動推導了CTC的前向、後向的計算流程,如下圖所示:

 

  CTC的前推和後退跟HMM中的前向-後向演算法很類似,實際上個人認為深度學習方法都是很類似的,大家可以自己想一想。

  下面就是定義CTC的損失函式:


  關於上面的公式有說明:不論是在計算前向變數還是反向變數時,都涉及到了大量的概率的乘積。由於這些乘積都是小於1的,在大量的小數相乘時,最後得到的結果往往都會趨向於0,更嚴重的是產生underflow。因此在計算時對其做了取對數的處理,這樣乘法就會轉化為加法了,不僅避免了underflow,還簡化了計算。但是,原來的加法計算就不是太方便了。不過這裡有一個數學的trick。

  關於前向、後向的公式乘積我有一些自己的見解:


  假設路徑必須講過紅色畫圈的位置,那麼前向到這裡有3條路徑,後向到這裡也有三條路徑,一共就是9條路徑到達,這就是前向、後向演算法的精髓!

  下面就是採用BP演算法的思想進行調參,同樣我還是以自己推導為例,如下圖所示:


  之後就是採用TF實現CTC是否真正如論文所說的那樣效果是state-of-art!

參考文獻:https://blog.csdn.net/left_Think/article/details/76370453