word2vec 入門(三)模型介紹

2022-02-20 11:52:53 字數 3493 閱讀 1360

## word2vec 入門(三)模型介紹cbow 是 continuous bag-of-words model 的縮寫,是** \(

p(|w_,w_,w_...,w_,w_,w_...,w_)\)

這個網路結構的功能是為了完成乙個的事情——判斷一句話是否是自然語言。怎麼判斷呢?使用的是概率,就是計算一下這句話的「一列詞的組合」的概率的連乘(聯合概率)是多少,如果比較低,那麼就可以認為不是一句自然語言,如果概率高,就是一句正常的話。這個也是語言模型的目標。

對於上面的那個網路結構來說,網路訓練完成後,假如給定一句話s,這句話由詞w1,w2,w3,…,wt組成,就可以利用計算這句話是自然語言的概率了,計算的公式是下面的公式

\[}\left( } \right) = }\left( ,, \cdots } \right) = \prod \limits_^t p(|contex)"

\]計算\(|context_i)}\)的時候都要用到上面的那個網路,具體計算的方法用例子說明,假設就是計算「吃」這個詞的在「大家」、「喜歡」、「好吃」和「的」這四個詞作為上下文的條件概率,又假設「吃」這個詞在霍夫曼樹中是的最右邊那乙個葉子節點,那麼從根節點到到達它就有兩個非葉節點,根節點對應的詞向量命名為a,根節點的右孩子節點對應的詞向量命名為b,另外再假設「大家」、「喜歡」、「好吃」和「的」這四個詞的詞向量的和為c,則

其中\[ }\left( } \right) = 1/\left( }} \right)$$,

是sigmoid公式。要注意的是,如果「吃」這個詞在非葉節點b的左孩子節點(假設稱為e)的右邊的那個葉子節點,也就是在圖中右邊的三個葉子的中間那個,則有

!(上面的那句話的每個詞都計算\\(p(|contex)\\)後連乘起來得到聯合概率,這個概率如果大於某個閾值,就認為是正常的話;否則就認為不是自然語言,要排除掉。

這個神經網路最重要的輸出就是霍夫曼樹的葉子節點上的那些詞向量。

###優化目標與求解問題

語言模型的目標就是判斷一句話是否是正常,一般使用聯合概率,計算給定句子是自然語言的概率。聯合概率的又是通過條件概率連乘得到。

word2vec中條件概率的計算使用的是神經網路的能量函式,因為在能量模型中,能量函式的功能就是把神經網路的狀態轉化為概率表示。

既然是能量模型,那麼就需要能量函式,word2vec定義了乙個非常簡單的能量函式

e(a,c)=-(a∙c)

其中a可以認為是某個詞的詞向量,c是這個詞的上下文的詞向量的和(向量的和),基本上就可以認為c代表context;中間的點號表示兩個向量的內積。

然後根據能量模型(這個模型假設了溫度一直是1,所以能量函式沒有分母了),就可以表示出詞a的在上下文詞向量c下的概率來了

$$ }= \left(\frac}^v}}\right)\]

其中v表示語料庫裡面的的詞的個數,這個定義的意思是在上下文c出現的情況下,中間這個詞是a的概率。為了計算這個概率,需要把語料庫裡所有的詞的能量都算一次,然後根據a的能量,得到的比值就是出現a的概率。

例子:句子:我,喜歡,**,巴西,足球,世界盃

w=足球

正類概率:$$ = \frac}}$$

負類概率:$$1-\rm$$

"足球" 葉子節點經過4次二分類,每次分類結果對應的概率為

由context("足球")**"足球"出現的概率

\(p(w|context(w))= \sum_p(d_jw|^w})\)

對於語料庫中的某個詞\(w_t\),對應著二叉樹的某個葉子節點,因此它必然有乙個二進位制編碼,如"010011"。在訓練階段,當給定上下文,要**後面的詞\(w_t\)的時候,我們就從二叉樹的根節點開始遍歷,這裡的目標就是**這個詞的二進位制編號的每一位。即對於給定的上下文,我們的目標是使得**詞的二進位制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過logistic計算得到bit=1的概率盡量接近0,在第二層,希望其bit=1的概率盡量接近1,這麼一直下去,我們把一路上計算得到的概率相乘,即得到目標詞\(w_t\)在當前網路下的概率\(p(w_t)\),那麼對於當前這個sample的殘差就是\(1-p(w_t)\),於是就可以使用梯度下降法訓練這個網路得到所有的引數值了。顯而易見,按照目標詞的二進位制編碼計算到最後的概率值就是歸一化的。

