一文通覽詞向量
在NLP中,要把自然語言轉化成機器能理解的語言,就需要把詞數字化。網上有很多這方面的博客,不過大多是介紹其中某個技術,或者是給個技術的全貌概覽,而沒有一個很好的總結。這裡我會對目前的詞向量獲得技術作一個總結,對一些自己認為比較重要的細節會寫到,而其他沒有涉及到細節會在文末放出參考鏈接和文獻,供大家參考。由於是自己一個人整理,如果有錯誤之處,請不吝賜教~
【目錄】
一、什麼是詞向量
二、詞向量的表示
1、獨熱表示(One-hot Representation)
2、分散式表示(Distributed Representation)
3、為什麼要用分散式表示
4、為什麼分散式表示能表示詞向量
三、詞向量的訓練
0、語言模型簡單介紹
1、基於共現矩陣的分散式表示
- LSA、LDA
- GloVe
2、基於聚類的分散式表示
- Brown Clustering
3、基於神經網路的分散式表示
- 神經概率語言模型
- C&W(SENNA)
- M&H(HLBL)
- RNNLM
- Word2Vec
- 任務導向型
4、word2vec與GloVe的異同
四、詞向量的評價
1、Intrinsic評估
2、Extrinsic評估
五、總結
Reference
參考論文
擴展閱讀
一、什麼是詞向量
自然語言是符合語法、具有一定的信息、為人類所能理解並進行溝通的語言,比如你現在看到的文字,就是自然語言。但當我們需要計算機來處理自然語言時,計算機是無法直接理解這些符號的(漢字、字母、標點等)。這些符號需要數值化後才能輸入計算機進行後續的處理。然而只用單個數字來表示單詞是毫無意義的,它只是一個id,無法體現單詞的屬性(就好比單從座位號無法得知一個人的身高體重年齡等信息)。因此需要將單詞進行向量化。
二、詞向量的表示
詞向量的表示主要有兩種方式:獨熱編碼(One-hot Representation)和分散式表示(Distributed Representation)
1、獨熱編碼
獨熱編碼是最直觀、也最常用的方法。是一種稀疏的表示方式。其思路為將每個詞都表示成一個很長很長的向量,該向量的維度等於詞表大小,其中只有一個維度的值為1(維度的位置等於詞的id),其餘維度都為0。舉個栗子:
假設我們從語料庫中為每個詞分配一個數字ID(從0開始分配),得到「話筒」這個詞的ID為3,「麥克」為8,那麼用獨熱編碼為:
話筒:[0 0 0 1 0 0 0 0 0 0 ...]麥克:[0 0 0 0 0 0 0 0 1 0 ...]
每個詞都是茫茫0海中的一個1。如果要編程實現的話,用 Hash 表給每個詞分配一個編號就可以了。這麼簡潔的表示方法配合上最大熵、SVM、CRF 等等演算法已經很好地完成了 NLP 領域的各種主流任務。
如此簡潔的方法自然有它的缺點:
1、向量維度會隨著詞表增大而增大:
- 存儲效率低
- 若任務過程中詞表擴容,則每個詞維度也必須相應增加
- 若某個詞出現次數很少的話,則相應的權重會容易被錯誤估計
2、「辭彙鴻溝」問題:每個維度彼此正交,即所有詞彼此孤立。無法表示詞與詞之間的相關信息
2、分散式表示
所有詞都彼此孤立顯然是不符合現實情況的。與獨熱編碼不同,使用特定維度的低維實數向量來表示單詞的方法稱分散式表示。是一種稠密的表示方式。這種向量一般是這樣的:
[0.712 -0.05 -0.343 0.156 ...](數字是我隨便編的)
其最大的好處在於將語義信息融合進了詞向量中,使得基於衡量向量距離的方法(如歐式距離、餘弦距離等)可以用來度量單詞間的相似度。直觀上來說,就是語義上相近或相似的詞,在向量空間上的距離會更接近,而語義相反的詞距離會更遠。
3、為什麼要用分散式表示
前面介紹了詞的分散式表示。但說到底,為什麼需要用到分散式表示呢?
從數據量的角度來考慮, 語料庫的大小可以是無限的(26個英文字母可以排列組合出無窮多個單詞等)。首先,我們不可能獲取所有的單詞;其次,語料庫很大時,若還是採用one-hot方式,每個詞將有茫茫多個維度,而只有一個維度為1,顯然會造成存儲空間的極度浪費。針對第一個問題,我們需要通過對有限樣本的學習去推測無限樣本的情況;對第二個問題,分散式表示將離散值連續化,可以用更少的、特定長度的維度來表示詞向量,而不用每新來一個詞就擴一個維度。
從訓練的角度來看,以神經網路訓練為例(下面會詳細講到,這裡先超下綱),分散式表示由於將原始數據投射到了一個較低維度的空間,所需的參數也就變小了,對訓練來說是很有好處的。(詳情可以見YJango的Word Embedding--介紹)
(另,有一個專門的術語來描述詞向量的分散式表示技術——詞嵌入【word embedding】。從名稱上也可以看出來,獨熱編碼相當於對詞進行編碼,而分散式表示則是將詞從稀疏的大維度壓縮嵌入到較低維度的向量空間中)
4、為什麼分散式表示能表示詞向量
前面介紹了使用word embedding的目的。那麼為什麼word embedding能表示詞呢?換句話說,為什麼映射到向量空間當中的詞向量就能表示是確定的哪個詞並且還能知道它們之間的相似度呢?
關於為什麼能表示詞這個問題,在第3點裡已經說明了,分散式實際上就是求一個映射函數,這個映射函數將每個詞原始的one-hot表示壓縮投射到一個較低維度的空間並一一對應。所以分散式可以表示確定的詞。
關於為什麼分散式還能知道詞之間的關係,就必須要了解分散式假設(distributional hypothesis)。
竟然沒人提分散式假設(distributional hypothesis)。
總的來說,word embedding就是一個詞的低維向量表示(一般用的維度可以是幾十到幾千)。有了一個詞的向量之後,各種基於向量的計算就可以實施,如用向量之間的相似度來度量詞之間的語義相關性。其基於的分散式假設就是出現在相同上下文(context)下的詞意思應該相近。所有學習word embedding的方法都是在用數學的方法建模詞和context之間的關係。
作者:李明磊9527鏈接:https://www.zhihu.com/question/32275069/answer/197721342來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
單詞的意思是由上下文決定的。
舉個例子來說,
- 花園裡盛開的 玫瑰 真香
- 花園裡盛開的 牡丹 真香
這裡,玫瑰與牡丹具有相同的上下文,那麼它們的詞向量應該是很接近的。儘管計算機不知道它們到底是什麼,但能通過訓練學到它們都具有相同的特徵——都是花的品種。
因此,我們的目的在於,如何通過有限的樣本詞及其上下文,讓計算機自動學習到從輸入空間到嵌入空間的映射函數 。
#這是我曾經碰到過的一道面試題,不過當時完全沒答到點上,只是說了詞的共現頻率等特徵,還有同義詞反義詞之類的,但沒有說出分散式假設
三、詞向量的訓練
0、語言模型簡單介紹
編號為0意味著本不屬於詞向量訓練部分,但對下面的理解又比較重要,而單獨拿出來作為單獨的一個大標題又不是很合適,所以就編號為0了哈哈。這部分可以詳細內容可以看我的專欄另外一篇文章語言模型(哥大Michael Collins講義讀書筆記 )
這裡所說的語言模型是指統計語言模型。將每句話都看作是單片語成的序列 ,統計語言模型會對每句話 評定一個概率 。若該概率越高,說明該句子越符合語法,越像自然語言。
常見的統計語言模型為N-gram Model。句子得分概率的計算為:
上面這條公式右半部分的條件概率是大多數模型的目標。
用這種方法能一定程度上捕獲到上下文信息。
詞向量的分散式表示的核心思想由兩部分組成:一、選擇一種方式描述上下文;二、選擇一種模型刻畫目標詞與其上下文之間的關係。
(以下分類參考Turian的論文,見參考文獻)
1、基於共現矩陣的分散式表示
利用語料庫構建一個 共現矩陣 ,矩陣每一行代表一個詞,每一列是某種上下文表示方法。 是詞表大小。矩陣每個單元的值可以是二值的表示二者是否共現,可以是未經處理的共現次數,也可以是經過處理後的共現tf-idf值,等等。很多可衡量兩個對象之間關聯的指標都可以用來作為矩陣中每個單元的值。
由於矩陣每一行的維度大小都等於詞表大小,不便計算,所以需要進行降維,降維後的矩陣 大小為 。重點在於如何找出降維函數
【LSA、LDA】
這兩種方法的矩陣的列都是整篇文檔。也即使用了全局特徵。
在LSA中,降維函數g就是對term-document共現矩陣 進行奇異值分解(SVD),從而得到term的向量和document的向量
(鑒於對LDA模型不熟悉,這裡也不好進行展開。可以到擴展閱讀里找到「LDA數學八卦」進行閱讀。待以後理解了LDA後會回來補充這部分內容)
【GloVe】
GloVe是2014年提出的,結合了共現矩陣利用全局特徵和word2vec利用上下文特徵的優點。沒有使用神經網路。
GloVe首先使用詞共現矩陣 :
矩陣中每個單元的元素 是語料庫中出現在 上下文中 的次數
是出現在 上下文中的所有word的總次數
是 出現在 上下文中的概率
由此引申出共現概率矩陣:
可以看到 有規律可循:
- 單詞 相關,且單詞 相關:Ratio值趨近1
- 單詞 相關,但單詞 不相關:Ratio很大
- 單詞 不相關,但單詞 相關:Ratio很小
- 單詞 不相關,且單詞 不相關:Ratio趨近1
所以Ratio值能反映單詞間的相關性。
假設單詞 的詞向量分別為 ,通過某種函數作用後所呈現的規律和 具有相似的性質,也就可以認為詞向量中包含了共現概率矩陣中的信息。
假設該函數為 ,則
GloVe論文中通過公式推導得到函數 的形式為指數函數exp,則詞向量可以根據上式求出,具體過程可參見原論文或GloVe模型 - Weirping - 博客園,這裡不詳細展開。
2、基於聚類的分散式表示
聚類方法跟共現矩陣其實有重疊的部分。比方說LDA實質上也可以看做是一種聚類。
【Brown Clustering】
布朗聚類是一種基於二元文法模型(bigram)的層次聚類方法,目的在於最大化二元文法模型的互信息。它是一種硬聚類,每個詞都在且僅在唯一一個類中。
輸入語料庫中的詞序列,輸出二叉樹,二叉樹的葉子結點是一個個詞,中間節點即為我們想要的類。
缺點:只基於二元文法統計
(擴展閱讀:Brown Clustering演算法和代碼學習)
3、基於神經網路的分散式表示
通過神經網路對語言模型進行建模,訓練完後就得到了語言模型,也順便得到了詞向量。也就是說,用這種方法,詞向量是一個有用的副產品。
【神經概率語言模型】
神經概率語言模型由Bengio在2001年提出,用三層神經網路對n-gram進行建模。目標是求
輸入層:將前 個詞 首先通過查表映射成相應的詞向量 ,然後將這 個向量首尾拼接起來,形成一個 的向量(記為 )。矩陣 存儲了語料中所有詞的詞向量(可以理解為一個詞到次詞向量的映射表,每一行表示一個詞),其維度為 。 表示詞表大小(語料中詞總數), 是詞向量的維度。
隱藏層:用激活函數tanh作一次非線性變換
輸出層:一共有 個節點。每個節點表示下一個詞為 時的未歸一化的分數。使用softmax歸一化成概率,最終取概率最大的那個詞作為最終輸出。
整個模型的多數計算都集中在輸入層到隱藏層、隱藏層到輸出層的矩陣乘法運算中。
(圖中還有三條從輸入層到輸出層的虛線,表示不經過隱層直接通過softmax激活輸出。在論文中作者說發現加上這樣一個操作後可以減少一半的迭代次數)
這時,使用梯度下降法來訓練模型就可以了。當模型收斂後就可以得到詞向量了。
【C&W(SENNA)】
C&W的目的不在於訓練語言模型,而是需要用訓練好的詞向量進行下游的應用,如命名實體識別、詞性標註等。他們不像Bengio那樣去求 ,而是直接求 的打分,且用連續窗口n個詞的概率 去近似。打分越高,說明這句話越像合理的話。如果只是隨機地堆積幾個詞,那打分是負分。打分只有相對高低之分,沒有概率的特性。
有了這樣的假設之後,C&W直接用pair-wise的方式進行訓練,即使用hinge loss:
為訓練集中所有的連續n元短語, 為整個詞表。第一個求和枚舉了訓練集中所有的n元短語作為正樣本 ,第二個求和則是根據詞表作負樣本 。 意為將x中間的那個詞隨機地替換成詞表中的 。這樣構造的負樣本在大多數情況下是可用的。且負樣本僅僅修改了正樣本的一個詞,也不至於讓分類器距離負樣本太遠從而影響分類效果。網路的訓練希望正樣本的得分比負樣本得分至少高1分。
函數的結構和 Bengio 2003 中提到的網路結構基本一致。同樣是把窗口中的 個詞對應的詞向量串成一個長的向量,同樣是經過一層網路(乘一個矩陣)得到隱藏層。不同之處在於 C&W 的輸出層只有一個節點,表示得分,而不像 Bengio 那樣的有 個節點。這麼做可以大大降低計算複雜度,當然有這種簡化還是因為 C&W 並不想做一個真正的語言模型,只是借用語言模型的思想輔助他完成 NLP 的其它任務。(其實 C&W 的方法與 Bengio 的方法還有一個區別,他們為了程序的效率用 HardTanh 代替 tanh 激活函數。)
——引自licstar的博文Deep Learning in NLP (一)詞向量和語言模型
(這裡用SVM的hinge損失函數,訓練時可以構造正負樣本,但有疑問的是在測試時無負樣本的情況下如何進行測試,還有就是分數在這裡是相對高低,在測試時怎麼知道兩個樣本得分的相對高低呢?存疑,留待補充)
【M&H(HLBL)】
這部分內容,由於個人知識水平有限,暫未了解雙線性以及log-linear等模型,所以只能根據licstar的博文,簡單地介紹一下。
該模型同樣也是在Bengio的模型上進行的改進。該模型由Hinton和Mnih分別提出。
先來介紹Hinton的模型:以神經網路的形式,模型應該是這樣的:
第一個式子, 是一個 的矩陣,該矩陣可以理解為第 個詞經過 這個變換後,對第 個詞產生的影響。這裡求和的意思是前 個詞的共同影響, 則是對這些詞進行一個總結的隱藏層,即根據前 個詞對下一個詞的預測。
第二個式子,是詞向量與隱藏層做內積,去預測下一個詞的概率。內積可以反映相似度(根據餘弦公式可知,內積與兩向量間cos夾角成正比)。
(兩個式子可以合併寫成 。形如 的函數稱雙線性,也是模型名稱「log-bilinear」的由來)
模型訓練時,理論上應該要將前面所有的單詞都涵蓋進來,但「迫於現實壓力」,使用了n-gram近似,即採用前3-5個詞進行預測。
由於模型沒有採取非線性激活函數,所以速度有了很大的提升,同時由於詞向量與隱層直接相乘,減少了約一半的變數,使得模型更加簡潔。
然後是Mnih的分層log-bilinear模型(也叫HLBL)。與Hinton不同的是,它在輸出層構建了一棵平衡二叉樹進行預測。二叉樹的每個非葉節點用於給預測向量分類,最後到葉節點就可以確定最終輸出哪一個詞。這在複雜度上有顯著的提升,以前是對 個詞一一做比較,最後找出最相似的,現在只需要做 次判斷即可。(word2vec的分層softmax方法應該來源於此~)
平衡二叉樹的構造:
M&H 使用 bootstrapping 的方法來構建這棵樹。從隨機的樹開始,根據分類結果不斷調整和迭代。最後得到的是一棵平衡二叉樹,並且同一個詞的預測可能處於多個不同的葉節點。這種用多個葉節點表示一個詞的方法,可以提升下一個詞是多義詞時候的效果。
【RNNLM】
在Bengio網路的基礎上,Mikolov於2010年使用循環神經網路(RNN)進行改進,目的在於減少參數(RNN的隱藏層重複利用,參數共享)。隱藏層的計算:
是第t個詞的one-hot representation, 是第t時刻的隱狀態。
從隱藏層到輸出層的計算,Bengio網路需要大量的計算,MIkolov採用了分組的思想降低計算複雜度:首先根據詞頻將 個詞分成 個組,先通過 次判斷,看下一個詞屬於哪個組,再通過若干次判斷,找出其屬於組內的哪個元素。最後平均複雜度約為 。
前面方法都是使用前n個詞對下一個詞進行預測,而使用RNN就厲害了,它的優勢在於能充分利用所有上下文信息來預測下一個詞。但RNN有個眾所周知的弱點:由於參數共享且連乘,很容易導致梯度爆炸或者梯度消失的現象,難以捕捉到長距離的信息,難以優化。(關於這點,可以詳見Understanding LSTM Networks的The Problem of Long-Term Dependencies部分)
【word2vec】
終於到大名鼎鼎的word2vec出場了。Mikolov於2013年提出的這個演算法(與RNNLM應該是同一個人,大牛就是大牛),宣告了Deep Learning向NLP領域的進軍。下面細分為兩個模型:連續詞袋模型(Continous Bag of Words Model,CBOW)和跳躍元文法模型(Skip-Gram)。
CBOW與skip-gram的異同
CBOW:用上下文作為輸入去預測中心單詞
skip-gram:用中心詞作為輸入去預測上下文
CBOW演算法對於很多分散式信息進行了平滑處理(例如將一整段上下文信息視為一個單一觀察量)。很多情況下,對於小型的數據集,這一處理是有幫助的。相形之下,Skip-Gram模型將每個「上下文-目標辭彙」的組合視為一個新觀察量,這種做法在大型數據集中會更為有效。
——TensorFlow 官方文檔中文版-word2vec教程
赫夫曼樹
給定n個權值作為n個葉子結點,構造一棵二叉樹。若該二叉樹的帶權路徑長度達到最小,則稱這樣的二叉樹為最優二叉樹,也叫赫夫曼樹。
構造過程:
(1)將 看做是森林中的n棵樹,每棵樹只有一個根節點
(2)在森林中選出根節點權值最小的兩棵樹進行合併,作為合併後的新樹的左右子樹,且新樹根節點的權值為左右兩子樹根節點權值之和
(3)從森林中刪除所選中的兩棵樹,並將新樹加入到森林中
(4)重複步驟(2)、(3),直到森林中只剩一棵樹為止。
這樣構造出來的赫夫曼樹具有一個特點,詞頻高的詞距離根節點更近
按照慣例,詞頻大的詞作為左孩子結點,詞頻小的詞作為右孩子結點。
赫夫曼編碼
利用赫夫曼樹設計的二進位前綴編碼,稱赫夫曼編碼。
分層softmax
分層softmax在網路的輸出層上採用赫夫曼樹結構以代替輸出到softmax的映射,大大降低了時間複雜度。
CBOW:
與神經概率語言模型的區別:
- 從輸入層到投影層:前者是拼接,後者是累加
- 前者有隱藏層,後者無隱藏層
- 前者輸出層是線性結構,後者輸出層是樹形結構
輸出層的每一個分支都可以看作是做了一次二分類。每經過一次分支,就算一次交叉熵,然後所有交叉熵的乘積即為最後的損失函數。
Skip-gram
Negative Sampling
可以作為分層softmax的一種替代方法。其目的在於提高訓練速度並改善所得詞向量的質量。負採樣模型中構造了一個預測給定的單詞是否為一對Context-Target的新監督學習問題,在構造負樣本時更傾向於選取出現頻率高的詞。負採樣通過直接告訴模型什麼是對的,什麼是錯的,可以加大對錯誤項的懲罰,而不是讓模型自己區分,能有效提高詞向量的質量。
【任務導向型】
嚴格來說,任務導向型並不是演算法。只是在DL中要用到神經網路,就把它歸到這了。本質上是與下游應用,如情感分析、文本分類等結合,利用下游應用的標籤來對網路進行更新,順帶學習出了詞向量。這裡的詞向量可以是隨機初始化的,然後在訓練過程中一起更新;也可以是pre-train的,在訓練過程中進行微調;也可以是通用領域的詞向量作遷移學習到專用領域的。還可以是以上方法的結合。這種有監督學習得到的詞向量會更精確,也更適用於正在進行的任務。唯一缺點就是缺乏普適性,且需要耗費額外的時間去訓練。
4、word2vec與GloVe的異同
本質上來說,word2vec通過上下文預測中心詞/通過中心詞預測上下文的做法,也是基於詞共現信息的一種建模方式。因此兩者的共同點就是都能通過詞的共現信息去學到詞之間的關係。
不同之處在於,word2vec是一種「預測」模型,而GloVe是一種「計數」模型。預測模型的目的在於最小化損失函數以提高預測能力;而計數模型本質上是對詞共現矩陣進行降維操作。
在實際NLP應用中,兩者的差異不大。而GloVe比word2vec的優勢在於GloVe能並行,意味著它在更大數據上更容易訓練;且GloVe使用了全局信息。而word2vec精度可以比GloVe稍高,不過得付出時間的代價:
word2vec(分層softmax):精度57.4%,但非常快
word2vec(Negative Sampling):精度68.3%,8h38min(需要更多迭代次數)
GloVe:精度67.1%,4h12min
四、詞向量的評價
1、Intrinsic評估
常用的Intrinsic評估是詞向量類比,是word2vec論文里提出來的。它評估了一組詞向量在語義和句法上的線性關係。具體來說,給定一組詞 ,我們要驗證的是: ,即d 是與向量 的cosine距離最近的詞。
2、Extrinsic評估
Intrinsic評估主要用於模型初步的調參,具體詞向量的優劣還得看它對下游應用的效果,如命名實體識別、情感分析、文本分類等,看對最終的效果有無提升。
五、總結
寫到這裡也差不多了吧?一共花了幾個晚上將之前看過的資料整理了一遍,重看一遍還是有挺多收穫的。最起碼,自身做輸出的過程很明顯可以知道自己不懂的點在哪,而不像做輸入時會忽視掉。從自己寫的時候還可以看出來,要完整地理解詞向量。牽涉的方面還很多,不過好在它們是屬於細節的部分。關於詞向量的評價,由於近期精力不太夠,很多評價方法沒來得及看,就先把一些常用的評價方法給寫了。先把文章的大框架搭起來吧,後面有機會會把這部分補上,也會把文中自己尚未清楚的坑給填上。
Reference
- Deep Learning in NLP (一)詞向量和語言模型
- word2vec 中的數學原理詳解(二)預備知識
- word2vec 中的數學原理詳解(四)基於 Hierarchical Softmax 的模型
- word2vec 中的數學原理詳解(五)基於 Negative Sampling 的模型
- 深度學習、自然語言處理和表徵方法
- 知乎用戶:有誰可以解釋下word embedding?
- YJango的Word Embedding--介紹
- 文本表示學習-詞嵌入入門理解
- 語言模型(哥大Michael Collins講義讀書筆記 )
- GloVe模型 - Weirping - 博客園
- (Stanford CS224d) Deep Learning and NLP課程筆記(三):GloVe與模型的評估
- 【deeplearning.ai】深度學習(9):自然語言處理
- TensorFlow 官方文檔中文版-word2vec教程
- https://www.quora.com/How-is-GloVe-different-from-word2vec/answer/Stephan-Gouws?share=fa924d48&srid=nlCs
- 為何做DL用word2vec比glove多? - 潘超的回答 - 知乎
參考論文
- Turian J, Ratinov L, Bengio Y. Word representations: a simple and general method for semi-supervised learning[C]// ACL 2010, Proceedings of the, Meeting of the Association for Computational Linguistics, July 11-16, 2010, Uppsala, Sweden. DBLP, 2010:384-394.d
擴展閱讀
- 【轉】LDA數學八卦 - JSong - 博客園
- Brown Clustering演算法和代碼學習
- Understanding LSTM Networks
- 《How to Generate a Good Word Embedding?》導讀
推薦閱讀:
※Dynamic word embedding 動態詞向量表示
※《GloVe: Global Vectors for Word Representation》閱讀筆記
※DNN模型訓練詞向量原理
TAG:詞向量 |