Word2vec和embedding 非底層算法原理講解

網上關於二者的信息真的是多如牛毛,參差不齊。
本文不對算法細節進行講解推導,不從零開始講二者含義,主要記錄些學習中出現的問題。
建議先看完基礎知識再瀏覽,歡迎大家留言指出錯誤或留下你的疑問。 先貼幾個不錯的鏈接

word2vec源碼
不錯的Word2vec原理講解

1.爲什麼embedding層引入了詞向量就減少了計算量呢?

首先,我們要清楚什麼是embedding層,**embedding層就是以one hot爲輸入、中間層節點爲字向量維數的全連接層!而這個全連接層的參數,就是一個“字向量表”!**我們下面給出一個計算實例:
在這裏插入圖片描述
降低了運算量不是因爲詞向量的出現,而是因爲把one hot型的矩陣運算簡化爲了查表操作。

2.word2vec的輸入是什麼?爲什麼有的資料是輸入隨機初始化的字向量(維度小於詞彙表)有的是直接輸入one-hot編碼呢?

首先,這兩種說法都是正確的,之所以會出現這樣的差別是因爲對層的合併,相信大部分人都有看過word2vec的3層model,一般如下:
在這裏插入圖片描述
我們先看第一種說法如何對應模型,輸入的是n個隨機初始化的k維字向量,那麼輸入規模就是(nk),經過一個全連接層隱藏層,假設有N個神經元(N就是我們擬要降到的維度,可以等於k),那麼隱藏層的輸出規模就是(nkkN=nN),接下來再接入softmax輸出層,輸出規模爲(nV,詞彙表大小爲V),通過計算預測概率最大的詞和實際詞之間的距離來優化參數(參數包括,神經網絡權值參數+輸入詞向量數單個詞向量大小)。那麼我們的詞向量表是那部分呢,很顯然是由兩部分構成的,一部分是作爲輸入的k維詞向量(模型訓練會調整其值),另一部分就是隱藏層的參數。二者之積就是最終的詞向量表(其實就是隱藏層的輸出)。

接下來看第二種說法,直接輸入one-hot向量,輸入規模是(nV),經過隱藏層(VN),輸出規模爲(nN),接下來再接入softmax輸出層,輸出規模爲(nV,詞彙表大小爲V),通過計算預測概率最大的詞和實際詞之間的距離來優化參數(參數包括,神經網絡權值參數+輸入詞向量數*單個詞向量大小)。可以看到和上面的輸出是一致的,那麼我們的詞向量表是那部分呢,還是隱藏層的輸出,此時就只有一部分組成,就是隻有隱藏層這個全連接層的參數(不明白爲什麼是這個層的參數可以看下上面關於embedding層的說明)。

接下來我們將二者合併給出定義:Word2Vec之類的模型,是“自監督”的,它事實上訓練了一個語言模型,通過語言模型來獲取詞向量。所謂語言模型,就是通過前n個字預測下一個字的概率,就是一個多分類器而已,我們輸入one hot,然後連接一個全連接層,然後再連接若干個層,最後接一個softmax分類器,就可以得到語言模型了,然後將大批量文本輸入訓練就行了,最後得到第一個全連接層的參數,就是字、詞向量表,當然,Word2Vec還做了大量的簡化,但是那都是在語言模型本身做的簡化,它的第一層還是全連接層,全連接層的參數就是字、詞向量表。

最後舉一個例子:y=6,x=1,求二者的關係,6= (1x2)x3 6= 1x(2x3 ) 能看懂相信你就已經明白這個問題了。

3.訓練字向量一定要用語言模型嗎?

我們知道字向量就是一層全連接參數。這樣看,問題就比較簡單了,我也沒必要一定要用語言模型來訓練向量吧?對呀,你可以用其他任務,比如文本情感分類任務來有監督訓練。因爲都已經說了,就是一個全連接層而已,後面接什麼,當然自己決定。

4.爲什麼一般先用大規模語料無監督訓練字、詞向量,可以降低過擬合風險?

降低過擬合風險的原因是可以使用無標籤語料預訓練詞向量出來(無標籤語料可以很大,語料足夠大就不會有過擬合風險),跟詞向量無關,詞向量就是一層待訓練參數,有什麼本事降低過擬合風險?

5.tf中的embedding是如何隨得到的呢?

Embedding層就是以one hot爲輸入、中間層節點爲字向量維數的全連接層!而這個全連接層的參數,就是一個“字向量表”!那tf中的embedding是如何隨model進行訓練的呢?

我也不知道怎麼得來呀。神經網絡的參數不是取決你的任務嗎?你的任務應該問你自己呀,怎麼問我來了?
細細品讀這句話,明白了你就知道了tf中的embedding如何得到的,當然首先要知道什麼是embedding層。

6.Word2vec的cbow和skip-gram中的loss函數是什麼

我們看下兩個模型輸出都是什麼,

首先都是一個softmax輸出層,那麼輸出的就是k個概率值(k爲詞彙表大小),對cbow而言,輸入上下文來預測中間詞,loss就是中間詞k維向量和預測k維向量之間的距離。
eg:預測輸出(0,0,0.8,0.1,0.1), 中間詞向量爲(0,0,1,0,0)那麼可以計算這兩個向量之間的距離,當小於預設閾值時就可以認爲預測等於實際值。

對skip-gram而言,輸入是一箇中間詞,輸出是預測其對應的上下文。
eg:預測輸出(0,0.5,0.5)。中間詞的上下文詞向量是(0.1,0.5,0.4),最小化二者的距離來反向優化參數。

具體可以看頂部源碼鏈接。

7.最後一提

embedding層就是一個全連接層的參數,可以通過很多途徑得到,一類是語言模型,用語言模型無監督訓練,開通窗口獲得字詞向量以及之間的性質(僅僅是基於統計的性質);另一類通過自定義的神經網絡模型,獲得字詞向量以及之間的性質(性質和你的模型目的掛鉤,若你的任務認爲"大的" "高的"是兩相對的,那麼二者對應的字向量就差異較大,哪怕它們一般是近似的)。

感覺還沒說完,但好像也沒有什麼好說的了,希望這點文字有助於大家理解字、詞向量這些概念,弄清楚Word2vec和Embedding的本質。有疑問或者有新的見解,歡迎留言提出。

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