hierarchical softmax用huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那麼「桔子」、「汽車」都是混在一起。給定w_t的上下文,先讓模型判斷\(w_t\)是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是「桔子」。

但是在訓練過程中,模型會賦予這些抽象的中間結點乙個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所以hierarchical softmax方法和原始問題並不是等價的,但是這種近似並不會顯著帶來效能上的損失同時又使得模型的求解規模顯著上公升。

沒有使用這種二叉樹,而是直接從隱層直接計算每乙個輸出的概率——即傳統的softmax,就需要對|v|中的每乙個詞都算一遍,這個過程時間複雜度是o(|v|)的。而使用了二叉樹(如word2vec中的huffman樹),其時間複雜度就降到了o(log2(|v|)),速度大大地加快了。

網路結構如下:

計算p(大家│吃)這麼乙個概率,這裡的計算方法就簡單多了,就是隨機從語料庫裡面抽取c個詞,這裡假設c=3,抽中了d,e,f這三個詞,又假設「吃」這個詞的詞向量是a,那麼就計算「吃」這個詞的概率就用下面的公式

所有詞的概率計算出來再連乘就是整句話是自然語言的概率了。剩下的同上。

解法跟上面相同。

前面提到到 skip-gram 中的條件概率為:

\(p(w_o|w_i) = \fract}}} w}}}}\)

這其實是乙個多分類的 logistic regression, 即 softmax 模型,對應的 label 是one-hot representation,只有當前詞對應的位置為 1,其他為 0。普通的方法是 p(wo|wi) 的分母要對所有詞彙表裡的單詞求和,這使得計算梯度很耗時。

hierarchical softmax 則是介於兩者之間的一種方法,使用的辦法其實是借助了分類的概念。 假設我們是把所有的詞都作為輸出,那麼「桔子」、「汽車」都是混在一起。而 hierarchical softmax 則是把這些詞按照類別進行區分的。對於二叉樹來說,則是使用二分類近似原來的多分類。例如給定 wi,先讓模型判斷 wo是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是「桔子」。雖然 word2vec **裡,作者是使用哈夫曼編碼構造的一連串兩分類。但是在訓練過程中,模型會賦予這些抽象的中間結點乙個合適的向量, 這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所以hierarchical softmax 方法和原始問題並不是等價的,但是這種近似並不會顯著帶來效能上的損失同時又使得模型的求解規模顯著上公升。

negative sampling 也是用二分類近似多分類,區別在於使用的是one-versus-one 的方式近似,即取樣一些負例,調整模型引數使得模型可以區分正例和負例。 換乙個角度來看,就是 negative sampling 有點懶,他不想把分母中的所有詞都算一次,就稍微選幾個算算,選多少,就是模型中負例的個數,怎麼選,一般就需要按照詞頻對應的概率分布來隨機抽樣了。

與word2vec 原來word2vec那麼簡單

說到word2vec,它可謂非結構化資料裡面的佼佼者,尤其是在推薦和nlp當中,足以體現它的優勢所在,並且多年一直備受工業界喜愛.那麼word2vec到底是怎麼個原理的,發現身邊總是有很多人問,確不能準確的說出為什麼是兩個矩陣,到底是怎麼自動反向傳播的,以及對於softmax之後那麼大的維度資料,是...

Word2Vec教程 Skip Gram模型

這個教程包含 訓練word2vec的 skip gram 模型。通過這個教程,我希望跳過常規word2vec 的介紹和抽象理解,而是去討論一些細節。特別是skip gram的網路結構。skipgram model 常常讓人驚訝於它的簡單結構。我認為基本沒啥彎路,或者需要複雜的模型解釋。讓我們從高層語...

小小word2vec模型訓練

嗨,好久不見啊!今天我們來完成乙個word2vec模型訓練,學習筆記有挺多人寫的,不瞞您說,小白也是看別人的部落格學習的。所以這次,小白就直接上手例項啦,一起嘛?首先介紹一下模型引數 通過jieba分詞 import jieba import pandas as pd 把文字檔案讀進來,再分詞,去停...