原文: https://blog.csdn.net/qq_26778411/article/details/89682447html
也能夠參考: http://vsooda.github.io/2018/03/12/fsmn/git
因爲 Bi-RNN 較高的成功率須要獲得整段語音全部將來信息的支持才能實現,所以會帶來較長的硬延時,故 Bi-RNN 不適合做爲在線語音識別的模型。故在 2015 年科大訊飛提出了 FSMN(Feedforward Sequential Memory Networks)模型,該模型在很小的延時下,就能取得與 Bi-RNN 同樣的效果。
詳見論文:
(1)Feedforward Sequential Memory Neural Networks without Recurrent Feedback 該篇篇幅較短,只介紹了 FSMN 在 Language Model 的應用。
(2)Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency 該篇較爲詳細的描述了 FSMN 的三個變種,在 Acoustic Model 和 Language Model 上的應用。github
在 FSMN 的基礎之上,陸陸續續又出現了 cFSMN、DFSMN、pyramidal-FSMN 等 FSMN 的變種。
(1)cFSMN:Compact Feedforward Sequential Memory Networks for Large Vocabulary Continuous Speech Recognition
(2)DFSMN:Deep-FSMN for Large Vocabulary Continuous Speech Recognition
(3)pyramidal-FSMN:A novel pyramidal-FSMN architecture with lattice-free MMI for speech recognitionmarkdown
前面提到了,有兩篇論文講述了 FSMN,這裏就選取較爲全面的第二篇 Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency 進行講解。網絡
FSMN 的結構如上圖所示,在圖中咱們能夠看到,FSMN 對比普通的前饋神經網絡,最大的區別就是引入了 Memory Block. 該 Memory 的表達式以下:
h˜ℓt=∑Ni=0aℓi⋅hℓt−ih~tℓ=∑i=0Naiℓ⋅ht−iℓ \tilde{\mathbf{h}}_{t}^{\ell}=\sum_{i=0}^{N} a_{i}^{\ell} \cdot \mathbf{h}_{t-i}^{\ell} h~tℓ=i=0∑Naiℓ⋅ht−iℓ
其中,hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ爲t−it−i t-i t−i 時刻ℓℓ \ell ℓ層的 features,aℓiaiℓ a_{i}^{\ell} aiℓ爲對應的時不變係數。app
這裏能夠看出,Memory Block 中儲存了NN N N 個hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ的 「過去記憶」,該 「過去記憶h˜ℓth~tℓ \tilde{\mathbf{h}}_{t}^{\ell} h~tℓ」 會與當前層的 features hℓthtℓ \mathbf{h}_{t}^{\ell} htℓ一塊兒前向傳入下一層。post
固然,不難想到,該 Memory Block 也能夠經過引入部分延時來存儲 「將來的記憶」,改進後的表達式以下:
h˜ℓt=∑N1i=0aℓi⋅hℓt−i+∑N2j=1cℓj⋅hℓt+jh~tℓ=∑i=0N1aiℓ⋅ht−iℓ+∑j=1N2cjℓ⋅ht+jℓ \tilde{\mathbf{h}}_{t}^{\ell}=\sum_{i=0}^{N_{1}} a_{i}^{\ell} \cdot \mathbf{h}_{t-i}^{\ell}+\sum_{j=1}^{N_{2}} c_{j}^{\ell} \cdot \mathbf{h}_{t+j}^{\ell} h~tℓ=i=0∑N1aiℓ⋅ht−iℓ+j=1∑N2cjℓ⋅ht+jℓ
其中,hℓt+jht+jℓ \mathbf{h}_{t+j}^{\ell} ht+jℓ爲t+jt+j t+j t+j 時刻ℓℓ \ell ℓ層的 features,cℓiciℓ c_{i}^{\ell} ciℓ爲對應的時不變係數。atom
文章中對 Memory Block 中時不變係數aℓiaiℓ a_{i}^{\ell} aiℓ和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ的運算 (⋅⋅ \cdot ⋅) 進行了分類:
(1) 若aℓiaiℓ a_{i}^{\ell} aiℓ爲一個常數,則該 FSMN 被稱爲 sFSMN,aℓiaiℓ a_{i}^{\ell} aiℓ和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ之間的運算爲標量相乘。
(2) 若aℓiaiℓ a_{i}^{\ell} aiℓ是一個與hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ等長的向量,則該 FSMN 被稱爲 vFSMN, aℓiaiℓ a_{i}^{\ell} aiℓ和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell} ht−iℓ之間的運算爲 dot product.spa
文章解釋了 FSMN 的 Memory Block 能夠替代 RNN 中緣由:
.net
如上圖所示,RNN 中的循環結構能夠當作一個 IIR 濾波器 (z−1z−1 z^{-1} z−1 爲上一時刻導數的 Z 變換),FSMN 中的 Memory 能夠當作一個 FIR 濾波器。根據信號與系統的知識咱們知道,IIR 濾波器能夠經過高階的 FIR 濾波器逼近表示。因此 FSMN 中的 Memory Block 能夠當作是 RNN 中循環結構的近似。因爲 FSMN 在同一層中的某時刻的輸入不須要依賴上一時刻的輸出,因此網絡的訓練時間對比 RNN 會大大縮短。
FSMN 的參數更新公式爲:
h˜ℓt=∑N1i=0aℓi⊙hℓt−i+∑N2j=1cℓj⊙hℓt+jh~tℓ=∑i=0N1aiℓ⊙ht−iℓ+∑j=1N2cjℓ⊙ht+jℓ \tilde{\mathbf{h}}_{t}^{\ell}=\sum_{i=0}^{N_{1}} \mathbf{a}_{i}^{\ell} \odot \mathbf{h}_{t-i}^{\ell}+\sum_{j=1}^{N_{2}} \mathbf{c}_{j}^{\ell} \odot \mathbf{h}_{t+j}^{\ell} h~tℓ=i=0∑N1aiℓ⊙ht−iℓ+j=1∑N2cjℓ⊙ht+jℓ
hℓ+1t=f(Wℓhℓt+W˜ℓh˜ℓt+bℓ)htℓ+1=f(Wℓhtℓ+W~ℓh~tℓ+bℓ) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{W}^{\ell} \mathbf{h}_{t}^{\ell}+\tilde{\mathbf{W}}^{\ell} \tilde{\mathbf{h}}_{t}^{\ell}+\mathbf{b}^{\ell}\right) htℓ+1=f(Wℓhtℓ+W~ℓh~tℓ+bℓ)
若是使用 FSMN,設該層和下一層的神經元的個數均爲nn n n 時,"前向記憶" 的個數爲N1N1 N_1 N1,"後向記憶" 的個數爲N2N2 N_2 N2,該層的參數個數爲:n∗n+n∗n+n∗(N1+N2)n∗n+n∗n+n∗(N1+N2) n*n+n*n+n*(N_1+N_2) n∗n+n∗n+n∗(N1+N2) 個。當nn n n 很大,訓練參數就會不少。
爲了解決 FSMN 參數較多的問題,文章 Compact Feedforward Sequential Memory Networks for Large Vocabulary Continuous Speech Recognition 提出了 cFSMN,該文章借鑑了矩陣低秩分解的思路在網絡中引入了一個維數較小的 project 層,經過該 project 層進行降維,從而實現減小訓練參數個數的目的。
cFSMN 的結構以下圖所示:
cFSMN 的參數更新公式爲:
pℓt=Vℓhℓtptℓ=Vℓhtℓ \mathbf{p}_t^{\ell}=\mathbf{V}^{\ell}\mathbf{h}_t^{\ell} ptℓ=Vℓhtℓ
p˜ℓt=pℓt+∑N1i=0aℓi⊙pℓt−i+∑N2j=1cℓj⊙pℓt+jp~tℓ=ptℓ+∑i=0N1aiℓ⊙pt−iℓ+∑j=1N2cjℓ⊙pt+jℓ \tilde{\mathbf{p}}_{t}^{\ell}=\mathbf{p}_{t}^{\ell}+\sum_{i=0}^{N_{1}} \mathbf{a}_{i}^{\ell} \odot \mathbf{p}_{t-i}^{\ell}+\sum_{j=1}^{N_{2}} \mathbf{c}_{j}^{\ell} \odot \mathbf{p}_{t+j}^{\ell} p~tℓ=ptℓ+i=0∑N1aiℓ⊙pt−iℓ+j=1∑N2cjℓ⊙pt+jℓ
hℓ+1t=f(Uℓp˜ℓt+bℓ+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{U}^{\ell} \tilde{\mathbf{p}}_{t}^{\ell}+\mathbf{b}^{\ell+1}\right) htℓ+1=f(Uℓp~tℓ+bℓ+1)
設 project 層的 features 個數爲pp p p, 該層和下一層的神經元的個數均爲nn n n, 則 cFSMN 參數的個數爲n∗p+p∗(N1+N2)+n∗pn∗p+p∗(N1+N2)+n∗p n*p+p*(N_1+N_2)+n*p n∗p+p∗(N1+N2)+n∗p.
由於每一個 cFSMN 層中包含了較多的子層,一個包含 4 個 cFSMN 層,2 個 DNN 層的 cFSMN 網絡總共須要 12 層結構。若經過直接增長 cFSMN 層的方法來設計更深的 cFSMN 網絡,網絡可能會出現梯度消失的問題。
針對上述問題,文章 Deep-FSMN for Large Vocabulary Continuous Speech Recognition 提出了 DFSMN,該 DFSMN 在 cFSMN 的 Memory Block 之間添加了 skip connection,使低層的 memory 能夠直接流入高層的 Memory Block 中。在反向傳播的過程中,高層的梯度也會直接流入低層的 Memory Block 中,這樣有助於克服梯度消失的狀況。DFSMN 的結構以下圖所示:
DFSMN 的參數更新公式爲:
pℓt=Vℓhℓtptℓ=Vℓhtℓ \mathbf{p}_t^{\ell}=\mathbf{V}^{\ell}\mathbf{h}_t^{\ell} ptℓ=Vℓhtℓ
p˜ℓt=ℋ(p˜ℓ−1t)+pℓt+∑Nℓ1i=0aℓi⊙pℓt−s1∗i+∑Nℓ2j=1cℓj⊙pℓt+s2∗jp~tℓ=H(p~tℓ−1)+ptℓ+∑i=0N1ℓaiℓ⊙pt−s1∗iℓ+∑j=1N2ℓcjℓ⊙pt+s2∗jℓ \tilde{\mathbf{p}}_{t}^{\ell}=\mathcal{H}\left(\tilde{\mathbf{p}}_{t}^{\ell-1}\right)+\mathbf{p}_{t}^{\ell}+\sum_{i=0}^{N_{1}^{\ell}} \mathbf{a}_{i}^{\ell} \odot \mathbf{p}_{t-s_{1} * i}^{\ell}+\sum_{j=1}^{N_{2}^{\ell}} \mathbf{c}_{j}^{\ell} \odot \mathbf{p}_{t+s_{2} * j}^{\ell} p~tℓ=H(p~tℓ−1)+ptℓ+i=0∑N1ℓaiℓ⊙pt−s1∗iℓ+j=1∑N2ℓcjℓ⊙pt+s2∗jℓ
hℓ+1t=f(Uℓp˜ℓt+bℓ+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{U}^{\ell}\tilde{\mathbf{p}}_{t}^{\ell}+\mathbf{b}^{\ell+1}\right) htℓ+1=f(Uℓp~tℓ+bℓ+1)
ℋ(p˜ℓ−1t)H(p~tℓ−1) \mathcal{H}\left(\tilde{\mathbf{p}}_{t}^{\ell-1}\right) H(p~tℓ−1) 表示低層 Memory Block 與高層 Memory Block 的鏈接形式。若將低層的 Memory 直接添加到高層的 Memory Block 中,則ℋ(p˜ℓ−1t)=p˜ℓ−1tH(p~tℓ−1)=p~tℓ−1 \mathcal{H}\left(\tilde{\mathbf{p}}_{t}^{\ell-1}\right)=\tilde{\mathbf{p}}_{t}^{\ell-1} H(p~tℓ−1)=p~tℓ−1。
pyramidal-FSMN 是雲從科技 2018 年刷新 Librispeech 數據集正確率最高記錄時使用的模型中的一部分。詳情見論文 A novel pyramidal-FSMN architecture with lattice-free MMI for speech recognition。
文章認爲在 DFSMN 的結構中,若直接將底層的 Memory Block 的 Memory 直接添加到上層的 Memory Block 中,這將致使上層和底層擁有相同記憶,這麼作是很是冗餘的。文章提出的 pyramidal-FSMN 結構,它相比於 DFSMN 有兩點不同:第一點改變是底層的 Memory Block 較小,越高層的 Memory Block 依次變大,文章認爲這樣的結構能夠用底層提取音素信息,而用高層提取到語義和語法特徵;第二點改變是在 skip connection 鏈接底層和上層的 Memory Block 時,只有在 Memory Block 的 size 不同時,才進行鏈接。
pyramidal-FSMN 中 Memory Block 的更新公式爲:
xlt=xl−mt+∑Nl1i=0ali⊙hlt−s1∗i+∑Nl2j=0bli⊙hlt+s2∗jxtl=xtl−m+∑i=0N1lail⊙ht−s1∗il+∑j=0N2lbil⊙ht+s2∗jl x_{t}^{l}=x_{t}^{l-m}+\sum_{i=0}^{N_{1}^{l}} a_{i}^{l} \odot h_{t-s_1 * i}^{l}+\sum_{j=0}^{N_{2}^{l}} b_{i}^{l} \odot h_{t+s_2 * j}^{l} xtl=xtl−m+i=0∑N1lail⊙ht−s1∗il+j=0∑N2lbil⊙ht+s2∗jl