博客 | 斯坦福大學—自然語言處理中的深度學習(CS 224D notes-1)

本文原載於鄒佳敏知乎專欄“AI的怎怎,歪歪不喜歡

關鍵詞:自然語言處理,詞向量,奇異值分解,Skip-gram模型,CBOW模型,負採樣。

本文從NLP的概念出發,簡述當今NLP所面臨的問題,接着討論使用數值向量的詞表達,最後介紹幾種詞向量的常用表達方式。

一, NLP簡介:

NLP的目的是通過設計算法的方式讓計算機理解人類的自然語言,從而幫助人類完成指定的任務。任務通常有以下幾類:

簡單任務:拼寫檢查,關鍵詞索引,查找同義詞;

中等任務:解析網站或文檔信息;

困難任務:機器翻譯,語義分析,指代歧義,機器問答。

在面對不同任務時,首先也是最重要的一點:如何將詞語表述成模型可接受的輸入,如何計算詞語間的相似程度等。詞向量,很好的解決了上述問題。

二, 詞向量:

英語中有1300萬單詞,大部分單詞間都存在聯繫,比如,酒店和旅館。因此,我們想將單詞編碼至一個向量,以至於它們可以用“詞空間”內的點來表示。最直觀方案,存在一個N維空間(N<<1300萬),它能夠表示單詞的所有語義維度,則空間中的每一維代表單詞在某一方面的語義。比如,構建一個3維空間(時間,階層,性別),則國王(現在,頂級,男性),王后(現在,頂級,女性),太子(未來,頂級,男性)就可以分別用這個3維空間來表示。

爲了方便理解,我們先從最簡單的one-hot向量開始。one-hot將有序排列的全部單詞看作整個向量空間,向量內只有0,1兩種數值,如果某個單詞出現在第i個位置,則向量的第i個元素是1,其他元素是0。one-hot解決了單詞的表示問題,但卻不能拿來計算單詞間的相似度,因爲,任意兩個詞向量間都是正交的,即內積爲0,模1,相似度同樣爲0。

aardvark,a,at,...,zebra在語料庫的one-hot表示

因此,我們需要降維詞空間,嘗試去找一個可以計算單詞間相似度的子空間。

三, 基於SVD的方案

該類方案通常需要先遍歷整個語料集,找到所有詞的共現矩陣X,再對X做奇異值分解得到

。最終,U的行空間向量即爲語料詞庫的詞向量。那麼,問題來了,X應該怎麼選?

1, 詞-文檔矩陣:相似的詞會在相同的文檔中經常出現。

按文檔粒度遍歷語料庫,

表示單詞i出現在第j篇文檔中的次數。顯然X的維數是V*M,V表示詞彙量,M表述文檔數。這樣的X不僅巨大,還會隨着文檔數的增加而暴增。因此,該方案是不能承受的。

2, 共現窗口矩陣:相似的詞會經常一起出現。

將語料集看成整體,在一個指定大小的上下文語境窗口內,記錄每個單詞出現的次數。顯然,X的維數是V*V,V表示詞彙量。舉例說明,假設語料集內有3句話:

語料庫的size=3的共現窗口矩陣

對X使用SVD,得到

,選擇特徵值矩陣S的前k大個特徵值降維,則U對應的子矩陣就是我們需要的詞向量矩陣,它是V*k維,即詞典中的每個詞用k維向量近似表示。

SVD後降維整個詞向量空間

3, 問題和解決方案:以上2種方法得到的詞向量,對語法和句法都有較好的表示。但仍存在以下5個問題和3個解決方案:

3.1.1, 矩陣X會隨新詞的加入或語料大小的改變而經常變化;

3.1.2, 因爲大多數單詞並不會經常共現,矩陣X會很稀疏;

3.1.3, 矩陣X維度極大,通常是

3.1.4,

的訓練時間複雜度(SVD算法);

3.1.5, 矩陣X需要預處理以應對詞頻間的極度不平衡。

----------------------------------------------------------

3.2.1,忽略停用詞;

3.2.2,採用加權距離窗口,即基於文檔中單詞的距離加權共現詞頻;

3.2.3,使用相關係數,同時用負數替換詞頻0的位置。

四, 基於迭代的方案:

對上述問題,更優雅的解決方案

與存儲並計算全量語料集信息不同,我們通過構建模型的方式,不斷迭代,最終在給定的上下文環境中編碼詞的概率。

假設存在一個概率模型,它有已知參數和未知參數,每使用一個訓練樣本,評估並最小化模型損失,就能朝未知參數的真實估計更近一步,最終輸出由已知參數和估計參數構成的模型。

1, 語言模型:Unigram,Bigram等

首先嚐試計算一句話出現的概率:”the cat jumped over the puddle”,因爲它完整的語法,句法和語義,優秀的語言模型會得到一個極高的概率。相反,”stock boil fish is toy“,不符常識,毫無意義,計算的概率就很低。

該模型的數學化表達:

代表第i個單詞。如果每個單詞都是獨立出現,和它的上下文無關,則

,這就是最簡單的Unigram模型。顯而易見,Unigram並沒有考慮任何合理且有關聯的上下文信息,更重要的是,完全錯誤的句子可能會被計算出極高的概率。

因此,進一步地,假定一個單詞和它前面一個單詞相關,該模型就變爲

,我們稱它爲Bigram模型,看上去很樸素,但在實踐中非常好用。另外,窗口大小爲1的共現窗口矩陣,可以達到相同的目的,但它需要存儲和計算全量語料集。

2, 連續詞袋模型(CBOW):根據指定窗口的上下文預測或生成它的中心詞。

比如,根據{“the”,“cat”,“over”,“the”,“puddle”}預測或生成單詞jumped。

首先,模型已知的參數,我們用one-hot向量表示整個上下文,記爲

。同時,因爲CBOW模型僅預測一個單詞,所以輸出是一箇中心詞的one-hot表示,記爲

接着,模型未知的參數,我們定義

矩陣,其中n是用戶指定的詞向量空間大小。V是輸入的詞矩陣,即V的第i列表示單詞

的n維詞向量,記爲列向量

。同樣,U是輸出的詞矩陣,即U的第j行表示單詞

的n維詞向量,記爲行向量

所以,CBOW模型,本質上就是學習每個單詞

的輸入矩陣列向量

和輸出矩陣行向量

。詳細而言,有以下6步:

2.1,生成以one-hot向量表示,size=m的上下文窗口輸入:

2.2,初始化矩陣V,生成模型的輸入詞向量 :

2.3,計算上下文窗口內詞向量的均值向量:

2.4,初始化矩陣U,生成得分向量

2.5,使用softmax將得分向量z轉換爲概率

2.6,真實的y是中心詞的one-hot向量,而

是對它的預測。因此想辦法找到最適合的V和U,使y和

儘可能接近,就可以達到目的。爲了實現上述目標,首先需要定義目標函數。

通常,概率領域的建模會使用信息理論來測量2個分佈之間的距離。在CBOW模型中,我們選擇交叉熵作爲損失函數,即

,y是one-hot向量,中心詞

所在的位置c,值

是1,其餘爲0。顯然,當

時,損失H最小爲0,但當

時,損失H約爲4.6。因此,交叉熵H給概率分佈的距離計算提供了一個非常好的方法。

最優化目標函數:

CBOW的目標函數

最後,我們使用梯度下降迭代更新

, 收斂到最終詞向量。

3, Skip-Gram模型:根據中心詞,預測或生成它的上下文單詞。

比如,根據jumped,預測或生成{“the”,“cat”,“over”,“the”,“puddle”}。

顯然,交換CBOW模型的x和y,Skip-Gram模型的輸入是中心詞的one-hot向量x,定義輸出爲

。詞向量矩陣V和U和CBOW模型相同。它的模型訓練同樣有以下6步:

3.1,生成以one-hot向量表示,中心詞c的詞向量x;

3.2,初始化矩陣V,生成模型的輸入詞向量

3.3,因爲輸入只有1箇中心詞,無需均值化,

3.4,初始化矩陣U,類比

,生成2m個得分向量 :

3.5,使用softmax將每個得分向量都轉換爲概率:

3.6,最小化softmax概率和真實

間的損失函數;

值得注意的是,Skip-Gram的目標函數需要建立在樸素貝葉斯的條件概率獨立的假設上,即,除了中心詞,所有的上下文詞都相互獨立。

Skip-Gram的目標函數

4, 負採樣

上述損失函數的|V|極大,任何一步的迭代和更新都會花費O(|V|)時間,一個直觀的優化,就是去近似迭代它。

對每一次迭代,我們並不會遍歷整個詞庫,而只是選取幾個反例而已。具體而言,我們從一個噪音分佈

中隨機選擇反例樣本,其概率通常設定爲語料庫各詞頻的3/4次冪,我們將它稱作負採樣。假設,is在語料庫的詞頻是0.9,Constitution是0.09,bombastic是0.01,其各自的3/4次冪分別是0.92,0.16和0.032。因此,使用3/4次冪負採樣到bombastic的概率相比之前增大3倍。即,相對而言,低頻詞更容易被採樣到。

基於負採樣的Skip-Gram模型的優化目標和常規Skip-Gram不同。考慮一對中心詞和上下文(w,c),P(D=1|w,c)表示(w,c)出自訓練語料集的概率,P(D=0|w,c)則表示(w,c)不在訓練語料集中的概率。因此,我們的目標函數就變成,當(w,c)確實在語料集中時,最大化P(D=1|w,c),但當(w,c)不在語料中時,最大化P(D=0|w,c)即可。在這種場景下我們選用最大似然函數的求解目標函數。

我們使用sigmoid函數對P(D=1|w,c)建模,即,

是模型未知參數的同時,也是我們前文提到的V和U。定義,

表示“錯誤”或“負”的語料組合,比如“stock boil fish is toy”等,它是按P_n(w)採樣出的K個錯誤表達。因此,具體的目標函數如下:

基於負採樣的Skip-Gram目標函數

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