語音識別算法閱讀之CTC


論文:
  CTC:Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
思想:
  語音識別中,一般包含語音段和對應的文本標簽,但是卻並不知道具體的對齊關系,即字符和語音幀之間對齊,這就給語音識別訓練任務帶來困難;而CTC在訓練時不關心具體的唯一的對齊關系,而是考慮所有可能對應為標簽的序列概率和,所以比較適合這種類型的識別任務。
細節:
  • 輸入: x = (x1, x2, ..., xT )
  • 字符集: L' = 有效字符集 L U{blank}, blank用於處理當字符連續出現的情況
  • 對齊序列和標簽序列的多對一關系: 對於一個標簽序列l,其對應的所有可能的路徑集合為B(e.g. B(a-ab-) = B(-aa--abb) = aab),其中任意一條路徑為π

 

 

其中,y項為路徑π在t時刻的的字符所對應的概率,l不包含blank
  • CTC的優化目標為最大化所有映射為標簽的路徑的log概率和,如果取負號,則變成最小化
  其中,D為訓練集合,X為輸入序列,Y為標簽序列對應的對齊序列
  • 路徑搜索:在計算目標函數時,我們需要計算訓練集中每個標簽序列對應的對齊序列的概率,對於一個標簽序列可能對應很多的對齊,計算和存儲較大,影響訓練效率;CTC中采用一種動態規划算法,即前向后向算法來高效計算對齊路徑的概率p(l|x)
  1. 為了處理字符連續重復出現的情況,需要在標簽序列每個字符的前后插入blank,這樣原始標簽l,變成l',長度變成2|l|+1,l=(y1​, y2​,…, yU),變成l'=(ϵ, y1​, ϵ, y2​,…, ϵ, yU​, ϵ)
  2. 前向

     定義αt(s) 為時刻t處於狀態s的前向路徑l1:s對應的概率和,αt(s)可以通過αt-1(s)和αt-1(s-1)遞歸計算

1)路徑的起始字符可以是blank,也可以是第一個有效字符l 1,基於此進行遞歸計算后續路徑概率
2)對t時刻的字符s,其來自於上一時刻的可能字符有兩種情形:
  當t時刻字符s=blank或者s=s-2,其上一時刻可以是字符本身s或者s-1,兩種情況

        其他情況時,其上一時刻可以是本身s、blank s-1和l'的前一有效字符s-2,三種情況

  1. 后向

     定義βt(s) 為時刻t處於狀態s的后向路徑ls:|l|對應的概率和,同理,βt(s)可以通過βt+1(s)和βt+1(s+1)遞歸計算

1)路徑的起始字符是blank,也可以是l的最后一個有效字符l|l|,基於此進行遞歸計算后續路徑概率
2)對t時刻的字符s,其概率合並的形式分兩種:

        當t時刻字符s=blank或者s=s+2,t+1可以是字符本身s或者s-1,兩條路徑來源概率疊加

        其他情況時,t+1時刻可以是本身s、blank(s-1)和l的后有效字符s+2,三條路徑來源概率疊加

  1. 前向后向整合

     由前向概率和后向概率計算得到標簽路徑對應的所有可能對齊序列的概率和p(l|x)

 
 
訓練:
  • 網絡結構BLSTM(單向結點數100)+full_connected(26)+softamx(62,61字符+blank)
  • 數據集TIMIT,train+dev 4620utts、test 1680utts
  • 聲學特征:13維MFCCs+13維delta=26維
  • SGD,學習率10-4,momentum=0.9
  • 權重初始化維均勻分布[-0.1,0.1]
預測:模型訓練完成后,對於給定的輸入序列,計算最可能的輸出序列
  • 直觀的辦法是將每一個時間片最大預測概率對應的字符串聯起來,得到輸出序列,但此方法的缺點是沒有考慮一個輸出序列可能對應多條對齊路徑的情況,這樣可能得不到最大概率對應的輸出,比如aaϵ和aaa單獨每個路徑概率可能小於bbb,但因為二者對應同一個輸出p(a),所以二者累加后概率可能大於bbb對應輸出p(b),從而導致錯失最佳路徑
 
  • CTC中采用prefix beam search算法,想比於beam search 增加了路徑合並的操作,即一方面在路徑搜索的過程中對相同映射的路徑進行合並;另一方面選取合適的beam size,僅保持最優的n條路徑,剔除概率較少的候選路徑,節約計算;

 

上圖中,存在路徑的合並操作,在T=2時刻aϵ和aa都對應a,於是二者概率疊加,路徑合並為a;在T=3時刻,對於prefix路徑a,當前時刻字符可以是ϵ或者a,此時需要考慮字符連續情況(否則,可能會將連續字符合並為單一字符,比如實際為aa,輸出為a情況),所以,prefix路徑分為兩部分,以ϵ結束和不以ϵ結束兩部分,以ϵ結束與t時刻a組成aa,不以ϵ結束部分與t時刻ϵ和a合並仍為a;所以,在prefix beam search算法中需要迭代維護兩個概率,一個是prefix以ϵ結束的概率,另一個是prefix不以ϵ結束的概率
  • 在實際語音識別中,還可能會與語言模型進行結合,提升識別效果
其中α、β為對應權重,L(Y)為路徑的長度,緩解模型傾向於輸出短路徑的問題
論文效果:
  相比於HMM和HMM-RNN結構提升了5~8%
實戰分析:
  ideas:
  • m*Conv2d+n*BIGRU+k*FC+wrapctc;
  • BN,其中rnn BN僅對當前時刻激活前輸出進行歸一化,效果更好;
  • sortedGrad,采用隨機minibatch策略訓練時,由於一些樣本長度較長,路徑的預測概率接近0,導致訓練不穩定,論文采用第一個epoch通過排序的數據訓練,第二個epoch開始隨機minibatch訓練;
  環境安裝:GPU和CPU兩個版本;安裝時會附加安裝相應的版本對應的依賴包;注意GPU版deepspeeh2要求paddlepaddle==1.6以上;相應的cuda和cudnn也有版本對應要求,具體參照 https://www.paddlepaddle.org.cn/documentation/docs/en/install/index_en.html
  • 數據處理:訓練和測試數據統一整理成manifest.train/dev/test形式,每一行包含{文件路徑、時長、文本}
  • 隨機從訓練集中抽取2000個樣本,計算這批樣本的功率譜均值和標准差用於數據歸一化數據
  • 數據增強:在配置文件中設置相關參數,包含語速、音量、幀移、噪聲、混響等擾動,后兩者需要事先准備噪聲和混響文件
  • 模型:2conv(bn)+3biGru(fc+bn+gru,fc+bn+gru reverse,concat)+fc(dict_size+1)+softmax+wrapctc
  • 語言模型kenlm,可通過該工具訓練自己的n-gram語言模型,參考鏈接:https://github.com/kpu/kenlm
  實測效果:aishell test 百度提供的語言模型,cer: 0.080447/aishell語料單獨訓練的語言模型,cer:0.105999
  idea:
  • 輸入特征: stft-161維;
  • 11convBlock(conv1d+GLU+dropout)+ctc;
  • GLU門控線性單元,收斂速度快、防止梯度彌散;
  • 建模單元:單字4334;
  • 訓練集排序后划分minibatch;
  • 語言模型基於kenlm;beamsearch解碼;
  • 注意,torch版本最好按照項目要求的1.0.1,本人安裝高版本torch運行項目時發生內存泄漏問題,按照項目要求安裝1.0.1后再運行問題解決
  實測效果:aishell test cer:百度開源的語言模型 0.112/aishell語料單獨訓練的語言模型 0.192
  idea:
  • 輸入特征:200維log頻率譜
  • 模型:

    CNNs網絡模型cnn-ctc: 2conv(3*3,輸出通道數32)+max pooling(3*3)+

             2conv(3*3,輸出通道數64)+max pooling(3*3)+
             2conv(3*3,輸出通道數128)+max pooling(3*3)+
             2conv(3*3,輸出通道數128)+dense(256)+softmax+ctc; 每個卷積層采用BN;全連接層采用Dropout=0.2
  RNN網絡模型gru-ctc: 2dense(512)+3BiGRU(512)+dense(512)+softmax+ctc;全連接層采用Dropout=0.2
  • 輸出字符為帶字符的拼音,比如:好--hao3
  • 語言模型采用transforme訓練得到
  • 解碼采用greey search/beam search
 實測效果:

  無論是在cnn-ctc還是在gru-ctc模型訓練均出現問題,cnn-ctc是不收斂,而gru-ctc是出現aishell測試集識別率極低的問題;此外該項目作者Github貌似停止維護

Reference:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM