gram矩阵_Skip-gram
Skip-gram
標簽(空格分隔):NLP
一. skip-gram和cbow的對比
skip-gram與cbow相比,好處在于對于不常用的詞,skip-gram的效果要更好;
舉個簡單的例子,一個句子'w1w2w3w4',window_size=1;
對于cbow,模型學習的是預測給定上下文后出現word的概率,或者去最大化下面式子的概率值:
?
但這對不常見的單詞來說是個問題,因為不常見的單詞在給定的上下文中不經常出現,結果模型會分配給它們很小的概率。
對于skip-gram,模型學習的是給定單詞后去預測上下文的概率,或者去最大化下面式子的概率值:
在這個例子中,兩個單詞(頻繁出現的和不頻繁出現的) 被相同的對待。均被當作是單詞和上下文兩個觀測。因此,這個模型會把罕見的單詞也學到。
二. skip-gram
主要思想
skip-gram公式化的表述
skip-gram通過最優化似然目標函數,來學習預測給定單詞后的上下文。假設現在我們有一個句子:
'I am writing a summary for NLP.'
這個模型目的是,根據給定目標word ‘summary’,來預測window_size=2窗口中的上下文單詞;
'I am [] [] summary [] [].'
接著模型試著去最優化似然函數:
事實上,給出一個句子,skip-gram可以做到。相反的,把每個單詞都當作一個目標word,并且預測上下文word。所以這個目標函數可以表示為:
給它一個更正式的表述:給出一組單詞w和它們的上下文c. 我們考慮條件概率是P(c|w), 并且給出預料,目標是找出條件概率
的參數,以至于最大化語料出現的概率:或者,我們也可以將其寫為:
其中D是我們提取的所有單詞和上下文的集合,接下來通過log函數來進行簡化:
那么接下來的問題就是如何來定義
,其必須滿足如下兩個條件:一是
;二是
一個自然的方法是使用softmax函數,所以可以這樣來定義:
是word w和w的上下文單詞c的向量化表示,U表示所有可用上下文的集合。在這篇文章中,我們假設目標單詞w和上下文c來自不同的詞匯表矩陣V和U,因此,來自單詞word的'lunch'和來自單詞上下文的'lunch'是不同的。其中一個動機是每個單詞在模型中充當了兩種角色,其中一個作為目標單詞,而另一個作為上下文單詞。這就是為什么我們需要兩個單獨矩陣的原因,注意到它們必須是相同的維度:V * k,其中k是一個超參數,表示的是每一個詞向量的維數。我們想要設置參數
,從而使得函數最大化。這里我們用內積(inner product)來衡量
和兩向量間的相似性,如果它們有近似的含義,那么就代表這它們有著近似的向量化表示,那么它們的共現概率也會比較高。(note:將余弦相似度和內積來作為距離度量的對比,cos距離只關心角度的區別,而內積關心的是角度和大小。如果你歸一化了你的數據使得它們有相同的大小,那么這兩種方法就沒有區別了)
代入我們的定義
,可以把目標函數表示為:然而這個目標函數計算起來太過于復雜,因為其表示為log(sum),故計算目標函數的代價會比較大。
在考慮所有word的上下文的情況下,其時間復雜度為O(|Vocab|)
為什么更prefer選擇在求和里面取log,而不是在求和外面取log
經常我們選擇在求和里面取log而不在外面。當你想做優化時,log和sum函數是一部分功能。
這就表示在某個點處,你需要把函數的梯度設為0,導數是線性的計算,所以當你需要求log(sum)時,和的導數就是導數的和。對比之下,根據鏈式法則,和的log的導數,求得為如下形式:
1/(your sum)?(derivative of the sum)
特別是當分析的時候, 找到該函數的0可能是一個具有挑戰性的任務。另一方面,因為這個過程的計算代價很大,在求和外的log常常需要近似的來進行計算,例如使用Jensen不等式來進行近似。
現在,開始重新構造目標函數并且對其近似:
負采樣--skipgram model
在進行skip-gram模型的推導之前,我們假定(w,c)在訓練數據集中是一個詞與其上下文詞的對,那么
的共現概率應該很大。現在可以思考一個問題:當共現概率比較大時,在訓練數據中,它們是不是一個單詞及單詞的上下文對?按照這種方式進行思考,我們提出了二元分類問題:表示來自上下文語料庫的單詞對(w,c)的共現概率,表示來自不同語料庫的單詞對(w,c)共現概率。和以前一樣,假設有參數
控制分布,因為它是一個二分類的問題,故我們可以使用sigmoid函數來定義它:現在的目標變成了尋找參數
來最大化如下目標函數:其中
是由不在語料庫中的詞對(w, c)隨機組成,我們將(w, c)這個不在語料庫中的詞對稱為負采樣(源于的采樣過程是對負樣本進行隨機采樣)。下面有幾個點需要注意:通常情況下:
,所以我們為每個數據樣本取k個負樣本。由原始論文中,對于小型訓練數據集,作者建議k值取在5--20之間;對于大型訓練數據集,作者建議k值取在2--5之間。因此如果我們對每個數據樣本取k個負樣本,并且通過N(w)來表示這些負樣本。那么目標函數可以表示為:
SGD for skip-gram objective function
代碼實現細節
- 動態窗口大小:使用的窗口大小是動態的,參數k表示最大窗口大小。對于語料庫中的單詞,窗口大小從[1,k]均勻采樣;
- 二次采樣和稀有詞修剪:關于二次采樣和下采樣
References
https://blog.csdn.net/Jay_Tang/article/details/105577295 唐兄的blog
http://www.davidsbatista.net/blog/2018/12/06/Word_Embeddings/
https://www.quora.com/Why-is-it-preferential-to-have-the-log-inside-the-sum-rather-than-outside
- END -
總結
以上是生活随笔為你收集整理的gram矩阵_Skip-gram的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: android gridview控件使用
- 下一篇: 安卓侧滑菜单实现(安卓侧滑菜单)
