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

上節課學習了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語言模型:$$Pleft(y_{1}, y_{2}, ldots ldots, y_{n}right)=Pleft(y_{1} | B O Sright) Pleft(y_{2} | y_{1}right) ldots Pleft(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} ldotsend{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