本文的標題是《NLP–Word2Vec詳解》來源于:由作者:陳品正采編而成,主要講述了注:其他有很多公式是用markdown寫的,但頭條顯示不了,推薦大家在微信公眾號閱讀~
微信公眾號:浩波的筆記
注:其他有很多公式是用markdown寫的,但頭條顯示不了,推薦大家在微信公眾號閱讀~
微信公眾號:浩波的筆記
文章鏈接:Word2Vec詳解:https://mp.weixin.qq.com/s?__biz=MzU1MjE1Nzk1OA==&mid=2247484504&idx=1&sn=920e796a3adda8b812ea74be87bd9e08&chk**=fb871231ccf09b27ab0bbaf25e5c565d3e388ec95584998cc58bebd09a8bef72be95b5a16051&token=279089019&lang=zh_CN#rd
word2vec可以在百萬數量級的詞典和上億的數據集上進行高效地訓練;并且,該工具得到的訓練結果——詞向量(word embedding),可以很好地度量詞與詞之間的相似性。隨著深度學習(Deep Learning)在自然語言處理中應用的普及,很多人誤以為word2vec是一種深度學習算法。其實word2vec算法的背后是一個淺層神經網絡。
另外需要強調的一點是,word2vec是一個計算word vector的開源工具。當我們在說word2vec算法或模型的時候,其實指的是其背后用于計算word vector的CBoW模型和Skip-gram模型。很多人以為word2vec指的是一個算法或模型,這也是一種謬誤。接下來,本文將從統計語言模型出發,盡可能詳細地介紹word2vec工具背后的算法模型的來龍去脈。
Statistical Language Model
在深入word2vec算法的細節之前,我們首先回顧一下自然語言處理中的一個基本問題:如何計算一段文本序列在某種語言下出現的概率?之所為稱其為一個基本問題,是因為它在很多NLP任務中都扮演著重要的角色。例如,在機器翻譯的問題中,如果我們知道了目標語言中每句話的概率,就可以從候選**中挑選出最合理的句子做為翻譯結果返回。
統計語言模型給出了這一類問題的一個基本解決框架。對于一段文本序列
它的概率可以表示為:
即將序列的聯合概率轉化為一系列條件概率的乘積。問題變成了如何去預測這些給定previous words下的條件概率:
由于其巨大的參數空間,這樣一個原始的模型在實際中并沒有什么用。我們更多的是采用其簡化版本一一Ngram模型:
常見的如bigram模型 (N=2) 和trigram模型 (N=3) 。事實上,由于模型復雜度和預測精度的限制,我們很少會考慮N>3的模型。 我們可以用最大似然法去求解Ngram模型的參數一一等價于去統計每個Ngram的條件詞頻。 型進一步發展出了back-off trigram模型 (用低階的bigram和unigram代替零概率的trigram) 和interpolated trigram模型(將條件 概率表示為unigram、bigram、trigram三者的線性函數)。
Distributed Representation
不過,Ngram模型仍有其局限性。首先,由于參數空間的爆炸式增長,它無法處理更長程的context(N>3)。其次,它沒有考慮詞與詞之間內在的聯系性。例如,考慮"the cat is walking in the bedroom"這句話。如果我們在訓練語料中看到了很多類似“the dog is walking in the bedroom”或是“the cat is running in the bedroom”這樣的句子,那么,即使我們沒有見過這句話,也可以從“cat”和“dog”(“walking”和“running”)之間的相似性,推測出這句話的概率。然而, Ngram模型做不到。
這是因為,Ngram本質上是將詞當做一個個孤立的原子單元(atomic unit)去處理的。這種處理方式對應到數學上的形式是一個個離散的one-hot向量(除了一個詞典索引的下標對應的方向上是1 ,其余方向上都是0)。例如,對于一個大小為5的詞典:{"I", "love", "nature", "luaguage", "processing"},“nature”對應的one-hot向量為:[0,0,1,0,0] 。顯然,one-hot向量的維度等于詞典的大小。這在動輒上萬甚至百萬詞典的實際應用中,面臨著巨大的維度災難問題(The Curse of Dimensionality)
于是,人們就自然而然地想到,能否用一個連續的稠密向量去刻畫一個word的特征呢?這樣,我們不僅可以直接刻畫詞與詞之間的相似度,還可以建立一個從向量到概率的平滑函數模型,使得相似的詞向量可以映射到相近的概率空間上。這個稠密連續向量也被稱為word的distributed representation。
事實上,這個概念在信息檢索(Information Retrieval)領域早就已經被廣泛地使用了。只不過,在IR領域里,這個概念被稱為向量空間模型(Vector Space Model,以下簡稱V**)。
V**是基于一種Statistical Semantics Hypothesis[4]:語言的統計特征隱藏著語義的信息(Statistical pattern of human word usage can be used to figure out what people mean)。例如,兩篇具有相似詞分布的文檔可以被認為是有著相近的主題。這個Hypothesis有很多衍生版本。其中,比較廣為人知的兩個版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是說,一篇文檔的詞頻(而不是詞序)代表了文檔的主題;后者是說,上下文環境相似的兩個詞有著相近的語義。后面我們會看到,word2vec算法也是基于Distributional的假設。
那么,V**是如何將稀疏離散的one-hot詞向量映射為稠密連續的Distributional Representation的呢?
簡單來說,基于Bag of Words Hypothesis,我們可以構造一個term-document矩陣A:矩陣的行Ai,:: 對應著詞典里的一個word;矩陣的列A:,j對應著訓練語料里的一篇文檔;矩陣里的元素Ai,j代表著wordwi在文檔Dj中出現的次數(或頻率)。那么,我們就可以提取行向量做為word的語義向量(不過,在實際應用中,我們更多的是用列向量做為文檔的主題向量)。
類似地,我們可以基于Distributional Hypothesis構造一個word-context的矩陣。此時,矩陣的列變成了context里的word,矩陣的元素也變成了一個context窗口里word的共現次數。
注意,這兩類矩陣的行向量所計算的相似度有著細微的差異:term-document矩陣會給經常出現在同一篇document里的兩個word賦予更高的相似度;而word-context矩陣會給那些有著相同context的兩個word賦予更高的相似度。后者相對于前者是一種更高階的相似度,因此在傳統的信息檢索領域中得到了更加廣泛的應用。
不過,這種co-occurrence矩陣仍然存在著數據稀疏性和維度災難的問題。為此,人們提出了一系列對矩陣進行降維的方法(如LSI/LSA等)。這些方法大都是基于SVD的思想,將原始的稀疏矩陣分解為兩個低秩矩陣乘積的形式。
Neural Network Language Model
接下來,讓我們回到對統計語言模型的討論。鑒于Ngram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:A neural probabilistic language model。在這篇文章里,他們總結出了一套用神經網絡建立統計語言模型的框架(Neural Network Language Model,以下簡稱NNLM),并首次提出了word embedding的概念(雖然沒有叫這個名字),從而奠定了包括word2vec在內后續研究word representation learning的基礎。
NNLM模型的基本思想可以概括如下:
- 假定詞表中的每一個word都對應著一個連續的特征向量;
- 假定一個連續平滑的概率模型,輸入一段詞向量的序列,可以輸出這段序列的聯合概率;
- 同時學習詞向量的權重和概率模型里的參數。
值得注意的一點是,這里的詞向量也是要學習的參數。
在03年的論文里,Bengio等人采用了一個簡單的前向反貴神經網絡 來擬合一個詞序列的條件概率 。整個模型的網絡結構見下圖:
我們可以將整個模型拆分成兩部分加以理解:
- 首先是一個線性的Embedding層。它將輸入的N?1個one-hot詞向量,通過一個共享的D×V的矩陣C,映射為N?1個分布式的詞向量(distributed vector)。其中,V是詞典的大小,D是Embedding向量的維度(一個先驗參數)。C矩陣里存儲了要學習的word vector。
- 其次是一個簡單的前向反饋神經網絡g。它由一個tanh隱層和一個softmax輸出層組成。通過將Embedding層輸出的N?1個詞向量映射為一個長度為V的概率分布向量,從而對詞典中的word在輸入context下的條件概率做出預估:
我們可以通過最小化一個cross-entropy的正則化損失函數來調整模型的參數theta:
其中,模型的參數θ包括了Embedding層矩陣C的元素,和前向反饋神經網絡模型g里的權重。這是一個巨大的參數空間。不過,在用SGD學習更新模型的參數時,并不是所有的參數都需要調整(例如未在輸入的context中出現的詞對應的詞向量)。計算的瓶頸主要是在softmax層的歸一化函數上(需要對詞典中所有的word計算一遍條件概率)。
然而,拋卻復雜的參數空間,我們不禁要問,為什么這樣一個簡單的模型會取得巨大的成功呢?
仔細觀察這個模型就會發現,它其實在同時解決兩個問題:一個是統計語言模型里關注的條件概率 的計算; 一個是向量空間模型里關注的詞向量的表達。而這兩個問題本質上并不**。通過引入連續的詞向量和平滑的概率模型,我們就可以在一個連續空間里對序列概率進行建模,從而從根本上緩解數據稀政性和維度災難的問題。另一方面,以條件概率 為學習目標去更新 詞向量的權重, 具有更強的導向性, 同時也與V**里的Distributional Hypothesis不謀而合。
在主角正式登場前,我們先看一下NNLM存在的幾個問題。
一個問題是,同Ngram模型一樣,NNLM模型只能處理定長的序列。在03年的論文里,Bengio等人將模型能夠一次處理的序列長度N提高到了5,雖然相比bigram和trigram已經是很大的提升,但依然缺少靈活性。
因此,Mikolov等人在2010年提出了一種RNNLM模型[7],用遞歸神經網絡代替原始模型里的前向反饋神經網絡,并將Embedding層與RNN里的隱藏層合并,從而解決了變長序列的問題。
另一個問題就比較嚴重了。NNLM的訓練太慢了。即便是在百萬量級的數據集上,即便是借助了40個CPU進行訓練,NNLM也需要耗時數周才能給出一個稍微靠譜的解來。顯然,對于現在動輒上千萬甚至上億的真實語料庫,訓練一個NNLM模型幾乎是一個impossible mission。
這時候,還是那個Mikolov站了出來。他注意到,原始的NNLM模型的訓練其實可以拆分成兩個步驟:
- 用一個簡單模型訓練出連續的詞向量
- 基于詞向量的表達,訓練一個連續的Ngram神經網絡模型。
- 而NNLM模型的計算瓶頸主要是在第二步。
如果我們只是想得到word的連續特征向量,是不是可以對第二步里的神經網絡模型進行簡化呢?
Mikolov是這么想的,也是這么做的。他在2013年一口氣推出了兩篇paper,并開源了一款計算詞向量的工具——至此,word2vec橫空出世,主角閃亮登場。
1 Word2Vec模型總述
Word2Vec 簡單講其實就是通過學習文本然后用詞向量的方式表征詞的語義信息,即通過 Embedding 把原先詞所在空間映射到一個新的空間中去, 使得語義上相似的單詞在該空間內 距離相近。以傳統神經網絡為基礎的神經概率語言模型,缺點主要是計算量太大,集中體現在:隱 層和輸出層之間的矩陣運算和輸出層上的 Softmax 歸一化運算上。因此 Word2Vec 就 是針對這兩點來優化神經概率語言模型的。Word2Vec 中兩個重要的模型是: CBOW 模 型和 Skip-gram 模型。對于這兩個模型, Word2Vec 給出了兩套框架,分別是基于 Hierarchical Softmax 和 Negative Sampling 來設計的,本文硫理的是第一種類型。
2 CBOW模型
2.1 基于 模型的網絡結構 CBOW 模型的全稱是 Continous bag-of-words,它包括三層結構分別是:輸入層。 投影層和輸出層。
- 輸入層:包含 Context 中 個詞的詞向量 其中 表示詞向量的長度。
- 投影層:將輸入層的 個向量做求和累加處理,即
Sample:
- 輸出層:輸出層對應一顆 Huffman 樹,它是以語料中出現過的詞當葉子節點,以各詞 在 語料庫中出現的次數當權值構造而成。在這顆 Huffman 樹中,葉子結點共 個 分別對應詞典 mathcal 中的詞,非葉結點 個 (上圖中**的結點) 。
2.2 梯度的計算 為了后續方便描述問題,首先對 模型中用到的符號做一個統一的說明:
從根節點到出發到達 對應葉子結點的路徑; 路徑中包含節點的個數 路徑 中的 個結點, 其中 表示根結點, 表示詞 對應的結點; 其中 詞 對應的 Huffman 編碼, 它由 位編碼構成表示路徑中第個結點對應的編碼(根結點不對應編碼 其中 路徑 中非葉子結點對應的向量, 表示 路徑 中第 個非葉子結點對應的向量。
所以 Hierarchical Softmax 的思想,即對于詞典 D 中的任意詞 樹中必然存在唯一一條從根結點到詞 對應葉子結點的路徑 。路徑 上存在 個分支, 將每個分支看作一次二分類,那么每一次分類就對應一個概率,最后將這些概率連乘得到
其中 。通過對數極大似然化處理可得 模型的目標函數為:
Word 極大化化目標函數使用的算法是是隨機梯度上升法, 首先考慮 關 于 的梯度計算:
于是, 的更新公式為:
然后再考慮 關于 的梯度計算:
如果觀察到 中 和 具有對稱性, 那么計算相應梯度會更方便。由于 表示的是 Context 中所有詞向量的蛋加, 那么如何根據 來更 新每一個分量 呢? 中的做法非常的樸素, 直接取
2.3 CBOW模型更新相關參數偽代碼
- FOR
- FOR Context DO
3 Skip-gram模型
同 模型一樣, Skip-gram 模型的網絡結構也包括三層結構分別是輸入層、投影 層和輸出層:
- 輸入層:只含有當前樣本的中心詞 的詞向量
- 投影層:該層為恒等投影,其實這層可有可無,在這里只是為了方便和 CBOW 模型的網絡 結構做對比。
在這里插入圖片描述
Sample:
- 輸出層:和 CBOW 模型一樣,輸出層也是一顆 Huffman 樹。
3.2 梯度的計算
對于 Skip-gram 模型已知的是當前詞 需要對其上下文 Context 中的詞進行預 測,所以關鍵是條件概率函數 的構造, Skip-gram 模型中將其定義 為:
上式中的 可以類比上節介紹的 Hierarchical Softmax 的思想, 因此可得:
通過對數極大似然化處理可得 Skip-gram 模型的目標函數為:
首先考慮 關于 的梯度計算:
于是, 的更新公式為:
然咸再考慮 對關于 的梯度計算 亦可根據對稱性直接得出
于是, 的更新公式為:
3.3 Skip-gram 模型更新相關參數偽代碼 ?FOR Context DO
4 總結 的基本功能就是把自然語言中的每一個詞,表示成一個統一意義統一維度的詞向量,因為只有把自然語言轉化為向量的形式,才能在此之上構建相關的算法,至于向量中的每個維度具體是什么含義,得自己探索了~
本文原作者為陳品正,轉載請注明:出處!如該文有不妥之處,請聯系站長刪除,謝謝合作~
原創文章,作者:陳品正,如若轉載,請注明出處:http://www.uuuxu.com/20220512316568.html