一、概述GloVe與word2vec

Count-based模型,如GloVe,本質上是對共現矩陣進行降維。首先,構建一個詞匯的共現矩陣,每一行是一個word,每一列是context。共現矩陣就是計算每個word在每個context出現的頻率。
由於context是多種詞匯的組合,其維度非常大,我們希望像network embedding一樣,在context的維度上降維,學習word的低維表示。
這一過程可以視為共現矩陣的重構問題,即reconstruction loss。
這里再插一句,降維或者重構的本質是什么?我們選擇留下某個維度和丟掉某個維度的標准是什么?
--- Find the lower-dimensional representations which can explain most of the variance in the high-dimensional data,這其實也是PCA的原理。
兩種方法都能學習詞的向量表示,在real world application中,他們效果上有啥差別呢?
答案是performance上差別不大。
兩個模型在並行化上有一些不同,即GloVe更容易並行化,所以對於較大的訓練數據,GloVe更快。
在英文上,glove for GloVe 和 gensim for word2vec是常用的訓練詞向量的python package,完全可以使用自己的訓練語料訓練詞向量。
當然,他們都提供了google news(英文)上訓練好的詞向量,大家完全可以下載下來,直接使用。對於中文的訓練語料,可以使用sogou中文新聞語料。
二、深入解剖word2vec
1、word2vec的兩種模型分別是什么?
word2Vec 有兩種模型:CBOW 和 Skip-Gram:
- CBOW 在已知
context(w)
的情況下,預測w
; - Skip-Gram在已知
w
的情況下預測context(w)
;
word2vec
與NNLM相比,word2vec的主要目的是生成詞向量而不是語言模型,在CBOW中,投射層將詞向量直接相加而不是拼接起來,並舍棄了隱層,這些犧牲都是為了減少計算量,使訓練更加
2、word2vec的兩種優化方法是什么?它們的目標函數怎樣確定的?訓練過程又是怎樣的?
不經過優化的CBOW和Skip-gram中 ,在每個樣本中每個詞的訓練過程都要遍歷整個詞匯表,也就是都需要經過softmax歸一化,計算誤差向量和梯度以更新兩個詞向量矩陣(這兩個詞向量矩陣實際上就是最終的詞向量,可認為初始化不一樣),當語料庫規模變大、詞匯表增長時,訓練變得不切實際。為了解決這個問題,word2vec支持兩種優化方法:hierarchical softmax 和negative sampling。此部分僅做關鍵介紹,數學推導請仔細閱讀《word2vec 中的數學原理詳解》。
(1)基於hierarchical softmax 的 CBOW 和 Skip-gram
基於hierarchical softmax 的 CBOW 和 Skip-gram
hierarchical softmax 使用一顆二叉樹表示詞匯表中的單詞,每個單詞都作為二叉樹的葉子節點。對於一個大小為V的詞匯表,其對應的二叉樹包含V-1非葉子節點。假如每個非葉子節點向左轉標記為1,向右轉標記為0,那么每個單詞都具有唯一的從根節點到達該葉子節點的由{0 1}組成的代號(實際上為哈夫曼編碼,為哈夫曼樹,是帶權路徑長度最短的樹,哈夫曼樹保證了詞頻高的單詞的路徑短,詞頻相對低的單詞的路徑長,這種編碼方式很大程度減少了計算量)。
CBOW中的目標函數是使條件概率 最大化,其等價於:
Skip-gram中的目標函數是使條件概率 最大化,其等價於:
(2)基於negative sampling的 CBOW 和 Skip-gram
negative sampling是一種不同於hierarchical softmax的優化策略,相比於hierarchical softmax,negative sampling的想法更直接——為每個訓練實例都提供負例。
對於CBOW,其目標函數是最大化:
對於Skip-gram,同樣也可以得到其目標函數是最大化:
負采樣算法實際上就是一個帶權采樣過程,負例的選擇機制是和單詞詞頻聯系起來的。
具體做法是以 N+1
個點對區間 [0,1]
做非等距切分,並引入的一個在區間 [0,1]
上的 M
等距切分,其中 M >> N。
源碼中取 M = 10^8。然后對兩個切分做投影,得到映射關系:采樣時,每次生成一個 [1, M-1] 之間的整數 i,則 Table(i) 就對應一個樣本;當采樣到正例時,跳過(拒絕采樣)。
三、深入解剖Glove詳解
GloVe的全稱叫Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表征(word representation)工具。
1、GloVe構建過程是怎樣的?
(1)根據語料庫構建一個共現矩陣,矩陣中的每一個元素 代表單詞
和上下文單詞
在特定大小的上下文窗口內共同出現的次數。
(2)構建詞向量(Word Vector)和共現矩陣之間的近似關系,其目標函數為:
這個loss function的基本形式就是最簡單的mean square loss,只不過在此基礎上加了一個權重函數 :
根據實驗發現 的值對結果的影響並不是很大,原作者采用了
。而
時的結果要比
時要更好。下面是
時
的函數圖象,可以看出對於較小的
,權值也較小。這個函數圖像如下所示:
2、GloVe的訓練過程是怎樣的?
- 實質上還是監督學習:雖然glove不需要人工標注為無監督學習,但實質還是有label就是
。
- 向量
和
為學習參數,本質上與監督學習的訓練方法一樣,采用了AdaGrad的梯度下降算法,對矩陣
中的所有非零元素進行隨機采樣,學習曲率(learning rate)設為0.05,在vector size小於300的情況下迭代了50次,其他大小的vectors上迭代了100次,直至收斂。
- 最終學習得到的是兩個詞向量是
和
,因為
是對稱的(symmetric),所以從原理上講
和
,是也是對稱的,他們唯一的區別是初始化的值不一樣,而導致最終的值不一樣。所以這兩者其實是等價的,都可以當成最終的結果來使用。但是為了提高魯棒性,我們最終會選擇兩者之和
作為最終的vector(兩者的初始化不同相當於加了不同的隨機噪聲,所以能提高魯棒性)。
3、Glove損失函數是如何確定的?(來自GloVe詳解)
Glove與Word2vec比較:
- Word2vec是局部語料庫訓練的,其特征提取是基於滑窗的;而glove的滑窗是為了構建co-occurance matrix(上面詳細描述了窗口滑動的過程),統計了全部語料庫里在固定窗口內的詞共線的頻次,是基於全局語料的,可見glove需要事先統計共現概率;因此,word2vec可以進行在線學習,glove則需要統計固定語料信息。
- Word2vec是無監督學習,同樣由於不需要人工標注,glove通常被認為是無監督學習,但實際上glove還是有label的,即共現次數log(X_i,j)
- Word2vec損失函數實質上是帶權重的交叉熵,權重固定;glove的損失函數是最小平方損失函數,權重可以做映射變換。
- Glove利用了全局信息,使其在訓練時收斂更快,訓練周期較word2vec較短且效果更好。
更多關於GloVe和word2vec的區別詳見論文:
一、什么是tf-idf?
- tf(Term Frequency)詞頻:指的是某一個給定的詞語在該文件中出現的次數。這個數字通常會被歸一化(一般是詞頻除以文章總詞數), 以防止它偏向長的文件。
- idf(Inverse Document Frequency)逆文檔頻率:log(語料庫的文檔總數/包含該詞的文檔數)
- 特點:1. 可用某篇文章中出現次數多但在其他文章中出現次數少的詞來作為該篇文章的特征詞。2. 使罕見的單詞更加突出並且有效地忽略了常用單詞 3. 易於理解
- 缺點:1. 因為是詞袋模型,所以沒有考慮詞的位置信息,但詞的位置是有一定含義的。2. 並不能反映單詞的重要程度和特征詞的分布情況。
二、各種詞向量的特點:
- One-hot:維度災難 and 語義鴻溝
- 矩陣分解(LSA):利用全局語料特征,但SVD求解計算復雜度大
- 基於NNLM/RNNLM的詞向量:詞向量為副產物,存在效率不高等問題
- word2vec、fastText:優化效率高,但是基於局部語料
- glove:基於全局預料,結合了LSA和word2vec的優點
- elmo、GPT、bert:動態特征
三、NNLM(參考鏈接:http://www.pengjingtian.com/2016/09/17/nnlm/):
- 神經網絡語言模型:利用語言模型產生詞向量,詳細點說就是利用上下文詞預測中心詞或利用前n個詞預測下一個詞,詞向量只是副產物
- 初始化一個V*D的詞向量矩陣,其中V是語料庫詞匯表的大小,D是詞向量的維度,隨機初始值
- 輸入層:利用n個上下文詞的one-hot編碼與詞向量矩陣相乘,找到每個單詞的詞向量,拼接起來,成為一個更長的向量,即D*n維向量
- 隱藏層:將D*n維向量經過線性層轉換為M維向量,再經過tanh等激活函數
- 輸出層:再把M維向量經過線性層轉換為大小為V維的向量,經過softmax函數即可得到每一個詞的概率
- 其訓練目標是最大化似然函數
四. Word2vec和nnlm的對比:
- 兩者本質都是語言模型
- 詞向量只是nnlm的一個產物,雖說word2vec本質也是語言模型,但其更專注於詞向量本身,所以有一些優化算法來提高計算效率
- 具體計算方面,在利用上下文詞預測中心詞時,nnlm是把上下文詞的向量進行拼接,word2vec是進行sum,並舍棄隱藏層(為了減少計算量)
- word2vec的兩個加速算法:hierarchical softmax 和negative sampling
五、深入剖析word2vec(參考鏈接:https://blog.csdn.net/itplus/article/details/37969519):
- 兩種模型 and 兩種優化算法:
- CBOW(連續詞袋模型):利用上下文詞預測中心詞
- Skip-gram(跳字模型):利用中心詞預測上下文詞
- hierarchical softmax(層次softmax)
- negative sampling(負采樣)
六. 深入剖析Fasttext(參考鏈接:https://zhuanlan.zhihu.com/p/32965521):
- 模型架構:
- 與word2vec的CBOW類似
- 輸入層:詞和子詞(subword)的n-gram的特征向量
- 隱藏層:所有詞的向量疊加求平均之后經過線性變換到隱藏層
- 輸出層:Hierarchical Softmax輸出文本類別
- 兩個特色:
- 字符級的n-gram:除了每個單詞的詞向量外,還為每個單詞的n-gram字符添加一個向量,作為額外的特征,兩點好處:
- 對於低頻詞生成的詞向量效果會更好。因為它們的n-gram可以和其它詞共享。
- 對於訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字符級n-gram向量。
- 分層softmax:利用哈夫曼樹構建,根據目標類別的多少自上而下構建,數目越多的類越在頂部。(與word2vec里類似)
2. 核心思想:將整篇文檔的詞及n-gram向量疊加平均得到文檔向量,然后使用文檔向量做softmax多分類。這中間涉及到兩個技巧:字符級n-gram特征的引入以及分層Softmax分類。
3. 為什么fasttext會快:
- hierarchical softmax 和negative sampling是對普通softmax的極大提速
- hs里使用huffman樹,做分類一般類別沒那么多,葉子節點相對word2vec(每個目標詞一個葉子節點)少很多。並且語料每一行只訓練一次,word2vec要每個中心詞訓練一次,訓練次數又少了很多。當然fasttext可以設置epoch訓練多輪
- 各種提速的trick,比如提前算好exp的取值之類的,這點和word2vec是一樣的了
七. Fasttext與Word2vec比較:
- 都可以無監督學習詞向量, fastText訓練詞向量時會考慮subword
- fastText還可以進行有監督學習進行文本分類
- 都利用了hierarchical softmax進行加速
- Fasttext引入字符級n-gram可以處理長詞,未出現過的詞,以及低頻詞
八. Elmo(Embeddings from Language Models)詳解(參考鏈接:https://www.jiqizhixin.com/articles/2019-04-22-3):
- 模型結構(如圖):
- 首先使用字符級卷積神經網絡(convolutional neural network, CNN)來將文本中的詞轉換成原始詞向量(raw word vector)
- 將這些原始詞向量輸入雙向語言模型中第一層
- 前向迭代中包含了該詞以及該詞之前的一些詞匯或語境的信息
- 后向迭代包含了該詞之后的信息
- 這兩種迭代的信息組成了中間詞向量(intermediate word vector)
- 這些中間詞向量被輸入到模型的下一層
- 最終表示(ELMo)就是原始詞向量和兩個中間詞向量的加權和

2. 訓練過程:
- 首先明確LSTM 每一個時間點都會有一個輸出,不要把這個輸出和向下一時間點傳送的記憶內容搞混,兩個是有區別的,LSTM向下一個時間點傳送的東西有兩個,一個是該時間點的輸出也就是隱狀態H,同時傳給了下一個時間點,另一個是記憶單元C,每個時間點的輸出只有H(如圖)。
- 理解了LSTM的輸出后,再來看一層雙向LSTM就會有兩個輸出,一個來自正向,一個來自負向,這兩個一個代表前面信息對該詞的影響的輸出,一個代表后面信息對該詞影響的輸出,都能拿來當作詞向量用,所以一層就會有兩個詞向量,兩層就有4個,再加上最開始的輸入,raw word vectors,就有4+1,也就有了2L+1個詞向量!!!
- 再來理解一下RNN的提出,RNN的提出本身就是為了解決序列信息的問題(在NLP中),普通神經網絡在操作時,后面的輸入和前面的輸入都是無關的,所以RNN本身就可以拿來做語言模型,我們也做過用LSTM/GRU或普通RNN來直接做語言模型的。
- 理解了RNN語言模型,那Elmo就很簡單了,就是個多層的LSTM來用作訓練語言模型。
- 具體公式如圖,目標就是最小化損失函數,反向傳播更新就完事了: