一直以來感覺好多地方都吧Word Embedding和word2vec混起來一起說,所以導致對這倆的區別不是很清楚。
其實簡單說來就是word embedding包含了word2vec,word2vec是word embedding的一種,將詞用向量表示。
1.最簡單的word embedding是把詞進行基於詞袋(BOW)的One-Hot表示。這種方法,沒有語義上的理解。把詞匯表中的詞排成一列,對於某個單詞 A,如果它出現在上述詞匯序列中的位置為 k,那么它的向量表示就是“第 k 位為1,其他位置都為0 ”的一個向量。但是這種表示方法學習不到單詞之間的關系(位置、語義),並且如果文檔中有很多詞,詞向量可能會很長。對於這兩個問題,第一個問題的解決方式是ngram,但是計算量很大,第二個問題可以通過共現矩陣(Cocurrence matrix)解決,但還是面臨維度災難,所以還需降維。
2.現在較常用的方法就是通過word2vec訓練詞匯,將詞匯用向量表示。該模型涉及兩種算法:CBOW和Skip-Gram。
這種方法我們可以發現在語義理解上效果比較好,可以將我們語義上相似的詞用相似的向量表示,但是有個缺點,同一個詞只有一種語義,如:我喜歡吃蘋果 很多人覺得蘋果手機很好用 這兩個句子中的蘋果是不同的語義,表示不同的對象,但是word2vec沒有辦法表示出來。和傳統的詞向量相比,使用語言模型預訓練(如ELMo[1],OpenAI GPT [2] 和 BERT [3]對該定義的理解及相關論文解釋可以參考 https://mp.weixin.qq.com/s/A-PKyZcXwOz-2lL-hBmjsA)其實可以看成是一個句子級別的上下文的詞表示,它可以充分利用大規模的單語語料,並且可以對一詞多義進行建模。
cbow是給定上下文來預測中心詞,skip-gram是通過中心詞預測上下文,兩者所用的神經網絡都只需要一層hidden layer.
他們的做法是:
cbow:
將一個詞所在的上下文中的詞作為輸入,而那個詞本身作為輸出,也就是說,看到一個上下文,希望大概能猜出這個詞和它的意思。通過在一個大的語料庫訓練,得到一個從輸入層到隱含層的權重模型。如下圖所示,第l個詞的上下文詞是i,j,k,那么i,j,k作為輸入,它們所在的詞匯表中的位置的值置為1。然后,輸出是l,把它所在的詞匯表中的位置的值置為1。訓練完成后,就得到了每個詞到隱含層的每個維度的權重,就是每個詞的向量。
skip-gram
將一個詞所在的上下文中的詞作為輸出,而那個詞本身作為輸入,也就是說,給出一個詞,希望預測可能出現的上下文的詞。通過在一個大的語料庫訓練,得到一個從輸入層到隱含層的權重模型。如下圖所示,第l個詞的上下文詞是i,j,k,那么i,j,k作為輸出,它們所在的詞匯表中的位置的值置為1。然后,輸入是l,把它所在的詞匯表中的位置的值置為1。訓練完成后,就得到了每個詞到隱含層的每個維度的權重,就是每個詞的向量。
cbow與skip-gram的區別:
cbow在學習過程中,類似k個學生(周圍詞)同時由一位老師(中心詞)授課,如果下次學習的時候還在該老師的課上(窗口內)則可以繼續學習,否則不會繼續。
而skip-gram類似一個學生(中心詞)多個老師(周圍詞),學生通過向多位老師學習學到最終的知識能力,所以比cbow學習的時間長,即時間復雜度高,數據量少或有生僻字時適用,另外,直接訓練Skip-Gram類型的算法,很容易使得高曝光詞匯得到過多的權重。同樣地,cbow效率較高,速度快,數據量大時適用。(https://www.cnblogs.com/june0507/p/9412989.html解釋得不錯)另外,cbow與skip-gram在最后的softmax層一般適用層次softmax,即層次softmax是先根據語料計算出詞典中每個詞的詞頻,然后根據詞頻構建霍夫曼樹,得到霍夫曼樹之后就可以得到根節點到每一個葉節點的路徑(葉節點代表的就是詞典中的每個詞,一顆霍夫曼樹中有詞典大小個葉節點),得到路徑之后再根據路徑計算詞典中每個詞的概率,計算這個概率的時間復雜度是O(logD),比直接計算打分的O(D)的時間復雜度低很多。 后來一般會用負采樣代替霍夫曼樹。.
fasttext的模型結構與cbow類似,但是兩者區別很大:
fastText的模型和CBOW的模型結構一樣,雖然結構一樣,但是仍有不同
一、目的不一樣,fastText是用來做文本分類的,雖然中間也會產生詞向量,但詞向量是一個副產物,而CBOW就是專門用來訓練詞向量的工具。
fastText的輸出層是預測句子的類別標簽,而CBOW的輸出層是預測中間詞;
fastText的輸入層是一個句子的每個詞以及句子的ngram特征,而CBOW的輸入層只是中間詞的上下文,與完整句子沒有關系;
fastText是一個文本分類算法,是一個有監督模型,有額外標注的標簽
CBOW是一個訓練詞向量的算法,是一個無監督模型,沒有額外的標簽,其標准是語料本身,無需額外標注。
用fastText做文本分類的關鍵點是極大地提高了訓練速度(在要分類的文本類別很多的情況下,比如500類),原因是在輸出層采用了層級softmax,層級softmax如何提高訓練速度在上面CBOW的層級softmax中已經介紹了,在這里就是將葉節點有詞頻變成文本分類數據集中每種類別的樣本數量,霍夫曼樹的結構也可以處理類別不均衡的問題(每種類別的樣本數目不同),頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高(意思是數目多的樣本深度小,那很多樣本都只需乘一次就把概率計算出來了(構建樹的過程中記錄了大多數路徑的值),自然就快)。這段話的原文:https://blog.csdn.net/sun_brother/article/details/80327070
具體的細節在學習過程中感覺這位用戶的博客https://www.cnblogs.com/pinard/p/7243513.html 寫的挺好的。
對於我上面的理解如果覺得有幫助,點個贊咯~~~~~~
[1] Peters, M. E. et al. Deep contextualized word representations. naacl (2018).
[2] Radford, A. & Salimans, T. Improving Language Understanding by Generative Pre-Training. (2018).
[3] Devlin, J., Chang, M.-W., Lee, K. & Toutanova, K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. (2018).