上節課學習了seq2seq模型如何用於語音識別,這節課我們將學習如何將語言模型加入到模型中
為什么需要語言模型
-
token sequence 的概率
- token sequence: \(Y=y_1,y_2,...,y_n\)
- \(P(y_1,y_2,...,y_n)\)
token 可以是字符、詞等等,可以見深度學習與人類語言處理-語音識別(part1)
HMM
在使用HMM進行語音識別時,\(P(Y)\)就是語言模型
LAS
在端到端的深度學習模型中,是在給定\(X\)的情況下找到最大的\(Y\),似乎沒有語言模型存在的空間,但神奇的是,我們可以直接把Decoding的式子寫為
從概率的角度來看,我們很難解釋這個式子的含義,乘個\(P(Y)\)干啥?但是為什么乘\(P(Y)\)有用呢,因為\(P(Y|X)\)和\(P(Y)\)的數據來源可以不同。具體來說\(P(Y|X)\)需要收集成對的數據,而\(P(Y)\)只需要收集大量的文本
成對數據和單獨的文本數據量差了多少呢?
google的語言識別系統使用了12500小時的聲音信號,包含的詞數:\(12500*60*130\)(60分鍾,每分鍾平均可以說130個詞),大約1億個詞
單純文本數據:BERT用了30億以上的詞
BERT數據是的語音數據的30倍,所以可以很容易的收集到大量文本數據,把\(P(Y)\)估的比較准,這就是為什么需要加入語言模型
N-gram
-
怎么估計一個token sequence 的概率?
-
直觀的想法,收集大量的數據,統計 \(y_1,y_2,...,y_n\)這個序列出現的次數,但人類的句子非常復雜,很可能句子沒有出現在訓練數據中,顯然不能因為句子沒有在訓練數據中出現就認為它出現的概率是0
-
N-gram語言模型:$$P\left(y_{1}, y_{2}, \ldots \ldots, y_{n}\right)=P\left(y_{1} | B O S\right) P\left(y_{2} | y_{1}\right) \ldots P\left(y_{n} | y_{n-1}\right)$$,就是二元語言模型,舉個栗子
\(P(“wreck a nice beach”) =P(wreck|START)P(a|wreck) P(nice|a)P(beach|nice)\)
計算\(P(beach|nice)\)的概率:
\[P(\text { beach } | \text { nice })=\frac{C(\text {nice beach})}{C(\text {nice})} \]N-gram 有什么問題?
訓練數據: the dog ran... the cat jumped...
估計新句子的概率:
\(P(\text { jumped } | \text { the }, \operatorname{dog})=0\)
\[P(\text { ran } | \text { the }, \text { cat })=0 \]這顯然是不合理的,只是因為出現的概率低,不能設置為0.這種情況需要進行平滑處理,例如add-1 smoothing, add-k smoothing,這個大家可以自行了解。
Continuous LM
除了傳統的自定義平滑規則,還有一種自動化的平滑方法,continuous LM
表格中數字表示詞數,例如\(Count(ran|dog)=3,Count(ran|cat)=3\), 值為0表示訓練數據中沒有出現,我們想估計它的實際值,我們來看看Continuous LM怎么做
每一個token有一個對應的向量,分別表示為\(h,v\), 代表詞的屬性,需要根據訓練集學習得到,假設表中數值用\(n\)表示,同時假設\(n\)可以由\(v,h\)的內積表示,例如
對應的損失函數:
\(n_{i j}\)是表中可以直接得到的, \(v^{i}, h^{j}\) 可以通過梯度下降求解
將\(v^{i} \cdot h^{j}\)表示估計到的對應詞匯被接在一起的概率
- 這樣做有什么好處?
假設“dog”和“cat”有某些同樣的屬性,就會得到相似的向量\(h^{dog}\)和\(h^{cat}\), 如果訓練數據中已經知道“cat”通常會接“jumped”,也就是 \(v^{jumped} \cdot h ^{cat}\) 很大,那對應的$ v^{jumped} \cdot h ^{dog}$也會很大, 可以看到這是可以通過學習得到的語言模型平滑方法
看到這里熟悉word2vec的同學會發現這有點像啊,我們來看看他們之間有什么聯系?
我們具體看下continuous LM的學習過程
我們希望\(h,v\)相乘后結果和目標越接近越好
我們可以把這個看作是一個簡單神經網絡,只有一個隱層,沒有激活函數。把h當做參數,輸入是one-hot,就得到了下面的樣子
NN-based LM
我們將上面的模型拓展更深,就是NN-based 語言模型
- training
data:
潮水 退了 就 知道 誰 ...
不爽 不要 買 ...
假設使用NN代替一個tri-gram語言模型,就是輸入前兩個單詞,預測下一個
同樣的,如果是一個二元語言模型,也可以用NN來代替
\(P(“wreck a nice beach”) =P(wreck|START)P(a|wreck)P(nice|a)P(beach|nice)\)
\(P(b|a)\):NN 預測下一個詞的概率
訓練如下
實際上NNLM(2003)比continuous LM(2010)出現的還早,只是在語音領域沒有引起重視,后來才被挖出來
RNN-based LM
看很長的history決定下一個詞,如果用NN的話,輸入會非常長,需要非常多的參數,所以引入一個RNN,將歷史詞輸入到RNN,用Ht表示,在乘以每個詞對應的v輸出下一個詞對應的概率
How to use LM to improve LAS
先說幾個整合方法怎么做:
-
shallow fusion
分別訓練LM和LAS,訓練好后將各自的輸出接到一起,整合
-
deep fusion
分別訓練LM和LAS,訓練好后將各自的隱層接到一起,整合
-
cold fusion
先訓練LM,再將LM的隱層接到LAS進行訓練
Shallow Fusion
Deep Fusion
隱層被接到一起,在訓練一個Network進行輸出
將隱層接到一起的缺點在於:如果LM改變了,network需要重新訓練
Cold Fusion
由於LM已經被訓練號,LM的收斂會比較快
缺點在於:如果LM改變了,network需要重新訓練
這節課就到這里了,下節課我們將學習語音合成。
references: