論文|Sentence2Vec & GloVe 算法原理、推導與實現

萬物皆可Embedding系列會結合論文和實踐經驗進行介紹,前期主要集中在論文中,後期會加入實踐經驗和案例,目前已更新:

後續會持續更新Embedding相關的文章,歡迎持續關注「搜索與推薦Wiki」


Sentence2vec

Sentence2vec 是2017年發表於ICLR(國際學習展示回憶)的一篇論文,其全稱爲:A Simple but tough-to-beat baseline for sentence embeddings

下面來看一下論文所介紹的內容(論文的內容比較晦澀難懂,小編水平也不高,如果不當之處,評論區留言,感謝!)。

1、概述

論文主要提出了一種無監督的,基於單詞詞向量計算句子embedding的方法,稱之爲Smooth Inverse Frequecy(SIF),使用加權平均的方法從word embedding到sentence embedding,然後再基於句子的embedding進行相似度計算,下面使用Sentence2vec來代替模型的思想。

論文中提出的計算方法比直接平均求句子embedding的方法效果要好一些,在一些任務中甚至比RNN、LSTM模型表現還要好一些。

與該論文中思路比較相近的做法有:

  • 直接使用詞語的平均embedding來表示句子,即不帶權平均
  • 使用TF-IDF值作爲權重,進行帶權計算(前提是句子中沒有大量重複的詞語,且使用tfidf值作爲權重沒有理論依據)

通過引入SIF,結合詞語embedding加權計算句子embedding,不僅表現較好,而且有較好的魯棒性,論文中提到了三點:

  • 使用不同領域的語料訓練得到的不同詞語embedding,均取得了不錯的效果,說明算法對各種語料都比較友好
  • 使用不同語料計算得到的詞頻,作爲詞語的權重,對最終的結果影響很小
  • 對於方法中的超參數, 在很大範圍內, 獲得的結果都是區域一致的, 即超參數的選擇沒有太大的影響

2、理論

a)潛在變量生成模型

在介紹Sentence2vec之前,先看一下潛在變量生成模型(latent variable generative model),其將語料的生成過程看作是一個動態的過程,第 t t t個單詞是在第 t t t步生成的,每個單詞 w w w 對應一個實值向量 R d R^d Rd。這個動態過程是通過 discourse vector c t ∈ R d c_t \in R^d ctRd 隨機遊走驅動的。discourse vector表達的是 what is being talked about。

discourse vector c t c_t ct 和 單詞的向量 v w v_w vw 的內積表達的是 discourse和word之間的相關性,並且假設 t t t時間觀測到的 w w w 的概率爲這個內積的對數線性關係(log linear),表達式爲:
P r [ w   e m i t t e d a t t i m e t ∣ c t ] ∝ e x p ( < c t , v w > ) Pr[w \, emitted at time t | c_t] \propto exp(<c_t, v_w>) Pr[wemittedattimetct]exp(<ct,vw>)

由於 c t c_t ct 是較小幅度的隨機遊走生成的, c t c_t ct c t + 1 c_{t+1} ct+1 之間只是相差一個很小的隨機差向量,因此相鄰的單詞由相似的discourses vector 生成,另外計算表明這種模型的隨機遊走允許偶爾 c t c_t ct 有較大的 jump,通過這種方法生成的詞向量,與word2vec(CBOW)和Glove是相似的。

b)Sentence2vec 在隨機遊走上的改進

在給定句子 s s s的情況下,對控制該句子的向量 discourse vector 進行最大似然估計, 我們觀察到在句子生成單詞的時候,discourse vector c t c_t ct 變化特別小,爲了簡單起見,認爲其是固定不變的,爲 c s c_s cs,可以證明 對 c s c_s cs 的最大似然估計就是該句中所有單詞向量的平均。

Sentence2vec對模型的改進爲增加了兩項平滑(smoothing term),原因是:有些單詞在上下文之外出現,可能會對discourse vector產生影響;有些常見的停用詞和discourse vector幾乎沒有關係。

