一、詞嵌入背景
詞嵌入(Word Embedding)是一種將文本中的詞轉換成數(shù)字向量的方法,為了使用標準機器學習算法來對它們進行分析,就需要把這些被轉換成數(shù)字的向量以數(shù)字形式作為輸入。詞嵌入過程就是把一個維數(shù)為所有詞數(shù)量的高維空間嵌入到一個維數(shù)低得多的連續(xù)向量空間中,每個單詞或詞組被映射為實數(shù)域上的向量,詞嵌入的結果就生成了詞向量。
詞向量是各種NLP任務中文本向量化的首選技術,如詞性標注、命名實體識別、文本分類、文檔聚類、情感分析、文檔生成、問答系統(tǒng)等。
二、詞嵌入方法介紹
1.One-hot編碼
One-hot編碼(被稱為獨熱碼或獨熱編碼)的詞向量。One-hot編碼是最基本的向量方法。One-hot編碼通過詞匯大小的向量表示文本中的詞,其中只有對應于該詞的項是1而所有其他的項都是零。
One-hot編碼的主要問題是不能表示詞之間的相似性。在任何給定的語料庫中,我們會期望諸如(貓、狗)之類的詞具有一些相似性,使用點積計算向量之間的相似性。點積是向量元素乘法的總和。在One-hot編碼中,語料庫中任何兩個詞之間的點積總是為零。
2.信息檢索(IR)技術
為了克服One-hot編碼的局限性,NLP領域借用了信心檢索 (IR)技術,使用文檔作為上下文來對文本進行矢量化。比如TF-IDF,LSA和主題建模。
3.分布式表示
分布式表示的目的是找到一個變換函數(shù),以便將每個詞轉換為其相關的向量。換句話說,分布是表示就是將詞轉化成向量,其中向量之間的相似性與詞之間的語義相似性相關。
分布式假說。上下文中相似的詞其語義也相似,這樣一來,我們可以把信息分布式存儲在向量的各個維度中,這種分布式表示方法具有緊密低維、句法和語義信息容易獲取的特點。
基于分布式假說,根據(jù)建模不同,大體可以分為三類:基于矩陣分布表示,基于聚類的分布表示和基于神經(jīng)網(wǎng)絡的分布表示。他們的核心思想由兩部分組成:1.選擇一種方法描述該詞的下上文;2.選擇一種模式刻畫某個詞(“目標詞”)與其上下文的關系。
(a)基于矩陣的分布表示
基于矩陣的分布表示主要是構建“詞-上下文”矩陣,通過某種技術從該矩陣中獲取詞的分布表示,矩陣的行表示打詞,列表示上下文,每個元素表示某個詞和上下文共現(xiàn)的次數(shù)。這樣矩陣的一行就描述了該詞的上下文分布情況。
常見的上下文有:1.文檔:即“詞-文檔“矩陣;2.上下文的每個詞:即“詞-詞”矩陣;3.n-元詞組,即“詞-n-元組”矩陣。矩陣中每個元素為詞和上下文共現(xiàn)次數(shù),通常會采用TF-IDF、取對數(shù)等方法進行加權平滑。另外,矩陣的維度教高并且非常稀疏的話,可以通過SVD等手段進行姜維,變?yōu)檩^低稠密矩陣。
(b)基于聚類的分布表示
通過聚類手段構建詞語上下文之間的關系,代表模型為布朗聚類(Brown Clustering)
(c)基于神經(jīng)網(wǎng)絡的分布表示
- 基于神經(jīng)網(wǎng)絡語言模型
- 循環(huán)神經(jīng)網(wǎng)絡語言模型
- C&W模型
- 著名的Word2Vec‘’
(1). skip-gram
(2). CBOW(continuous Bags-of-Words)
三、Word2vec算法
Word2vec是一種開創(chuàng)性的方法,可以在沒有任何人干預的情況下學習單詞的含義。此外,Word2vec通過查看給定單詞周圍的單詞來學習單詞的數(shù)字表示。
Word2vec通過查看單詞上下文并以數(shù)字方式表示它,來學習給定單詞的含義。所謂“上下文”,指的是感興趣的單詞的前面和后面固定數(shù)量的單詞。假設我們有一個包含N個單詞的語料庫,在數(shù)學上,這可以由以來表示,其中
是語料庫中的第i個單詞。
接下來,我們想找到一個能夠?qū)W習單詞含義的好算法,那么,在給定一個單詞之后,我們的算法應該能夠正確地預測上下文單詞。這意味著對于任何給定的單詞,以下的概率應該較高。
為了等到等式右邊成立,我們需要假設給定目標單詞的上下文單詞彼此獨立,雖然不完全成立,但這種近似使得學習問題貼合實際,并且在實際中效果很好
1.Skip-gram算法
該算法是一種利用文本單詞的上下文來學習好的詞嵌入的算法,首先我們將討論數(shù)據(jù)準備過程,然后介紹理解算法所需要的表示法,最后,我們將討論算法本身。
(1)從原始文本到結構化的數(shù)據(jù)
首先,無票需要設計一種方法來提取可以送入學習模型的數(shù)據(jù)集,這樣的數(shù)據(jù)集應該是格式為(輸入,輸出)這樣的一組二元組,而且,這需要以無監(jiān)督的方式創(chuàng)建。也就是說,人們不應該手動設置數(shù)據(jù)的標簽,總之,數(shù)據(jù)準備過程應該執(zhí)行以下操作:
- 獲取給定的單詞的周圍單詞
- 以無監(jiān)督的方式執(zhí)行
skip-gram模型使用以下方法來構建數(shù)據(jù)集:
- 對于給定的單詞
,假設上下文窗口大小為m。長下文窗口大小,指的是單側被視為上下文的單詞數(shù)。因此,對于
,上下文窗口(包含目標詞
)的大小為2m+1,
- 接下來,輸入輸出元組為
,這里
,N是文本中用于獲得實際含義的單詞數(shù)。
讓我們假設一下句子和上下文窗口大小m為1:
The dog barked at the mailman
對于此示例,數(shù)據(jù)集將如下表示:
(2)使用神經(jīng)網(wǎng)絡學習詞嵌入
一旦數(shù)據(jù)是(輸入,輸出)格式,我們就可以使用神經(jīng)網(wǎng)絡來學習詞嵌入。首先,讓我們確定學習詞嵌入所需的變量。為了存儲詞嵌入,我們需要一個V*D矩陣,其中V是次匯量大小,D是詞嵌入的維度(即向量中表示單個單詞的元素數(shù)量)。D是用戶定義的超參數(shù),D越大,學習到的詞嵌入表達力躍遷。該矩陣將稱為嵌入空間或嵌入層。
接下來,我們有一個softmax層,其權重大小為D*V,偏置大小為V。
每個詞將被表示為大小為V的獨熱編碼向量,其中一個元素為1,所有其他元素為0。因此,輸入單詞和相應的輸出單詞各自的大小為V,讓我們把第i個輸入記為,
的對應嵌入記為
,對應的輸出為
。
此時,我們定義了所需的變量。接下來,對于每個輸入,我們將從對應于輸入的嵌入層中找到嵌入向量。該操作為我們提供
,它是大小為D的向量(即長度為D的嵌入向量),然后,我們做提下轉換以計算
的預測輸出
這里,表示非標準化分數(shù)(即logits),
是V大小的預測輸出(表示輸出是V大小的詞匯表的單詞的概率)。W是DV權重矩陣,b是V1偏置矢量,softmax是softmax激活。我們將可視化skip-gram模型的概念
- V是詞匯量大小
- D是嵌入層的維度
-
表示定i個輸入單詞,表示獨熱編碼向量
-
是與第i個輸入單詞對應的嵌入向量
-
是與
對應輸出單詞的獨熱編碼向量
-
表示
的預測輸出
-
輸入
的非標準化得分
-
是單詞
的獨熱碼表示
- W是softmax權重矩陣
- b是softmax的偏置
通過使用現(xiàn)有單詞和計數(shù)得到的實體,我們可以使用符對數(shù)似然損失函數(shù)來計算給定數(shù)據(jù)點的損失。
(3)制定實際的損失函數(shù)
我們得出的損失函數(shù)如下:
但是根據(jù)目前掌握的信息,計算這一特定損失并不很容易。
首先,讓我們理解代表什么。為此,我們將從單詞表示法轉為單個數(shù)據(jù)點表示。也就是說,我們會說
由第n個數(shù)據(jù)點給出,其中
的獨熱編碼向量作為輸入
,
y_n$,這由等式給出
表示給定輸入
獲得的非標準化預測得分(即logit)向量(V大小),而
是
的獨熱編碼中非零的索引所對應的得分值(從現(xiàn)在開始,我們稱之為
的索引)。然后,我們將
索引處的logit值相對于整個詞匯表中所有單詞所對應的所有l(wèi)ogit非標準化。這種特定類型的歸一化成為softmax激活(或歸一化)?,F(xiàn)在,我們通過將其轉化成對數(shù)空間,我們得到以下等式
從實際角度來看,該損失函數(shù)的目標是,使預測給定單詞的上下文單詞的概率最大化,同時使預測給出單詞的“所有”非上下文單詞的概率最小化。
(4)有效的損失函數(shù)
上面實際的損失函數(shù),將不可避免地面對算法執(zhí)行得非常緩慢的問題,這種緩慢是由于詞匯量大而導致的性能瓶頸。上面實際的損失函數(shù)需要計算詞匯表中所有單詞的logit,與通過數(shù)百個輸出類別就足以解決大多數(shù)現(xiàn)有的真實問題的計算機視覺不同,skip-gram并不劇本這些特性。因此,我們需要在不失去模型效果的前提下尋找有效的損失近似方案。
- 負采樣
- 多層softmax
(a)對softmax層進行負采樣
負采樣是對噪聲對比估計(NCE)方法的近似。NCE要求,一個好的模型應該通過邏輯回歸來區(qū)分數(shù)據(jù)和噪聲。
考慮到這個屬性,讓我們重新設計學習詞嵌入的目標。我們不需要完全概率模型,該模型對給定單詞給出詞匯表中所有單詞的確切概率。我們需要的是高質(zhì)量的詞向量。因此,我們可以簡化我們的問題,將其變成區(qū)分實際數(shù)據(jù)(即輸入輸出對)與噪聲(即K個虛擬噪聲輸入輸出對)。噪聲指的是使用不屬于給定單詞的上下文的單詞所創(chuàng)建的錯誤輸入輸出對。我們還將擺脫softmax激活層,并將其替換成sigmoid激活(也稱為邏輯函數(shù))。這使得我們能夠使輸出保持在[0,1]之間的同時,消除損失對完整詞表的依賴。
經(jīng)過一些簡化后,我們得出以下等式
這里表示
的上下文單詞,
表示其非上下文單詞。這個等式基本上說的是,為了使
最小化,我們應該使
,這意味著
需要一個很大的正值,然后
需要一個大的負值。換句話說,對應表示真實單詞和上下文的真實數(shù)據(jù)點應該獲得大的正值,而表示目標單詞和噪聲的偽數(shù)據(jù)點應該獲得大的負值,這與softmax函數(shù)獲得的效果相同,但具有很高的計算概率。
這里表示sigmoid激活函數(shù)。直觀地看,在計算損失的時候,我們做了如下2步:
- 計算
的非零列的損失(推向正值)
- 計算K各噪聲樣本的損失(拉向負值)
(b)分層softmax
分層softmax比負采樣略復雜,但與負采樣的目標相同,也就是說,近似softmax而不必計訓練樣本的詞匯表所有單詞的激活狀態(tài)。但是,與負采樣不同,分層softmax僅使用實際數(shù)據(jù),并且不需要噪聲采樣。
要了解分層softmax,讓我們考慮一個例子:
I like NNP.Deep learning is amazing.
其詞匯表如下:
I,like,NLP,learning,is,amazing
使用詞匯表,構建二叉樹,其中,詞匯表中所有單詞以葉節(jié)點的形式出現(xiàn),我們還將添加一個特殊的標記PAD,以確保所有葉結點都有兩個成員。
然后,最后一個隱藏層將完全連接到分層結構中的所有節(jié)點,注意,與經(jīng)典的softmax層相比,該模型具相似的總權重,但是對于給定的計算,它僅使用其中一部分。
假如我們要推斷P(NLP|like)的概率,其中l(wèi)ike是輸入詞,那么我們只需要權重的子集即可計算。
具體地,以下是概率計算的過程
(NLP|like)=P(left at 1|like)p(right at 2|like)p(left at 5|like)
現(xiàn)在,我們知道如何計算,我們可以使用原始的損失函數(shù)
注意,該方法僅使用連接到路徑中的節(jié)點的權重進行計算,從而提高了計算效率
學習分層結構:
我們?nèi)绾未_定樹的分支?更準確地說,哪個詞會跟隨哪個分支?有幾種方法可以實現(xiàn)這一目標
* 隨機初始化層次結構:詞方法確實存在一些性能下降,因為隨機分配無法保證單詞之間是最佳分支
* 使用wordNet確定層次結構:WordNet可用于確定樹中單詞的合適順序,該方法明顯比隨機初始化有更好的性能。
2.連續(xù)詞袋算法(CBOW)
在skip-gram模型中,我們從目標單詞預測上下文單詞。在CBOW模型中,我們將從上下文單詞預測目標單詞。讓我們通過前面的例句來比較skipgram和CBOW的數(shù)。
The dog barked at the mailam
對于skip-gram,數(shù)據(jù)元組(即(輸入詞,輸出詞))可能如下所示
(dog,the),(dog,barked),(barked,dog),等等
對于CBOW,數(shù)據(jù)元組如下所示
([the,barked],dog,([dog,at],barked),等等
因此CBOW的輸入具有2md的維度,其中m是上下文窗口大小,D是嵌入的維度。
3.比較skip-gram算法和CBOW
在給定一批數(shù)據(jù)中,對于給定單詞的上下文,CBOW接受的信息多于skip-gram。與skip-gram相比,CBOW模型在給定時間可以訪問更多信息(輸入),從而允許CBOW在某些條件下執(zhí)行得更好。與skip-gram相比,CBOW損失快速下降。
skip-gram在語義任務中表現(xiàn)更好,而CBOW在句法任務中的表現(xiàn)更好。與CBOW相比,skip-gram更適用于大型數(shù)據(jù)集,我們的任務只涉及相對較小的數(shù)十萬字,CBOW可能表現(xiàn)更好。因為skip-gram,單詞之間分開,更多關注單詞之間的細微差別,CBOW根據(jù)語義,會認為近義詞之間沒有差別,對給定上下文的所有單詞進行平均。
4.詞嵌入擴展
(1)使用Unigram分布進行負采樣
人們已經(jīng)發(fā)現(xiàn),當從某些分布而不是均勻分布進行采樣時,負采樣的性能結果更好。一種這樣的分布是Unigram分布,單詞的unigram概率由以下等式給出
這里,是
出現(xiàn)在文檔中的次數(shù)。對于某個常數(shù)Z,當unigram分布變形為
,可以比均勻分布或標準unigram分布有更好的性能。
(2)降采樣:從概率上忽視常用詞
降采樣(即忽略常用詞)被證明也可以提供更好的性能。可以這樣直觀地理解----從有限上下文(the,france)提取的輸入輸出單詞提供的信息少于元組(paris,france),因此,相比于直接采樣,忽略像the這種從語料庫中會被頻繁采樣的無信息詞(即停用詞)是更好的選擇。
在數(shù)學上,可以使用概率實現(xiàn)語料庫的單詞序列中的單詞
這里t是一個常數(shù),它控制忽略單詞的詞頻閾值,是語料庫中
的詞頻。
5.Glove:全局向量表示
Word2vec技術在捕獲單詞語義方面非常強大,但是它并非沒有限制,例如,它不關心上下文單詞語目標單詞之間的距離。然而,如果上下文單詞離目標單詞比較遠,那么它對目標單詞的影響應該更小。
學習詞向量的方法有兩類:基于全局分解的方法或者基于局部上下文窗口的方法。潛在語義分析(LSA)是基于全局矩陣分解的方法的例子,而skip-gram和CBOW是基于局部上下文窗口的方法。LSA用文檔分析技術,它將文檔中的單詞映射到被稱為概念的對象上,這是一種文檔中出現(xiàn)的常見單詞模式?;谌志仃嚪纸獾姆椒ㄓ行У乩昧苏Z料庫的全局統(tǒng)計信息(比如全局范圍內(nèi)的單詞的重復出現(xiàn)),但它在單詞類比任務中表現(xiàn)不佳。另一方面,已經(jīng)證明基于上下文窗口的方法在單詞類比任務中表現(xiàn)更好。但是,因為沒有利用語料庫中的全局統(tǒng)計信息,所以留下了改進空間。Glove試圖充分利用這兩方面,該方法試圖有效利用全局語料庫統(tǒng)計數(shù)據(jù),同時類似于skip-gram或CBOW這種基于上下文窗口的方式來優(yōu)化學習模型
(1)理解Glove
對于Glove模型而言,其主要目標是將詞進行向量化表示,以便使各個向量之間能夠盡可能多地涵蓋語境內(nèi)的語義和語法信息。通過輸入語料庫而輸出詞向量。實現(xiàn)方法為:首先基于整個語料庫構建詞的共現(xiàn)矩陣,然后基于共現(xiàn)矩陣和Glove模型處理學習詞向量。
任意詞之間的關系都可以通過研究它們的共現(xiàn)概率與多個探測詞之間的比例來檢測,且詞向量學習的合理起點應該是貢現(xiàn)概率的比例,而非概率本身。
(2)共現(xiàn)矩陣
設共現(xiàn)矩陣為X,其元素為,這里,
是指整個語料庫中詞i和詞j共同出現(xiàn)在一個窗口中的次數(shù)。
(3)使用Glove模型訓練詞向量
我們假設i=dog,j=cat,且給出體格探測詞k,那么可以定義為詞i和詞k在一起出現(xiàn)的概率,
為詞j和詞k一起出現(xiàn)的概率。這時,對于k=bark,它很可能與i一起初夏,因此
會很高,然而,k不會經(jīng)常與j一起出現(xiàn)則導致
低。因此
如果k=whiz,那么它不太可能出現(xiàn)在i附近,因此具有低的,但由于k與j高度相關,因此
的值很高,所以,
如果k=pet,那么它與i和j都有很強的關系,或者k=lawyer,其中i和j兩者都有很小的相關性,我們可以得到,
由此我們可以得知,通過統(tǒng)計彼此相近兩個詞的頻數(shù)可以統(tǒng)計其對應共現(xiàn)概率,進而可以得到兩者的比率與1的關系,最終可以得到詞之間的關系情況,所以,
就可以成為學習詞向量的重要方法,下面給出最通用的表現(xiàn)形式
經(jīng)過一系列推導,我們最終會得到損失函數(shù)