2018年對於自然語言處理(Natural Language Processing, NPL)是極有意義的一年,這一年出現了許多新的研究方向和尖端成果。在學術界和工業界,由於帶有上下文的嵌入模型對內存和硬體的要求極高,預先訓練詞嵌入的使用仍然十分普遍。
SGNS and Matrix FactorizationYou shall know a word by the company it keeps. (Firth, 1957)
正如Firth所言,詞義的確定需要結合它與其它詞語之間的搭配關係,他所說的「company」指的就是與某一詞語同現的搭配詞語。構建預先訓練詞嵌入的優勢在於,其向量表示能夠反映通用語言信息,這些信息對後續任務的開展有很大的幫助。對於NLP而言,通過創建單詞的詞嵌入向量,能夠預測可能會出現在該單詞周圍的單詞。
Skip-Gram with Negative Sampling (SGNS)
SGNS作為一種神經網絡模型受到了廣泛的關注,其目的是預測給定當前單詞的所有上下文單詞。在下圖中,我們將通過單詞「a」,對「am」,「I」,「neural」,「network」等單詞進行預測。詞彙量的大小及單詞的順序決定了,對一個單詞,我們都會產生million-dimensional預測向量,並且需要在整個辭典上計算全部詞向量和當前中心詞的點積,這個計算量太大了。
SGNS的提出者引入了「負採樣(negative sampling)」來解決這一問題。其思想就是,做一個負樣本,可以理解成隨機語料。於是每次訓練的時候,我們就有一個正樣本和若干個負樣本,我們讓正樣本的預測概率儘可能大,而讓負樣本預測概率儘可能小,通過負樣本的引入,將本來建立在整個辭典上的一個|V|分類問題,轉換成一個建模在正負樣本上的一個二分類問題。
SGNS的基本過程大致如上圖所示,但當對輸出層使用softmax函數時,需要用單詞的上下文嵌入(context embedding)矩陣C乘以輸入單詞的詞嵌入矩陣W,該圖在這一點上未能清楚描述。
對輸出層採用softmax函數,其計算量過大。負採樣(negative sampling)的引入能夠有效緩解這個問題。不同於原來每個訓練樣本更新所有的權重,負採樣每次讓一個訓練樣本僅僅更新一部分的權重,降低了梯度下降過程中的計算量。
SGNS其實是一種隱式的矩陣分解
接下來我們將提出一個不同的概念框架來理解Word2vec,在深入討論細節之前,讓我們先形式化一些符號:
Sigma (σ) :常用的邏輯回歸函數輸入單詞的詞嵌入矩陣W,其它上下文單詞的詞嵌入矩陣C。值得注意的是,Word2vec和GloVe一樣,需要單獨的單詞和上下文嵌入,即使它們對應相同的詞彙表。這與邏輯回歸中將特徵向量(單詞)與學習的權重向量(上下文)分離是同一個道理。下面公式中的求和符號表明,通過噪聲分布U近似抽取k個負樣本。SGNS的目標函數如下所示:
損失函數需要幫我們完成以下任務:(1)最大化矩陣W與C的點積;(2)最小化矩陣W和隨機採樣k的點積。但是目標函數並未包含上下文窗口,其大小是一個超參數。下圖可以更好的代表SGNS:
從圖中可以看出,SGNS並未做任何預測。這個模型和上面的損失函數準確地描述了隨機梯度下降過程中採樣的每一步嵌入情況。通俗來講,每次模型讀取一個單詞並查看它周圍的上下文時,我們都能確切地捕捉它的學習過程。然而它看上去更像是一個自然語言處理的工具,而不是一個基於神經網絡的學習算法。
Levy & Goldberg: Local Prediction is Global Approximation
Levy和Goldberg從理論上證明了Word2Vec其實近似等價於矩陣分解(Matrix Factorization),甚至能夠說SGNS就是一種隱式的矩陣分解,類似於GloVe和singular value decomposition。PMI矩陣的計算如下所示:
k是一個超參數,表示負採樣的數量(默認值為15)
點間互信息(Pointwise Mutual Information,PMI)是NLP中用得很多的信息度量指標,主要用於計算詞語間的語義相似度,基本思想是統計兩個詞語在文本中同時出現的概率,如果概率越大,其相關性就越緊密,關聯度越高。例如,「costa」和「rica」之間就擁有較高的PMI值,因為你看見其中一個單詞的時候,會有很大概率想起另一個單詞。PMI的定義如下所示,值得注意的是,如果語料庫中從未出現單詞-上下文對,那麼他們之間的P(i,j)=0,其PMI值為log(0),或者負無窮。
Levy和Goldberg表示,Word2vec就是隱式的矩陣分解。SGNS能夠將單詞和其對應的上下文嵌入到一起,這樣計算得到的點積可以表示它們同時出現的可能性。
只要做到以下幾點,我們就能用矩陣分解算法來實現SGNS:1、 根據語料庫,預先計算正確的PMI矩陣2、 找到對應的損失函數
在發現SGNS其實就是隱式的矩陣分解後,Levy和Goldberg嘗試利用顯式矩陣分解表示SGNS,如下:1、 由於PMI矩陣是個稠密矩陣,還會有很多不好處理的缺失值,而且把缺失值寫成0也會有問題,所以分解Positive PMI會更合理,也就是把所有非正值都變成0:PPMI(x) = max(0, PMI(x))2、 直接用SVD分解,SVD在復原PMI或類似矩陣方面效果非常好,而且不用調優任何參數。
但該方法並不能很好的代替SGNS。原因在與(1)沒有使用shifted PMI矩陣;(2)沒有找到正確的損失函數。