在機器學習領域,語言識別和圖像識別都不太須要預處理就能餵給計算機,語音識別的輸入數據能夠是音頻頻譜序列向量所構成的矩陣,圖像識別的輸入數據是像素點向量構成的矩陣。可是文本是一種抽象的東西,顯然不能直接把文本數據餵給機器當作輸入,所以這裏就須要對文本數據進行處理。html
語言模型是對一段文本的機率進行估計即針對文本\(X\),計算\(P(X)\)的機率,對信息檢索,機器翻譯,語音識別等任務有着重要的做用。語言模型分爲統計語言模型和神經網絡語言模型。算法
要判斷一段文字是否是一句天然語言,能夠經過肯定這段文字的機率分佈來表示其存在的可能性。語言模型中的詞是有順序的,給定m個詞看這句話是否是一句合理的天然語言,關鍵是看這些詞的排列順序是否是正確的。因此統計語言模型的基本思想是計算條件機率。網絡
輸入:\(X=(x_1,x_2,...,x_m)\)機器學習
輸出:\(P(X)\)的機率分佈式
\[ P(X)=P(x_1,x_2,x_3...,x_m)=P(x_2|x_1)P(x_3|x_1,x_2)...P(x_m|x_1,x_2,...x_{m-1}) \]
以上公式就是語言模型的基本定義。這個公式有2個問題。學習
假設有句子\((x_1,x_2,x_3,x_4,x_5,x_6)\)
\[ P(x_6|x_1,x_2,x_3,x_4,x_5)=\frac{count(x_1,x_2,x_3,x_4,x_5,x_6)}{count(x_1,x_2,x_3,x_4,x_5)} \]spa
假定字符串中字符所有來自與大小爲\(V\)的詞典,上述例子中咱們須要計算全部的條件機率,對於全部的條件機率,這裏的\(x\)都有\(V\)種取值,那麼實際上這個模型的自由參數數目量級是\(V^6\),6爲字符串的長度。
從上面能夠看出,模型的自由參數是隨着字符串長度的增長而指數級暴增的,這使咱們幾乎不可能正確的估計出這些參數。翻譯
從上面能夠看到,每個\(x\)都具備\(V\)種取值,這樣構造出了很是多的詞對,但實際中訓練語料是不會出現這麼多種組合的,那麼依據最大似然估計,最終獲得的機率實際是極可能是0。code
你們已經知道了語言模型的定義,那首先會遇到一個問題,上面這個公式遇到長句子時計算最後一個詞的機率\(P(x_m|x_1,x_2,...x_{m-1})\)會變得很是的麻煩,那咱們是否是能夠進行必定的簡化呢?設想一下這句話「今每天氣真是不錯,如今感受有點餓,咱們去吃飯吧!」當咱們預測P("吃飯")的機率時,感受和最前面描述天氣的關係不是很大,而是和比較近的「有點餓」聯繫比較緊密。因此咱們根據一個詞會和它附近的詞聯繫比較緊密,那咱們就能夠簡化語言模型的機率公式了。orm
假設咱們定義一個詞的機率和它前面的k個詞相關,公式改寫以下:
\[ P(x_i|x_1,x_2,...x_{i-1})=P(x_i|x_{i-(k-1)},...,x_{i-1}) \]
\[ P(X)=\prod_{i=1}^mP(x_i|x_{i-(k-1)},...,x_{i-1}) \]
從模型的效果來看,理論上\(n\)的取值越大,效果越好。但隨着\(n\)取值的增長,效果提高的幅度是在降低的。同時還涉及到一個可靠性和可區別性的問題,參數越多,可區別性越好,但同時單個參數的實例變少從而下降了可靠性。
N-gram比較好解決了自由參數多的問題,可是數據稀疏的問題仍是沒有唄解決。
假設有一個詞組在訓練語料中沒有出現過,那麼它的頻次就爲0,但實際上能不能認爲它出現的機率爲0呢?顯然不能夠,咱們沒法保證訓練語料的完備性。那麼,解決的方法是什麼?若是咱們默認每個詞組都出現1次呢,不管詞組出現的頻次是多少,都往上加1,這就可以解決機率爲0的問題了。
\[ P(x_6|x_1,x_2,x_3,x_4,x_5)=\frac{count(x_1,x_2,x_3,x_4,x_5,x_6) + 1}{count(x_1,x_2,x_3,x_4,x_5) + 1} \]
神經網絡語言模型的提出解決了N-gram模型當\(n\)較大時會發生數據稀疏的問題。與N-gram語言模型相同,神經網絡語言模型(NNLM)也是對\(n\)元語言模型進行建模,估計\(P(x_i|x_{i-n+1},x_{i-n+2},...x_{i-1})\)的機率,與統計語言模型不一樣的是,神經網絡語言模型不經過計數的方法對\(n\)元條件機率進行估計,而是直接經過一個神經網絡對其建模求解。
神經網絡語言模型的結構入上圖所示,能夠分爲輸入層、投影層、隱藏層和輸出層
即便使用了神經網絡語言模型,本質上仍然是N元語言模型,就是你要預測的當前詞只和他前面的N-1個詞有關,與更前面的詞無關。儘管神經網絡這種方法必定程度上解決了數據稀疏的問題,但仍是損失了一些信息。若是想要學習前面全部的的詞就要涉及s到天然語言處理中的循環神經網絡(RNN),咱們都知道,循環神經網絡的定義是當前的輸出不只和當前的輸入有關,還和上一時刻的隱藏層的輸出有關,這樣講神經網絡展開後就會發現他把序列從開頭到結尾全連起來了,十分方便處理序列數據,而這個性質正是咱們作語言模型所須要的。