本文爲李弘毅老師【Speech Recognition - CTC, RNN-T and more】的課程筆記,課程視頻youtube地址,點這裏👈(需翻牆)。
下文中用到的圖片均來自於李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 1-2 LAS
下篇 - 1-4 HMM
1 CTC
CTC源於論文Connectionist Temporal Classification: Labelling Unsegmented
Sequence Data with Recurrent Neural Networks,是用來訓練RNN的一種方法,它被廣泛應用於一些標籤未與輸入對齊的任務中,如語音識別、圖像文本識別等等。說簡單點,就比如我們今天有一段語音"Hello",然後我們的標籤一般來說只會是"Hello"這樣幾個字符,從標籤中,我們無法知道語音的哪幾秒對應了"H",哪幾秒對應了"e"。所以當我們的Encoder輸出一個長度和輸入相等爲的序列時,我們沒法和標籤對齊,也就沒法去算這個loss。當然,我們可以再加一個RNN的decoder來解決問題,但我們也可以減小一些模型的大小,直接利用CTC來處理Encoder的輸出。
沒錯,利用CTC來計算loss的話,我們只需要Encoder就可以了。不過這個時候,我們每個time step的輸出要比vocabulary的size大1,這多出來的一個就是CTC需要的間隔符,這裏記作。
這個是我們人爲加進去的,出現在模型輸出的結果中,但不應該出現在最終得到的結果當中,因爲vacabulary裏是沒有這個的。所以,在解析模型輸出結果的時候,我們定義瞭如下兩條規則:
- 首先合併所有的相鄰重複字符
- 然後去除掉所有的
哦,對了,還有一條規則,這個是在構建模型和數據集的時候需要注意的:
- label的長度必須不大於模型輸出的長度
實際情況下,label的長度最好是遠小於模型輸出的長度,因爲label中有重複字符的話,模型的輸出就必須加入額外的纔可能解析出和label一樣的結果。
如下是幾個轉化的例子:
從上面的例子也不難推斷出,模型不同的輸出也可以得到相同的結果,比如下圖左邊的三種輸出都可以解析得到相同的文字。CTC在訓練的時候回去窮舉所有可能的對齊方式。
也正是因爲CTC的這些特性,模型classifier(第一張圖☝️)的每一個time step的最終輸出結果是獨立的,在面對有很多重複的輸入時,CTC很容易壞掉。
爲了解決這個問題,有人提出了一種叫做RNA(Recurrent Neural Aligner)的方法。它就是把CTC獨立的classifier換成了一個RNN就結束了。這樣模型在輸出token的時候,就可以參考前面的輸出了。
不過,這樣還有一個問題,就是面對一個輸入,需要有多個輸出的時候,該怎麼辦?比如“th”的發音只有一個音節,但是輸出卻有兩個字母。這個時候就輪到RNN-T出場了。
2 RNN-T
RNN-T出自論文Sequence Transduction with Recurrent Neural Networks。它在RNA的基礎上做了改進,解決了上述一對多的問題。它的改進在於,每個time step產生輸出的時候,一直要等到模型輸出了,纔會繼續去看下一個time step的內容,如下圖所示。
所以,RNN-T的運算流程是長這個樣子的。輸入sequence的長度有多長,那麼就會產生多少個。
而實際的RNN-T,還會再多做一步,就是它會以輸出的token爲輸入,加了一個RNN的模型去影響輸出的token,如下圖所示。不過,這個RNN會無視。
這裏多加入的RNN模型可以看成一個language model,可以先單獨train好再拿進來。
3 Neural Transducer
Neural Transducer又繼續做了優化,就是每次不是隻看一個time step的hidden state來進行輸出,而是看一個長度爲的窗口內的hidden states來做attention,之後再塞進RNN裏去得到token,輸出後再看下一個窗口。這個有些細節我也沒去細看,李老師也只是略講了一下,這裏就當瞭解一下吧。
4 Monotonic Chunkwise Attention
MoCha(Monotonic Chunkwise Attention)也是略講了一下,它就是一個窗口可以自由選擇移動的Neural Transducer,這裏我也偷下懶不說了。
5 小結
結合上篇所講的LAS,現在一共講了6個模型。