1. 程式人生 > >NLP學習筆記(1)-詞向量與語言模型

NLP學習筆記(1)-詞向量與語言模型

閱讀的第一篇詞向量相關的文獻是Tomas Mikolov 2013年的論文,其中提到了Bengio在2003的經典文章。經過一番努力,粗略的學習了這兩篇文獻,並查閱了相關的資料,現簡單整理如下:
1、詞向量
作為NLP的初學者,遇到的第一個難以理解的概念就是詞向量(“Word Representation”或“Word Embedding”)。通俗的來說,詞向量就是用一個向量來表示一個詞,進而研究詞之間的相似性或者說“距離”等特徵。一種名為One-hot Representation的方法把每個詞均表示為一個很長的向量。(向量的維度是詞表大小,其中絕大多數元素為 0,只有一個維度的值為 1)該方法存在一個重要的問題就是“詞彙鴻溝”現象:任意兩個詞之間都是孤立的。光從兩個向量中看不出兩個詞是否有關係,即“距離”難以度量。另一種Distributed Representation方法形如:[0.792, −0.177, −0.107, 0.109, −0.542, …]能更好的表示向量間的距離,按[1]中所述,通常意義上的詞向量都是指該種方法表示的。(貌似還有一種“Distributional Representation”的表示方法,大概是基於統計生成的詞向量,不太懂。。)
回到語言模型的應用,詞向量的維度一般都是相等的,所以可以用矩陣來表示,進而可以通過矩陣變換來得到詞的概率分佈。語言模型的訓練過程其實也是詞向量的訓練過程,接下來討論語言模型。
2、語言模型
統計語言模型(Statistical Language Model)是自然語言處理(NLP)中非常重要的一部分。如何判斷一個句子是否合理,[2]中表述為句子產生的可能性大小,而可能性用概率來衡量,語言模型即是用來估計這個概率的。總結其形式化定義:給定一個字串S,估計它是自然語言的概率 P(w1,w2,…,wt),其中w1 到 wt 依次表示這句話中的各個詞,依據貝葉斯定理,有:P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1),此處引入馬爾可夫假設:任意一個詞wi出現的概率僅與它前面的詞wi-1相關,即S的計算簡化為二元模型。在[1]、[2]中均對模型的訓練、零概率問題和平滑方法做了介紹。[5]中對N-gram模型及神經網路模型做出了詳細介紹(還沒看完。。)
圖1 通常的三層神經網路模型

3、Bengio的經典模型
Bengio使用前饋神經網路Feedforward Neural Net Language Model (NNLM),訓練目標是得到模型f,使得
這裡寫圖片描述
圖2 Bengio 的神經網路結構示意圖(來自原文)
Bengio 使用一個三層的神經網路:第一層(輸入層)是將 C(wt−n+1),…,C(wt−2),C(wt−1) 這 n−1 個向量首尾相接拼起來,形成一個 (n−1)m 維的向量,記為 x。第二層(隱藏層)就使用偏置項d+Hx計算得到,之後使用 tanh 作為啟用函式。第三層(輸出層)一共有 |V| 個節點,每個節點 yi 表示下一個詞為 i 的log 形概率。最後使用 softmax 啟用函式將輸出值 y 歸一化成概率。最終,y 的計算公式為:y=b+Wx+Utanh(d+Hx) U是一個 |V|×h 的矩陣,是隱藏層到輸出層的引數,整個模型的多數計算集中在 U 和隱藏層的矩陣乘法中,這也是Tomas改進的原因。值得一提的是,這樣訓練出的模型和詞向量無需平滑。
PS:不得不說,這篇文章還是比較難理解的,後面的優化過程和梯度上升過程還沒有理解透徹,許多細節的地方仍需進一步學習。
4、Tomas Mikolov的改進工作
考慮Bengio用遞迴的神經網路訓練詞向量的方法,雖然原理簡單(額,原文如此,我不覺得簡單)、魯棒性高,但計算複雜度較高,對詞表大小、訓練語料規模都有限制。為此提出一種可以用於從大量資料集高效學習高質量詞向量的方法:log-bilinear模型。作者首先介紹了前饋神經網路模型NNLM(在輸出層使用Huffman樹提高效率),遞迴神經網路模型RNNLM以及並行訓練的神經網路(使用DistBelief工具),之後提出了一種New Log-linear Models。前文說過,大量的計算都消耗在非線性的隱含層,因此作者去除了隱含層以提高效率。此外,作者還將詞向量計算與神經網路模型的訓練分開進行。
這裡寫圖片描述


圖3 改進的神經網路結構示意圖(來自原文)
根據上下文來輸出當前詞語的CBOW和依據當前詞語來輸出網路上下文的Skip-gram模型。去除隱含層後,作者將N個詞語都投影到一個D維向量上(貌似是加和平均)。測試部分中,作者設計了一個非常有趣的任務:D(biggest)-D(big)+D(small)=D(smallest),並且比較了準確率:RNNLM