【NLP模型筆記】Intro || Word2vec詞向量模型

INTRO

自然語言處理(Natural Language Processing),簡稱NLP。這個領域是通過統計學、數學模型、機器學習等相關技術研究人類語言的特徵,對其進行數學的表示,並基於這種表示進行計算,從而可以處理一些和人類語言相關的事務,以達到模擬人類使用語言的狀態。

在人類的思想領域中,針對於人的認識,一直以來都有兩種截然相反的傾向。一種是認爲人類的認識和各種知識是天然具有邏輯的合理性的,因此在建構知識時,應當自頂向下的搭建邏輯的結構,才能獲得對知識的把握;而另一種則認爲人類的知識不是通過邏輯和理性把握的,而是通過在世界中的經驗一點一點形成的,我們認爲是邏輯和理性的確定性,也不過是在經驗中被我們歸納總結和確認的,因此人類的知識需要從大量的經驗中去歸納總結,這是一個自底向上的過程。從哲學史的角度看來,這兩者就是所謂的唯理論和經驗論的區別。這兩種傾向是認識事物的過程中不可避免的,因此被帶入到具體學科領域中,就會得到兩套相反的方法。

之所以要提到這個問題,是因爲在自然語言處理領域,也曾有偏向規則的(唯理論的)和偏向統計的(經驗論)的兩種方法。基於規則和語法的自然語言處理算法曾經一度是NLP領域的主流,很多研究者都基於建構一個更合理的語言規則的思路來推進算法對於人類語言的處理能力。現如今,這一主流已經被基於統計學的方法所取代。目前較爲流行的BERT及類似算法本質上都是基於對大量語料的訓練(實際上就是一種更高級的統計分析)得到的。這種基於神經網絡訓練的方法得到的模型已經具有了較強的人類語言處理能力。

在本系列中,將對自然語言處理髮展過程中較爲重要的一些模型進行整理和簡要介紹。主要說明它們的思路以及創新點,以及可以應用的領域。下面就從最簡單的Word2vec模型開始。

Word2vec 詞向量模型:Skip-Gram和CBOW

基本思想

如果要讓機器可以認識,或者說識別人類的語言,首先應該讓它認識每個單詞。因此第一個問題就是,如何把每個單詞變成機器可以辨識的內容?

機器只能識別數學實體,無法直接理解語言中的每個單詞,因此需要一種方法,將單詞轉變成某種數學形式,送入計算機。最直接的想法就是將單詞轉變成爲向量。要想將單詞變成向量,最簡單的辦法就是用詞典中的位置,將每個單詞映射成0-1向量(one-hot vector)。比如,如果一個詞典裏只有三個單詞:“abandon”、 “abacus”、 “about” ,那麼這三個詞的向量就分別爲 [1, 0, 0 ] 、[ 0, 1, 0 ] 以及 [ 0, 0, 1]。

但是這個方法並不可行,因爲對於實際的一種人類語言來說,比如漢語、英語、日語,它的詞典是非常龐大的,可能有上萬個單詞,這也就意味着每個單詞都要用一個長達幾萬維的向量來表示,非常不經濟。另外,還有一個原因,回想我們會在什麼情況下用one-hot編碼?答案是,當這幾種取值沒有相互關係時(因爲這些向量都是相互正交的)。比如我們有三個類別變量:A類、B類、C類,那麼我們會用一個3維one-hot進行編碼。但是,自然語言中的單詞可不是這樣的,不同單詞之間是有相互關係的。比如“國王”和“王后”就有邏輯意義上的關係,“美麗”和“漂亮”也有近義詞的關係,“好”和“更好”有比較級的關係……等等等等。這樣複雜的關係,one-hot編碼顯然也是不科學的。因此,我們需要找到一種方法,可以讓得到的詞向量具有它們在自然語言場合中的邏輯關係。這就是詞向量模型產生的基本緣起。

word2vec 的方法,我們在前面簡單提到了,是一種基於統計的方法。也就是說,它不是根據我們人工設定的某些規則而判斷單詞之間的關係的,而是通過對大量語料的學習,獲得不同單詞之間統計學意義上的關聯性。

所謂統計學意義上的關係,放在自然語言處理任務中,就是所謂的上下文 (context)

在學外語的時候,我們經常被教導:要理解一個詞的意思,需要聯繫上下文。這就說明了上下文的單詞一定程度上可以反映這個詞的某種含義和性質。因此,並沒有一個單詞本身的意思,單詞本身的意思蘊藏在它所經常一起出現的單詞當中。也就是說,詞意這種東西,單詞之間相互決定的。

