「NLP-詞向量」從模型結構到損失函式詳解word2vec

AIBigbull2050發表於2019-09-10

上週我們講到,在進行NNLM訓練時,能夠得到副產品,詞向量。本文介紹一種專門用於詞向量製備的方法:word2vec,利用它能夠高效的訓練出詞向量。

作者 | 小Dream哥

編輯 | 小Dream哥

1 word2vec是什麼?

在闡述word2vec的原理之前,筆者先大致介紹一下,word2vec是什麼,能夠用來幹什麼,讓讀者有一個大致的認識。

word2vec是2013年Efficient estimation of word representations in vector space論文中提出的一種有效的詞向量製備方法,沿用至今。

word2vec用前饋神經網路進行訓練,提出了Continuous Bag-of-Words和Continuous Skip-Gram兩種模型訓練方法,損失層有層次Softmax(Hierarchical Softmax)和負取樣(Negative Sampling)兩種。

2 模型結構

上面我們說了,word2vec是一種高效的製備詞向量的方法,那麼跟2003年的NNLM相比,它的效率高在哪裡呢?先從網路結構開始,我們來細細看一下。

「NLP-詞向量」從模型結構到損失函式詳解word2vec

如上圖所示,是word2vec中提出的兩種模型訓練模式:Continuous Bag-of-Words和Continuous Skip-Gram。

Continuous Bag-of-Words:

CBOW是這樣一種任務,給定一個去掉了中間一個詞的context,預測其中間的那個詞。它跟NNLM的任務有點相似,差別在於,它是雙向的,即預測詞時利用了該詞前後的詞語資訊。

Continuous Skip-Gram:

Continuous Bag-of-Words是透過一個詞,預測其周圍的幾個詞。

以Continuous Bag-of-Words為例,我們來看看word2vec的網路結構。

如上圖所示,word2vec將網路做了如下的改造:

1.輸入的所有詞向量相加求和得到SUM,稱為embedding layer;

2.移除前向反饋神經網路中非線性的hidden layer,直接將中間層的embedding layer與輸出層的softmax layer連線;

我們來分析下這樣做有什麼好處呢?移除中間的隱藏層,最大的好處就是能夠極大的減少運算量了,訓練時候的效率就能夠大幅提升。Continuous Skip-Gram也是相似的道理了。

3 損失函式

以CBOW模型為例,訓練時最容易想到的是,得到輸入序列的SUM embedding之後,透過一個project和softmax層,計算出字典V中每個詞的機率,再構建交叉熵之類的損失函式,然而直接對詞典裡的V個詞計算相似度並歸一化顯然是極其耗時的。

為此作者提出了層次Softmax(Hierarchical Softmax)和負取樣(Negative Sampling)兩種損失層。層次Softmax(Hierarchical Softmax)原理很有意思,但是計算起來還是比NCE要複雜。因此,真正應用比較多的是NCE,這裡就詳細介紹一下NCE的原理。

負取樣的思想最初來源於一種叫做Noise-Contrastive Estimation的演算法,原本是為了解決那些無法歸一化的機率模型的引數預估問題。

在CBOW中,給定一個去掉了中間一個詞的context(w),預測其中間的那個詞w。那麼,中間的那個詞w就是 正樣本,其他的詞就是 負樣本了。那麼NCE的過程大致是這樣的, 對於context(w)構造一個關於w的負樣本集NEG(w);在訓練時,針對{w,NEG(w)}構造一個目標函式,透過最佳化該目標函式最佳化整個網路的引數(包括詞向量)

那麼,這個目標函式該怎麼構建呢?

我先定義一個這樣的函式,

「NLP-詞向量」從模型結構到損失函式詳解word2vec

其中:

「NLP-詞向量」從模型結構到損失函式詳解word2vec

那麼p函式也可以這樣表示:

「NLP-詞向量」從模型結構到損失函式詳解word2vec

這裡X表示輸入的各個詞向量之和。

那我們的目標函式這樣去構建:

「NLP-詞向量」從模型結構到損失函式詳解word2vec

也可表示為:

「NLP-詞向量」從模型結構到損失函式詳解word2vec

這樣的話,我們在訓練時,只需最大化這個g,就可以最佳化網路的引數。想想看為什麼呢?從形式上看,最大化g就是最大化

「NLP-詞向量」從模型結構到損失函式詳解word2vec

同時最小化所有的

「NLP-詞向量」從模型結構到損失函式詳解word2vec

這不正是我們所需要的嗎?

好了,我們來總結一下上述的過程。 NCE的訓練過程,就是構建一個關於w的負樣本集NEG(w),針對正負樣本集,計算g函式的值,訓練時,透過最大化該值來最佳化網路

4 負取樣的過程

我們這節來看看負取樣的過程是怎麼樣進行的, 也就是上述NEG(w)是如何獲得的

對於語料C,可以構建一個詞典D,並統計其中各個詞的詞頻。整體的原則是,詞頻高的詞選中作為負樣本的機率就高。

設詞典D中每一個詞對應一個長度l(w)的線段,則l(w)=counter(w)/|C|。然後將這些線段首尾連線起來,就構成了一個長度為1的線段。在負取樣時,隨機往該線段上打點,打到的就被採到。這就是負取樣的大致過程了,在word2vec的實際操作過程中,會做一些變化,但是基本的思想就是這樣的。

總結

上述就是word2vec的基本原理了,透過word2vec能夠高效的獲得詞向量,是自然語言處理入門必須要掌握的內容。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2656589/,如需轉載,請註明出處,否則將追究法律責任。

相關文章