日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

word2vec原理

發(fā)布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 word2vec原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先聲明,本文源自于劉建平老師的博客,原文寫的非常好,在此結(jié)合鄙人的項目經(jīng)驗和大家分享。

word2vec原理(一) CBOW與Skip-Gram模型基礎(chǔ)

一:詞向量基礎(chǔ)
word2vec是谷歌于2013年提出的一個nlp工具,他的特點就是將詞向量化,這樣,詞與詞之間就可以定量的去度量他們之間的相互關(guān)系,發(fā)掘詞之間的聯(lián)系,用詞向量來表示詞并不是word2vec的首創(chuàng),很早之前就出現(xiàn)了,最早的詞向量是很冗長的,它使用詞向量的維度來表示詞匯表的大小,對于詞匯表中的某個具體詞,他的對應(yīng)位置為1,比如我們有下面的5個詞組成的詞匯表,詞"Queen"的序號為2, 那么它的詞向量就是(0,1,0,0,0)。同樣的道理,詞"Woman"的詞向量就是(0,0,0,1,0)。這種方式我們一般叫做one-hot representation 。

但是這種編碼方式存在一個巨大的問題,我們在實際的工業(yè)生產(chǎn)中,我們的詞匯表一般非常大,達到百萬級別,這樣每個詞都用百萬維的向量來表示簡直就是內(nèi)存災(zāi)難,除了一個是1,其余全是0,這樣表達效率嚴重不足。我們可以用distributed representation 可以解決one-hot-representation 問題,他的訓練方式是將詞映射到較短的詞向量上從而用這些較短的詞向量組成詞向量空間,進而用普通的統(tǒng)計學方法來研究詞與詞之間的關(guān)系。
比如下圖我們將詞匯表里的詞用"Royalty",“Masculinity”, “Femininity"和"Age"4個維度來表示,King這個詞對應(yīng)的詞向量可能是(0.99,0.99,0.05,0.7)。當然在實際情況中,我們并不能對詞向量的每個維度做一個很好的解釋。
 
有了用Distributed Representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關(guān)系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發(fā)現(xiàn):


可見,只要得到了詞匯表里所有詞對應(yīng)的詞向量,我們就可以做很多事情了
二. CBOW與Skip-Gram用于神經(jīng)網(wǎng)絡(luò)語言模型
在word2vec之前,就已經(jīng)有用神經(jīng)網(wǎng)絡(luò)DNN來訓練詞向量進而處理詞與詞之間的關(guān)系了 ,一般都是采用三層神經(jīng)網(wǎng)絡(luò),即輸入層,隱藏層,輸出層(softmax層) 。一般我們用CBOW模型和skip-gram模型來定義模型的數(shù)據(jù)的輸入和輸出.
CBOW模型的輸入就是與一個特定詞上下文相關(guān)的詞所對應(yīng)的詞向量,而輸出就是這個特定詞的詞向量。比如下面這段話,我們的上下文大小取值為4,特定的這個詞是"Learning”,也就是我們需要的輸出詞向量,上下文對應(yīng)的詞有8個,前后各4個,這8個詞是我們模型的輸入。由于CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關(guān)注的詞之間的距離大小,只要在我們上下文之內(nèi)即可。


在上面的例子中,我們的輸入是八個詞向量,輸出是詞匯表中所有詞的softmax概率(訓練的目標是期望訓練樣本也就是那八個詞對應(yīng)的softmax概率最大)。對應(yīng)到神經(jīng)網(wǎng)絡(luò)中,網(wǎng)絡(luò)輸入為八個神經(jīng)元,輸出為詞匯表大小個神經(jīng)元,隱層神經(jīng)元個數(shù)可以由我們自己指定。訓練過程大致如下:通過DNN的反向傳播找到模型參數(shù)和每個詞的詞向量,當有新的需求,例如求某幾個詞相關(guān)的特定詞時候,我們可以通過DNN前向傳播并通過softmax計算出詞匯表中概率最大的詞向量對應(yīng)的神經(jīng)元,也就是我們需要的特定詞。
skip-gram模型與CBOW模型完全相反,還是對應(yīng)上面的例子,輸入為一個特定詞的詞向量,輸出為與這個特定詞上下文相關(guān)的概率最大的八個字的詞向量。對應(yīng)到神經(jīng)網(wǎng)絡(luò)中,輸入為一個神經(jīng)元,輸出為八個神經(jīng)元,隱層個數(shù)可由我們自己指定,通過dnn反向傳播訓練,求出詞匯表中每個次對應(yīng)的詞向量以及模型參數(shù)。面對新需求時,通過前向傳播計算出詞匯表中與輸入相關(guān)的概率最大的詞向量,也就是我們需要的與特定次相關(guān)的詞向量。

以上就是神經(jīng)網(wǎng)絡(luò)語言模型如何用cbow和skip-gram來訓練得到詞向量的大致過程,但是,我們的詞匯表一般是百萬級別,輸出層在做softmax時,需要計算百萬個詞向量的概率,這個過程極為耗時。

三. word2vec基礎(chǔ)之霍夫曼樹
word2vec也使用了cbow和skip-gram模型來訓練模型得到詞向量,但是沒有使用dnn模型,最早的優(yōu)化結(jié)構(gòu)是使用霍夫曼樹來替代隱藏層和輸出層的神經(jīng)元,霍夫曼書的葉子結(jié)點就是模型的神經(jīng)元輸出,葉子節(jié)點的個數(shù)就是詞匯表的大小,內(nèi)部節(jié)點的個數(shù)就是隱藏層神經(jīng)元的個數(shù)。
葉子節(jié)點:樹的每一個葉子節(jié)點都代表一個單詞,所以通常詞頻越高離根節(jié)點越近;

內(nèi)部節(jié)點:每一個內(nèi)部節(jié)點都代表一次邏輯回歸的過程,可以規(guī)定沿著左子樹走是負類(霍夫曼編碼 1),沿著右子樹走是正類(霍夫曼編碼 0)。假設(shè) xw 是當前內(nèi)部節(jié)點的詞向量,而 θ 則是需要學習的模型參數(shù)。對于 CBOW 模型,xw 初始化(根節(jié)點)為輸入的詞向量加和求平均后的向量,對于 Skip-gram 來說,就是 xw 的詞向量。判別正類和負類的方法是使用 Sigmoid 函數(shù):

最終輸出哪個單詞是由 logN 次邏輯回歸過程決定的,回到基于 Hierarchical Softmax 的 word2vec 本身,我們的目標就是找到合適的所有節(jié)點的詞向量和所有內(nèi)部節(jié)點 θ, 使訓練樣本達到最大似然。如此經(jīng)過一系列推導便可得到目標函數(shù):

霍夫曼樹的建立過程如下:
輸入:權(quán)值為(w1,w2,w3…wn)的n 個節(jié)點
輸出:對應(yīng)的霍夫曼樹。
1,將(w1,w2,w3…wn)看作是有n顆樹的森林,每個樹只有一個節(jié)點(也就是根節(jié)點)。
2,在森林中選擇根節(jié)點權(quán)值最小的兩棵樹進行權(quán)值相加形成一顆新樹,這兩顆新樹分別作為新樹的左右子樹。
3,將新樹加入森林,并從森林中刪除掉兩顆子樹。
4,重復步奏2和步奏3,直到森林中只剩一棵樹為止
 下面我們用一個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節(jié)點,節(jié)點的權(quán)值分布是(20,4,8,6,16,3)。

首先是最小的b和f合并,得到的新樹根節(jié)點權(quán)重是7.此時森林里5棵樹,根節(jié)點權(quán)重分別是20,8,6,16,7。此時根節(jié)點權(quán)重最小的6,7合并,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

那么霍夫曼樹有什么好處呢,一般在得到霍夫曼樹后我們會對葉子結(jié)點進行霍夫曼編碼,由于權(quán)重越高的節(jié)點越靠近根節(jié)點,而低權(quán)重的節(jié)點會相對遠離根節(jié)點,所以我們的高權(quán)重節(jié)點的霍夫曼編碼值會就較短,而低權(quán)重節(jié)點的霍夫曼編碼值較長,這樣就保證了樹的帶權(quán)路徑最短,也符合我們的信息論,即我們希望我們常用的詞擁有更短的編碼。霍夫曼樹約定一般左子樹的編碼為0,右子樹的編碼為1,所以我們看到c的編碼為00。而在word2vec中相反,左子樹為1,右子樹為0,同時約定左子樹的權(quán)重不得小于右子樹。

word2vec原理(二) 基于Hierarchical Softmax的模型

一:
由于神經(jīng)網(wǎng)絡(luò)訓練語言模型的缺點,word2vec并沒有采用傳統(tǒng)的DNN模型,而是進行了改進,一種是分層softmax(Hierarchical Softmax),另一種就是負采樣(negative sampling).本章我們先講word2vec基于分層sorfmax對語言訓練模型的改進。
首先我們回顧傳統(tǒng)dnn詞向量語言模型,里面有三層,輸入層,輸出層(softmax),隱藏層。該模型最大的缺點就是隱層到輸出的softmax層之間的計算會計算詞匯表的維度,非常大,所以被摒棄。如下圖:

word2vec在傳統(tǒng)的dnn基礎(chǔ)之上做了兩點改進,
第一,在輸入層到隱層,word2vec并沒有像傳統(tǒng)的dnn那樣采用線性變換和激活函數(shù),而是直接對所有的輸入詞向量進行了求和平均。比如輸入的是三個4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我們word2vec映射后的詞向量就是(5,6,7,8)。由于這里是從多個詞向量變成了一個詞向量。
第二,在隱藏層到輸出的softmax層,為了避免softmax計算詞匯表所有詞的詞向量,word2vec采用了霍夫曼樹來代替從隱藏層到輸出層的映射,如何映射呢?

由于把我們之前所有的輸出softmax概率計算替換成了一顆二叉霍夫曼樹,那么我們的softmax概率計算只需要沿著樹形結(jié)構(gòu)進行就可以了,也就是從霍夫曼書的根節(jié)點走到葉子結(jié)點。和之前的神經(jīng)網(wǎng)絡(luò)語言模型相比,我們的霍夫曼樹的所有內(nèi)部節(jié)點就類似之前神經(jīng)網(wǎng)絡(luò)隱藏層的神經(jīng)元,其中,根節(jié)點的詞向量對應(yīng)我們的投影后的詞向量,而所有葉子節(jié)點就類似于之前神經(jīng)網(wǎng)絡(luò)softmax輸出層的神經(jīng)元,葉子節(jié)點的個數(shù)就是詞匯表的大小。在霍夫曼樹中,隱藏層到輸出層的softmax映射不是一下子完成的,而是沿著霍夫曼樹一步步完成的,因此這種softmax取名為"Hierarchical Softmax"。例如下圖的W2:

在word2vec中我們采用二元邏輯回歸(區(qū)別于二分類)的方法,即規(guī)定沿著左子樹走就是負類(霍夫曼樹編碼為1),沿著右子樹走即為正類(霍夫曼書編碼為0)。同時規(guī)定左子樹的權(quán)重不得低于右子樹。判別正類和負類的方法是使用sigmoid函數(shù),即:

 其中xw是當前內(nèi)部節(jié)點的詞向量,而θ則是我們需要從訓練樣本求出的邏輯回歸的模型參數(shù)。
使用霍夫曼樹的優(yōu)點有兩個:
1,由于是二叉樹,之前的計算量為v,現(xiàn)在變成了log2v,
2,由于使用霍夫曼樹使得高頻詞更靠近根節(jié)點,這樣高頻詞就可以更快的找到,符合我們的貪心優(yōu)化算法。
 容易理解,被劃分為左子樹而成為負類的概率為P(?)=1?P(+)。在某一個內(nèi)部節(jié)點,要判斷是沿左子樹還是右子樹走的標準就是看P(?),P(+)誰的概率值大。而控制P(?),P(+)誰的概率值大的因素一個是當前節(jié)點的詞向量,另一個是當前節(jié)點的模型參數(shù)θ。

對于上圖中的w2,如果它是一個訓練樣本的輸出,那么我們期望對于里面的隱藏節(jié)點n(w2,1)的P(?)概率大,n(w2,2)的P(?)概率大,n(w2,3)的P(+)概率大。
回到基于分層softmax本身,我們的目標是找到適合的,所有節(jié)點的詞向量和內(nèi)部節(jié)點參數(shù)θ,使得訓練樣本達到最大似然。
二: 基于Hierarchical Softmax的模型梯度計算
我們使用最大似然法來尋找所有節(jié)點的詞向量和所有內(nèi)部節(jié)點的 θ ,我們的期望是最大化所有訓練樣本的似然函數(shù)乘積。
為了方便計算,我們定義輸入詞為w,定義經(jīng)過輸入層到隱層求和平均后的霍夫曼樹根節(jié)點為Xw,定義從根節(jié)點到葉子結(jié)點的節(jié)點總數(shù)為Lw,w從根節(jié)點開始經(jīng)過第i個節(jié)點表示piw,對應(yīng)的霍夫曼編碼為diw,而該節(jié)點對應(yīng)的模型參數(shù)為 θ iw,其中i最大為Lw-1,因為訓練只針對內(nèi)部節(jié)點,不包括根節(jié)點。
定義w經(jīng)過霍夫曼樹第i個節(jié)點的邏輯回歸概率為如下:

對一個樣本去最大似然:

在word2vec中我們使用的是隨機梯度上升法,并沒有將所有樣本的似然函數(shù)乘起來得到真正的訓練集最大似然。每次僅僅用一個樣本來更新梯度,從而降低梯度計算,這樣我們可以得到對數(shù)似然函數(shù)L如下

要得到模型中w詞向量和內(nèi)部節(jié)點的模型參數(shù)θ, 我們使用梯度上升法即可。首先我們求模型參數(shù)θ的梯度

 同樣的方法,可以求出xw的梯度表達式如下:
 

三:基于Hierarchical Softmax的CBOW模型
首先我們要定義詞向量的維度大小M,以及CBOW的上下文大小2c,這樣我們對于訓練樣本中的每一個詞,其前面的c個詞和后面的c個詞作為了CBOW模型的輸入,該詞本身作為樣本的輸出,期望softmax概率最大。
在做CBOW模型前,我們需要先將詞匯表建立成一顆霍夫曼樹。
對于從輸入層到隱藏層(投影層),這一步比較簡單,就是對w周圍的2c個詞向量求和取平均即可,即:

第二步,通過梯度上升法來更新我們的θwj?1和xw,注意這里的xw是由2c個詞向量相加而成,我們做梯度更新完畢后會用梯度項直接更新原始的各個xi(i=1,2,2c),即:

其中η為梯度上升法的步長。

這里總結(jié)下基于Hierarchical Softmax的CBOW模型算法流程,梯度迭代使用了隨機梯度上升法:
輸入:基于cbow的預料訓練樣本,詞向量的維度M,cbow的上下文2c,步長為η
輸出:霍夫曼樹的內(nèi)部節(jié)點參數(shù)θ ,所有的詞向量w
1,基于語料庫建立霍夫曼樹
2,隨機初始化所有的模型參數(shù)θ ,所有的詞向量w
3,機型梯度上升迭代,對于訓練集中的每個樣本做如下處理

四:基于Hierarchical Softmax的Skip-Gram模型
我們對于訓練樣本中的每一個詞,該詞本身作為樣本的輸入, 其前面的c個詞和后面的c個詞作為了Skip-Gram模型的輸出,,期望這些詞的softmax概率比其他的詞大。

Skip-Gram模型和CBOW模型其實是反過來的,在上一篇已經(jīng)講過。

在做CBOW模型前,我們需要先將詞匯表建立成一顆霍夫曼樹。

