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的詞向量只是攜帶的大量語義、語法信息的怪胎。
