【NLP】Word2vec

文本表示方法

在這裏插入圖片描述

One-hot

在這裏插入圖片描述
優點:
(1)解決了分類器不好處理離散數據的問題
(2)在一定程度上起到了擴充特徵的作用

缺點: 尤其是在文本特徵表示上
(1)是一個詞袋模型,不考慮詞與詞之間的順序,丟失詞的順序信息。
(2)假設詞與詞相互獨立。在大多數情況下,詞與詞是相互影響的。
(3)得到的特徵是離散稀疏的。比如將世界所有城市名稱作爲語料庫,那這個向量會過於稀疏,並且會造成維度災難

Q: 對於神經網絡而言,在輸入特徵多數爲categorical類別變量時,使用one-hot會使維度大大增加,使用one-hot真的比直接用離散數字表示好嗎?
S: 分類問題裏,損失函數經常定義爲預測值和真實值的誤差平方和。離散數字編碼之後,3被預測爲1的損失>3預測爲2(與現實不符)。而one-hot則保證了不同的類別距離相同。 當然實際生活中有許多分類變量也帶有距離的含義(比如職稱),所以標準基乘上係數可能會更好。當然最後還是要結合實際情況。

把詞向量的維度變小?

 Dristributed representation通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關係。這個較短的詞向量維度是在訓練時指定的。
 在 NLP 中,把xx看做一個句子裏的一個詞語,yy是這個詞語的上下文詞語,那麼這裏的f(x)yf(x)\rarr y就是語言模型(language model)。這個模型的目的,就是判斷 (x,y)(x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起,是不是人話。
 Word2vec正是來源於這個思想,但它的最終目的,不是要把ff訓練得多麼完美,而是隻關心模型訓練完後的副產物——模型參數(這裏特指神經網絡的權重),並將這些參數,作爲輸入x的某種向量化的表示,這個向量便叫做——詞向量

Word2vec

目的:將“不可計算”“非結構化”的詞轉化爲“可計算”“結構化”的向量。

百度百科:
 Word2vec,是一羣用來產生詞向量的相關模型。這些模型爲淺而雙層的神經網絡,用來訓練以重新建構語言學之詞文本。網絡以詞表現,並且需猜測相鄰位置的輸入詞,在word2vec中詞袋模型假設下,詞的順序是不重要的。訓練完成之後,word2vec模型可用來映射每個詞到一個向量,可用來表示詞對詞之間的關係,該向量爲神經網絡之隱藏層

1. Word2vec模型其實就是簡單化的神經網絡
2. Word2vec 本質上是一種降維操作:把詞語從One-Hot編碼形式降維到 Word2vec 形式。
InputInput:One-Hot vector
Hidden layerHidden~layer:線性單元,沒有激活函數。
OutputLayerOutput Layer:Softmax迴歸,維度與Input Layer相同。
OutputOutput:模型通過訓練數據所學得的參數隱層的權重矩陣

CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好。

在這裏插入圖片描述

CBOW:給定上下文預測target word

全名:Continuous Bag-of-Words
在這裏插入圖片描述
在這裏插入圖片描述
Input layerInput~layer:上下文單詞的one-hot,假設單詞的特徵空間的維度爲VV

Hidden layerHidden~layer:輸入層的所有one-hot分別乘以共享的輸入權重矩陣WV×dW_{V×d},相加求平均,得到隱藏層向量,size爲1×d1×d

Loss functionLoss~function:一般爲交叉熵代價函數,採用梯度下降算法更新WWWW'

Output layerOutput~layer:隱藏層向量乘以輸出層權重矩陣Wd×VW'_ {d×V},得到1×V1×V 向量。經激活函數,得到維度爲VV的概率分佈,其中的每一維代表着一個單詞的概率(因爲是one-hot)。概率最大的index所指示的單詞爲預測出的中間詞(target word),將概率與true label的one-hot做比較,誤差越小越好(根據誤差更新權重矩陣)。

Need OutputNeed~Output權重矩陣WV×dW_{V×d},其中 dd爲自己設定的數。訓練完畢後,輸入層的每個單詞的one-hot與矩陣WW相乘,得到的向量的就是我們想要的詞向量(word embedding)矩陣WW就是所有單詞的word embedding,也叫做look up table 也就是說,任何一個單詞的one-hot乘以WW都將得到該單詞的詞向量。有了look up table就可以免去訓練過程,直接查表得到單詞的詞向量了。

舉例:窗口大小是2,表示選取coffe前面兩個單詞和後面兩個單詞,作爲input詞。
訓練出來的look up table爲矩陣W。即,任何一個單詞的one-hot表示乘以W都將得到該單詞的word embedding。
圖片來自https://www.jianshu.com/p/471d9bfbd72f
在這裏插入圖片描述

Skip-Gram:給定input word來預測上下文

在這裏插入圖片描述

獲取訓練數據

在這裏插片描述
上圖中:

  • Training Samples =(Input word, Output word)
  • Input word:藍色框詞
  • 參數skip_window = 2表示從當前Input word的一側(左邊或右邊)選取詞的數量爲2, 白色框詞。
  • 參數num_skips表示從整個窗口中選取多少個不同的詞,作爲output word。

模型訓練

在這裏插入圖片描述
 神經網絡基於這些訓練數據,輸出概率分佈(代表着詞典中的每個詞是output word的可能性)。如先拿一組數據 (‘dog’, ‘barked’) 來訓練神經網絡,那麼模型通過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是“barked”的概率。模型的輸出概率代表着:詞典中每個詞有多大可能性跟input word同時出現
 過程:通過給神經網絡輸入文本中成對的單詞來訓練它完成上述概率計算。
再次注意:我們需要的是訓練出來的權重矩陣。

此處需要還是WW,而不是WW'。因爲yy是概率,而不是one-hot!詞向量是one-hot×W×W

訓練技巧

 Word2vec是一個多分類問題。但實際當中,詞語的個數非常多,計算難,所以需要用加速技巧。

  • Hierarchical softmax
    是 softmax 的一種近似形式,本質是把 N 分類問題變成 log(N)次二分類。
  • Negative sampling
    本質是預測總體類別的一個子集。

優點

  1. 考慮上下文,因此跟之前的Embedding方法相比,效果要更好(但不如18年之後的方法)。
  2. 比之前的Embedding方法維度更少,所以速度更快。
  3. 通用性很強,可以用在各種 NLP任務中。

缺點

  1. 由於詞和向量是一對一的關係,所以無法解決多義詞
  2. 是一種靜態的方式,雖然通用性強,但是無法針對特定任務做動態優化

句子、文檔層面的任務

  • 計算相似度
    • 尋找相似詞
    • 信息檢索
  • 作爲SVM/LSTM等模型的輸入
    • 中文分詞
    • 命名體識別
  • 句子表示
    • 情感分析
  • 文檔表示
    • 文檔主題判別

實現:Gensim 和 NLTK

import gensim
sentences=word2vec.Text8Corpus("test.txt")  #加載語料庫,此處訓練集爲英文文本或分好詞的中文文本,注意去停用詞
model=gensim.models.Word2Vec(sentences,sg=1,size=100,window=5,min_count=2,negative=3,sample=0.001,hs=1,workers=4)
model.save("文本名")	# 模型保存,打開爲亂碼
#model.wv.save_word2vec_format("文件名",binary = "Ture/False")  #通過該方式保存的模型,能通過文本格式打開,也能通過設置binary是否保存爲二進制文件。但該模型在保存時丟棄了樹的保存形式(詳情參加word2vec構建過程,以類似哈夫曼樹的形式保存詞),所以在後續不能對模型進行追加訓練

gensim.models.Word2Vec.load("模型文件名") # 對.sava保存的模型的加載
model = model.wv.load_word2vec_format('模型文件名') # 對..wv.save_word2vec_format保存的模型的加載

model.train(more_sentences) # 追加訓練。如果對..wv.save_word2vec_format加載的模型進行追加訓練,會報錯

model.most_similar("word",topn=10)	# 計算與該詞最近似的10個詞
model.similarity("word1","word2")   # 計算兩個詞的相似度
model ['word'] # 獲取詞向量

Natural Language Toolkit:自然語言處理工具包,在NLP領域中,最常使用的一個Python庫。

擴展

  1. 在詞嵌入領域,除了 Word2vec之外,還有基於共現矩陣分解的GloVe等詞嵌入方法。

來斯惟博士在它的博士論文附錄部分,證明了Skip-gram 模型和GloVe的cost fucntion本質上是一樣的。

  1. 輸入不一定非得是One-Hot。
  2. Word2vec在2018年之前比較主流,但是隨着BERT、GPT2.0的出現,它已經不算效果最好的方法了。

思考

Word2vec考慮了上下文,那算考慮了詞順序嗎?

參考

https://www.jianshu.com/p/471d9bfbd72f
https://zhuanlan.zhihu.com/p/26306795
https://easyai.tech/ai-definition/word2vec/
https://blog.csdn.net/qq_28840013/article/details/89681499

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章