詞向量的Distributed Representation與n元語法模型(n-gram model)
所謂的word vector,就是指將單詞向量化,將某個單詞用特定的向量來表示。將單詞轉化成對應的向量以後,就可以將其應用於各種機器學習的演算法中去。一般來講,詞向量主要有兩種形式,分別是稀疏向量和密集向量。
所謂稀疏向量,又稱為one-hot representation,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小N,向量的分量只有一個1,其他全為0,1的位置對應該詞在詞典中的索引[1]。舉例來說,如果有一個詞典[“麵條”,”方便麵”,”獅子”],那麼“麵條”對應的詞向量就是[1,0,0],“方便麵”對應的詞向量就是[0,1,0]。這種表示方法不需要繁瑣的計算,簡單易得,但是缺點也不少,比如長度過長(這會引發維數災難),以及無法體現出近義詞之間的關係,比如“麵條”和“方便麵”顯然有非常緊密的關係,但轉化成向量[1,0,0]和[0,1,0]以後,就看不出兩者有什麼關係了,因為這兩個向量相互正交。當然了,用這種稀疏向量求和來表示文件向量效果還不錯,清華的長文字分類工具THUCTC使用的就是此種表示方法
至於密集向量,又稱distributed representation,即分散式表示。最早由Hinton提出,可以克服one-hot representation的上述缺點,基本思路是通過訓練將每個詞對映成一個固定長度的短向量,所有這些向量就構成一個詞向量空間,每一個向量可視為該空間上的一個點[1]。此時向量長度可以自由選擇,與詞典規模無關。這是非常大的優勢。還是用之前的例子[“麵條”,”方便麵”,”獅子”],經過訓練後,“麵條”對應的向量可能是[1,0,1,1,0],而“方便麵”對應的可能是[1,0,1,0,0],而“獅子”對應的可能是[0,1,0,0,1]。這樣“麵條”向量乘“方便麵”=2,而“麵條”向量乘“獅子”=0 。這樣就體現出麵條與方便麵之間的關係更加緊密,而與獅子就沒什麼關係了。這種表示方式更精準的表現出近義詞之間的關係,比之稀疏向量優勢很明顯。可以說這是深度學習在NLP領域的第一個運用(雖然我覺得並沒深到哪裡去)
回過頭來看word2vec,其實word2vec做的事情很簡單,大致來說,就是構建了一個多層神經網路,然後在給定文字中獲取對應的輸入和輸出,在訓練過程中不斷修正神經網路中的引數,最後得到詞向量。
word2vec的語言模型
所謂的語言模型,就是指對自然語言進行假設和建模,使得能夠用計算機能夠理解的方式來表達自然語言。word2vec採用的是n元語法模型(n-gram model),即假設一個詞只與周圍n個詞有關,而與文字中的其他詞無關。這種模型構建簡單直接,當然也有後續的各種平滑方法[2],這裡就不展開了。
現在就可以引出其他資料中經常提到的CBOW模型和skip-gram模型了。其實這兩個模型非常相似,核心部分程式碼甚至是可以共用的。CBOW模型能夠根據輸入周圍n-1個詞來預測出這個詞本身