Connectionist Temporal Classification (CTC)
CTC可以用於線上實時地語音識別,編碼器用的是單向的RNN,解碼是用MLP來預測文字分布。
編碼器將語音輸入\(x^i\)編碼成\(h^i\),MLP再對它乘上一個權重,接上Softmax,得到詞表V大小的概率分布。
但有時候當前的語音輸入可能並不能對應實際的文本token,所以預測要額外多一個為空的類別,表示模型不知道要輸出什么。
CTC中沒有使用下采樣,所以輸入和輸出的序列長度都是T。
模型預測完后要進行后處理,一是把重復的token合並,二是把空類別去掉,得到最終的預測序列。
CTC的這種預測方式,會讓它的數據標注變得很難,因為要確保剛好每個輸入聲音特征都對應一個正確的token。而標注語料的不足,會直接影響模型評測的表現。
此外,一個序列正確的標注方式又可以存着很多種,造成標注多標准問題。這也加大標注數據選擇的困難。
由此采用的方法是窮舉所有的可能的標注去訓練。在數據集充足的情況下,CTC的效果還是不錯的。
CTC模型的問題主要在,每個MLP的解碼器工作是獨立的。它可能會遇到一個奇怪的問題。
比如語音數據部分前三幀都在發音c,第一個隱層\(h^i\)解碼出是c后,后面兩個隱層就無須再解碼出c了。
但由於它們是獨立工作的,后面的解碼部分不知道前面解碼的是什么,所以第二個可能解碼成空或c,第三個也可能解碼成空或c。
但如果編碼器是足夠深的RNN,它也可能在編碼過程中考慮這種前后關系的依賴,讓第一個輸出隱層包含更多關於c的信息,而后面兩個隱層包含更多關於空類別的信息。
Recurrent Neural Aligner (RNA) and RNN Tansducer (RNN-T)
RNA:RNA是一個介於CTC和RNN-T的過渡模型,針對CTC獨立解碼問題,把MLP換成了RNN。
RNN-T:可以輸出多個token。比如要輸出th,CTC只能先輸出t,然后在下一個時間點解碼輸出h,而RNN可以輸入一個隱層,預測多個tokens。
不過,RNN-T與CTC一樣會遇到訓練數據難標注,標注多標准的問題。對此也是窮舉所有可能的標注給模型訓練。
RNN-T在解碼過程中是如何確保輸入一個隱層,輸出多個token的呢?
輸入一個\(h^t\),RNN-T會決定要產生一個"t"。這個"t"會被放到另一個RNN單元中,輸出的隱層會放回RNN-T的解碼器中作為隱層和之前的\(h^t\)輸入,來產生新的輸出"h"。
再反復一次,由於那一個RNN單元看到過"h"了,就會輸出新的東西。這個新東西再與之前的\(h^t\)輸入RNN-T,可能會得到一個空類別。
而后一個RNN單元會無視掉這個空類別,把之前輸出的"h",與下一個隱層\(h^{t+1}\)輸入到RNN-T得到的新輸出"e"。
這里的另一個RNN實際上扮演的角色是一個語言模型LM。它只看token輸出。我們可以用大量的文本語料去訓練這個RNN,再和編碼器一起去做訓練。
這樣一來,我們就能確保接上語言模型之后的RNN-T的輸出不會有空類別,這樣對訓練數據的標注就會容易許多。
Neural Transducer
CTC,RNA和RNN-T都是每次只讀一個聲學特征,這樣效率很低。
Neural Transducer做了一個改變,用注意力機制來允許模型一次能讀很多個聲學特征。
首先我們會讓聲學特征通過編碼器產生隱層輸出,再對一個窗口的小范圍隱層做注意力后,再輸出給解碼的RNN。
若窗口大小內信息已經用完了,解碼的RNN就會輸出空類別。接下來我們再移動窗口,對下一個窗口內的隱層重復剛才的操作。
窗口大小要如何設計呢?
Neural Transducer做了實驗發現,沒有注意力時,窗口一長,結果就會爛掉。但用了注意力后,窗口大小又沒那么重要。
它嘗試了各種計算注意力的方法,有DOT-Attention和MLP-Attention,甚至還有LSTM-Attention(它把注意力權重讀進LSTM中去,通過LSTM來考慮前一個時間步的注意力的位置)。
Monotonic Chunkwise Attention (MoChA)
MoChA能動態地調整移動窗口的距離。它用的是一個類似注意力機制的模塊來做這個調整的操作。這個模塊輸入\(z^0\)和隱層\(h^1\),輸出yes/no,表示要不要把窗口開頭放在此處位置。
如果不要,就往右移動窗口,再檢查下一個位置的隱層\(h^2\)。一旦確定放置窗口,就對窗口內的隱層向量做注意力,解碼出的token不會包含空類別。
各模型的總結對比