兩項平滑技術爲:

  • 1、在對數線性模型中引入 了累加項 $ \alpha p(w) , , p(w)$ 表示的是單詞 w w w在整個語料中出現的概率, α \alpha α 是一個超參數,這樣即使和 c s c_s cs的向量內積很小,這個單詞也有概率出現
  • 2、引入糾錯項 c 0 ∈ R d c_0 \in R^d c0Rd (a common discourse vector),其意義是句子的最頻繁的意義可以認爲是句子的最重要組成部分。常常可以與語法聯繫起來. 文章中認爲對於某個單詞, 其沿着 c 0 c_0 c0方向的成分較大(即向量投影更長), 這個糾正項就會提升這個單詞出現的概率.

糾正後的單詞 w w w在句子 s s s中出現的概率爲:
P r [ w   e m i t t e d i n s e n t e n c e s ∣ c s ] = α p ( w ) + ( 1 − α ) e x p ( < c s ~ , v w > ) Z c s ~ Pr[w \, emitted in sentence s | c_s] = \alpha p(w) + (1-\alpha) \frac{exp(<\tilde{c_s}, v_w>)}{Z_{\tilde{c_s}}} Pr[wemittedinsentencescs]=αp(w)+(1α)Zcs~exp(<cs~,vw>)
其中:

  • c s ~ = β c 0 + ( 1 − β ) c s , c 0 ⊥ c s \tilde{c_s} = \beta c_0 + (1- \beta) c_s, c_0 \perp c_s cs~=βc0+(1β)cs,c0cs
  • $ \alpha, \beta$爲超參數
  • Z c s ~ = ∑ w ∈ V e x p ( < c s ~ , v w > ) Z_{\tilde{c_s}} = \sum_{w \in V} exp(<\tilde{c_s}, v_w>) Zcs~=wVexp(<cs~,vw>) 是歸一化常數

從上面的公式中也可以看出,一個與 c s c_s cs 沒有關係的詞語 w w w 也可以在句子中出現,因爲:

  • α p ( w ) \alpha p(w) αp(w) 常數項
  • 與 common discourse vector c 0 c_0 c0的相關性

c)計算句子相關性

句子的向量,即上文提到的 c s c_s cs 可以通過最大似然函數去生成,這裏假設組成句子的詞語 v w v_w vw是統一分散的,因此這裏歸一化 Z c Z_c Zc 對於不同句子的值都是大致相同的,即對於任意的 c s ~ \tilde{c_s} cs~ Z Z Z值都是相同的,,在這個前提下,得到的似然函數爲:
p [ s ∣ c s ] = ∏ w ∈ s p ( w ∣ c s ) = ∏ w ∈ s [ α p ( w ) + ( 1 − α ) e x p ( < v w , c s ~ > ) Z ] p[s | c_s] = \prod_{w\in s} p(w|c_s)= \prod_{w \in s} [\alpha p(w) + (1-\alpha) \frac{ exp(<v_w, \tilde{c_s}>) }{Z}] p[scs]=wsp(wcs)=ws[αp(w)+(1α)Zexp(<vw,cs~>)]
取對數,可得:
f w ( c s ~ ) = l o g [ α p ( w ) + ( 1 − α ) e x p ( < v w , c s ~ > ) Z ] f_w(\tilde{c_s}) = log [\alpha p(w) + (1-\alpha) \frac{ exp(<v_w, \tilde{c_s}>) }{Z}] fw(cs~)=log[αp(w)+(1α)Zexp(<vw,cs~>)]
經過一系列推導,可得最終的目標函數爲:
a r g m a x ∑ w ∈ s f w ( c s ~ ) arg max \sum_{w \in s} f_w(\tilde{c_s}) argmaxwsfw(cs~)




其正比於:
∑ w ∈ s α p ( w ) + α v w \sum_{w \in s} \frac {\alpha}{p(w) + \alpha} v_w wsp(w)+ααvw
其中 α = 1 − α α Z \alpha = \frac{1-\alpha} {\alpha Z} α=αZ1α

因此可以得到:

  • 最優解爲句子中所有單詞向量的加權平均
  • 對於詞頻更高的單詞 w w w, 權值更小, 因此這種方法也等同於下采樣頻繁單詞

最後, 爲了得到最終的句子向量 c s c_s cs, 我們需要估計 c 0 c_0 c0.。通過計算向量 c s ~ \tilde{c_s} cs~的first principal component(PCA中的主成分), 將其作爲 c 0 c_0 c0,最終的句子向量即爲 c s ~ \tilde{c_s} cs~減去主成份向量 c 0 c_0 c0

