1. 引入
語言模型是兩種系統的基礎
- 語音識別系統
- 機器翻譯系統
所謂語言模型,能夠告訴你,某個特定的句子(序列),出現的概率是多少。
舉個例子,假設一個人說了一句話,這句話可能是如下兩種文本中的一種
- The apple and pair salad.
- The apple and pear salad.
你覺得這個人說的是1的可能性大,還是2的可能性大?
語言模型能給你這兩句話各自的可能性,p(text1)=0.002, p(text1)=0.003。所以是2的可能性更高。
2. 語言模型的構建過程
- Tokenize
首先,我們得有corpus(語料),就是大量的文本數據。
然後,我們要做Tokenize:建立一個字典,將每個單詞都轉化成對應的one-hot向量。
如果你需要模型能準確識別句子結尾,那你還需要定義句子的結尾,一般用EOS(end of sentence)。
如果句子中有些詞並沒有在你的字典中出現過,那你就可以把這個單詞替換爲UNK(unique token),即代表未知詞。
- 構建RNN
假設輸入的文本爲:
- Cats average 15 hours of sleep a day.
(1)在第0個時刻,輸入向量(x<1>)爲0向量,對應的輸入a<0>也爲0向量,輸出層用一個softmax來輸出概率。他只是預測第一個詞的概率,而不去管結果是什麼。這個步驟在下圖的1處表示。
(2)接下來的時刻,我們告訴模型,第一個詞是Cats(把Cats的向量作爲輸入),讓模型告訴我們Cats後面應該接一個什麼詞,也就是此時y<2>=p(average|Cats)。這個步驟在下圖的2處表示
(3)接下來的時刻,y<3> = p(?|“Cats average”)
(4)接下來每個步驟的RNN,都會考慮前面出現過的詞
爲了訓練RNN,我們要定義Cost Function,即下圖的3處的公式。有hat的符號,表示預測值。
3. 一些細節
- RNN模型訓練時,需要知道y<2>=p(average|Cats),就是條件概率(Cats出現時,後面出現average的概率),那這個條件概率怎麼計算呢?
- 可以在語料中,直接統計而得到,這也是我們需要大量語料做模型訓練的原因
- 除了RNN,還有其他方法構建語言模型嗎?
- wikipedia上給出了一種直接用統計方法構建語言模型的方法
這是基於NGRAM的語言模型(概率)計算方式。要注意句子開頭會被看做一個字符,句子結束也會被看做一個字符。通過對語料中的單詞進行統計,就能算出各個單詞出現的條件概率。條件概率乘在一起,就能算出一個序列(一句話)的概率。
4. 總結
A statistical language model is a probability distribution over sequences of words. Given such a sequence, say of length m, it assigns a probability p(w1,w2,…,wm) to the whole sequence.
參考
- [1]. Andrew Ng. Sequence Model class
- [2]. https://en.wikipedia.org/wiki/Language_model
- [3]. 如何用python構建一個語言模型, https://nlpforhackers.io/language-models/