Word2vec算法原理詳解
今天我們要講解的算法是Word2vec。Word2vec(word to vector)顧名思義,這是一個(gè)將單詞轉(zhuǎn)換成向量形式的工具。通過(guò)轉(zhuǎn)換,可以把對(duì)文本內(nèi)容的處理簡(jiǎn)化為向量空間中的向量運(yùn)算,計(jì)算出向量空間上的相似度,來(lái)表示文本語(yǔ)義上的相似度。
Word2vec主要分為CBOW(Continuous Bag of Words)又叫連續(xù)詞袋和Skip-Gram兩種模式,今天我們主要講解的就是CBOW,接下來(lái)我們將從頭到尾的詳細(xì)講解Word2vec算法流程。
先來(lái)講解一個(gè)背景知識(shí):one-hot向量。獨(dú)熱向量是指使用N位0或1來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有它獨(dú)立的表示形式,并且其中只有一位為1,其他位都為0。
比如我們現(xiàn)在要編碼apple\bag\cat\dog\elephant這五個(gè)單詞,我們用5位向量來(lái)進(jìn)行編碼,如下所示:
apple [1 0 0 0 0]
bag [0 1 0 0 0]
cat [0 0 1 0 0]
dog [0 0 0 1 0]
elephant [0 0 0 0 1]
如果我們現(xiàn)在想要編碼其他另外的單詞,那就需要更多位參與編碼,但是這五個(gè)單詞的編碼前5位仍然能夠是這樣,只不過(guò)后面省略號(hào)省略的部分都為0罷了。
圖片
同時(shí)使用獨(dú)熱向量形成的特征矩陣會(huì)非常的稀疏,占用的空間非常的大。
而Word2vec就可以解決這個(gè)問(wèn)題,其核心思想是:上下文語(yǔ)境相似的詞,其語(yǔ)義也相似。Word2vec采用的是n元語(yǔ)法模型(n-gram model),即假設(shè)一個(gè)詞只與周圍n個(gè)詞有關(guān),而與文本中的其他詞無(wú)關(guān)。所以Word2vec就是把這n個(gè)詞作為一個(gè)目標(biāo)詞的特征,那么就可以把特征映射到 K 維向量空間,可以為文本數(shù)據(jù)尋求更加深層次的特征表示 。所以 Word2vec的基本思想是 通過(guò)訓(xùn)練將每個(gè)詞映射成 K 維實(shí)數(shù)向量(K 一般為模型中的超參數(shù)),通過(guò)詞之間的距離(比如 cosine 相似度、歐氏距離等)來(lái)判斷它們之間的語(yǔ)義相似度。
接下來(lái)看一看CBOW的結(jié)構(gòu)。分為三層:輸入層,隱藏層和輸出層。
圖片
這里對(duì)傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)做了以下一些改造:
1. 首先,對(duì)于從輸入層到隱藏層的映射,沒(méi)有采取神經(jīng)網(wǎng)絡(luò)的線性變換加激活函數(shù)的方法,而是采用簡(jiǎn)單的對(duì)所有輸入詞向量求和并取平均的方法。比如輸入的是三個(gè)4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我們word2vec映射后的詞向量就是(5,6,7,8)。由于這里是從多個(gè)詞向量變成了一個(gè)詞向量。
2. 第二個(gè)改進(jìn)就是從隱藏層到輸出的softmax層這里的計(jì)算量個(gè)改進(jìn)。為了避免要計(jì)算所有詞的softmax概率,word2vec采樣了霍夫曼樹來(lái)代替從隱藏層到輸出softmax層的映射。
說(shuō)到哈夫曼樹,我們都不陌生,它是一種帶權(quán)路徑最短的二叉樹,也叫做最優(yōu)二叉樹。如下圖,b是哈夫曼樹,他的帶權(quán)路徑只有48
圖片
哈夫曼樹的構(gòu)造方法如下圖所示:先用權(quán)重最小的兩個(gè)作為最底層葉子結(jié)點(diǎn),然后權(quán)重次小的,以此類推。保證權(quán)重越大的越早被遍歷到,節(jié)省時(shí)間和空間。同時(shí)遍歷葉子結(jié)點(diǎn)的路徑我們也可以用哈夫曼編碼表示,例如左節(jié)點(diǎn)是0,右節(jié)點(diǎn)是1,那么葉子結(jié)點(diǎn)c的哈夫曼編碼就是110。
圖片
使用霍夫曼樹有什么好處呢?首先,由于是二叉樹,之前計(jì)算量為V,現(xiàn)在變成了log2V。第二,由于使用霍夫曼樹是高頻的詞靠近樹根,這樣高頻詞需要更少的時(shí)間會(huì)被找到,這符合我們的貪心優(yōu)化思想。
有了哈夫曼樹,就有了哈夫曼編碼,我們這整個(gè)算法的核心就是:即對(duì)于給定的上下文,使得預(yù)測(cè)詞的哈夫曼編碼概率最大。如果你現(xiàn)在感到很疑惑,我來(lái)舉個(gè)例子:
假設(shè)我們現(xiàn)在的語(yǔ)境是這一個(gè)簡(jiǎn)單的只有四個(gè)單詞的document:{I drink coffee everyday}
我們選coffee作為中心詞,我們要根據(jù)單詞"I","drink"和"everyday"來(lái)預(yù)測(cè)一個(gè)單詞,并且我們希望這個(gè)單詞是coffee。將"I""drink""everyday"的one-hot向量作為輸入層的輸入
圖片
最開(kāi)始輸入層的權(quán)重w參數(shù)是隨機(jī)生成的,接下來(lái)將這三個(gè)向量x初始乘以初始權(quán)重:w*x=v
圖片
將向量v求和并平均得到隱藏層的輸出向量c它:
圖片
從輸入層到隱藏層的邏輯過(guò)程講解完畢,接下來(lái)講解隱藏層到輸出層。
我們?cè)谶@一層用語(yǔ)料庫(kù)中所有的詞根據(jù)詞頻(就是哈夫曼中的權(quán)重)構(gòu)建了哈夫曼樹,這樣每個(gè)詞 w 都可以從樹的根結(jié)點(diǎn)root沿著唯一一條路徑被訪問(wèn)到,其路徑也就形成了其全局唯一的二進(jìn)制編碼code,如"010011"。而我們從根結(jié)點(diǎn)開(kāi)始走左子樹還是右子樹的概率是根據(jù)邏輯回歸二分類算法判斷的,邏輯回歸算法sigmoid,輸入是負(fù)無(wú)窮到正無(wú)窮,輸出是0到1之前的概率,sigmoid g函數(shù)和其導(dǎo)數(shù)如下圖所示:
圖片
那么我們的輸出層的哈夫曼樹就可以表示成下圖:
圖片
假設(shè)目標(biāo)詞是足球,那么足球的哈夫曼編碼是1001。這里我們指定負(fù)例是1,正例是0,那么我們可以得到上圖的第1次,第2次直到第四次的結(jié)果,那么足球的概率就是前面所有結(jié)點(diǎn)的概率相乘。d是每個(gè)結(jié)點(diǎn)的哈夫曼編碼,那么我們目標(biāo)詞的概率可以寫成如下似然函數(shù)p,取對(duì)數(shù),d=1就是負(fù)例,d=0就是正例:
圖片
上面就是做了簡(jiǎn)單的化簡(jiǎn),log連乘變成連加,log里面的指數(shù)放到log前面。接下來(lái)就是求這個(gè)似然函數(shù)的最大值,求極大值,我們都用梯度上升算法,那么下一步就是分別對(duì)變量x和c它求偏導(dǎo)數(shù):
圖片
求導(dǎo)很簡(jiǎn)單,上面有詳細(xì)的求導(dǎo)過(guò)程,由此我們就得到了參數(shù)c它的更新公式,同樣再對(duì)x求偏導(dǎo)也可以得到x的更新公式。
不過(guò)我們知道隱藏層的x是上下文詞向量的和,不是上下文單個(gè)單詞的詞向量,怎么把這個(gè)更新量應(yīng)用到單個(gè)單詞的詞向量上去呢?這里我們采用的是直接將更新量應(yīng)用到每個(gè)詞向量上去:
圖片
還有一種提升訓(xùn)練速度的方法就是負(fù)采樣,我們知道對(duì)于訓(xùn)練語(yǔ)言模型來(lái)說(shuō),softmax層非常難算,畢竟你要預(yù)測(cè)的是當(dāng)前位置是哪個(gè)詞,那么這個(gè)類別數(shù)就等同于詞典規(guī)模,因此動(dòng)輒幾萬(wàn)幾十萬(wàn)的類別數(shù),算softmax函數(shù)當(dāng)然很費(fèi)力啦。
但是,如果我們的目標(biāo)不在于訓(xùn)練一個(gè)精準(zhǔn)的語(yǔ)言模型,而只是為了訓(xùn)練得到語(yǔ)言模型的副產(chǎn)物-詞向量,那么其實(shí)只需要用這里隱含的一個(gè)計(jì)算代價(jià)更小的“子任務(wù)”就好啦。想一想,給你10000張寫有數(shù)字的卡片,讓你找出其中的最大值,是不是特別費(fèi)力?但是如果把里面的最大值事先抽出來(lái),跟五張隨機(jī)抽取的卡片混到一起,讓你選出其中的最大值,是不是就容易多啦?
負(fù)采樣就是這個(gè)思想,即不直接讓模型從整個(gè)詞表找最可能的詞了,而是直接給定這個(gè)詞(即正例)和幾個(gè)隨機(jī)采樣的噪聲詞(即采樣出來(lái)的負(fù)例),只要模型能從這里面找出正確的詞就認(rèn)為完成目標(biāo)啦。
那么我們選擇哪些作為噪音呢?
word2vec常用的負(fù)采樣策略有均勻負(fù)采樣、按詞頻率采樣等等。比較常用的采樣方法是一元分布模型的3/4次冪。該方法中,一個(gè)詞被采樣的概率,取決于這個(gè)詞在語(yǔ)料中的詞頻 ,其滿足一元分布模型(Unigram Model).
圖片
其中V為整個(gè)詞表大小, f(wi)為詞wi的詞頻。
至于為什么選擇3/4呢?其實(shí)是由論文作者的經(jīng)驗(yàn)所決定的。
假設(shè)由三個(gè)詞,,”我“,”和平“,”覬覦“ 權(quán)重分別為 0.9 ,0.01,0.003;經(jīng)過(guò)3/4冪后:
我: 0.9^3/4 = 0.92
和平:0.01^3/4 = 0.03
覬覦:0.003^3/4 = 0.012
對(duì)于”覬覦“而言,權(quán)重增加了4倍;”和平“增加3倍;”我“只有輕微增加。
可以認(rèn)為:在保證高頻詞容易被抽到的大方向下,通過(guò)權(quán)重3/4次冪的方式,適當(dāng)提升低頻詞、罕見(jiàn)詞被抽到的概率。如果不這么做,低頻詞,罕見(jiàn)詞很難被抽到,以至于不被更新到對(duì)應(yīng)的Embedding。
所以我們可以得到如下公式g,w表示正確的預(yù)測(cè)詞,u表示錯(cuò)誤的負(fù)采樣,那么1-預(yù)測(cè)中心詞u的概率還是預(yù)測(cè)正確的概率,所以我們的目標(biāo)還是使得g最大化,那么還是求似然函數(shù),并求導(dǎo):
圖片
那么求導(dǎo)還是一樣的方式,如下所示,對(duì)似然函數(shù)求偏導(dǎo),然后得出更新的步長(zhǎng)
圖片
圖片
本文轉(zhuǎn)載自 ??人工智能訓(xùn)練營(yíng)??,作者: 小A學(xué)習(xí)

