d)整體算法流程

整體算法流程

3、實現

作者開源了其代碼,地址爲:https://github.com/PrincetonML/SIF

Glove

1、概述

論文中作者總結了目前生成embedding的兩大類方法,但這兩種方法都有其弊端存在

  • 基於矩陣分解,弊端爲因爲是基於全局進行矩陣的構建,對於一些高頻詞,在算法優化的過程中,佔的權重比較大
  • 基於滑動窗口,不能直接對語料庫的單詞進行共現建模,使用的是滑動窗口,沒有辦法利用數據的共現信息

因此作者提出了一種基於語料庫進行信息統計,繼而生成embedding的算法-Glove。下面就來具體看下對應的算法原理。

2、算法推導過程

字符的定義:

  • X X X 表示單詞的共現矩陣, X i j X_{ij} Xij 表示 單詞 j j j在單詞 i i i的上下文中出現的次數,即在指定的窗口內,單詞 i , j i,j i,j的共現次數
  • X i X_i Xi 表示 任何一個單詞 k k k 和單詞 i i i的共現次數總和, ∑ k X i k \sum_{k} X_{ik} kXik
  • P i j = P ( j ∣ i ) = X i j / X i P_{ij}=P(j|i)=X_{ij} / X_i Pij=P(ji)=Xij/Xi,表示單詞 i , j i,j i,j的共現次數在單詞 i i i 出現次數總和的概率

論文中給出了一個簡單的例子,來數目如何從共現矩陣中提取出有意義的信息,如下圖所示:

共現矩陣提取信息說明

上圖想要說明的信息是,如果單詞 k k k 和單詞 i i i的相關度比 k k k j j j的相關度大的話, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值會很大,差距越大,比值越大;同理如果 k k k i i i的相關度比 k k k j j j的相關度小的話, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值會很小,差距越大,比值越小;如果 k k k i , j i, j i,j都不想關的話, P ( i k ) / P ( j k ) P(ik) / P(jk) P(ik)/P(jk)的值會接近於1。

上述的討論說明了詞向量的學習應該是基於共現概率的比率而不是概率本身,因此假設可以通過函數 F F F來學習到詞向量,函數 F F F可以抽象爲:
F ( w i , w j , w ~ k ) = P i k P j k F(w_i, w_j, \tilde{w}_k) = \frac{P_{ik}} {P_{jk}} F(wi,wj,w~k)=PjkPik
其中 w w w表示的是詞向量, P i k P j k \frac{P_{ik}} {P_{jk}} PjkPik 可以從語料中計算得到,函數 F F F依賴於一些尚未指定的參數,但因爲一些必要的條件,函數 F F F可以進一步的被確定。

由於向量空間具有線性結構,因此可以對詞向量進行差分,函數 F F F可以轉化爲:
F ( w i − w j , w ~ k ) = P i k P j k F(w_i - w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} F(wiwj,w~k)=PjkPik
雖然函數F可能是一個比較複雜的結構,比如神經網絡,但這樣做,會使我們試圖捕獲的線性結構消失,因此爲了避免這個問題,我們可以先對向量做個內積,可以轉化爲:
F ( ( w i − w j ) T w ~ k ) = P i k P j k F((w_i - w_j)^T \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} F((wiwj)Tw~k)=PjkPik


