Chapter1-7_Speech_Recognition(Language Modeling)
文章目錄
- 1 為什么需要Language Model
- 2 N-gram
- 3 Continuous LM
- 3 NN-based LM
- 4 RNN-based LM
- 5 合并LAS和LM
- 5.1 shallow fusion
- 5.2 deep fusion
- 5.3 cold fusion
本文為李弘毅老師【Speech Recognition - Language Modeling】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 1-6 RNN-T Training
下篇 - 2-1 Feature Disentangle
總目錄
1 為什么需要Language Model
LM是用來估計一串token出現的概率的,簡單點說,就是給模型一個單詞,模型幫你看看這個單詞拼寫正確的概率是多大,這樣子。也就是,我們平時所說的P(Y)P(Y)P(Y)。
在HMM當中,使用P(Y)P(Y)P(Y)是非常自然的,因為HMM求解的是
HMM:Y?=argmax?YP(X∣Y)P(Y)HMM:\ Y^* = \underbrace{argmax}_Y P(X|Y)P(Y) HMM:?Y?=Yargmax??P(X∣Y)P(Y)
但是在類似LAS這樣的深度學習模型當中,我們是直接求解P(Y∣X)P(Y|X)P(Y∣X)的。這個時候,還要乘上一個P(Y)P(Y)P(Y)其實有點奇怪,甚至難以解釋。但事實是,這樣的做法,可以提升模型的performance。
LAS:Y?=argmax?YP(Y∣X)P(Y)LAS:\ Y^* = \underbrace{argmax}_YP(Y|X)P(Y) LAS:?Y?=Yargmax??P(Y∣X)P(Y)
如果非要解釋一波的話,因為P(Y∣X)P(Y|X)P(Y∣X)的訓練是需要大量的成對數據的(語音 - 文字),我們并沒有那么多的數據。而P(Y)P(Y)P(Y)這個模型是單獨拿出來train好的,它的訓練只需要文字就可以了,比如我們可以用超神的BERT。
2 N-gram
一種比較傳統的語言模型叫做N-gram。N-gram會去統計一大堆語料當中某一組詞出現的概率。但是,我們人類所使用的詞匯實在是太復雜多樣了,我們說的一串話,可能都從來沒有出現在用來訓練的語料庫當中。那怎么辦呢?
我們會在假設詞和詞之間相互獨立的基礎上,把P(y1,y2,y3,...,yn)P(y_1,y_2,y_3,...,y_n)P(y1?,y2?,y3?,...,yn?)這個概率拆解開來,比如2-gram的時候,就變成了
P(y1,y2,y3,...,yn)=P(y1∣BOS)P(y2∣y1)?P(yn∣yn?1)P(y_1,y_2,y_3,...,y_n) = P(y_1|BOS)P(y_2|y_1) \cdots P(y_n|y_{n-1}) P(y1?,y2?,y3?,...,yn?)=P(y1?∣BOS)P(y2?∣y1?)?P(yn?∣yn?1?)
用一個實際一點的例子來說就是
P("wreckanicebeach")=P(wreck∣BOS)P(a∣wreck)P(nice∣a)P(beach∣nice)P("wreck\ a\ nice\ beach") = P(wreck|BOS)P(a|wreck)P(nice|a)P(beach|nice) P("wreck?a?nice?beach")=P(wreck∣BOS)P(a∣wreck)P(nice∣a)P(beach∣nice)
那么,我們在訓練的時候,就只需要去統計相鄰詞出現的概率即可,比如
P(beach∣nice)=C(nicebeach)C(nice)P(beach|nice) = \frac{C(nice\ beach)}{C(nice)} P(beach∣nice)=C(nice)C(nice?beach)?
CCC表示訓練數據中的頻數。
類似的3-gram就是P(yn∣yn?1,yn?2)P(y_n|y_{n-1},y_{n-2})P(yn?∣yn?1?,yn?2?),4-gram就是P(yn∣yn?1,yn?2,yn?3)P(y_n|y_{n-1},y_{n-2},y_{n-3})P(yn?∣yn?1?,yn?2?,yn?3?)。
但即使是這樣,我們的訓練數據仍舊是遠遠不夠的,有許多的組合從來沒有出現在訓練數據當中過。但這些沒有出現過的,并不代表它們的實際概率為0,只是在訓練數據中的概率為0而已。為了解決這個問題,我們會用一個很小的概率去代替0,比如0.0001。這個操作叫做language model smooting。這個smooting的方法也有非常多的變形,這里不展開去講了。
3 Continuous LM
在進入深度學習之前,有人還想出了另一種方法來解決這個訓練集不夠的問題,那就是借用推薦算法MF(Matrix Factorization)。
什么是MF呢?比如我們現在有A、B、C、D、E五個用戶,分別在某個動漫網站上對四個動漫人物打了分。B對第2個人物還沒有打分,但他對第一個人物打分了。那么,其實我們可以根據其他用戶的打分行為來推斷B會對第2個人物打幾分。我們發現喜歡第1個人物的用戶,通常也會喜歡第2個人物,故我們覺得B可能對第2個人物會打5分。
當然,這個只是拍拍腦袋想象的,MF就可以用數學的方法,幫我們把下面這張表格的空格給填滿。
在把MF應用到LM的的時候,我們的橫軸和縱軸都會變成vocabulary中的所有單詞,而中間的表格就表示橫軸的單詞后面接縱軸的單詞在訓練集中的頻數。比如下圖中的n11=2n_{11}=2n11?=2就表示"dog"后面接"ran"出現了2次。
然后每一個橫軸的單詞都用一個特征向量hih^ihi來表示,每一個縱軸的單詞都用一個不同的特征向量vjv^jvj來表示。我們會試圖用vj?hiv^j \cdot h^ivj?hi來逼近njin_{ji}nji?。vjv^jvj和hih^ihi都是可以學習的。
逼近的方法,就是通過最小化下面這個loss來計算出所有的vjv^jvj和hih^ihi。
Minimize:L=∑i,j(vj?hi?nj,i)2Minimize:\ L = \sum_{i,j}(v^j \cdot h^i - n_{j,i})^2 Minimize:?L=i,j∑?(vj?hi?nj,i?)2
通過這樣學習得到的vjv^jvj和hih^ihi就表示了每個單詞的一些特征,當我們要去計算在訓練集里沒有出現過的nj,in_{j,i}nj,i?時,就可以直接用vj?hiv^j \cdot h^ivj?hi的方法。這種通過學習的方法,比直接統計要靠譜很多。
3 NN-based LM
這種矩陣相乘的形式,當然時可以轉換成神經網絡的形式的,稍稍變形就可以變成幾個全連接搞定的神經網絡,如下圖所示。輸入是一個one-hot encoding過的向量,其中的全連接權重就是hih^ihi和vjv^jvj,目標就是我們的nj,in_{j,i}nj,i?。
那這樣的模型如何訓練呢?訓練方法其實和n-gram 差不多,就是輸入幾個單詞,讓模型去預測下一個單詞是什么。
有了這樣的模型,就可以去計算P(Y)了。下圖是一個示意圖。
4 RNN-based LM
NN-based LM用的都是全連接,所以當我們想要看非常長的句子時,也就是n-gram中的n非常大時,網絡就會變得異常大,沒有錢或者硬件是跑不起來的。為了減少資源的消耗,我們可以引入RNN,用RNN的最后一個hidden state去和vjv^jvj相乘。
這里用到的RNN可以非常復雜,但是一般只需要用LSTM就可以了。
5 合并LAS和LM
我們知道怎么train這個LM了之后,怎么把它結合到LAS里呢?方法也有很多種,下面來一一介紹。
5.1 shallow fusion
shallow fusion就是說,我們已經有了train好的LM和train好的LAS,然后在做decoding的時候,每個time step它們都會輸出一個維度和詞表大小一樣的概率向量,把這兩個向量加權求和作為最終的概率向量。然后不斷這樣循環下去就可以了。
5.2 deep fusion
deep fusion和shallow fusion的不同之處在于,它會把LM和LAS的hidden state塞進一個神經網絡里去進行融合。這個額外的神經網絡是需要train出來的,也就是說我們有一個train好的LM和train好的LAS之后,還要把這兩者接進一個network中,再去train一發。
這樣做帶來的弊端就是,我們沒法隨意更換LM模型,一旦更換了就需要重新train一發。如果我們要對每個用戶做一個針對性的LM,那這個方法就行不通了。
不過也有辦法可以換了LM而不重新train這個network,那就是用LM的輸出概率作為network的輸入。
5.3 cold fusion
最后再來將一個cold fusion,cold fusion其實結構上和deep fushion長的一模一樣,只不過,cold fusion當中,我們的LAS是沒有train好的,需要接上之后去end-to-end的訓練的。這樣的做法,可以讓LAS收斂得更快。
總結
以上是生活随笔為你收集整理的Chapter1-7_Speech_Recognition(Language Modeling)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1781. 所有子字符
- 下一篇: LeetCode 2177. 找到和为给