詞嵌入

一、詞嵌入背景

詞嵌入(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)絡的分布表示

  1. 基于神經(jīng)網(wǎng)絡語言模型
  2. 循環(huán)神經(jīng)網(wǎng)絡語言模型
  3. C&W模型
  4. 著名的Word2Vec‘’
    (1). skip-gram
    (2). CBOW(continuous Bags-of-Words)

三、Word2vec算法

Word2vec是一種開創(chuàng)性的方法,可以在沒有任何人干預的情況下學習單詞的含義。此外,Word2vec通過查看給定單詞周圍的單詞來學習單詞的數(shù)字表示。

Word2vec通過查看單詞上下文并以數(shù)字方式表示它,來學習給定單詞的含義。所謂“上下文”,指的是感興趣的單詞的前面和后面固定數(shù)量的單詞。假設我們有一個包含N個單詞的語料庫,在數(shù)學上,這可以由以w_o,w_1,\dots,w_i,\dots,w_N來表示,其中w_i是語料庫中的第i個單詞。

接下來,我們想找到一個能夠?qū)W習單詞含義的好算法,那么,在給定一個單詞之后,我們的算法應該能夠正確地預測上下文單詞。這意味著對于任何給定的單詞w_i,以下的概率應該較高。

P(w_{i-m},\dots,w_{i-1},w_{i+1},\dots,w_{i+m}|w_i)=\prod_{j\ne i,j=1-m}^{i+m}P(w_j|w_i)
為了等到等式右邊成立,我們需要假設給定目標單詞w_i的上下文單詞彼此獨立,雖然不完全成立,但這種近似使得學習問題貼合實際,并且在實際中效果很好

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ù)集:
  1. 對于給定的單詞w_i,假設上下文窗口大小為m。長下文窗口大小,指的是單側被視為上下文的單詞數(shù)。因此,對于w_i,上下文窗口(包含目標詞w_i)的大小為2m+1,
  2. 接下來,輸入輸出元組為[\dots,(w_i,w_{i-m}),\dots,(w_i,w_{i+1}),\dots,(w_i,w_{i+m}),\dots],這里m+1 \le i \le N-m,N是文本中用于獲得實際含義的單詞數(shù)。

讓我們假設一下句子和上下文窗口大小m為1:
The dog barked at the mailman
對于此示例,數(shù)據(jù)集將如下表示:
[(dog,the),(dog,barked),(barked,dog),(barked,at),\dots,(the,at),(the,mailman)]

(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個輸入記為x_i,x_i的對應嵌入記為z_i,對應的輸出為y_i。

此時,我們定義了所需的變量。接下來,對于每個輸入x_i,我們將從對應于輸入的嵌入層中找到嵌入向量。該操作為我們提供z_i,它是大小為D的向量(即長度為D的嵌入向量),然后,我們做提下轉換以計算x_i的預測輸出
\begin{aligned} logit(x_i)=z_iW+b\\ \hat y_i =softmax(logit(x_i)) \end{aligned}
這里,logit(x_i)表示非標準化分數(shù)(即logits),\hat y_i是V大小的預測輸出(表示輸出是V大小的詞匯表的單詞的概率)。W是DV權重矩陣,b是V1偏置矢量,softmax是softmax激活。我們將可視化skip-gram模型的概念

  • V是詞匯量大小
  • D是嵌入層的維度
  • x_i表示定i個輸入單詞,表示獨熱編碼向量
  • z_i是與第i個輸入單詞對應的嵌入向量
  • y_i是與x_i對應輸出單詞的獨熱編碼向量
  • \hat y_i表示x_i的預測輸出
  • logit(x_i)輸入x_i的非標準化得分
  • \prod_{wj}是單詞w_j的獨熱碼表示
  • W是softmax權重矩陣
  • b是softmax的偏置
    通過使用現(xiàn)有單詞和計數(shù)得到的實體,我們可以使用符對數(shù)似然損失函數(shù)來計算給定數(shù)據(jù)點(x_i,y+i)的損失。

(3)制定實際的損失函數(shù)

我們得出的損失函數(shù)如下:
J(\theta)=-(\frac{1}{N-2m})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}^{i+m}logP(w_j|w_i)
但是根據(jù)目前掌握的信息,計算這一特定損失并不很容易。

首先,讓我們理解P(w_j|w_i)代表什么。為此,我們將從單詞表示法轉為單個數(shù)據(jù)點表示。也就是說,我們會說P(w_j|w_i)由第n個數(shù)據(jù)點給出,其中w_i的獨熱編碼向量作為輸入x_nw_j#的獨熱編碼表示作為真實輸出y_n$,這由等式給出
P(w_j|w_i)=\frac{exp(logit(x_n)_{w_j})}{\sum_{w_k \in vocabulary} exp(logit(x_n)_{w_k})}

