word2vec
動機:爲什麼要學習詞向量(Word Embeddings)
傳統的自然語言處理系統把詞(word)當作一個離散的原子符號。比如,貓可以使用Id537來表示,Id143表示狗。這些編碼是任意的,這些編碼對於系統處理不同的單詞並沒有提供有用的信息。這就意味着,如果系統已經學習了什麼是“貓”的信息,但這個系統處理什麼是“狗”是並沒有提供很大的幫助(比如:他們都是動物,有四條腿,寵物,等)。這種詞的表示是獨立的,離散的Id使得數據之間並沒有很大的關聯,通常也意味着我們需要更多的數據去成功的訓練統計模型。然而,向量(vector representation)克服了這些缺點。
向量空間模型(Vector space models, VSMs)使用一個連續的空間表示詞(words/embed), 它把語義相關的單詞都映射在了附近爲位置。在NLP中,VSM擁有很長很豐富的歷史,但是所有的方法,在很大的程度上都有這些或者那樣的分佈式假設(Distributional Hypothesis), 及指出了出現在相同上下文的詞具有相同的語意。基於這種假設可以劃分兩種不同的類別:count-based methods e.g. Latent Semantic Analysis), 和 predictive methods (e.g. neural probabilistic language models)
Baroni et al詳細的介紹了這兩種方法的差異性。但是總的來說,Count-based methods compute the statistics of how often some word co-occurs with its neighbor words in a large text corpus, and then map these count-statistics down to a small, dense vector for each word(只可意會不可言傳啊! ^_^)。就學習更小,更稠密詞向量(dense embedding vectors)而言, Predictive models直接從它附近的詞去預測它。
從最原始的文本去學習詞向量,Word2vec是一個特別有效的預測模型(Predictive models)。它具有兩個版本,Continuous Bag-of-Words 模型(CBOW) 和 Skip-Gram 模型。從算法的角度來看,這兩個模型都是相似的。
CBOW模型是給定周圍的上下文預測(surrounding context)一箇中心詞(center word)。比如,給定“The cat sits on the mat”, 我們把[“The” , “cat”, “sits”, “on”, “mat”]爲上下文,而我們需要去預測和生成的中心詞爲”jumped”。
Skip-Gram模型:是給定中心詞預測它周圍的詞,它與CBOW模型剛好是相反的。
對於這兩種模型,對於數據集比較小的情況CBOW性能要比Skip-Gram模型好,但是對於數據集比較大時,其性能要差一些。
Scaling up with Noise-Contrastive Training
給定前面的詞(previous words)的概率
其中
上面等式爲正確標準化的語言模型。然而訓練它,代價非常的大。因爲每個訓練,我對於給定當前的上下文
換句話說,特徵學習對於word2vec模型並不需要一個完全的概率模型。及對於相同的上下文,CBOW 和 skip-gram 模型訓練使用二分類目標函數(binary classification objective)從
數學表示爲,對於每個詞最大化目標函數爲:
其中,
因此,目標變成了最大化真實詞(real words)的概率,最小化噪音詞(noise)的概率。從技術的角度,這稱之爲負採樣(Negative Sampling)。使用這個損失函數有一個很好數學動機:在有限的條件下所提出的更新規則近似的更新了softmax函數。但是計算特別的具有吸引力,因爲現在計算這個損失函數我們僅僅需要規格化我們所選擇的
讓我們更加直觀的看這個模型在實踐中是怎麼工作的。
Skip-gram 模型詳解
考慮數據集
the quick brown fox jumped over the lazy dog
首先,我們形成單詞的數據集和上下文,我們可以使用任何有意義的方式定義”上下文”。事實上,我們都知道語法規則(當前目標詞的語法依賴關係)。因爲,我們可以定義“上下文”(context)爲爲這詞左邊窗口的單詞,而目標詞(target word)作爲右邊的單詞。假設窗口(window size)爲1。對於上面數據集的(context, target)對爲,
([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), …
我們知道skip-gram模型是給定context去預測目標詞。所以這任務就變成了預測‘the’ 和 ‘brown’給定‘quick’,預測‘quick’和’fox’ 給定 ‘brown’,等。因爲數據集的(input, output)對爲
(quick, the), (quick brow), (brown, quick), (brow, fox), …
其中目標函數是定義在整個數據集上,但是我們可以是使用隨機梯度遞減(stochastic gradient descent, SGD)來進行優化, 每一次只使用一個例子。(或者使用batch_size個例子中的minibatch個, 一般情況下,
假設上面第一個訓練例子(quick, the)在第t步下進行訓練, 及預測the給定input。我們選擇
及目標是就去更新向量參數
我們可以使用像 t-SNE dimensionality reduction technique將所學習到的詞向量投影到2維空間上。當我們仔細看這個可視化試圖的,這向量捕獲了非常有用的語義信息。在語義的關係上,我們也發現了一些確定的方向在可視化向量空間上。如下圖所示
這個例子說明了爲什麼向量表示對於許多的NLP任務是非常的有用,比如說,詞性標註,命名實體識別, etc。
對於CBOW模型來說我們只需要把上面的(context, target)對換一下。其過程還是一樣的
Skip-Gram 模型數學表示
首先,來定義一些數學符號
1. 輸入one-hot向量或者context使用
2. 輸出使用
3. 輸入向量矩陣
4.
5.
6.
7.
則,Skip-Gram可以使用下面六步來表示,
1. 生成one-hot 輸入向量
2. 獲取輸入向量
3. 因爲不需要averaging(或者可以理解爲,不需要對輸入數據規格化),因此
4. 使用
5. 將每個score vectors 轉換成概率,
6. 應該使得說生成的概率要近似等於真實的概率,及
我們的目標是最小化,損失函數啊:
注意與前面區別, 前面少了一個負號,因此是最大損失函數
其給定輸入向量
其中
方法一:如果使用Cross-Entropy 那麼損失函數爲:
因爲該方法每次都需要對詞彙表中所有的單詞都進行更新,因此訓練速度非常的慢
爲了是損失函數最小化,可以使用梯度下降的方法來進行計算,及相應的梯度爲:
方法二:使用負採樣方法,損失函數爲:
其中,
相應梯度爲:
其中
整理翻譯以下內容
1. tensorflow Vector Representations of Words
2. CS224d: Deep Learning for Natural Language Processing
僅作學習交流使用,嚴禁用於商業目的,轉載請說明出處!