前言

在深度學習興起之前,NLP領域一直是統計模型的天下,例如詞對齊演算法GIZA++,統計機器翻譯開源框架MOSES等等。在語言模型方向,n-gram是當時最為流行的語言模型方法。一個最為常用的n-gram方法是回退(backoff) n-gram,因為n值較大時容易產生特別稀疏的數據,這時候 回退n-gram會使用(n-1)-gram的值代替n-gram。

n-gram的問題是其捕捉句子中長期依賴的能力非常有限,解決這個問題的策略有cache模型和class-based模型,但是提升有限。另外n-gram演算法過於簡單,其是否有能力取得令人信服的效果的確要打一個大的問號。

一個更早的使用神經網路進行語言模型學習的策略是Bengio團隊的使用前饋神經網路進行學習[2]。他們要求輸入的數據由固定的長度,從另一個角度看它就是一個使用神經網路編碼的n-gram模型,也無法解決長期依賴問題。基於這個問題,這篇文章使用了RNN作為語言模型的學習框架。

這篇文章介紹了如何使用RNN構建語言模型,至此揭開了循環神經語言模型的篇章。由於演算法比較簡單,這裡多介紹一些實驗中使用的一些trick,例如動態測試過程等,希望能對你以後的實驗設計有所幫助。(TODO:待之後對神經語言模型有系統的了解後,考慮將本文融合進綜述的文章中)

1. 演算法介紹

1.1 RNN

這篇文章中使用了最簡單的RNN版本,而現在市場上普遍選擇LSTM,GRU甚至NAS等具有捕捉更長時間長期依賴的節點。在RNN中,第 t 個時間片 x(t) 讀取的是 t-1 時刻的狀態 s(t-1)t 時刻的數據 w(t)w(t)t 時刻單詞的one-hot編碼,單詞量在3萬-20萬之間; s(t-1)t-1 時刻的隱藏層狀態,實驗中隱層節點數一般是30-500個, t=0 時使用0.1進行初始化。上面過程表示為:

x(t) = w(t) + s(t-1) 	ag1

t 時刻的隱藏層狀態是 x(t) 經過sigmoid激活函數 f 得到的值,其中 u_{ji} 是權值矩陣:

s_j(t) = f(sum_i x_i(t)u_{ji}) 	ag2

有的時候我們需要在每個時間片有一個輸出,只需要在隱層節點 s_j(t) 處添加一個softmax激活函數 g 即可:

y_k(t)= g(sum_j s_j(t)v_{kj}) 	ag3

1.2 訓練數據

訓練語言模型的數據是不需要人工標註的,我們要做的就是尋找大量的單語言數據即可。在製作訓練數據和訓練標籤時,我們通過取第 0t-1 時刻的單詞作為網路輸入,第 t 時刻的單詞作為標籤值。

由於輸出使用了softmax激活函數,所以損失函數的計算使用的是交叉熵,輸出層的誤差向量為:

	ext{error}(t) = 	ext{desired}(t) - y(t) 	ag4

上式中 	ext{desired}(t) 是one-hot編碼的模型預測值, y(t) 是標籤值。不知道上式的得來的同學自行搜索交叉熵的更新的推導公式,此處不再贅述。更新過程使用標準的SGD即可。

1.3 訓練細節

初始化:使用的是均值為0,方差為0.1的高斯分布進行初始化。

學習率:初始值為0.1,當模型在驗證集上的精度不再提升時將學習率減半,一般10-20個Epoch之後模型就收斂了。

正則:即使採用過大的隱藏層,網路也不會過度訓練,並且實驗結果表明添加正則項不會很有幫助。

動態模型:常見的機器/深度學習在測試的時候測試數據並不會用來更新模型。在這篇文章中作者認為測試數據也應該參與到模型的更新中,例如在測試數據中反覆出現的一個人名等這種類似的情況,作者將這種情況叫做動態模型。實驗結果表明動態模型可以大大降低困惑度。

稀有(rare)類:為了提高模型的能力,作者將低於閾值的詞合併到rare類中,詞概率的計算方式如下:

P(w_i(t+1)|w(t), s(t-1))= left{ egin{array}{} frac{y_{rare}(t)}{C_{rare}} & 	ext{if } w_i(t+1)	ext{ is rare}\ y_i(t) & 	ext{otherwise} end{array} 
ight. 	ag5

其中 C_{rare} 是詞表中詞頻低於閾值的單詞的個數,所有的低頻次都被平等對待,即它們的概率分布是均等的。

2. 總結

2019年的側重點將會轉移到NLP方向,首先拿一篇經典的RNN語言模型進行一下預熱。畢竟發表在2010年,這篇文章的演算法非常簡單,RNN的效果必定不如LSTM或者GRU等,順序語言模型也不如掩碼語言模型能捕捉更多的上下文信息。這裡只算拋磚引玉,在之後的文章中我們將介紹更多效果更好的語言模型。

Reference

[1] Mikolov T, Karafiát M, Burget L, et al. Recurrent neural network based language model[C]//Eleventh Annual Conference of the International Speech Communication Association. 2010.

[2] Bengio Y, Ducharme R, Vincent P, et al. A neural probabilistic language model[J]. Journal of machine learning research, 2003, 3(Feb): 1137-1155.


推薦閱讀:
相关文章