自然語言處理中的詞向量—word2vec!
自然語言是一套用來表達含義的複雜系統。在這套系統中,詞是表義的基本單元。在機器學習中,如何使用向量表示詞?
顧名思義,詞向量是用來表示詞的向量,通常也被認為是詞的特徵向量。近年來,詞向量已逐漸成為自然語言處理的基礎知識。
為何不採用one-hot向量
我們在循環神經網路中介紹過one-hot向量來表示詞。假設詞典中不同詞的數量為N,每個詞可以和從0到N?1的連續整數一一對應。假設一個詞的相應整數表示為i,為了得到該詞的one-hot向量表示,我們創建一個全0的長為N的向量,並將其第i位設成1。
然而,使用one-hot詞向量並不是一個好選擇。一個主要的原因是,one-hot詞向量無法表達不同詞之間的相似度。例如,任何一對詞的one-hot向量的餘弦相似度都為0。
word2vec
2013年,Google團隊發表了word2vec工具。word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW),以及兩種高效訓練的方法:負採樣(negative sampling)和層序softmax(hierarchical softmax)。值得一提的是,word2vec詞向量可以較好地表達不同詞之間的相似和類比關係。
word2vec自提出後被廣泛應用在自然語言處理任務中。它的模型和訓練方法也啟發了很多後續的詞向量模型。本節將重點介紹word2vec的模型和訓練方法。
模型
跳字模型
在跳字模型中,我們用一個詞來預測它在文本序列周圍的詞。例如,給定文本序列」the」, 「man」, 「hit」, 「his」, 和」son」,跳字模型所關心的是,給定」hit」,生成它鄰近詞「the」, 「man」, 「his」, 和」son」的概率。在這個例子中,」hit」叫中心詞,「the」, 「man」, 「his」, 和」son」叫背景詞。由於」hit」只生成與它距離不超過2的背景詞,該時間窗口的大小為2。
我們來描述一下跳字模型。
假設詞典大小為|V|,我們將詞典中的每個詞與從0到|V|?1的整數一一對應:詞典索引集V={,1,…,|V|?1}。一個詞在該詞典中所對應的整數稱為詞的索引。給定一個長度為T的文本序列中,t時刻的詞為w(t)。當時間窗口大小為m時,跳字模型需要最大化給定任一中心詞生成背景詞的概率:
上式的最大似然估計與最小化以下損失函數等價
我們可以用v和u分別代表中心詞和背景詞的向量。換言之,對於詞典中一個索引為i的詞,它在作為中心詞和背景詞時的向量表示分別是vi和ui。而詞典中所有詞的這兩種向量正是跳字模型所要學習的模型參數。為了將模型參數植入損失函數,我們需要使用模型參數表達損失函數中的中心詞生成背景詞的概率。假設中心詞生成各個背景詞的概率是相互獨立的。給定中心詞wc在詞典中索引為c,背景詞wo在詞典中索引為o,損失函數中的中心詞生成背景詞的概率可以使用softmax函數定義為
當序列長度T較大時,我們通常隨機採樣一個較小的子序列來計算損失函數並使用隨機梯度下降優化該損失函數。通過微分,我們可以計算出上式生成概率的對數關於中心詞向量vc的梯度為:
而上式與下式等價:
通過上面計算得到梯度後,我們可以使用隨機梯度下降來不斷迭代模型參vc。其他模型參數uo的迭代方式同理可得。最終,對於詞典中的任一索引為i的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量vi和ui。
連續詞袋模型
連續詞袋模型與跳字模型類似。與跳字模型最大的不同是,連續詞袋模型中用一個中心詞在文本序列周圍的詞來預測該中心詞。例如,給定文本序列」the」, 「man」, 「hit」, 「his」, 和」son」,連續詞袋模型所關心的是,鄰近詞「the」, 「man」, 「his」, 和」son」一起生成中心詞」hit」的概率。
假設詞典大小為|V|,我們將詞典中的每個詞與從0到|V|?1的整數一一對應:詞典索引集V={,1,…,|V|?1}。一個詞在該詞典中所對應的整數稱為詞的索引。給定一個長度為T的文本序列中,t時刻的詞為w(t)。當時間窗口大小為m時,連續詞袋模型需要最大化由背景詞生成任一中心詞的概率:
上式的最大似然估計與最小化以下損失函數等價
我們可以用v和u分別代表背景詞和中心詞的向量(注意符號和跳字模型中的不同)。換言之,對於詞典中一個索引為i的詞,它在作為背景詞和中心詞時的向量表示分別是vi和ui。而詞典中所有詞的這兩種向量正是連續詞袋模型所要學習的模型參數。為了將模型參數植入損失函數,我們需要使用模型參數表達損失函數中的中心詞生成背景詞的概率。給定中心詞wc在詞典中索引為c,背景詞wo1,…,wo2m在詞典中索引為o1,…,o2m,損失函數中的背景詞生成中心詞的概率可以使用softmax函數定義為
當序列長度T較大時,我們通常隨機採樣一個較小的子序列來計算損失函數並使用隨機梯度下降優化該損失函數。通過微分,我們可以計算出上式生成概率的對數關於任一背景詞向量voi(i=1,…,2m)的梯度為:
通過上面計算得到梯度後,我們可以使用隨機梯度下降來不斷迭代各個模型參數voi(i=1,…,2m)。其他模型參數uc的迭代方式同理可得。最終,對於詞典中的任一索引為
i的詞,我們均得到該詞作為背景詞和中心詞的兩組詞向量vi和ui。
近似訓練法
我們可以看到,無論是跳字模型還是連續詞袋模型,每一步梯度計算的開銷與詞典V的大小相關。顯然,當詞典較大時,例如幾十萬到上百萬,這種訓練方法的計算開銷會較大。所以,使用上述訓練方法在實踐中是有難度的。
我們將使用近似的方法來計算這些梯度,從而減小計算開銷。常用的近似訓練法包括負採樣和層序softmax。
負採樣
我們以跳字模型為例討論負採樣。
詞典V大小之所以會在目標函數中出現,是因為中心詞wc生成背景詞wo的概率P(wo∣wc)使用了softmax,而softmax正是考慮了背景詞可能是詞典中的任一詞,並體現在softmax的分母上。
我們不妨換個角度,假設中心詞wc生成背景詞wo由以下相互獨立事件聯合組成來近似
中心詞wc和背景詞wo同時出現在該訓練數據窗口
中心詞wc和第1個雜訊詞w1不同時出現在該訓練數據窗口(雜訊詞w1按雜訊詞分布P(w)隨機生成,假設一定和wc不同時出現在該訓練數據窗口)
…
中心詞wc和第k個雜訊詞wK不同時出現在該訓練數據窗口(雜訊詞wK按雜訊詞分布P(w)隨機生成,假設一定和wc不同時出現在該訓練數據窗口)
我們可以使用σ(x)=1/(1+exp(?x))函數來表達中心詞wc和背景詞wo同時出現在該訓練數據窗口的概率:
當我們把K取較小值時,每次隨機梯度下降的梯度計算開銷將由O(|V|)降為O(K)。
同樣地,當我們把K取較小值時,每次隨機梯度下降的梯度計算開銷將由O(|V|)降為O(K)。
層序softmax
層序softmax利用了二叉樹。樹的每個葉子節點代表著詞典V中的每個詞。每個詞wi相應的詞向量為vi。我們以下圖為例,來描述層序softmax的工作機制。
假設l(w)為從二叉樹的根到代表詞w的葉子節點的路徑上的節點數,並設n(w,i)為該路徑上第i個節點,該節點的向量為un(w,i)。以上圖為例,l(w3)=4。那麼,跳字模型和連續詞袋模型所需要計算的任意詞wi生成詞w的概率為:
我們可以使用隨機梯度下降在跳字模型和連續詞袋模型中不斷迭代計算字典中所有詞向量v和非葉子節點的向量u。每次迭代的計算開銷由O(|V|)降為二叉樹的高度O(log|V|)。
結論
word2vec工具中的跳字模型和連續詞袋模型可以使用兩種負採樣和層序softmax減小訓練開銷。
練習
雜訊詞
?(w)
P(w)在實際中被建議設為w的單字概率的3/4次方。為什麼?(想想的大小)
一些」the」和」a」之類的英文高頻詞會對結果產生什麼影響?該如何處理?(可參考word2vec論文第2.3節)
如何訓練包括例如」new york」在內的片語向量?(可參考word2vec論文第4節)。
原文:http://zh.gluon.ai/chapter_natural-language-processing/word2vec.html
TAG:AI講堂 |