---
# System prepended metadata

title: CIF - Continuous Integrate-And-Fire for E2E ASR
tags: [碩, ML, ASR]

---


## Introduction
CIF 是一種 **soft** 且 **monotonic** 的對齊，可以用於序列的感知，使用在 encoder-decoder 框架上，除了齊精簡的計算方式還支援線上辨認與聲學邊界定位等功能。

#### attention-based
- Soft alignment
- 無法串流化
- 時間上無法定位辨認結果
- 計算量大

<center>

<img width=400 src="https://hackmd.io/_uploads/BJC9DL9u3.png">
</center>

## Method
CIF 的核心概念當累積的數值達到升學邊界的時候就發射一個字的資訊量出去，在每個 encoder step 會產生一組高維特徵與一個權重值代表該特徵包含多少量的資訊，用來放大縮小特徵值。
<center>

<img width=300 src="https://hackmd.io/_uploads/rJMttI5u2.png">
</center>

### Continuous Integrate-and-Fire
在每個 encoder step $u$ 中會接收到兩個輸入：現在 encoder 輸出(狀態) $h_u$、現在權重 $\alpha_u$，用來衡量 $h_u$ 的資訊量，然後累加這些權重與特徵 (使用 weighted sum)，直到累積的值到達一個閥值 $\beta$ (推薦設為 1) ，代表到達了聲學邊界，此時的權重會被拆成兩個部分，一個是滿足了現在的發射要求，另一個用來提供下一次發射，這些 weighted sum 的結果稱為 context vector $c_i$，用來預測標籤 $y_i$。

<center>

<img width=300 src="https://hackmd.io/_uploads/ryG9TIcu2.png">
<img width=400 src="https://hackmd.io/_uploads/rkLpTU9dh.png">
</center>

<center>

<img width=550 src="https://hackmd.io/_uploads/BkgMAU5_2.png">
</center>


## Strategy
### Scaling Strategy
在訓練時由於預測的長度 $S$ 會與答案的長度 $\tilde{S}$ 不同，導致 CE loss 無法計算 (CE 適合 one-to-one)，因此在訓練的時候加入 scaling 機制讓預測的長度與答案相同，其實現如下：將權重 $\alpha=(\alpha_1,\alpha_2,...,\alpha_U)$ 乘上 scalar $\frac{\tilde{S}}{\sum_{u=1}^U \alpha_u}$ 來產生新的權重 $\alpha'=(\alpha_1',\alpha_2',...,\alpha_U')$，這樣全部的權重起來就會等於 $\tilde{S}$，這樣在訓練的時候就可以計算 CE loss。

### Quantity Loss
這個 loss 是用來監督模型將字數收斂到正確答案的長度，用一個 MAE 來實現
$$
\mathcal{L}_{QUA} = |\sum_{u=1}^U \alpha_u - \tilde{S}|``
$$

加入這個損失函數不只讓模型可以更好的標記聲學邊界還可以減輕因為 scaling 使得訓練和推理機制不同導致的效能下降。

### Tail Handling
在推理階段，序列尾巴會留下一些有用的資訊，但因為沒有達到閥值而沒有辦法發射導致辨認結果不完全，因此在最後的部分多去做一次的發射動作，當累積的權重超過 0.5 的話就發射，除此之外也使用 \<EOS> 當作結尾的目標，讓模型學習去預測序列的結束和給他一個空間避免辨識不完全。

## Model
<center>

<img width=400 src="https://hackmd.io/_uploads/BJri5w9uh.png">
</center>

### Encoder
Encoder 沿用了上述架構使用雙層 convolutional front-end 搭配金字塔型的 self-attention (SANs) 來減少時間上的解析度至 1/8，使用 chunk-hopping。

### Decoder
兩種 decoder，同樣沿用上述架構：
1. Autoregressive：
    Autoregressive 會加入之前的結果一起做辨認，首先會將之前的預測結果 $y_{i-1}$ (會變成 embedding $e_{i-1}$) 連接前一次的 context vector 再做投影轉換後輸入 SANs 得到 $o_i$，再將其與當前的 context vector 連接後再做一次投影轉換與 softmax 得到結果。
    $$
    e_i = {\rm Embedding}(y_i) \\
    o_i = {\rm SANs}({\rm Project}({\rm Concat}(e_{i-1}, c_{i-1}))) \\
    y_i = {\rm softmax}({\rm Project}({\rm Concat}(o_i,c_i)))
    $$
    
2. Non-autoregressive (NAR)：
    直接將 $c_i$ 當作 SANs 的輸入得到 $o_i$ 後做投影轉換再過 softmax 後得到輸出，這種作法在 offline 的 ASR 時可以讓 decode 平行化達到加速的效果。
    $$
    o_i = {\rm SANs}(c_i) \\
    y_i = {\rm softmax}({\rm Project}(o_i))
    $$

### Loss Functions
CIF 只佔很小的訓練量，因為他只去做 weighted sum，並沒有可學習的參數，因此 CIF-based 模型訊量上是快速的。為了讓增強模型，因此除了 cross-entropy 以外還提供了可選擇的 loss functions 來使用，分別是 quantity loss $\mathcal{L}_{QUA}$ 和 CTC loss $\mathcal{L}_{CTC}$，前者用來幫助模型預測對的字數，減少 scaling 帶來的誤差；後者用來讓 encoder 更好的定位 (左至右) 的 acoustic encoding，綜合上述最後的損失函數如下：
$$
\mathcal{L} = \mathcal{L}_{CE} + \lambda_1 \mathcal{L}_{CTC} + \lambda_2 \mathcal{L}_{QUA}
$$

$\lambda_1, \lambda_2$ 為 hyper-parameters 用來調整損失函數看的比例。