自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

機器之心發表於2018-08-01

在常見的自然語言處理系統中,單詞的編碼是任意的,因此無法向系統提供各個符號之間可能存在關係的有用資訊,還會帶來資料稀疏問題。使用向量對詞進行表示可以克服其中的一些障礙。本文通過推理、範例及數學公式介紹了從原始文字中學習「詞嵌入」的模型 Word2Vec。該模型通常用在預處理階段,可以提高計算效率。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

讓我們用推理、範例及數學公式來介紹 Word2Vec

引言

Word2Vec 模型用於學習被稱為「詞嵌入」的單詞向量表示,通常用在預處理階段,之後,學習到的詞向量可以被輸入到一個判別模型(通常是一個 RNN)中,進而生成預測或被用於處理其他有趣的任務。

為什麼要學習詞的嵌入表示

影象和音訊處理系統與豐富的高維資料集一起工作,其處理的影象資料被編碼為各個原始畫素強度的向量,因此所有資訊都被編碼在資料中,從而可以很容易地建立起系統中各種實體之間的關係(比如貓和狗)。

但是,在常見的自然語言處理系統中,單詞被視為離散的原子符號,因此」貓」可以被表示為 Id537 而」狗」可以被表示為 Id143。這些編碼是任意的,因而無法向系統提供各個符號之間可能存在關係的有用資訊。這意味著該模型在處理關於「狗」的資料時無法充分利用關於「貓」的知識(例如它們都是動物、寵物、有四隻腳等)。

將單詞表示為獨特、離散的序列號還會導致資料稀疏問題,這通常意味著我們可能需要更多資料才能成功地訓練統計模型,而使用向量對詞進行表示可以克服其中的一些障礙。

舉例來說:

傳統的自然語言處理方法涉及到許多語言學本身的知識。理解諸如音素和語素之類的術語是相當基礎和必要的,因為有許多語言學分支致力於這樣的研究。我們來看看傳統的自然語言處理如何試圖理解下面的單詞。

假設我們的目標是收集關於這個詞的一些資訊(表徵它的情感,找到它的定義等)。利用我們的語言學知識可以將這個詞分解成 3 個部分。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

深度學習最基本的層次是表示學習。在這裡,我們將通過相同方法在大規模資料集上為單詞構建向量表示。

詞向量

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

我們把每一個單詞表示為一個 d 維的向量。在這裡 d=6。我們希望根據這個句子,為每一個單獨的詞構建它的向量表示。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

現在讓我們來思考一下如何填充這些值。我們希望這些值能夠一定程度上表示這個單詞和它的上下文、含義或語義資訊。一種方法是構建共現矩陣。

共現矩陣包含了語料庫(或訓練集)中每一個單詞同出現在它後一個單詞的統計資訊。下表是上面所示句子的共現矩陣。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

通過這個簡單的矩陣,我們能夠獲得非常有用的資訊。例如,「love」和「like」這兩個詞對名詞(NLP 和 dogs)的計數都是 1。他們對「I」的計數也是 1,這表明這些詞很可能是某種動詞。對於遠比一個句子更大的資料集,可以預料的是這種相似性會體現得更加清晰,因為「like」、」love」和其他具有相似上下文的同義詞將開始具有相似的向量表示。

這是一個好的開始,但應該注意每個單詞的維度將隨著語料庫的大小線性增加。如果我們有一百萬詞(在自然語言處理任務中並不算很多),我們將會得到一個一百萬乘一百萬的非常稀疏(有很多 0)的矩陣,儲存效率很低。後來人們在探索更好的詞向量表示上取得了很多進展。其中最著名的是 Word2Vec。

正式介紹 

向量空間模型(VSM)表示(嵌入)連續向量空間中的單詞,其中語義上相似的單詞被對映到相鄰的點(「都嵌在彼此附近」)。向量空間模型自然語言處理中有著悠久、豐富的歷史,但是所有方法都以某種方式依賴於分佈假說,該假說認為出現在相同語境中的詞語具有相似的語義。基於這一原則的方法可以被分為兩類:

 1. 基於計數的方法(例如隱性語義分析)

 2. 預測方法(例如神經概率語言模型

二者的區別在於:

基於計數的方法計算某個詞在大型文字語料庫中與其相鄰詞彙共同出現的頻率的統計資料,然後將這些統計資料對映到每個詞的小而密集的向量。

預測模型直接嘗試根據學習到的近鄰單詞的小密集嵌入向量(考慮模型的引數)來預測單詞。

Word2vec 是一種用於從原始文字中學習詞嵌入的模型,它有很高的計算效率。它主要有兩種實現方式,一種是連續詞袋模型(CBOW),另一種是 Skip-Gram 模型。這兩種方式在演算法上是相似的,唯一的差別在於 CBOW 從源上下文單詞中預測目標單詞,而 Skip-Gram 則恰恰相反,它根據目標單詞預測源上下文單詞。

接下來,我們將重點討論 skip-gram 模型。

應用到的數學知識

神經概率語言模型一般使用最大似然原則進行訓練,其目標是要最大化在給定前面的單詞 h(對於「history」)時的下一個單詞 wt(對於「target」)的 softmax 概率

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

其中 score(wt, h) 計算目標詞 wt 與上下文 h 的相容性(常用點積)。

我們通過在訓練集上最大化它的對數似然來訓練這個模型。所以,我們要最大化以下損失函式

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

這為語言建模提供了一個合適的標準化概率模型

我們可以用另一種形式來更好地展示這種方法,它可以清晰地展示在訓練過程中為了最大化目標函式而不斷改變的選擇變數(或引數)。

我們的目標是找到可以用於預測當前單詞的周圍詞彙的向量表示。我們尤其希望最大化我們在整個語料庫上的平均對數概率:

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

這個等式的主要含義是,在當前單詞的一定視窗範圍 c 內出現的單詞 wt 存在一定的概率 p。這個概率同當前詞 wt 和我們設定的引數 theta 相關。我們希望設定的引數 theta 可以最大化整個語料庫的上述概率。

基本引數化:Softmax 模型

基本的 skip-gram 模型定義了經過 softmax 函式計算的概率 p。如果我們的詞彙表中有 N 個詞,而我們希望學習的嵌入向量的維度為 k,那麼我們可以設定 wi 是 N 維的 ont-hot 向量,theta 是一個 N×K 的嵌入矩陣,從而有:

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

值得注意的是,在學習之後,矩陣 theta 可以被認為是嵌入查詢矩陣。

在架構方面,它是一個簡單的三層神經網路

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

 1. 使用一個 3 層神經網路(1 個輸入層+ 1 個隱藏層+ 1 個輸出層)。

 2. 輸入一個詞,並訓練模型來預測它的相鄰詞彙。

 3. 刪除最後一層(輸出層)並保留輸入和隱藏層。

 4. 現在,輸入一個詞彙表中的單詞。在隱藏層給出的輸出是輸入單詞的「單詞嵌入」。

限制這種引數化方法在大規模語料中的應用的一個主要缺點是計算的效率。具體來說,為了計算單次的正向傳播過程,我們需要對整個語料庫的詞彙進行統計,以計算 softmax 函式。這對於大型資料集來說是非常昂貴的,所以我們希望能夠在這個模型和計算效率之間找到一個平衡。

提高計算效率

對於 word2vec 中的特徵學習,我們不需要完整的概率模型。CBOW 和 skip-gram 模型是使用二元分類目標(邏輯迴歸)來訓練的,其目標是要在相同的上下文中將真實目標詞語(wt)與 k 個偽(噪音)詞語 -w 進行區分。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

當模型給真實單詞分配更高的概率並且將低概率分配給噪音詞時,我們可以得到最大化的目標函式。從技術上來講,我們一般稱之為負取樣,它提出的更新近似於 softmax 函式更新的極限。但是從計算角度來看,它擁有很高的效率,因為這樣一來損失函式的複雜度僅僅依賴於我們選擇的噪音詞的數量(k)而不是詞彙表(V)中的所有單詞。這可以大大提高訓練的速度。像 Tensorflow 這樣的軟體包使用了一種非常相似的損失函式,稱為噪聲對比估計(NCE)損失。

SKIP-GRAM 模型的直觀感受

以這個資料集為例:

the quick brown fox jumped over the lazy dog

我們首先構建一個包含所有單詞和它們的上下文的資料集。現在,讓我們保持原始定義,並將「上下文」定義為目標單詞左側和右側的視窗單詞。設定視窗大小為 1,我們可以得到(上下文,目標)對形式的資料集。

([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...

回想一下,skip-gram 會顛倒上下文和目標,試圖根據目標詞預測每個上下文單詞,因此任務變為從」quick」預測」the」和」brown」以及從」brown」預測」quick」和」fox」等。

這樣一來我們的資料集可以整理為(輸入,輸出)對,如下所示:

(quick, the), (quick, brown), (brown, quick), (brown, fox), ...

目標函式在定義上依賴於整個資料集,但是我們通常使用隨機梯度下降(SGD)方法來對模型進行優化,即每次只使用一個例子(或者每次使用一小批資料,每批的數量通常在 16 到 512 之間)。接下來讓我們看一下每一步的訓練過程。

讓我們想象一下上述例子的訓練過程。這裡的目標是從 the 預測 quick。我們從一個噪聲分佈 P(w)(通常是單字元分佈)中選取 num_noise 個噪聲樣本(單字元分佈假設每個單詞的出現與所有其他單詞無關,即我們可以將生成過程看作一個按序列擲骰子的過程)

為了簡單起見,我們設定 num_noise = 1,我們選擇 sheep 作為一個噪聲樣本。接下來我們計算這對觀察到的和有噪聲的例子的損失,即在」t」時刻的目標函式變成:

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

我們的目標是要對嵌入引數進行更新

 theta 用來最大化這個目標函式。我們通過匯出與之相關的損失梯度來實現這一目標。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵

然後,我們通過向梯度方向邁出一小步來更新嵌入。當我們在整個訓練集上重複進行這個過程時,可以對每個單詞產生「移動」嵌入向量的效果,直到模型成功地區分真實單詞和噪音單詞為止。

我們可以通過將它們向下投影到 2 維來視覺化學習到的向量。當我們觀察這些視覺化時,很明顯這些向量捕獲到了一些關於單詞的語義資訊以及詞與詞之間的關係,這在實際中是非常有用的。

自然語言處理的一大步,應用Word2Vec模型學習單詞向量表徵


原文連結:https://towardsdatascience.com/word2vec-a-baby-step-in-deep-learning-but-a-giant-leap-towards-natural-language-processing-40fe4e8602ba

相關文章