詞向量概況


Reference:http://licstar.net/archives/328比較綜合的詞向量研究現狀分析)

序:為什么NLP在模式識別里面比較難?

Licstar的文章開頭這么提到:語言(詞、句子、篇章等)屬於人類認知過程中產生的高層認知抽象實體,而語音和圖像屬於較為底層的原始輸入信號

語音、圖像數據表達不需要特殊的編碼,而且有天生的順序性和關聯性,近似的數字會被認為是近似特征。然而語言就麻煩了。

比如通俗的One-hot Representation就是一種不是很好的編碼方式,編出來的數據比圖像、語音的信號表達方式差很多。

還可以對比的是:統計數據。為什么數據挖掘模型簡單?因為統計數據是人工build出來的,特征維度特低,是經過人腦這個大殺器提煉出來的超濃縮特征。

所以數據挖掘不需要深度學習啊,特征提取啊什么的,而且也沒法這么做。大數據下,你跑個十幾層的神經網絡試試?

問題:語序不分

在NLP中,表達一個句子很簡單。比如CV loves NLP,只要我們對所有單詞建立一個詞庫。

那么CV loves NLP 可以表示成二進制編碼[0,1,0,0,0,1,0,0,1],即出現的詞是1,不出現為0。

這就是著名的One-hot Representation特征表示法,用它能完成NLP中的很多任務,然而就這么滿足了?

那么問題來了,NLP loves CV和CV loves NLP不是一坨了?這是致命問題之一:語序

問題:維度過高

通常一個詞庫的大小是10^5,如果繼續用二進制編碼。那么一個句子的維度是10^5。

要知道,AlexNet的一張圖片維度才256*256=65536, 就得拿GPU算好久,10^5基本得完蛋了。

實際上,10^5里,大部分都是維度都是廢的,真正有用的特征就藏在那么幾個維度中。

這說明,One-hot Representation表達的特征維度過高,需要降維。然而,這還不是最坑爹的缺陷。

Bengio在2003年的A neural probabilistic language model中指出,維度過高,導致每次學習,都會強制改變大部分參數。

由此發生蝴蝶效應,本來很好的參數,可能就因為一個小小傳播誤差,就改的亂七八糟。

實際上,傳統MLP網絡就是犯了這個錯誤,1D全連接的神經元控制了太多參數,不利於學習到稀疏特征。

CNN網絡,2D全連接的神經元則控制了局部感受野,有利於解離出稀疏特征。

問題:詞之間的關聯性

吳軍博士寫的《數學之美》里面科普了著名的N-Gram模型(N元模型)。

在一個句子當中,一個單詞的T出現的概率,和其前N個單詞是有關的。$P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$

當然數學之美中並沒有提及詞向量,早期的N-Gram模型是用來求解一個句子的信度的。

即:把每個單詞的概率連乘,誰的概率大,哪個句子就可信。$\max\prod _{t=1}^{T}P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$

為了計算$P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$,最簡單的是基於詞頻統計計算聯合概率。

麻煩之處,在於低頻詞概率過小,甚至為0,導致模型不平滑。

於是,最先提出來的卡茨退避法用於人工修正出平滑模型,放在今天,略顯笨拙。

因為我們有強大的基於統計模型的Adaptive Perception的神經網絡。

研究:詞頻統計模型·【降維】(參考自Stanford CS224d Deep Learning for NLP課程)

• I like deep learning.
• I like NLP.
• I enjoy flying.

假設有這么3個句子成為我們的語料庫,並且我們注意到了詞之間關聯性問題。

使用一種新的編碼來形成一個離散統計矩陣,取上下文關聯詞數目=1。

統計 I  

like  enjoy deep learning NLP flying .
I 0 2 1 0 0 0 0 0
like 2 0 0 1 0 1 0 0
enjoy 1 0 0 0 0 0 1 0
deep 0 1 0 0 1 0 0 0
learning 0 0 0 1 0 0 0 1
NLP 0 1 0 0 0 0 0 1
flying 0 0 1 0 0 0 0 1
. 0 0 0 0 1 1 1 0

 

 

 

 

 

 

 

 

 

對這個矩陣進行SVD奇異值分解后,得到三個矩陣U陣(n*r)、S陣(r*r)、VT陣(r*m)

傳統的PCA使用的是特征值分解來降維,比較麻煩。

其實奇異值分解SVD也可以。若要用奇異值降維,則取U陣即可,n為數據個數,r為降維的新維度。

Python中代碼如下:

將U陣前兩維度畫出來之后,大概是這個樣子

可以看到,從9維降到2維之后,一些語意、語法比較近的詞被聚在了一起。

這說明,詞向量的特征可以控制在較低的維度。

研究:詞向量模型·【神經網絡】

最早提出用神經網絡做NLP是華裔牛人徐偉(原Facebook,現百度IDL研究院),提出了NN訓練2-Gram的方法。

正式訓練N-Gram的模型由Bengio在2001&2003年提出,即前面的A neural probabilistic language model

其結構就是簡單的MLP網絡+Softmax回歸,有點今天DL味道。(早期MLP的輸出層是不用Softmax的)。

Bengio把訓練出來的詞向量稱之為Distributed Represention,對抗One-hot Representation。

在輸入層中,每個Word被定義成一個維度$|M|$ (100 or 200 or 300)固定的低維連續性向量。

在一個句子當中,跑到第$i$個詞時,把前n個詞向量連在一起,組成一個$|N|*|M|$的輸入向量。

在隱層中,將輸入映射到高層空間,並通過Sigmoid函數激活。

