深度學習與人類語言處理-語言模型


上節課學習了seq2seq模型如何用於語音識別,這節課我們將學習如何將語言模型加入到模型中


為什么需要語言模型

HMM

\[\begin{equation}\mathrm{Y}^{*}=\arg \max _{\mathrm{Y}} P(X | \mathrm{Y}) P(\mathrm{Y})\end{equation} \]

在使用HMM進行語音識別時,\(P(Y)\)就是語言模型

LAS

\[\begin{equation}Y^{*}=\arg \max _{Y} P(Y | X)\end{equation} \]

在端到端的深度學習模型中,是在給定\(X\)的情況下找到最大的\(Y\),似乎沒有語言模型存在的空間,但神奇的是,我們可以直接把Decoding的式子寫為

\[\begin{equation}Y^{*}=\arg \max _{Y} P(Y | X)P(Y)\end{equation} \]

從概率的角度來看,我們很難解釋這個式子的含義,乘個\(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\)的內積表示,例如

\[\begin{array}{l}n_{12}=v^{1} \cdot h^{2} \\n_{21}=v^{2} \cdot h^{1} \ldots\end{array} \]

對應的損失函數:

\[L=\sum_{(i, j)}\left(v^{i} \cdot h^{j}-n_{i j}\right)^{2} \]

\(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:

http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM