誰給講講語音識別中的CTC方法的基本原理?

所謂「端到端」 具體是指什麼呢?


CTC 全稱 是Connectionist Temporal Classification,是一種改進的RNN模型。

RNN模型可以用來對兩個序列之間的關係進行建模。但是,傳統的RNN,標註序列和輸入的序列是一一對應的。語音識別中的序列建模問題不是這樣:識別出的字元序列或者音素序列長度遠小於輸入的特徵幀序列。所以不能直接用RNN來建模。

CTC解決這一問題的方法是,在標註符號集中加一個空白符號blank,然後利用RNN進行標註,最後把blank符號和預測出的重複符號消除。比如有可能預測除了一個"--a-bb",就對應序列"ab"。這樣就讓RNN可以對長度小於輸入序列的標註序列進行預測了。

RNN的訓練需要用到前向後向演算法(Forward-backward algorithm),大概思路是,對於給定預測序列,比如「ab」,在各個字元間插入空白符號,建立起籬笆網路(Trellis),然後對將所有可能映射到給定預測的序列都窮舉出來求和。

RNN的解碼還沒有好方法,一般會使用最優路徑,即只取可能性最大的帶blank符號的路徑,但是這實際上不一定對應最終結果的最佳概率值。利用前綴樹的方法可以求取映射到最終結果序列的總概率,但是時間複雜度是指數級的,不能用。苗亞傑博士提供了一種結合語言模型的解碼方法,其實質是取最優路徑。

參 考

《Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks》Alex Graves

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.75.6306

《EESEN: End-to-end speech recognition using deep RNN models and WFST-based decoding》Yajie Miao

http://arxiv.org/abs/1507.08240


關於CTC, @火華講得很好了。我來說說「端到端」是怎麼回事。

傳統的語音識別系統,是由語音模型、詞典、語言模型構成的,而其中的語音模型和語言模型是分別訓練的。這就造成每一部分的訓練目標(語音模型的likelihood,語言模型的perplexity)都與整個系統的訓練目標(word error rate)不一致。

而使用了CTC之後,從語音特徵(輸入端)到文字串(輸出端)就只有一個神經網路模型(這就叫「端到端」模型),可以直接用WER的某種proxy作為目標函數來訓練這個神經網路,避免花費無用功去優化一個別的目標函數。

當然,實際中因為可以獲取的文本數據比語音數據多得多,所以往往還會用文本數據訓練一個更好的語言模型,與CTC神經網路結合使用。


最近把mxnet和baidu-warpctc 集成起來,寫了個OCR的例子,可以形象的了解一下CTC的作用。https://zhuanlan.zhihu.com/p/21344595


感謝 一路向東 邀請

  1. 解釋下 CTC
    1. Connectionist Temporal Classifier 一般譯為聯結主義時間分類器 [1],適合於輸入特徵和輸出標籤之間對齊關係不確定的時間序列問題,CTC可以自動端到端地同時優化模型參數和對齊切分的邊界

    2. 一般CTC需要與RNN或DNN結合使用。DNN與CTC模型在輸出層引入一個「blank(空白)」節點,將兩個發音單元之間混淆或不確定的區域映射到「blank」節點(傳統「固定對齊邊界」的方法將該「模糊」區域「強制」分類為左邊標籤、右邊標籤或者短停頓,存在天然的缺陷),這樣,將傳統的「軌跡」建模轉化為「差異性」建模,使得模型更加關注一個發音單元與其它發音單元之間的「差異性」,緩減了傳統模型需要完整地描述該發音單元全部信息的建模負擔,可以參考 [1]
    3. DNN模型Softmax層的輸出,獲得了基於輸入特徵序列 ftr 的每一個相互獨立建模單元個體(包括「空白」節點在內)的類屬概率分布。在此基礎上,CTC進一步計算出基於 ftr 的給定輸出標籤序列 lab 的條件概率 p(lab|ftr),這是所有可能映射到 lab 的子序列概率之和。這些子序列包括「空白」節點或者建模單元個體的連續重複,如子序列 /-aa-b--ccc---/ 和 /---a-b-cccc---/ (其中,「-」表示「空白」節點)都可以映射到/abc/,如下圖所示
  2. 解釋下 端到端 End2End
    1. 一般傳統語音識別包括聲學模型,語言模型,解碼器這三個部分。在CTC出現後,如果建模單元選擇是字母,或者漢字,那麼音頻文件進入該系統後提完特徵,送入到模型解碼,出來的結果即為字母或者漢字,只要一個模型即可,即從模型的輸入端輸入數據,到模型的輸出端取得識別結果,這就是端到端
    2. 不過這都是比較理想的情況,實際工程中還有很多的trick

[1] Alex Graves , Supervised Sequence Labelling with Recurrent Neural Networks, Chapter 7

[2] A. Graves, A. Mohamed, G. Hinton, Speech Recognition with Deep Recurrent Neural Networks, ICASSP 2013

[3] D. Amodei, R. Anubhai , and etc., Deep Speech 2: End-to-End Speech Recognition in English and Mandarin

[4] Hasim Sak, Andrew Senior, and etc., Fast and Accurate Recurrent Neural Network Acoustic Models for Speech Recognition


補充一下,distill.pub最近加了一個ctc的講解https://distill.pub/2017/ctc/


早期的訓練語音模型的時候,我們需要標記每一幀的訓練數據,這時候基本上是用傳統的HMM和GMM做的。然後用標記了的數據去訓練神經模型。端到端的方案是去處這部分非神經網路的處理階段,而直接用CTC跟RNN來實現不需要標記到幀的訓練數據來直接訓練出語音模型,而不藉助於其他(HMM,GMM)來訓練神經網路模型。


推薦閱讀:

語音識別kaldi該如何學習?
Language Model 在語音識別方面有哪些應用?
交通銀行機器人是如何做到如此智能的?
李開復在 CMU Sphinx 項目到底是什麼地位?
Siri 通過語音識別提供智能助手服務,這樣一個產品的技術挑戰在哪裡?

TAG:人工智慧 | 自然語言處理 | 語音識別 | 中文語音識別 | 深度學習DeepLearning |