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)}
$$

###### <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)**。

- #### 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

在每個時間點, 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* |
> |:-------------------------------------:|:-------------------------------------:|
> |  |  |
在各個時間點的 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 效果不會變好

## 實驗結果
### 1. Attention
#### <center>Figure 1. Alignment between the Characters and Audio</center>

在 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 有助於提升效能。

<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。

<center>Figure 3.</center>
#### Word frequency
這邊討論效能與詞頻和稀有字的關係。這邊使用 recall metric 來表示某個詞曾出現在語料裡的機率。通常稀有的字 variance 越高而 recall 會越低,而常見的字則有較高的 recall。
以本實驗為例,觀察到 `and` 在 training set 出現 85k 次卻只有 80% 的 recall,就算加上 LM 也是,但卻常常沒有辨識出來,或是漏掉,相對之下 `walkville` 只出現一次卻有 100% 的 recall。這邊猜測 recall 與 training set 的詞頻與聲學上的唯一性相依。

<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.

另外也發現 LAS 可以辨識重複的字。
##### Table 4. Repeated "seven"s
