Listen, Attend and Spell - A Speech Recognition NN Model == ###### tags: `碩` `ML` ## Introduce 傳統的 DNN-HMM 模型中常常將以下三者拆開來訓練 - *聲學模型* - *發音模型* - *語言模型* 而現今流行的方式則趨向於將三者綜合且來訓練,也就是希望可以達到**輸入語音輸出文字**的 end-to-end。通常分為兩種做法 1. Connectionist Temporal Classification (CTC) 2. Sequence to Sequence Models with Attention 但這兩者都有其各自的問題 (conditional independent、只能使用在 phoneme),這也是 LAS 出現的初衷。 LAS 為一 sequence to sequence 的 attention 架構,其目標是去學習如何從聲音轉譯為文字: - **輸入**:一串聲音訊號序列。 - **輸出**:文字序列,且每次輸出一個字母。 其架構分為兩個部分:**listener**、**speller** - **Listener**:在 LAS 裡扮演 encoder,為一個**金字塔型**的 RNN,將輸入的語音訊轉換為更**高階的特徵** (消除雜訊、抹除語者差異...)。 - **Speller**:在 LAS 裡扮演 decoder,為一個 RNN,透過 model 一個將**高階特徵**分布到文字的 distribution 來將特徵轉換為文字,其中有使用 **attention** 的技術。 > LAS 中使用了 **pyramidal RNN** 這個技巧,用於減少 attention 的時候需要去關聯的 time step 數,且由於一次輸出一個字母,所以稀少字與 OOV 皆可以處理,也可以解決一音多詞的狀況如:'triple a'、'aaa'。 ## Model > 以下舉例以一個輸入為聲學特徵;輸出為英文字母的 LAS 為例 ### I/O - $x=(x_1,...,x_T)$:Filter bank spectra feature 作為輸入 - $y=(<sos>,y_1,...,y_S,<eos>), \ y_i \in {\rm any \ accept \ character}$ 我們要 model 的目標是各個時間的字母 $y_i$ 給定 $y_{<i}$ 與輸入為 $x$ 的條件機率 $$ P(y|x)=\prod_i P(y_i|x,y_{<i}) $$ > 理解:參考所有時間的輸入與先前的所有輸出。 此模型分為 **Listener** 和 **Speller**,其中 Listener 是針對聲學特徵的 encoder,他的中心思想是去聽 (listen);Speller 是一個 attention-base 的 decode,其中心思想是去觀察然後拼 (attend and spell)。Listener function 將聲學特徵 $x$ 轉換為較高級的表示法 (特徵) $h=(h_1,...,h_U) \ with \ U<T$;AttendAndSpell function 吃進 $h$ 然後產生一個對應的機率分布 $$ h={\rm Listener(x)} \\ P(y|x)={\rm AttendAndSpell(h,y)} $$ ![](https://i.imgur.com/HT9gAb6l.png) ###### <center> visualize LAS </center> > 上圖的輸出層應該需要 $c_i$ 與 $s_i$ 作為輸入,下面的公式會提到。 ### Listen Listener 的部分是使用 *Bidirectional Long Short-term Memory (BLSTM)* 作為核心去實作的,其中為了減少 encoder 輸出的參數量而將 BLSTM 以金字塔形排列稱為 *pBLSTM*,每層將 2 個參數合為一個,此處疊了 3 層,共減少 8 倍的參數。 其中疊 3 層除了可以減少時間上的 resolution,其中 deep-architecture 也可以學到一些非線性的特徵。 > 減少 encoder 輸出的原因:在 decoder 的部分若減少參數則可以加快模型收斂的速度,且在 input 大多是以小間隔的 frame 作為資料,其時訓練起來相鄰的資料並沒有包含太多的資訊,因此減少參數是 ok 的,且每個 encoder 包含的資訊量更大。 pBLSTM 在 $j^{th}$ 層 $i^{th}$ time step 時連結不同層時根據以下數學式: $$ h_i^j=pBLSTM(h_{i-1}^j, [h_{2i}^{j-1},h_{2i+1}^{j-1}]) $$ > 我認為將時間資訊濃縮 8 倍是有道理的,通常輸入的 frame offset 都為 10 ms,濃縮 8 倍後一個輸入包含了前後共 80 ms 的資訊,而 80 ms 通常是一個 phomene 的長度,將一個 phomene 作為輸入是 make sense 的。 ### Attend and Spell AttendAndSpell 是一個 attention-based 的 LSTM,分為三個部分 **decoder state**、**Attention Context**、**Character Distribution (output)**。 ![](https://i.imgur.com/8umZVQwm.jpg) - #### Decoder state: > 我理解是類似 HMM 中的 hidden state 透過先前的 state $s_{i-1}$、attention context $c_{i-1}$ 和前一刻的輸出來計算這一刻的 decoder state。模型為一個 RNN (2 layer LSTM)。 $$ s_i={\rm RNN}(s_{i-1},y_{i-1},c_{i-1}) $$ - #### Attention Context: 輸入這一刻的 state $s_i$ 與 encoder 的輸出 $h$,使用 attention 的技術得到。 $$ c_i={\rm AttentionContext}(s_i,h) $$ - #### Character Distribution: 輸入這一刻的 attention context $c_i$ 和 decoder state $s_i$,產生 character 的機率分布用來產生機率供 classifier 使用。也就是說輸出機率分布為 *decoder state* $s_i$ 和 *attention context* $c_i$ 的函數。模型是使用 *MLP* 並搭配 *softmax*。 > 理解上為每次輸出時會產生一個機率分布,並給定在看過先前所有的輸出。 $$ P(y_i|x,y_{<i})={\rm CharacterDistribution}(s_i,c_i) $$ #### Attention ![](https://i.imgur.com/ohJ68Sdm.png) 在每個時間點, AttentionContext 會產生一個 context vector $c_i$,其隱含了聲音訊號的相關資訊,並用於產生下一時刻的 character。在此的作法是將 encoder output 與 decoder state 去做 match function 產生一個 scalar $e_{i,u}$ 後過 softmax 得到對 $h_u$ 的權重 (總合為 1) $\alpha_{i,u}$,將 $h_u$ 依照權重相加後即得到 context $c_i$。 > 在 attention 中有個 match 機制,輸入關鍵字與 $h$,產生一個 scalar。\ > 常見的 match function 有以下: > | *Dot-product Attention* | *Additive Attention* | > |:-------------------------------------:|:-------------------------------------:| > | ![](https://i.imgur.com/m9Cmp5Xm.png) | ![](https://i.imgur.com/cbvibkkm.png) | 在各個時間點的 decoder state 會與 encoder output 有關,且這個時間關係通常只會在一小段時間。 $$ e_{i,u}=<\phi(s_i),\psi(h_u)> \\ \alpha_{i,u}=\frac{{\rm exp}(e_{i,u})}{\sum_u {\rm exp}(e_{i,u})} \\ c_i=\sum_u \alpha_{i,u} h_u $$ ## Learning LAS 在訓練的時候是將 Listen 和 AttendAndSpell 兩個函數一起訓練,每次的輸出都會建立在前一次的輸出上,並對以下數學式做 maximize: $$ \mathop{max}_{\theta} \sum_i log\ P(y_i|x,y^*_{<i};\theta) $$ 其中 $y^*$ 是 groundtruth 但在 inference 的時候,由於沒有 groundtruth,因此可能會產生嚴重錯誤的 prediction,因此為了讓模型更有彈性,這邊使用一個方法,讓部分的訓練要去 maximize 的機率不是以 groundtruth 的值做為參考,而是以之前的輸出,如以下: $$ \tilde{y_i} \sim {\rm CharacterDistribution}(s_i, c_i) \\ \mathop{max}_{\theta} \sum_i log\ P(y_i|x,\tilde{y}_{<i};\theta) $$ 此時的 $\tilde{y}_{i-1}$ 可以是來自 groundtruth 或是取樣自先前的輸出 > 該模型使用 pretrain 效果不會變好 ![](https://i.imgur.com/uk3xnn3m.png) ## 實驗結果 ### 1. Attention #### <center>Figure 1. Alignment between the Characters and Audio</center> ![](https://i.imgur.com/tVtQbFX.png) 在 LAS 的實驗中發現,網路會自己學習到如何對齊聲音訊號和字母,且機率只會分布在附近的位置,然後也可以在一整段訊號中精確的定位句子的開始和結束位置。 ### 2. Network Effect 本篇 paper 中觀察了以下三點造成的影響與 WER 的關係: 1. Beam width 2. Utterance 3. Word frequency #### Beam Width 在實驗過程中分為三種狀況討論模型效能與 beam search 的寬度的關係: 1. 一般的 LAS 2. LAS with LM 3. LAS with Oracle 結果發現將 beam width 從 1 陸續調到 32,大概在 16 的時候 WER 開始收斂,並且適用 language model 有助於提升效能。 ![](https://i.imgur.com/twOVOcK.png) <center>Figure 2.</center> ##### Table 1. WER with beam width of 32 | | WER | WER LM | WER Oracle | |:---------:|:-----:|:------:|:----------:| | clean set | 14.1% | 10.3% | 4.3% | #### Utterance Length 這邊探討的是語料長度與效能之間的關係。由於訓練資料的分布多在短句上,因此預期長句的辨識效果不好,實驗結果也是如此;但在比訓練資料更短的句子 (2個字或以下) 的辨識率也不好,推測是模型將單字拆開造成。 ##### Table 2. Error in long and short utterance | Utterance | Dominate Error | 原因 | |:---------:|:-----------------------:|:-------------------------------------------------------------------------- | | Long | deletion | 猜測可能是過長的句子導至略過了某些字 | | Short | substitution, insertion | 可能是模型將詞拆開為更多的詞,或為了達到訓練時相似的長度而將字誤認為別的字 | 從 Figure 3. 可以觀察到 Table 2. 的現象。此外還發現若用短語料訓練則 LAS 無法將結果通用到長的語料上 (從下圖可以觀察到)。 > 感覺某個長度的訓練語料相近長度的辨識下 work。 ![](https://i.imgur.com/kbZCSkh.png) <center>Figure 3.</center> #### Word frequency 這邊討論效能與詞頻和稀有字的關係。這邊使用 recall metric 來表示某個詞曾出現在語料裡的機率。通常稀有的字 variance 越高而 recall 會越低,而常見的字則有較高的 recall。 以本實驗為例,觀察到 `and` 在 training set 出現 85k 次卻只有 80% 的 recall,就算加上 LM 也是,但卻常常沒有辨識出來,或是漏掉,相對之下 `walkville` 只出現一次卻有 100% 的 recall。這邊猜測 recall 與 training set 的詞頻與聲學上的唯一性相依。 ![](https://i.imgur.com/QgIlJw4.png) <center>Figure 4. Training 時的詞頻與 test 時的 recall 對應圖</center> ### 3. Decoding 本篇 decoding 的實驗中 (無 language & dictionary) 發現了 LAS 有趣的特性: - 對同一個發音有不同的拼法 - 能正確拼出重複朗讀的字 本實驗發現當聲音訊號唸的是 "triple a" 的時候,LAS 會輸出 "triple a" 與 "aaa" (如 Table 3. 所示),推測 decoder 在解碼時沒有假設機率分布的 condition independence 如 CTC,其假設 $p(y_{i+1}|x)$ 有條件的與 $p(y_i|x)$ 獨立;而傳統的 DNN-HMM 模型要達成這種效果需要兩種發音的發音辭典。另外也發現 LAS 有學習字的結構與發音的關係,如 "xxx"。 ##### Table 3. "triple a" vs. "aaa" spelling variants. ![](https://i.imgur.com/iWMgoS5.png) 另外也發現 LAS 可以辨識重複的字。 ##### Table 4. Repeated "seven"s ![](https://i.imgur.com/J2CnVMP.png)