對于從輸入層到隱藏層(投影層),這一步比CBOW簡單,由于只有一個詞,所以,即xw就是詞w對應(yīng)的詞向量。
 第二步,通過梯度上升法來更新我們的θwj?1和xw,注意這里的xw周圍有2c個詞向量,此時如果我們期望P(xi|xw),i=1,2…2c最大。此時我們注意到由于上下文是相互的,在期望P(xi|xw),i=1,2…2c最大化的同時,反過來我們也期望P(xw|xi),i=1,2…2c最大。那么是使用P(xi|xw)好還是P(xw|xi)好呢,word2vec使用了后者,這樣做的好處就是在一個迭代窗口內(nèi),我們不是只更新xw一個詞,而是xi,i=1,2…2c共2c個詞。這樣整體的迭代會更加的均衡。因為這個原因,Skip-Gram模型并沒有和CBOW模型一樣對輸入進行迭代更新,而是對2c個輸出進行迭代更新。
 輸入:基于Skip-Gram的語料訓練樣本,詞向量的維度大小M,Skip-Gram的上下文大小2c,步長η
 輸出:霍夫曼樹的內(nèi)部節(jié)點模型參數(shù)θ,所有的詞向量w

  • 基于語料訓練樣本建立霍夫曼樹。
  • 2. 隨機初始化所有的模型參數(shù)θ,所有的詞向量w,

    3. 進行梯度上升迭代過程,對于訓練集中的每一個樣本(w,context(w))做如下處理:
     

    word2vec原理(三) 基于Negative Sampling的模型

    1. Hierarchical Softmax的缺點與改進
    雖然分層softmax采用霍夫曼書代替了神經(jīng)網(wǎng)絡(luò)隱藏層到softmax層的映射從而提高了模型的訓練效率,但存在一個問題,就是當我們的訓練樣本中目標詞是一個生僻詞的時候,霍夫曼書就會往下走很久,整個樹就會變得非常復雜。 Negative Sampling就是這么一種求解word2vec模型的方法,它摒棄了霍夫曼樹,采用了Negative Sampling(負采樣)的方法來求解,下面我們就來看看Negative Sampling的求解思路。
    2基于Negative Sampling的模型概述
    比如我們有一個訓練樣本,中心詞為w,上下詞共有2c個詞,記為context(w),由于這個中心詞w,的確和context(w)相關(guān)存在,因此它是一個真實的正例。通過Negative Sampling采樣,我們得到neg個和w不同的中心詞wi,i=1,2,…neg,這樣context(w)和wi就組成了neg個并不真實存在的負例。利用這一個正例和neg個負例,我們進行二元邏輯回歸,得到負采樣對應(yīng)每個詞wi對應(yīng)的模型參數(shù)θi,和每個詞的詞向量。 從上面的描述可以看出,Negative Sampling由于沒有采用霍夫曼樹,每次只是通過采樣neg個不同的中心詞做負例,就可以訓練模型,因此整個過程要比Hierarchical Softmax簡單。
    3:Negative Sampling負采樣方法
    負例采樣不再使用復雜的霍夫曼樹,而是利用相對簡單的隨機負采樣來大幅提高性能,并且在經(jīng)過論證后發(fā)現(xiàn),負例采樣不但可以提高訓練速度,還可以改善所得詞向量的質(zhì)量,因此,負例采樣比層次 Softmax 使用率更高。

    負例采樣的思想其實和層次 Softmax 很類似,也是將 Softmax 多分類問題轉(zhuǎn)化成多次二分類問題,使用二元邏輯回歸可以讓一個訓練樣本每次僅僅更新一小部分的權(quán)重,不同于原本每個訓練樣本更新所有的權(quán)重,這樣大大減少了梯度下降過程中的計算量。
    當然,負例采樣的具體過程和層次 Softmax 有很大區(qū)別。 它的技術(shù)點會涉及兩個關(guān)鍵的地方,一個是如何進行負例采樣,另外一個是如何進行二元邏輯回歸
    Word2Vec 論文中給出的采樣方式其實并不復雜,首先采樣的數(shù)量根據(jù)數(shù)據(jù)集的大小而定,一個經(jīng)驗是對于小數(shù)據(jù)集,選擇 5~20 個負例,而對于較大的數(shù)據(jù)集,則只需要 2~5 個負例就可以。另外,采樣會遵循一定的分布,這里用的是一元模型分布 (unigram distribution),它的特點是詞頻更高的詞更有可能被選為負例,是一個加權(quán)采樣。假設(shè)我們要將整個語料庫的單詞作為單詞表,并且從單詞表中進行隨機負例采樣,則選取某個詞的概率等于該詞出現(xiàn)在語料庫次數(shù)(詞頻)除以語料庫出現(xiàn)的單詞總數(shù),用公式表示為:
     

    其中,f(?) 可以理解為計數(shù),即得到詞頻。
    論文中指出,作者在這個公式上嘗試了很多變化,最后表現(xiàn)比較好的是將單詞詞頻提高到 3/4 次冪。如下:

    這個改變后的公式會產(chǎn)生一個效果,就是稍微增加低頻詞的采樣概率,降低高頻詞的采樣概率。
     在采樣前,我們將這段長度為1的線段劃分成M等份,這里M>>V,這樣可以保證每個詞對應(yīng)的線段都會劃分成對應(yīng)的小塊。而M份中的每一份都會落在某一個詞對應(yīng)的線段上。在采樣的時候,我們只需要從M個位置中采樣出neg個位置就行,此時采樣到的每一個位置對應(yīng)到的線段所屬的詞就是我們的負例詞。
     
    然后再來看二元邏輯回歸的目標函數(shù),論文中給出了 Skip-gram 模型負采樣的優(yōu)化目標函數(shù)為:

    其中 Pn(w) 就是采樣用的概率分布。
    原論文中并沒有給出負例采樣的推導過程,2014 年,Yoav Goldberg 在論文《word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method》里對上述目標函數(shù)給出了推導。
    從本文前面的內(nèi)容我們已知 Skip-gram 的最初的目標函數(shù):

    如果對上述目標函數(shù)進行優(yōu)化,第二項需要對詞典里的所有詞進行優(yōu)化,所以計算量比較大。如果換個角度考慮,如果我們將合理的上下文樣本對看成是 1,不合理的上下文樣本對看成是 0,那么問題轉(zhuǎn)換為二分類問題,那么我們目標就是最大化下面的目標函數(shù):

    總結(jié)

    以上是生活随笔為你收集整理的word2vec原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。