logit(x_n)表示給定輸入x_n獲得的非標準化預測得分(即logit)向量(V大小),而logit(x_n)_{w_j}w_j的獨熱編碼中非零的索引所對應的得分值(從現(xiàn)在開始,我們稱之為w_j的索引)。然后,我們將w_j索引處的logit值相對于整個詞匯表中所有單詞所對應的所有l(wèi)ogit非標準化。這種特定類型的歸一化成為softmax激活(或歸一化)?,F(xiàn)在,我們通過將其轉化成對數(shù)空間,我們得到以下等式
J(\theta)=-(\frac{1}{N-2m})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}^{i+m}logit(x_n)_{w_j}-log\bigg(\sum_{w_k in vocabulary}exp(logit(x_n)_{w_k})\bigg)

從實際角度來看,該損失函數(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)過一些簡化后,我們得出以下等式
J(\theta)=-(\frac{1}{N})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}(\sigma(logit(x_n)_{w_j}))+\sum_{q=1}^k E_{w_q \tilde vocabulary-(w_i,w_j)}log(\sigma(-logit(x_n)_{w_q}))

這里w_j表示w_i的上下文單詞,w_q表示其非上下文單詞。這個等式基本上說的是,為了使J(\theta)最小化,我們應該使\sigma(logit(x_n)_{w_i}) \approx 1,這意味著logit(x_n)_{w_j}需要一個很大的正值,然后\sigma(-logit(x_n)_{w_q}) \approx 1需要一個大的負值。換句話說,對應表示真實單詞和上下文的真實數(shù)據(jù)點應該獲得大的正值,而表示目標單詞和噪聲的偽數(shù)據(jù)點應該獲得大的負值,這與softmax函數(shù)獲得的效果相同,但具有很高的計算概率。

這里\sigma表示sigmoid激活函數(shù)。直觀地看,在計算損失的時候,我們做了如下2步:

  • 計算w_j的非零列的損失(推向正值)
  • 計算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)在,我們知道如何計算P(w_j|w_i),我們可以使用原始的損失函數(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分布,單詞w_i的unigram概率由以下等式給出
U(w_i) = \frac{count(w_i)}{\sum_{j in Corpus}count(w_j)}
這里,count(w_i)w_i出現(xiàn)在文檔中的次數(shù)。對于某個常數(shù)Z,當unigram分布變形為U(w_i)^{\frac{3}{4}}/Z,可以比均勻分布或標準unigram分布有更好的性能。

(2)降采樣:從概率上忽視常用詞

降采樣(即忽略常用詞)被證明也可以提供更好的性能。可以這樣直觀地理解----從有限上下文(the,france)提取的輸入輸出單詞提供的信息少于元組(paris,france),因此,相比于直接采樣,忽略像the這種從語料庫中會被頻繁采樣的無信息詞(即停用詞)是更好的選擇。

在數(shù)學上,可以使用概率實現(xiàn)語料庫的單詞序列中的單詞w_i
1-\sqrt{\frac{t}{f(w_i)}}
這里t是一個常數(shù),它控制忽略單詞的詞頻閾值,f(w_i)是語料庫中w_i的詞頻。

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)概率的比例,而非概率本身。
F((w_i-w_j)^Tw_k)=\frac{P_{ik}}{P_{jk}}

(2)共現(xiàn)矩陣

設共現(xiàn)矩陣為X,其元素為X_{(i,j)},這里,X_{(i,j)}是指整個語料庫中詞i和詞j共同出現(xiàn)在一個窗口中的次數(shù)。

(3)使用Glove模型訓練詞向量

我們假設i=dog,j=cat,且給出體格探測詞k,那么可以定義P_{ik}為詞i和詞k在一起出現(xiàn)的概率,P_{jk}為詞j和詞k一起出現(xiàn)的概率。這時,對于k=bark,它很可能與i一起初夏,因此P_{ik}會很高,然而,k不會經(jīng)常與j一起出現(xiàn)則導致P_{jk}低。因此P_{ik}/P_{jk} >> 1

如果k=whiz,那么它不太可能出現(xiàn)在i附近,因此具有低的P_{ik},但由于k與j高度相關,因此P_{jk}的值很高,所以,P_{ik}/P_{jk} \approx 1

如果k=pet,那么它與i和j都有很強的關系,或者k=lawyer,其中i和j兩者都有很小的相關性,我們可以得到,P_{ik}/P_{jk} \approx 1

由此我們可以得知,通過統(tǒng)計彼此相近兩個詞的頻數(shù)可以統(tǒng)計其對應共現(xiàn)概率P_{ik},P_{jk},進而可以得到兩者的比率與1的關系,最終可以得到詞之間的關系情況,所以,P_{ik}/P_{jk}就可以成為學習詞向量的重要方法,下面給出最通用的表現(xiàn)形式
F((w_i,w_j)^Tw_K)=\frac{P_{ik}}{P_{jk}}

經(jīng)過一系列推導,我們最終會得到損失函數(shù)
J = \sum_{i,j=1}^V f(X_{ij})(W_i^T \hat{W_j}+b_i+\hat{b_j}-log X_{ij})^2

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容