Chapter1-7_Speech_Recognition(Language Modeling)

本文爲李弘毅老師【Speech Recognition - Language Modeling】的課程筆記,課程視頻youtube地址,點這裏👈(需翻牆)。

下文中用到的圖片均來自於李宏毅老師的PPT,若有侵權,必定刪除。

文章索引:

上篇 - 1-6 RNN-T Training

下篇 - 待更新

總目錄

1 爲什麼需要Language Model

LM是用來估計一串token出現的概率的,簡單點說,就是給模型一個單詞,模型幫你看看這個單詞拼寫正確的概率是多大,這樣子。也就是,我們平時所說的P(Y)P(Y)

在HMM當中,使用P(Y)P(Y)是非常自然的,因爲HMM求解的是

HMM: Y=argmaxYP(XY)P(Y) HMM:\ Y^* = \underbrace{argmax}_Y P(X|Y)P(Y)

但是在類似LAS這樣的深度學習模型當中,我們是直接求解P(YX)P(Y|X)的。這個時候,還要乘上一個P(Y)P(Y)其實有點奇怪,甚至難以解釋。但事實是,這樣的做法,可以提升模型的performance。

LAS: Y=argmaxYP(YX)P(Y) LAS:\ Y^* = \underbrace{argmax}_YP(Y|X)P(Y)

如果非要解釋一波的話,因爲P(YX)P(Y|X)的訓練是需要大量的成對數據的(語音 - 文字),我們並沒有那麼多的數據。而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)這個概率拆解開來,比如2-gram的時候,就變成了

P(y1,y2,y3,...,yn)=P(y1BOS)P(y2y1)P(ynyn1) 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("wreck a nice beach")=P(wreckBOS)P(awreck)P(nicea)P(beachnice) P("wreck\ a\ nice\ beach") = P(wreck|BOS)P(a|wreck)P(nice|a)P(beach|nice)

那麼,我們在訓練的時候,就只需要去統計相鄰詞出現的概率即可,比如

P(beachnice)=C(nice beach)C(nice) P(beach|nice) = \frac{C(nice\ beach)}{C(nice)}

CC表示訓練數據中的頻數。

類似的3-gram就是P(ynyn1,yn2)P(y_n|y_{n-1},y_{n-2}),4-gram就是P(ynyn1,yn2,yn3)P(y_n|y_{n-1},y_{n-2},y_{n-3})

但即使是這樣,我們的訓練數據仍舊是遠遠不夠的,有許多的組合從來沒有出現在訓練數據當中過。但這些沒有出現過的,並不代表它們的實際概率爲0,只是在訓練數據中的概率爲0而已。爲了解決這個問題,我們會用一個很小的概率去代替0,比如0.0001。這個操作叫做language model smooting。這個smooting的方法也有非常多的變形,這裏不展開去講了。
ch1-7-1

3 Continuous LM

在進入深度學習之前,有人還想出了另一種方法來解決這個訓練集不夠的問題,那就是借用推薦算法MF(Matrix Factorization)。

什麼是MF呢?比如我們現在有A、B、C、D、E五個用戶,分別在某個動漫網站上對四個動漫人物打了分。B對第2個人物還沒有打分,但他對第一個人物打分了。那麼,其實我們可以根據其他用戶的打分行爲來推斷B會對第2個人物打幾分。我們發現喜歡第1個人物的用戶,通常也會喜歡第2個人物,故我們覺得B可能對第2個人物會打5分。

當然,這個只是拍拍腦袋想象的,MF就可以用數學的方法,幫我們把下面這張表格的空格給填滿。
ch1-7-2
在把MF應用到LM的的時候,我們的橫軸和縱軸都會變成vocabulary中的所有單詞,而中間的表格就表示橫軸的單詞後面接縱軸的單詞在訓練集中的頻數。比如下圖中的n11=2n_{11}=2就表示"dog"後面接"ran"出現了2次。

然後每一個橫軸的單詞都用一個特徵向量hih^i來表示,每一個縱軸的單詞都用一個不同的特徵向量vjv^j來表示。我們會試圖用vjhiv^j \cdot h^i來逼近njin_{ji}vjv^jhih^i都是可以學習的。
ch1-7-3
逼近的方法,就是通過最小化下面這個loss來計算出所有的vjv^jhih^i

Minimize: L=i,j(vjhinj,i)2 Minimize:\ L = \sum_{i,j}(v^j \cdot h^i - n_{j,i})^2

通過這樣學習得到的vjv^jhih^i就表示了每個單詞的一些特徵,當我們要去計算在訓練集裏沒有出現過的nj,in_{j,i}時,就可以直接用vjhiv^j \cdot h^i的方法。這種通過學習的方法,比直接統計要靠譜很多。

3 NN-based LM

這種矩陣相乘的形式,當然時可以轉換成神經網絡的形式的,稍稍變形就可以變成幾個全連接搞定的神經網絡,如下圖所示。輸入是一個one-hot encoding過的向量,其中的全連接權重就是hih^ivjv^j,目標就是我們的nj,in_{j,i}
ch1-7-4
那這樣的模型如何訓練呢?訓練方法其實和n-gram 差不多,就是輸入幾個單詞,讓模型去預測下一個單詞是什麼。
ch1-7-5
有了這樣的模型,就可以去計算P(Y)了。下圖是一個示意圖。
ch1-7-6

4 RNN-based LM

NN-based LM用的都是全連接,所以當我們想要看非常長的句子時,也就是n-gram中的n非常大時,網絡就會變得異常大,沒有錢或者硬件是跑不起來的。爲了減少資源的消耗,我們可以引入RNN,用RNN的最後一個hidden state去和vjv^j相乘。
ch1-7-7
這裏用到的RNN可以非常複雜,但是一般只需要用LSTM就可以了。

5 合併LAS和LM

我們知道怎麼train這個LM了之後,怎麼把它結合到LAS裏呢?方法也有很多種,下面來一一介紹。

5.1 shallow fusion

shallow fusion就是說,我們已經有了train好的LM和train好的LAS,然後在做decoding的時候,每個time step它們都會輸出一個維度和詞表大小一樣的概率向量,把這兩個向量加權求和作爲最終的概率向量。然後不斷這樣循環下去就可以了。
ch1-7-8

5.2 deep fusion

deep fusion和shallow fusion的不同之處在於,它會把LM和LAS的hidden state塞進一個神經網絡裏去進行融合。這個額外的神經網絡是需要train出來的,也就是說我們有一個train好的LM和train好的LAS之後,還要把這兩者接進一個network中,再去train一發。

這樣做帶來的弊端就是,我們沒法隨意更換LM模型,一旦更換了就需要重新train一發。如果我們要對每個用戶做一個針對性的LM,那這個方法就行不通了。
ch1-7-9
不過也有辦法可以換了LM而不重新train這個network,那就是用LM的輸出概率作爲network的輸入。
ch1-7-10

5.3 cold fusion

最後再來將一個cold fusion,cold fusion其實結構上和deep fushion長的一模一樣,只不過,cold fusion當中,我們的LAS是沒有train好的,需要接上之後去end-to-end的訓練的。這樣的做法,可以讓LAS收斂得更快。
ch1-7-11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章