NLP的首要問題就是尋求恰當的文本表示方法。因為,良好的文本表示形式,是后續進一步處理的基礎。近年來,詞嵌入方法越來越流行,在各種各樣的NLP任務中得到了廣泛的應用。簡單而言,詞嵌入是通過無監督方式學習單詞的向量表示。本文將首先回顧用向量表示文本的早期模型,并通過分析其缺陷揭示詞嵌入提出的動機,然后介紹Word2Vec和Glove這兩種最流行的詞嵌入方法背后的直覺。
向量空間模型
用向量來表示文本這一想法由來已久。早在1975年,Salton等就提出用向量空間模型來表示文本,以更好地索引、搜索文檔。
由于向量空間模型最初的應用場景是索引、搜索,因此更關注詞和權重。由詞的權重組成向量,并使用這一向量表示整篇文檔。
具體而言,假設文檔由n個單詞組成,那么這篇文檔就可以表示為由每個單詞的權重組成的n維向量(長度為n的數組),[w1, w2, ..., wn]。當然,為了降低維度,事先會移除一些無關緊要的詞(例如the、is)。在實踐中,使用一份停止詞(stop words)列表移除常見的無關緊要的單詞。
權重的計算有很多方法,最常用的是基于詞頻的方法。具體而言,單詞的權重由三個因素決定:
詞頻(Term Frequency,TF)。詞頻的計算公式為TF = t / m,其中,t為單詞在文檔出現的次數,m為文檔的長度(總詞數)。例如,假設文檔由1000個單詞組成,其中某個單詞總共出現了3次,那么這個單詞的詞頻就等于3/1000.
逆向文檔頻率(Inverse Document Frequency,IDF)。IDF衡量單詞提供的信息量,換句話說,某個單詞是否在所有文檔中都很常見/罕見。這背后的直覺很簡單。假設100篇文檔中,有80篇都包含“手機”這個單詞,而只有5篇文檔包含“足球”這個單詞。那么,對某篇特定文檔而言,如果它同時包含“足球”和“手機”這兩個單詞,這篇文檔更可能是一篇關于足球的文檔,而不是一篇關于手機的文檔,盡管“手機”的詞頻可能比“足球”高很多。
也就是說,我們需要設法加強“足球”的權重,削弱“手機”的權重。一個很容易想到的辦法是用總文檔數N除以包含該單詞的文檔數n,即N/n作為系數。在上面的例子中,“足球”的系數為100/5 = 20,“手機”的系數為100/80 = 1.25.
不過,這里有一個問題,20和1.25是比較大的數字,而詞頻的取值范圍小于1,兩者之間的數量級差異太大了。說不定有一篇文檔主要是關于手機的,頻繁提到“手機”,只提到過一次“足球”,也因為系數數量級的差距導致被誤判為關于“足球”的文檔。在實踐中,文檔的總數可能非常大,遠不止100,上述缺陷就更嚴重了。因此,我們需要“壓縮”一下,比如取個對數:log(N/n)。我們看到,取對數后,“足球”的系數為log(20) = 2.996,“手機”的系數為log(1.25) = 0.223,好多了。
但是,取了對數之后,當文檔總數很多,同時某個單詞在幾乎所有文檔中出現的時候,N/n趨向于1,由對數定義可知,log(N/n)趨向于0. 為了應對這個問題,我們可以在取對數前額外加1平滑下。所以,最終IDF的計算公式為:
IDF = log(1 + N/n)
長度正則化上面TF和IDF的計算,我們假定文檔長度差距不大。實際上,文檔長度也會影響TF和IDF的效果。
雖然,在計算TF的時候,已經除以文檔總詞數了,也就是已經考慮到文檔長度了。然而這并不能完全消除文檔長度的影響。讓我們先看IDF(沒有考慮文檔總詞數)的情形。
對于IDF而言,長文檔包含的單詞更多,因此更容易出現各種單詞。因此,IDF相等的情況下,經常出現在短文檔中的單詞,信息量比經常出現在長文檔中的單詞要高。例如,假設100篇文檔中,有2篇提到了“手機”,有2篇提到了“平板”,那么這兩個單詞的IDF值均為log(1 + 100/2) = 3.932。然而,假設提到“手機”的兩篇文檔各自長度為10個單詞(一句話),而提到“平板”的兩篇文檔各自長度為10000個單詞(長篇大論)。那么,很明顯,IDF相等的“手機”和“平板”,信息量是不同的。在一句話中提到“手機”,那么這句話和手機高度相關的可能性,要比在長篇大論中偶爾提到“平板”大很多。
IDF之后,再回過頭來看TF,就比較清楚了。計算IDF時,需要考慮有多少文檔出現過某個單詞。那么,反過來說,剩下的文檔沒出現過這個單詞,也就是說,該單詞在那些剩下的文檔中的TF為零。根據之前對IDF的分析,我們知道,同樣是TF為零,長文檔TF為零和短文檔TF為零,意義是不一樣的。從另一方面來說,長度為10單詞的文檔沒有提到“平板”,長度為10000單詞的文檔提到兩次“平板”,未必意味著后者就更可能和平板相關。很可能后者只是一篇偶爾提及平板,主要內容和平板完全無關的文檔。
1975年Salton等提出基于文檔的向量空間模型,原本是為了優化文檔的索引和獲取。當得到基于文檔的向量表示后,可以計算所有文檔在整個向量空間中的密度。文檔越密集、越扎堆,想要通過特定關鍵詞檢索,獲取某篇特定文檔就更困難。相反,文檔在向量空間中,彼此的距離越遠,索引系統的效果就越好。然而,這一方法的應用顯然并不局限于此。
例如,我們可以通過計算文檔向量的接近程度(例如,使用余弦相似度)來衡量兩個文檔的相似度。之后,相似度可以用于文本分類、推薦相似文本等任務。
圖片來源:Riclas;許可: CC-BY 3.0
詞向量空間
前面我們介紹了基于文檔的向量空間模型,這一模型主要是基于頻率(詞頻和逆向文檔頻率)構建。類似地,基于和其他單詞同時出現的頻率,我們可以構建基于單詞的向量空間模型。詞向量空間模型的主要思路是出現在類似的上下文環境中的單詞在語義上很可能相似。例如,假如我們發現,“咖啡”和“喝”經常同時出現,另一方面,“茶”和“喝”也經常同時出現,那么我們可以推測“咖啡”和“茶”在語義上應該是相似的。
例如,上圖可視化了“路”(road)、“街”(street)以及“咖啡”(coffee)、“茶”(tea)這兩對詞向量。每個詞向量有25個維度(25個上下文中出現的單詞),灰度表示同時出現的頻率。從圖中很明顯能看到“路”、“街”的相似性以及“咖啡”、“茶”的相似性。另外,我們也看到,“街”和“咖啡”并不相似。(圖片來源于Lund等1996年發表的論文,因年代較早,印刷、掃描的質量不高,圖片有點模糊,見諒。)
上面的可視化中,為了便于查看,每個詞向量僅有25個維度。實際上,詞向量的維度對應于整個語料庫的詞匯量,因此通常維度高達上萬,甚至百萬。處理這樣的高維向量無疑是一項巨大的挑戰。這也正是詞向量空間模型的主要缺陷。
為了降低詞向量的維度,我們需要詞嵌入(Word Embedding)。
詞嵌入
詞嵌入背后的直覺很簡單,既然同時出現的單詞在語義上有聯系,那么我們可以用某個模型來學習這些聯系,然后用這個模型來表示單詞。
當前最流行的詞嵌入方法是Word2Vec和Glove。下面我們簡單介紹下這兩種詞嵌入方法的主要思路。
Word2Vec
Word2Vec的網絡結構很簡單,包括一個輸入層、一個隱藏層、一個輸出層。其中,輸入層對應某個(上下文)單詞的獨熱編碼向量(共有V個詞匯),輸出層為與輸入單詞同時出現的單詞的概率分布,換句話說,詞匯表中的每個單詞,出現在這一上下文中的概率分別是多少。隱藏層由N個神經元組成。
圖片來源:Xin Rong arXiv:1411.2738v4
經過訓練之后,我們使用輸入層和隱藏層之間的連接權重矩陣WVxN表示單詞之間的關系。矩陣W共有V行,每一行都是一個N維向量,每個N維向量分別對應一個單詞。這樣,詞向量的維度就從V降到了N。
我們之前介紹Word2Vec的架構的時候沒有提及激活函數。現在我們回過頭來補充一下。由于輸出層需要輸出給定上下文中出現單詞的概率分布,因此順理成章地使用softmax。而Word2Vec的隱藏層不使用激活函數,這看起來有些離經叛道,其實在這一場景中很合適。因為最終我們只需要權重矩陣,并不使用隱藏層的激活函數。因此,為了簡化網絡架構,Word2Vec的隱藏層不使用激活函數。當然,最后的輸出層也沒用到,不過隱藏層和輸出層之間的權重,以及softmax可不能去掉,否則網絡就無法訓練了。
當然,上面的網絡架構其實是簡化過了的。通常,上下文不止一個單詞。所以,實際上Word2Vec的網絡架構要比上面稍微復雜一點。
圖片來源:Xin Rong arXiv:1411.2738v4
和上面簡化過的架構相比,唯一的區別是現在有多個上下文單詞了。所以,輸入不再是某個單詞的獨熱編碼向量了,而是多個上下文單詞的平均向量。相應地,原本我們僅僅使用輸入層和隱藏層之間的權重矩陣來表示單詞,現在則使用該權重矩陣和平均向量的乘積。
另外,其實我們也可以把上述的網絡架構翻轉過來,也就是將目標單詞作為輸入,可能的上下文作為輸出。
這兩種架構都屬于Word2Vec,前者稱為CBOW模型,后者稱為Skip-Gram模型。
Glove
另一個流行的詞嵌入方法是Glove。
之前我們提到,Word2Vec的輸出是單詞同時出現的概率分布。而Glove的主要直覺是,相比單詞同時出現的概率,單詞同時出現的概率的比率能夠更好地區分單詞。比如,假設我們要表示“冰”和“蒸汽”這兩個單詞。對于和“冰”相關,和“蒸汽”無關的單詞,比如“固體”,我們可以期望P冰-固體/P蒸汽-固體較大。類似地,對于和“冰”無關,和“蒸汽”相關的單詞,比如“氣體”,我們可以期望P冰-氣體/P蒸汽-氣體較小。相反,對于像“水”之類同時和“冰”、“蒸汽”相關的單詞,以及“時尚”之類同時和“冰”、“蒸汽”無關的單詞,我們可以期望P冰-水/P蒸汽-水、P冰-時尚/P蒸汽-時尚應當接近于1。
另一方面,之前我們已經提到過,Word2Vec中隱藏層沒有使用激活函數,這就意味著,隱藏層學習的其實是線性關系。既然如此,那么,是否有可能使用比神經網絡更簡單的模型呢?
基于以上兩點想法,Glove提出了一個加權最小二乘回歸模型,輸入為單詞-上下文同時出現頻次矩陣:
其中,f是加權函數,定義如下:
在某些場景下,Glove的表現優于Word2Vec。
-
向量
+關注
關注
0文章
55瀏覽量
11660 -
nlp
+關注
關注
1文章
487瀏覽量
22015
原文標題:Word2Vec與Glove:詞嵌入方法的動機和直覺
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論