word2vec原理(一): 词向量、CBOW与Skip-Gram模型基础
word2vec原理(一): CBOW與Skip-Gram模型基礎
word2vec原理(二):基于Hierarchical Softmax的模型
word2vec原理(三): 基于Negative Sampling的模型
目錄
1. 詞向量基礎
1.1?One-Hot 編碼(獨熱編碼)
1.2 分布式表示:詞向量/詞嵌入
1.3 詞向量可視化
1.4 用詞嵌入做遷移學習
2. 生成詞向量的方式
2.1. 基于統計方法
1. 共現矩陣
2.?SVD(奇異值分解)
2.2 基于語言模型(language model)
3. CBOW與Skip-Gram
3.1 CBOW與Skip-Gram用于神經網絡語言模型
1. CBOW模型
2. Skip-gram模型
3.2 word2vec中的CBOW與Skip-Gram??
1. CBOW模型
2. Skip-gram
? ? ? ? word2vec是Google在2013年推出的一個NLP工具,它的特點是將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關系,挖掘詞之間的聯系。
? ? ? ? word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW),以及兩種高效訓練的方法:負采樣(negative sampling)和層序softmax (hierarchical softmax)。值得一提的是,word2vec詞向量可以較好地表達不同詞之間的相似和類比關系。
? ? ? ? Skip-gram和CBOW是Word2vec架構的兩種類型,可以理解為兩種實現方式,不是說,word2vec包含這兩個模型。word2vec自提出后被廣泛應用在自然語言處理任務中。它的模型和訓練方法也啟發了很多后續的詞向量模型。
1. 詞向量基礎
? ? ? ? 向量空間模型長期以來一直被用于分布式語義的目的,它以向量的形式表示文本文檔和查詢語句。通過以向量空間模型在N維空間中來表示單詞,可以幫助不同的NLP算法實現更好的結果,因此這使得相似的文本在新的向量空間中組合在一起。
? ? ? ? 自然語言是一套用來表達含義的復雜系統。在這套系統中,詞是表義的基本單元。在機器學習中,如何使用向量表示詞?顧名思義,詞向量是用來表示詞的向量,通常也被認為是詞的特征向量。詞向量,又名詞嵌入(Word Embedding)。近年來,詞向量已逐漸成為自然語言處理的基礎知識。
? ? ? ?用詞向量來表示詞并不是word2vec的首創,在很久之前就出現了,表示方式:
1.1?One-Hot 編碼(獨熱編碼)
? ? ? ? 一種最簡單的詞向量方式是one-hot representation,就是用一個很長的向量來表示一個詞,向量的長度為詞匯表的大小,向量的分量只有一個 1,其他全為 0,1 的位置對應該詞在詞典中的位置。比如:
? ? ? ? ? ?'中國'表示為: [00010000000......]
? ? ? ? ? ?'美國'表示為:[0000000010000...]
每個詞都是茫茫 0 海中的一個 1。這種 One-hot Representation 采用稀疏向量方式存儲,會是非常的簡潔:也就是給每個詞分配一個數字 ID。比如剛才的例子中,中國記為 3,美國記為 8(假設從 0 開始記)。如果要編程實現的話,用 Hash 表給每個詞分配一個編號就可以了。這么簡潔的表示方法配合上最大熵、SVM、CRF 等等算法已經很好地完成了 NLP 領域的各種主流任務。
? ? ? ?
這種詞表示有兩個缺點:
? ? ?(1)容易受維數災難的困擾,尤其是將其用于 Deep Learning 的一些算法時:詞匯表一般都非常大,比如達到百萬級別,這樣每個詞都用百萬維的向量來表示簡直是內存的災難。這樣的向量其實除了一個位置是1,其余的位置全部都是0,表達的效率不高,能不能把詞向量的維度變小呢?
? ? ?(2)不能很好地刻畫詞與詞之間的相似性(術語好像叫做“詞匯鴻溝”):任意兩個詞之間都是孤立的,這樣使得算法對相關詞的泛化能力不強。因為任何兩個one-hot向量之間的內積都是0,很難區分他們之間的差別。光從這兩個向量中看不出兩個詞是否有關系,哪怕是丈夫和老公這樣的同義詞也不能幸免于難。
(個人認為,主要原因在于one-hot編碼是把不適合歐式距離度量的類別數據,轉換到歐式空間,適合距離度量,而文本分析中,更常用的是余弦距離,此時one-hot編碼體現不出角度概念,因為余弦距離將距離歸一化了)
1.2 分布式表示:詞向量/詞嵌入
? ? ? ? Distributed?representation可以解決One hot?representation的問題,它最早是 Hinton 于 1986 年提出的。它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這就是word embedding,即指的是將詞轉化成一種分布式表示,又稱詞向量。分布式表示將詞表示成一個定長的連續的稠密向量,這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。
? ? ? ? Distributed Representation 可以創建多個層次結構或分段,其中可以為每個單詞顯示的信息分配不同的權重。這些分段或維度的選擇可以是我們決定的,并且每個單詞將由這些段中的權重分布表示。
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ????
? ? ? ? 比如上圖我們將詞匯表里的詞用"位置","人口", "面積"和"距離"4個維度來表示,Rome這個詞對應的詞向量可能是(0.99,0.99,0.05,0.7),也就是普通的向量表示形式。維度以 50 維和 100 維比較常見。當然在實際情況中,我們并不能對詞向量的每個維度做一個很好的解釋。?
? ? ? ?有了用Distributed Representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:
? ? ? ? ? ? ? ? ? ? ??
分布式表示優點:?
? ? ? (1) 詞之間存在相似關系:?是詞之間存在“距離”概念,這對很多自然語言處理的任務非常有幫助。?
? ? ? (2) 包含更多信息:?詞向量能夠包含更多信息,并且每一維都有特定的含義。在采用one-hot特征時,可以對特征向量進行刪減,詞向量則不能。
? ? ? ? ?可見我們只要得到了詞匯表里所有詞對應的詞向量,那么我們就可以做很多有趣的事情了。不過,怎么訓練得到合適的詞向量呢?一個很常見的方法是使用神經網絡語言模型。
? ? ? ? 當然一個詞怎么表示成這么樣的一個向量是要經過一番訓練的,訓練方法較多,word2vec是其中一種,在后面會提到,這里先說它的意義。還要注意的是每個詞在不同的語料庫和不同的訓練方法下,得到的詞向量可能是不一樣的。
? ? ? ? 由于是用向量表示,而且用較好的訓練算法得到的詞向量的向量一般是有空間上的意義的,也就是說,將所有這些向量放在一起形成一個詞向量空間,而每一向量則為該空間中的一個點,在這個空間上的詞向量之間的距離度量也可以表示對應的兩個詞之間的“距離”。所謂兩個詞之間的“距離”,就是這兩個詞之間的語法,語義之間的相似性。
? ? ? ? 一個比較實用的場景是找同義詞,得到詞向量后,假如對于詞老婆來說,想找出與這個詞相似的詞,這個場景對人來說都不輕松,畢竟比較主觀,但是對于建立好詞向量后的情況,對計算機來說,只要拿這個詞的詞向量跟其他詞的詞向量一一計算歐式距離或者cos距離,得到距離小于某個值那些詞,就是它的同義詞。這個特性使詞向量很有意義,自然會吸引很多人去研究,google的word2vec模型也是基于這個做出來的。
1.3 詞向量可視化
? ? ? ? 如果我們能夠學習到一個 300 維的特征向量,或者說 300 維的詞嵌入,通常我們可以做一件事,把這 300 維的數據嵌入到一個二維空間里,這樣就可以可視化了。常用的可視化算法是 t-SNE 算法,來自于 Laurens van der Maaten 和 Geoff Hinton 的論文。
? ? ? ?t-SNE 算法:所做的就是把這些 300 維的數據用一種非線性的方式映射到 2 維平面上,可以得知 t-SNE 中這種映射很復雜而且很非線性。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?如果觀察這種詞嵌入的表示方法,會發現 man 和 woman 這些詞聚集在一塊(上圖編號 1 所示), king 和queen 聚集在一塊(上圖編號 2 所示),這些都是人,也都聚集在一起(上圖編號 3 所示)。動物都聚集在一起(上圖編號 4 所示),水果也都聚集在一起(上圖編號 5 所示),像 1、2、 3、 4 這些數字也聚集在一起(上圖編號 6 所示)。如果把這些生物看成一個整體,他們也聚集在一起(上圖編號 7 所示)。
? ? ? ?詞嵌入算法對于相近的概念,學到的特征也比較類似,在對這些概念可視化的時候,這些概念就比較相似,最終把它們映射為相似的特征向量。
? ? ? ?這種表示方式用的是在 300 維空間里的特征表示,這叫做嵌入( embeddings)。之所以叫嵌入的原因是,你可以想象一個 300 維的空間,這里用個 3 維的代替(上圖編號 8 所示)。現在取每一個單詞比如 orange,它對應一個 3 維的特征向量,所以這個詞就被嵌在這個 300 維空間里的一個點上了(上圖編號 9 所示), apple 這個詞就被嵌在這個 300 維空間的另一個點上了(上圖編號 10 所示)。為了可視化, t-SNE 算法把這個空間映射到低維空間,你可以畫出一個 2 維圖像然后觀察,這就是這個術語嵌入的來源。
1.4 詞嵌入用做遷移學習
? ? ? ? 如果對于一個命名實體識別任務,只有一個很小的標記的訓練集,訓練集里可能沒有某些詞,但是如果有一個已經學好的詞嵌入,就可以用遷移學習,把從互聯網上免費獲得的大量的無標簽文本中學習到的知識遷移到一個命名實體識別任務中。
? ? ? ?如果從某一任務 A 遷移到某個任務 B,只有 A 中有大量數據,而 B 中數據少時,遷移的過程才有用。
? ? ? ?用詞嵌入做遷移學習的步驟:
? ? ? (1)先從大量的文本集中學習詞嵌入,或者可以下載網上預訓練好的詞嵌入模型,網上可以找到不少,詞嵌入模型并且都有許可。
? ? ? (2)把這些詞嵌入模型遷移到新的只有少量標注訓練集的任務中。
? ? ? (3)考慮是否微調,用新的數據調整詞嵌入。當在新的任務上訓練模型時,如命名實體識別任務上,只有少量的標記數據集上,可以自己選擇要不要繼續微調,用新的數據調整詞嵌入。實際中,只有第二步中有很大的數據集時才會這樣做,如果你標記的數據集不是很大,通常不建議在微調詞嵌入上費力氣。
? ? ? ?當任務的訓練集相對較小時,詞嵌入的作用最明顯。詞嵌入在語言模型、機器翻譯領域用的少一些,尤其是做語言模型或者機器翻譯任務時,這些任務有大量的數據。
1.4 詞嵌入用做類比推理
? ? ? ? ? ? ? ? ??
? ? ? ?我們用一個四維向量來表示 man,稱為,woman 的嵌入向量稱為,對 king 和 queen 也是用一樣的表示方法。在該例中,假設你用的是4維的嵌入向量,而不是比較典型的 50 到 1000 維的向量。這些向量有一個有趣的特性,就是假如
你有向量和,將它們進行減法運算,即
? ? ? ? ? ? ? ? ? ? ? ? ? ?
?類似的,假如用和,最后也會得到一樣的結果,即?
? ?? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 這個結果表示, man 和 woman 主要的差異是 gender ( 性別)上的差異,而 king 和 queen之間的主要差異,根據向量的表示,也是 gender( 性別)上的差異,這就是為什么與結果是相同的。所以得出這種類比推理的結論的方法就是,當算法被問及 man 對 woman 相當于 king 對什么時,算法所做的就是計算,然后找出一個向量也就是找出一個詞,使得,也就是說,當這個新詞是 queen時,式子的左邊會近似地等于右邊。
? ? ? ? ? ? ? ? ? ??
? ? ? ?計算當 man 對于 woman,那么 king 對于什么,能做的就是找到單詞 w 來使得這個等式成立,就是找到單詞 w 來最大化與的相似度,即
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?測算?與的相似度,我們最常用的相似度函數叫做余弦相似度。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
2. 生成詞向量的方式
2.1. 基于統計方法
1. 共現矩陣
? ? ? ? 通過統計一個事先指定大小的窗口內的word共現次數,以word周邊的共現詞的次數做為當前word的vector。具體來說,我們通過從大量的語料文本中構建一個共現矩陣來定義word representation。?
例如,有語料如下:?
? ? ? ? ?I like deep learning.?
? ? ? ? ?I like NLP.?
? ? ? ? ?I enjoy flying.?
則其共現矩陣如下:? ? ? ?
矩陣定義的詞向量在一定程度上緩解了one-hot向量相似度為0的問題,但沒有解決數據稀疏性和維度災難的問題。
2.?SVD(奇異值分解)
? ? ? ? ?既然基于co-occurrence矩陣得到的離散詞向量存在著高維和稀疏性的問題,一個自然而然的解決思路是對原始詞向量進行降維,從而得到一個稠密的連續詞向量。?對1中矩陣進行SVD分解,得到正交矩陣U,對U進行歸一化得到矩陣如下:? ? ? ? ?
? ? ? ? SVD得到了word的稠密(dense)矩陣,該矩陣具有很多良好的性質:語義相近的詞在向量空間相近,甚至可以一定程度反映word間的線性關系。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.2 基于語言模型(language model)
? ? ? ? 語言模型生成詞向量是通過訓練神經網絡語言模型NNLM(neural network language model),詞向量作為語言模型的附帶產出。NNLM背后的基本思想是對出現在上下文環境里的詞進行預測,這種對上下文環境的預測本質上也是一種對共現統計特征的學習。?較著名的采用neural network language model生成詞向量的方法有:Skip-gram、CBOW、LBL、NNLM、C&W、GloVe等。接下來,以word2vec為例,講解基于神經網絡語言模型的詞向量生成。
? ? ? ? ? ? ? ? ? ? ??
3. CBOW與Skip-Gram
3.1 CBOW與Skip-Gram用于神經網絡語言模型
? ? ? ? 在word2vec出現之前,已經有用神經網絡DNN來用訓練詞向量進而處理詞與詞之間的關系了。采用的方法一般是一個三層的神經網絡結構(當然也可以多層),分為輸入層,隱藏層和輸出層(softmax層)。
? ? ? ?這個模型是如何定義數據的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words?與Skip-Gram兩種模型。
1. CBOW模型
? ? ? ? CBOW模型,利用上下文或周圍的單詞來預測中心詞。
? ? ? ? 輸入:某一個特征詞的上下文相關對應的詞向量(單詞的one-hot編碼);輸出:這特定的一個詞的詞向量(單詞的one-hot編碼)。
? ? ? ? 比如下面這段話,我們的上下文大小取值為4,特定的這個詞是"Learning",也就是我們需要的輸出詞向量(單詞Learning的one-hot編碼),上下文對應的詞有8個,前后各4個,這8個詞是我們模型的輸入(8個單詞的one-hot編碼)。由于CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關注的詞之間的距離大小,只要在我們上下文之內即可。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?這樣我們這個CBOW的例子里,我們的輸入是8個詞向量(8個單詞的one-hot編碼),輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本中心詞對應的softmax概率最大);對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法并通過softmax激活函數找到概率最大的詞對應的神經元即可。
2. Skip-gram模型
? ? ? ? Skip-gram模型,使用中心詞來預測上下文詞。
? ? ? ? Skip-Gram模型和CBOW的思路是反著來的(互為鏡像),即輸入是特定的一個詞的詞向量(單詞的one-hot編碼),而輸出是特定詞對應的上下文詞向量(所有上下文單詞的one-hot編碼)。還是上面的例子,我們的上下文大小取值為4,?特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出。
? ? ? ? 這樣我們這個Skip-Gram的例子里,我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應的神經元所對應的詞即可。
? ? ? ? 所以,只要簡單理解為CBOW與Skip-Gram互為鏡像,輸入/輸出都是詞的one-hot編碼,訓練上下文->中心詞/中心詞->上下文詞的關系權重就可以了。
? ? ? ? 以上就是神經網絡語言模型中如何用CBOW與Skip-Gram來訓練模型與得到詞向量的大概過程。但是這和word2vec中用CBOW與Skip-Gram來訓練模型與得到詞向量的過程有很多的不同。
? ? ? ? word2vec為什么不用現成的DNN模型,要繼續優化出新方法呢?最主要的問題:DNN模型的這個處理過程非常耗時。我們的詞匯表一般在百萬級別以上,這意味著我們DNN的輸出層需要進行softmax計算各個詞的輸出概率,計算量很大。有沒有簡化一點點的方法呢?
3.2 word2vec中的CBOW與Skip-Gram??
? ? ? ? word2vec也使用了CBOW與Skip-Gram來訓練模型與得到詞向量,但是并沒有使用傳統的DNN模型,而是對其進行了改進。最先優化使用的數據結構是用霍夫曼樹來代替隱藏層和輸出層的神經元。
? ? ? ? 葉子節點:起到輸出層神經元的作用,葉子節點的個數即為詞匯表的大小。
? ? ? ? 內部節點:起到隱藏層神經元的作用。
? ? ? ? 霍夫曼樹編碼方式:一般對于一個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1。
? ? ? ?Word2vec中,約定編碼方式和霍夫曼相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小于右子樹的權重。
1. CBOW模型
? ?連續詞袋模型(Continuous Bag-of-Word Model, CBOW)是一個三層神經網絡,輸入已知上下文,輸出對下個單詞的預測:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? CBOW模型的第一層是輸入層, 輸入已知上下文的詞向量;
? ? ? ? 中間一層稱為線性隱含層, 它將所有輸入的詞向量累加;
? ? ? ? 第三層是一棵哈夫曼樹, 樹的的葉節點與語料庫中的單詞一一對應, 而樹的每個非葉節點是一個二分類器(一般是softmax感知機等), 樹的每個非葉節點都直接與隱含層相連.
? ? ? ?將上下文的詞向量輸入CBOW模型, 由隱含層累加得到中間向量,將中間向量輸入哈夫曼樹的根節點, 根節點會將其分到左子樹或右子樹。每個非葉節點都會對中間向量進行分類, 直到達到某個葉節點,該葉節點對應的單詞就是對下個單詞的預測。
訓練過程:?
? ? ? ? 首先根據預料庫建立詞匯表, 詞匯表中所有單詞擁有一個隨機的詞向量。我們從語料庫選擇一段文本進行訓練;
? ? ? ? 將單詞W的上下文的詞向量輸入CBOW, 由隱含層累加, 在第三層的哈夫曼樹中沿著某個特定的路徑到達某個葉節點, 從給出對單詞W的預測。
? ? ? ?訓練過程中我們已經知道了單詞W, 根據W的哈夫曼編碼我們可以確定從根節點到葉節點的正確路徑, 也確定了路徑上所有分類器應該作出的預測.
? ? ? ?我們采用梯度下降法調整輸入的詞向量, 使得實際路徑向正確路徑靠攏。在訓練結束后我們可以從詞匯表中得到每個單詞對應的詞向量。
2. Skip-gram
? ? ? ? Skip-gram模型同樣是一個三層神經網絡,skip-gram模型的結構與CBOW模型正好相反,skip-gram模型輸入某個單詞,輸出對它上下文詞向量的預測。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????
? ? ? ? ?Skip-gram的核心同樣是一個哈夫曼樹, 每一個單詞從樹根開始到達葉節點,可以預測出它上下文中的一個單詞。對每個單詞進行N-1次迭代,得到對它上下文中所有單詞的預測, 根據訓練數據調整詞向量得到足夠精確的結果。
?
模型實現代碼:https://gitee.com/hdt3213/NeuralNetDemo/tree/master/Word2Vec
? ? ? ?word2vec有兩種改進方法,一種是基于Hierarchical Softmax的,另一種是基于Negative Sampling(負采樣)。兩種改進方式細節請跳轉:word2vec的兩種改進方法:Hierarchical Softmax(層序softmax)和Negative Sampling(負采樣)
? ? ? Hierarchical Softmax:對CBOW和Skip-Gram的損失結構進行了改進,
? ? ? Negative Sampling:改進了模型訓練,之前模型輸出是每個單詞的得分值,使用負采樣之后輸出是0(非臨近詞)和1(臨近詞),所以效率提高。
? ? ?
參考:
1.?NLP系列(10)_詞向量之圖解Word2vec:圖解
? ? 處理向量時,計算相似度得分的常用方法是余弦相似度
one-hot編碼——(維度災難)——>分布式編碼————>神經網絡語言模型:CBOW、skipgram——(輸出softmax,耗時)——>邏輯回歸模型(標簽值:值為0或1的新列,0=“不是鄰居”,1=“鄰居”)——>負采樣——(在數據集中引入負樣本:不是鄰居的單詞樣本)——>
未完待續。。。。。。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的word2vec原理(一): 词向量、CBOW与Skip-Gram模型基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自然语言处理库——TextBlob
- 下一篇: Word2vec基础之霍夫曼树