因此,就需要一種方法來獲取上下文。這種方法理解起來很簡單,就是一個滑動窗口,框選出窗中心的那個詞的上下文。

在這裏插入圖片描述

看上面這個圖,對於這一句話,我們用了一個窗長爲5的窗,對每個詞的前後鄰居進行選擇。右邊展示的就是選擇出來的上下文。我們所希望的,是一個模型可以輸入上下文的單詞,然後輸出中間的詞最可能是什麼;或者,另一個方向來看,輸入中間的詞,可以猜測它的上下文都有些什麼單詞。

這兩個思路是Skip-Gram和CBOW模型的出發點。SG試圖用中心詞預測周圍的鄰居,CBOW則相反,用鄰居預測中心詞。除此之外,其它方面思路較爲相近。我們就以SG模型爲例,來說明算法過程。

首先,我們要解決降維的問題,將一個上萬維的one-hot向量降維成一個低維度的向量,可以想到的方法就是用一個矩陣去乘它。比如,一個向量w,它的維度爲10000,如果想讓他變成300維,可以用一個10000x300的矩陣W去乘它,最終的結果就是一個300維向量。

對於每個one-hot 的單詞向量,都進行降維,我們就能得到對應的低維詞向量。但是,這矩陣怎麼得到呢?實際上,整個矩陣是通過學習的方法更新取值獲得的。如何更新呢?這就涉及到我們前面講的原則:上下文。

image-20200308235717712

看這個圖,用概率的語言來說,我們需要做的,是使得中心詞到周圍詞的條件概率儘量高一些。用似然函數的方式來表示,就得到了我們的優化的目標函數。

image-20200309000025840

likelihood儘量大,它的neg log likelihood就要儘量小一些。所以,我們可以通過迭代更新W,使得最終W能夠讓它降維出來的word vector得到的 J(theta)最小。也就意味着,這樣的低維向量中包含了詞語的語義信息。

可是還有個問題沒解決:我們降維處理的是一些向量,這裏的這些條件概率,如何用各個單詞的詞向量來表示呢?

回想一下,我們如何度量向量之間的相似性?內積是一個很好的方法。因爲內積實際上就是對兩個向量逐個元素相乘後的求和,因此兩個向量越像,內積就會越大。如果再對長度進行歸一化,就變成了餘弦相似度。

考慮用內積來表示概率,還要進行歸一化(概率都是0-1之間的嘛),歸一化並不困難,一個softmax就可以解決。這樣一來,就得到了最終的結果。

image-20200309002844293

結合上面的公式,對於這個優化過程,實際上就是讓輸入爲 vc 的時候,輸出的結果向量中,表示uo的位置的值更趨向於1。

神經網絡實現

下面來說一下這個優化過程是怎麼實現的。

image-20200309003224110

如果對神經網絡有所瞭解,這個過程就非常簡單明瞭了。首先,我們將10000x300大小的W矩陣看成是輸入層到隱層的連接權重矩陣,那麼,對於一個one-hot的10000維input向量,得到的hidden layer結果,自然就是低維的詞向量。我們也將這個過程叫做詞嵌入(word embedding),就是將詞語嵌入到300維的向量中。然後,從hidden到output,這個矩陣將詞向量又映射回去了10000維,但是,它表示的則是input的word周圍的word,也就是說,對於一個input vector,比如banking,輸入進去以後,output layer中表示crises 的詞語的那個位置應該輸出1。通過訓練,直到能夠預測的比較準,最終得到一個訓練好的模型,此時,W這個矩陣的每一行,即1x300的向量,就是每個one-hot的位置對應詞的詞向量。

這是輸入輸出一對一的情況,如果考慮前面的一對多(SG)或者多對一(CBOW),那麼,網絡結構就是這樣的:

image-20200309004023385

這個是Skip Gram 的網絡。此時,需要將所有的輸出的cost function進行求和彙總,來進行訓練。

image-20200309004608035

這個是CBOW,需要對各個輸入的結果進行求和後,再去擬合label。

至此,Word2vec的基本內容就說完了。

訓練word2vec有兩個技巧:

negative samplinghierarchical softmax

這兩個trick實際上不僅限於word2vec這一個場景,後續再介紹吧。

最後,來一張word2vec得到的詞在空間中的位置關係圖(降維過後的)

在這裏插入圖片描述

END

2020年3月9日00:45:07

北京

人生如夢幻,無論何事物

受已成念境,往事不復見

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