2018年對于自然語言處理(Natural Language Processing, NPL)是極有意義的一年,這一年出現了許多新的研究方向和尖端成果。在學術界和工業界,由于帶有上下文的嵌入模型對記憶體和硬體的要求極高,預先訓練詞嵌入的使用仍然十分普遍。
SGNS and Matrix Factorization
You 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)沒有找到正确的損失函數。
作者資訊
Kian Kenyon-Dean
本文由阿裡雲雲栖社群組織翻譯。
文章原标題《Unifying Word Embeddings and Matrix Factorization — Part 1》,譯者:Elaine,審校:袁虎。
文章簡譯,更為詳細的内容,請檢視
原文。