上述公式中左側是減法,右側是除法,這很容易讓人聯想到指數運算,因此限定函數 F F F爲指數函數,此時有:
e x p ( w i T w k − w j T w k ) = e x p ( w i T w k ) e x p ( w j T w k ) = P i k P j k exp(w_i^Tw_k - w_j^Tw_k) = \frac{exp(w_i^Tw_k)}{exp(w_j^Tw_k)} = \frac{P_{ik}}{P_{jk}} exp(wiTwkwjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
此時,只需要確保等式兩邊分子和分母相等即可,即:
e x p ( w i T w k ) = P i k , e x p ( w j T w k ) = P j k exp(w_i^T w_k) = P_{ik}, exp(w_j^Tw_k) = P_{jk} exp(wiTwk)=Pik,exp(wjTwk)=Pjk


進一步,可以轉化爲語料中的所有詞彙,考察 e x p ( w i T w k ) = P i k = X i k X i exp(w_i^T w_k) = P_{ik} = \frac{X_{ik}}{X_i} exp(wiTwk)=Pik=XiXik,即:
w i T w k = l o g ( X i k X i ) = l o g X i k − l o g X i w_i^T w_k = log (\frac{X_{ik}}{X_i}) = log X_{ik} - logX_i wiTwk=log(XiXik)=logXiklogXi
由於上式左側 w i T w k w_i^T w_k wiTwk 中,調換 i i i k k k 的值不會改變其結果,即具有對稱性,因此,爲了確保等式右側也具備對稱性,引入了兩個偏置項,即:
w i T w k = l o g X i k − b i − b k w_i^T w_k = log X_{ik} - b_i - b_k wiTwk=logXikbibk


此時, l o g X i log X_i logXi 已經包含在 b i b_i bi中,因此,此時模型的目標就轉化爲通過學習詞向量的表示,使得上式兩邊儘量接近,因此,可以通過計算兩者之間的平方差來作爲目標函數,即:
J = ∑ i , k = 1 V ( w i T w ~ k + b i + b k − l o g X i k ) 2 J = \sum_{i,k=1}^{V} (w_i^T \tilde{w}_k + b_i + b_k - log X_{ik})^2 J=i,k=1V(wiTw~k+bi+bklogXik)2
但是這樣的目標函數有一個缺點,就是對所有的共現詞彙又是採用相同的權重,因此,作者對目標函數進行了進一步的修正,通過語料中的詞彙共現統計信息來改變他們在目標函數中的權重,具體如下:
J = ∑ i , k = 1 V f ( X i k ) ( w i T w ~ k + b i + b k − l o g X i k ) 2 J = \sum_{i,k=1}^{V}f(X_{ik}) (w_i^T \tilde{w}_k + b_i + b_k - log X_{ik})^2 J=i,k=1Vf(Xik)(wiTw~k+bi+bklogXik)2
這裏 V V V 表示詞彙的數量,並且權重函數 f f f 必須具備一下的特性:



  • f ( 0 ) = 0 f(0)=0 f(0)=0,當詞彙共現的次數爲0時,此時對應的權重應該爲0
  • f ( x ) f(x) f(x) 必須時一個非減函數,這樣才能保證當詞彙共現的次數越大時,其權重不會出現下降的情況
  • 對於那些太頻繁的詞, f ( x ) f(x) f(x) 應該能給予他們一個相對小的數值,這樣纔不會出現過渡加權

綜合以上三點特性,作者提出了下面的權重函數:
f ( x ) = { ( x / x m a x ) a i f   x < x m a x 1 o t h e r w i s e f(x) = \left\{\begin{matrix} (x / x_{max})^a & if \,x < x_{max}\\ 1 & otherwise \end{matrix}\right. f(x)={ (x/xmax)a1ifx<xmaxotherwise

作者在實驗中設定 x m a x = 100 x_{max} = 100 xmax=100,並且發現 α = 3 / 4 \alpha = 3/4 α=3/4時效果比較好,函數的圖像如下圖所示:

a值設定效果

3、總結

以上就是有關 G l o V e GloVe GloVe原理的介紹,作者其實也是基於最開始的猜想一步一步簡化模型的計算目標,最後看GloVe的目標函數時發現其實不難計算,但是要從最開始就想到這樣一個目標函數其實還是很難的。最後做一下總結:

  • G l o v e Glove Glove綜合了全局詞彙共現的統計信息和局部窗口上下文方法的優點,可以說是兩個主流方法的一種綜合,但是相比於全局矩陣分解方法,由於 G l o V e GloVe GloVe不需要計算那些共現次數爲0的詞彙,因此,可以極大的減少計算量和數據的存儲空間
  • 但是 G l o V e GloVe GloVe把語料中的詞頻共現次數作爲詞向量學習逼近的目標,當語料比較少時,有些詞彙共現的次數可能比較少,筆者覺得可能會出現一種誤導詞向量訓練方向的現象

【技術服務】,詳情點擊查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

掃一掃 關注微信公衆號!號主 專注於搜索和推薦系統,嘗試使用算法去更好的服務於用戶,包括但不侷限於機器學習,深度學習,強化學習,自然語言理解,知識圖譜,還不定時分享技術,資料,思考等文章!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章