注:本文為一次課程展示所用幻燈片與報告存檔。
背景
語音識別是一項可以使人與人、人與機器更加順暢地交流的技術。近年來,語音識別相關的若干技術場景以及逐漸地改變了我們的工作和生活方式,如語音輸入法、語音消息“轉文本”、語音到語音翻譯系統、檢索語音信息等。同時,語音識別也能夠極大地提升人機交流地能力,包括語音搜索、個人數碼助理、游戲體驗改進、智能家居、車載娛樂系統等等。這些種種應用場景,其對於機器理解人類語音地程度要求各不相同,但共同之處在於,我們都需要構建一種以包含語音地待識別音頻為激勵,以呈現識別結果的書面表達形式為響應的識別系統。
形式化地,語音識別問題可以表達為:
由此,我們可以引入語音識別問題的評價指標,它通常是定義在某一種識別單位上的錯誤率,如最常用的詞錯誤率定義為以詞為單位的編輯距離。所謂編輯距離是指對於給定的兩個串A,B,串 A 修改為串 B 需要替換、刪除、插入的元素數量總和的最小值。它的求解是一個非常經典的可以在多項式時間內求解的動態規划問題。
在引出語音識別系統的系統結構之前,我們需要首先對語音識別問題進行基本的模型構建與數學表達。根據語音識別問題的定義,我們利用Bayes定理並引入音素
由此我們將語音識別問題的求解拆解成為三個部分。聲學模型負責給出對於一個確定的音素序列,它發聲為當前音頻的概率;詞典模型負責給出一個詞素序列的發音為一個音素序列的概率;語言模型給出一句話有多大概率是自然語言中的語句。
此外,在音頻被識別推理之前,還需要經過前端的VAD、分幀、特征提取等信號處理步驟。綜上所述,語音識別的系統結構可以粗略表示如下圖所示。
方法綜述
前端系統主要分為VAD、分幀、特征提取三個部分。
在這里我們討論特征提取的兩種常用思路:FBank和MFCC。FBank是由波形經過DFT變換產生頻譜圖並進行三角濾波后得到的,在此基礎上再做LogDCT得到梅爾倒譜系數MFCC。顯然,MFCC實在FBank的基礎上進一步計算得到的。因此,相對而言,FBank的計算量更小,特征相關性更高,但同時因為它更加原始,所以信息的損失也更小。基於GMM的方法通常采用MFCC作為特征提取的方式,而基於神經網絡的方法則通常采用FBank。
后端分為聲學模型、詞典模型、語言模型三部分。在這里我們着重討論聲學模型的主流研究方法。基於GMM-HMM的傳統方法由於缺少上下文信息和難以利用深度的非線性特征,目前已經較少采用。一種簡單的改進是采用DNN代替GMM,由此得到DNN-HMM方法,它只能通過拼幀來表達相關性,仍然不夠。因此引入了LSTM-RNN來代替普通DNN,自動保留歷史信息,但是這樣構造出的聲學模型復雜而難以訓練。此外,以上方法我們需要對數據做手工的對齊標注,即標注每一詞素的輸出是由輸入當中的哪一幀產生的,這樣的標注過程非常費時費力,同時也限制了大量訓練數據的產生。端到端方法的產生解決了這一問題。LAS作為一種帶有注意力機制的seq2seq方法,通過Attention規避了需要手工對齊的問題,但是它無法實現真正的在線語音識別。CTC雖然可以在線識別,但是由於缺乏語言建模能力,且輸出獨立性假設存在明顯的不合理性,單獨使用很難達到較好的效果。RNN-T是在CTC的基礎上改進產生,它解決了CTC兩個最主要的問題,也是本文要重點討論的對象。
RNN-Transducer
本節中我們主要介紹RNN-T的發展來源、模型結構、關鍵算法實現,並對齊性能表現進行討論,同時給出其與其它常用端到端模型的對比以及其改進策略。
發展背景
基於DNN-HMM的方法雖然克服了無法學習到深度非線性特征的問題,並通過引入LSTM-RNN解決了無法整合上下文信息的問題,但是仍然面臨着相當巨大的困境。為了訓練傳統的聲學模型,我們需要大量的高度標注的數據。這種標注,不僅是對一段聲音波形所包含的文字信息的標注,還需要包括每一個輸出Token對應到哪一幀的音頻輸入上。不妨簡單計算,每秒鍾100幀的音頻特征,對數萬小時的訓練數據進行這樣的人工標注,成本巨大,難以接受。LAS通過引入機器翻譯中常用的帶有Attention機制的seq2seq,但是仍然面臨着無法進行在線地流式識別的問題。
CTC是一個Encoder加上一個線性分類器的模型結構。Encoder負責將低級的語音特征轉換為高級的深度特征,將這些特征輸入到一個Softmax分類器中,得到該幀輸出字符的概率分布。回顧我們之前討論過的幾個問題,上下文信息已經在Encoder層被編碼到其輸出中。同時,對於每個輸入幀,CTC都會輸出一個對應的Token。這個過程中並沒有使用到將來的語音信息,因此它表現為一個自然的因果系統,可以完成流式的識別處理。
CTC中輸出的Token可能是一個有效的語素或者為空,事實上,大量的輸出都是空的。由於空語素的存在以及重復Token的輸出問題,我們需要對輸出序列做一些簡單的后處理。我們將輸出的序列先合並所有連續相同的Token,再刪除其中的空元素。由於存在很多種不同的對齊方式都是正確的,在計算損失函數時,需要用動態規划計算所有合法路徑總概率。注意 Token 的選擇也是多樣化的。
CTC 化繁為簡,可以加速解碼,但是仍然缺乏語言模型建模能力,因此無法實現真正的端到端聯合優化。同時,CTC存在一個非常不合理的假設,即各輸出之間時相互獨立的。我們需要通過聯合一個RNN語言模型來解決這一問題。
RNN-T在CTC的基礎上改進得到。其演變過程如下圖所示:
模型結構
RNN-T由一個Encoder,一個Decoder構成,這里我們將Pred. Network和Joint Network以及Softmax合起來看作一個Decoder。針對CTC網絡的條件獨立性假設即當前時刻輸出與之前的輸出條件獨立,引入語言模型預測網絡分支,通過聯合前饋神經網絡將二者結合,在預測最終輸出時能夠同時利用聲學和語言特征信息。
具體地,Encoder的輸入是經過編碼后的聲學特征信息,它會將這些信息映射到高階表示。和CTC中的Encoder一樣,它只與過去所有時刻的Encoder輸入相關,因此它可以被作為一個CTC模型單獨訓練。
Decoder的輸出之和整個網絡過去所有時刻的非空輸出歷史相關。具體而言,它由預測網絡和連結網絡構成。預測網絡通常使用一個由LSTM構造的RNN,它只和過去所有時刻的非空歷史輸出相關,而與Encoder當前的輸出無關,這意味着它是一個純粹的LM。連結網絡是一個簡單的前向傳播神經網絡,它產生logits,並交由Softmax層完成分類任務。
在Google的一項工作中,在grapheme作為建模單元基礎上,引入了詞組單元wordpieces,能夠捕獲更長的文本信息,有利於減少替換性錯誤。對於其中的CTC部分,采用多級CTC,建模單元包括音素phoneme、字母grapheme、詞條wordpieces,此外在字母LSTM輸出時,通過時域卷積來縮短時間片長度,減少參數量,加速訓練。
算法實現
下面我們簡單介紹實現過程中的幾個算法設計問題。
在RNN-T的訓練過程的實現上,需要使用Viterbi動態規划算法來完成損失函數以及梯度下降計算時導數反向傳播求解的過程,因為損失函數是根據所有的對齊方式設計的,而一個正確的文字序列結果,對應的對齊序列的結果是指數級別的,我們不可能窮舉所有的序列。
當然我們也可以將整個過程放在一個自動機上看。
在RNN-T的推理過程的實現上,模型輸出了序列每個位置的值的概率分布,我們需要求概率最大的若干輸出序列,雖然我們可以通過直接將分類器對所有幀輸出的概率分布的最大參數拼接起來,但這樣無法獲得全局最優解。事實上,獲得全局最優解無法在多項式時間內給出算法實現,因此我們考慮一種近似算法,通過Beam Search,一種帶剪枝的廣度優先搜索,即保證在搜索完概率樹形結構的每一層后,隊列中僅保留概率最大的不超過k個元素,以此來在推理開銷和准確程度之間取得可以調節的平衡。
后記
RNN-T雖然解決了CTC的兩個主要問題,但是它仍然面臨着訓練困難,以及輸出的一些路徑不夠合理的問題。在最新的頂會文章中,LAS和CTC仍然是最為主流的思路。