在輸出層,是一個大小為$|V|$的輸出層,V是整個詞庫大小(通常10^5)。

目標函數:$arg\max\limits_{Vec\&W}\sum _{t=1}^{T}logP(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$ ,  T一個句子中的詞數。

即基於前N個詞,預測當前詞,使得預測當前詞的Softmax概率分支最大:

$\max P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})=\frac{e^{W_{t}X+b_{t}}}{\sum_{i=1}^{V}e^{W_{i}X+b_{i}}}$

即需要訓練輸入層的詞向量參數,隱層的W&b,Softmax的W&b。

和傳統NN不同之處,除了多訓練詞向量之外,還多了輸入層到輸出層線性直連邊(Direct-Connected)。

原因是BP算法的通病:Gradient Vanish問題,誤差經過隱層到輸入層時候,梯度已經丟失太多,影響訓練速度,所以引入直連邊,加速訓練。

Bengio在當時論文中這么描述到 "然而並沒有什么卵用(it would not add anything useful)",不過,這個直連邊倒是催生了Word2Vec的誕生。

神經網絡方法訓練出來的$P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$自帶平滑,完全符合了Hinton提出的Adaptive Perception(自適應感知)原則。

視點:為什么神經網絡預測下一個詞就能訓練出詞向量?

其實下一個詞預測是否准確和詞向量訓練關系並不大。Licstar的文章后續介紹了Collobert&Weston的SENNA模型。

Collobert&Weston都是NLP和神經計算方面的年輕學者,Jason Weston還受邀在CS224d開了一節宣傳課,講他的Mermory Networks.

SENNA模型中,目標函數不再是預測下一個詞,而是換成了單個輸出神經元,正負采樣為下一個詞打分,做回歸分析。

顯然,最后神經網絡會訓練成,為合理句子打高分,不合理的句子打低分。結果,他們仍然訓練出了出色的詞向量。不過只是附帶品。

那么詞向量究竟和什么有關,答案是$Context$,即上下文。只要訓練模型中帶有上下文,那么網絡就會自動往訓練句子方向跑。如:

• I like CV
• I like NLP

在訓練I like NLP的時候,由於上下文關系,NLP的誤差修正會近似於CV的誤差修正。

這樣,CV和NLP這兩個語法相近的詞,會被無監督的聚在一起。

Richard Socher在他的Deep Learning for NLP Leture4中說到:詞向量的訓練類似於深度學習中的Pre-Training,

詞向量本身可以看成是個PCA,這個PCA還能自我學習,自我學習的PCA不就是RBM&AutoEncoder嗎?可以參考這篇科普

為什么可以看成是Pre-Training,而不是放到實際分類&回歸模型中訓練的原因,他舉了下面這個例子:

•假定:訓練一個二分類模型,語料來源:電影評論,任務:分析評論的情感

•情況:訓練集負類中出現TV、telly,測試集中負類出現television (估計評論者是想罵:這電影怎么垃圾得就像電視劇一樣)

左圖是詞向量無監督Pre-training后,再監督Fine-Tuning的測試結果,右圖則是直接Train。

盡管television沒有參加分類訓練,但是由於其預訓練的詞向量和telly、TV比較近,所以容易被分對。

這就是為什么詞向量方法是屬於Deep Learning陣營的原因。

研究:只為詞向量而生的線性學習Word2Vec模型

Richard Socher在他的Deep Learning for NLP Leture4提到,單獨訓練詞向量的另一個原因就是詞庫$|V|$過大。

不適合在NLP任務中計算。實際上,詞向量訓練作為Pre-Training部分,最較特殊的地方在於其輸入是可訓練的。

對於一般的固定輸入的模式識別問題,裸線性神經網絡模型(Logistic&Softmax回歸)早已被廢棄多年,因為還不如KNN。

原因是,除了一些統計數據,基本很少有數據是呈線性相關的,必須加上隱層(或支持向量)獲得處理非線性數據能力。

但是詞向量的輸入可變,也就是說,我用線性模型,肯定有誤差,要是順着誤差把輸入也給一鍋端了。

那么輸入數據會被強制修改成線性相關,這是Bengio當年沒有想到的,因為當初大家都認為非線性模型訓練出來的參數好。

Google的Tomas Mikolov就發現了這一點,將Bengio模型中的隱層移除,結果得出來向量呈大量線性相關。

於是有了下面的神奇之處:$Vec(King)-Vec(Man)+Vec(Woman)\approx Vec(Queen)$

如果把線性的詞向量輸入到超級非線性的神經網絡會怎么樣?實際上這是非常贊的一件事。

因為即便是神經網絡,基本計算也不過是輸入間乘以W再加加減減,沒有必要把輸入卡成多么復雜的非線性奇葩。

線性就好,非線性部分應當交給神經網絡去做,這樣兼顧了速度和精度。

這樣的流程大概就是:詞向量線性Pre-Traning=>神經網絡非線性Pre-Traning=>神經網絡Fine-Tuning

視點:Word2Vec的缺陷

Word2Vec對Bengio的模型做的第二個改動,就是取消了詞向量拼接,作為神經網絡的輸入。

在CBOW中: $P(W_{t}|W_{{\tilde{x}}})$ ,即用窗口邊緣詞的求和平均去預測中心詞

在Skip-Gram中:$\sum_{-c<=j<=c,j\neq 0}P(W_{t+j}|W_{t})$,即用窗口中心詞預測窗口邊緣詞

這兩種做法,都忽視了輸入的空間順序,造成一個窗口內的所有詞,詞序是等價的。

也就是說,Word2Vec的詞向量只是攜帶的大量語義、語法信息的怪胎。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM