0
本文作者: AI研習(xí)社 | 2017-06-23 10:34 |
雷鋒網(wǎng)按:這是一個(gè)關(guān)于 Skip-Gram 模型的系列教程,依次分為結(jié)構(gòu)、訓(xùn)練和實(shí)現(xiàn)三個(gè)部分,本文為第二部分:訓(xùn)練篇,最后一部分我們將隨后發(fā)布,敬請(qǐng)期待。原文作者天雨粟,原載于作者知乎專欄,雷鋒網(wǎng)已獲授權(quán)。
第一部分我們了解skip-gram的輸入層、隱層、輸出層。在第二部分,會(huì)繼續(xù)深入講如何在skip-gram模型上進(jìn)行高效的訓(xùn)練。
在第一部分講解完成后,我們會(huì)發(fā)現(xiàn)Word2Vec模型是一個(gè)超級(jí)大的神經(jīng)網(wǎng)絡(luò)(權(quán)重矩陣規(guī)模非常大)。
舉個(gè)栗子,我們擁有10000個(gè)單詞的詞匯表,我們?nèi)绻肭度?00維的詞向量,那么我們的輸入-隱層權(quán)重矩陣和隱層-輸出層的權(quán)重矩陣都會(huì)有 10000 x 300 = 300萬(wàn)個(gè)權(quán)重,在如此龐大的神經(jīng)網(wǎng)絡(luò)中進(jìn)行梯度下降是相當(dāng)慢的。更糟糕的是,你需要大量的訓(xùn)練數(shù)據(jù)來(lái)調(diào)整這些權(quán)重并且避免過(guò)擬合。百萬(wàn)數(shù)量級(jí)的權(quán)重矩陣和億萬(wàn)數(shù)量級(jí)的訓(xùn)練樣本意味著訓(xùn)練這個(gè)模型將會(huì)是個(gè)災(zāi)難(太兇殘了)。
Word2Vec 的作者在它的第二篇論文中強(qiáng)調(diào)了這些問(wèn)題,下面是作者在第二篇論文中的三個(gè)創(chuàng)新:
1. 將常見的單詞組合(word pairs)或者詞組作為單個(gè)“words”來(lái)處理。
2. 對(duì)高頻次單詞進(jìn)行抽樣來(lái)減少訓(xùn)練樣本的個(gè)數(shù)。
3. 對(duì)優(yōu)化目標(biāo)采用“negative sampling”方法,這樣每個(gè)訓(xùn)練樣本的訓(xùn)練只會(huì)更新一小部分的模型權(quán)重,從而降低計(jì)算負(fù)擔(dān)。
事實(shí)證明,對(duì)常用詞抽樣并且對(duì)優(yōu)化目標(biāo)采用“negative sampling”不僅降低了訓(xùn)練過(guò)程中的計(jì)算負(fù)擔(dān),還提高了訓(xùn)練的詞向量的質(zhì)量。
論文的作者指出,一些單詞組合(或者詞組)的含義和拆開以后具有完全不同的意義。比如“Boston Globe”是一種報(bào)刊的名字,而單獨(dú)的“Boston”和“Globe”這樣單個(gè)的單詞卻表達(dá)不出這樣的含義。因此,在文章中只要出現(xiàn)“Boston Globe”,我們就應(yīng)該把它作為一個(gè)單獨(dú)的詞來(lái)生成其詞向量,而不是將其拆開。同樣的例子還有“New York”,“United Stated”等。
在Google發(fā)布的模型中,它本身的訓(xùn)練樣本中有來(lái)自Google News數(shù)據(jù)集中的1000億的單詞,但是除了單個(gè)單詞以外,單詞組合(或詞組)又有3百萬(wàn)之多。
如果你對(duì)模型的詞匯表感興趣,可以點(diǎn)擊:
你還可以直接瀏覽這個(gè)詞匯表:
如果想了解這個(gè)模型如何進(jìn)行文檔中的詞組抽取,可以看論文中“Learning Phrases”這一章,對(duì)應(yīng)的代碼在 word2phrase.c ,相關(guān)鏈接如下。
論文鏈接:
代碼鏈接:
在第一部分的講解中,我們展示了訓(xùn)練樣本是如何從原始文檔中生成出來(lái)的,這里我再重復(fù)一次。我們的原始文本為“The quick brown fox jumps over the laze dog”,如果我使用大小為2的窗口,那么我們可以得到圖中展示的那些訓(xùn)練樣本。
但是對(duì)于“the”這種常用高頻單詞,這樣的處理方式會(huì)存在下面兩個(gè)問(wèn)題:
當(dāng)我們得到成對(duì)的單詞訓(xùn)練樣本時(shí),("fox", "the") 這樣的訓(xùn)練樣本并不會(huì)給我們提供關(guān)于“fox”更多的語(yǔ)義信息,因?yàn)椤皌he”在每個(gè)單詞的上下文中幾乎都會(huì)出現(xiàn)。
由于在文本中“the”這樣的常用詞出現(xiàn)概率很大,因此我們將會(huì)有大量的(”the“,...)這樣的訓(xùn)練樣本,而這些樣本數(shù)量遠(yuǎn)遠(yuǎn)超過(guò)了我們學(xué)習(xí)“the”這個(gè)詞向量所需的訓(xùn)練樣本數(shù)。
Word2Vec通過(guò)“抽樣”模式來(lái)解決這種高頻詞問(wèn)題。它的基本思想如下:對(duì)于我們?cè)谟?xùn)練原始文本中遇到的每一個(gè)單詞,它們都有一定概率被我們從文本中刪掉,而這個(gè)被刪除的概率與單詞的頻率有關(guān)。
如果我們?cè)O(shè)置窗口大?。矗?,并且從我們的文本中刪除所有的“the”,那么會(huì)有下面的結(jié)果:
1. 由于我們刪除了文本中所有的“the”,那么在我們的訓(xùn)練樣本中,“the”這個(gè)詞永遠(yuǎn)也不會(huì)出現(xiàn)在我們的上下文窗口中。
2. 當(dāng)“the”作為input word時(shí),我們的訓(xùn)練樣本數(shù)至少會(huì)減少10個(gè)。
這句話應(yīng)該這么理解,假如我們的文本中僅出現(xiàn)了一個(gè)“the”,那么當(dāng)這個(gè)“the”作為input word時(shí),我們?cè)O(shè)置span=10,此時(shí)會(huì)得到10個(gè)訓(xùn)練樣本 ("the", ...) ,如果刪掉這個(gè)“the”,我們就會(huì)減少10個(gè)訓(xùn)練樣本。實(shí)際中我們的文本中不止一個(gè)“the”,因此當(dāng)“the”作為input word的時(shí)候,至少會(huì)減少10個(gè)訓(xùn)練樣本。
上面提到的這兩個(gè)影響結(jié)果實(shí)際上就幫助我們解決了高頻詞帶來(lái)的問(wèn)題。
word2vec的C語(yǔ)言代碼實(shí)現(xiàn)了一個(gè)計(jì)算在詞匯表中保留某個(gè)詞概率的公式。
ωi 是一個(gè)單詞,Z(ωi) 是 ωi 這個(gè)單詞在所有語(yǔ)料中出現(xiàn)的頻次。舉個(gè)栗子,如果單詞“peanut”在10億規(guī)模大小的語(yǔ)料中出現(xiàn)了1000次,那么 Z(peanut) = 1000/1000000000 = 1e - 6。
在代碼中還有一個(gè)參數(shù)叫“sample”,這個(gè)參數(shù)代表一個(gè)閾值,默認(rèn)值為0.001(在gensim包中的Word2Vec類說(shuō)明中,這個(gè)參數(shù)默認(rèn)為0.001,文檔中對(duì)這個(gè)參數(shù)的解釋為“ threshold for configuring which higher-frequency words are randomly downsampled”)。這個(gè)值越小意味著這個(gè)單詞被保留下來(lái)的概率越?。从性酱蟮母怕时晃覀儎h除)。
P(ωi) 代表著保留某個(gè)單詞的概率:
圖中x軸代表著 Z(ωi) ,即單詞 ωi 在語(yǔ)料中出現(xiàn)頻率,y軸代表某個(gè)單詞被保留的概率。對(duì)于一個(gè)龐大的語(yǔ)料來(lái)說(shuō),單個(gè)單詞的出現(xiàn)頻率不會(huì)很大,即使是常用詞,也不可能特別大。
從這個(gè)圖中,我們可以看到,隨著單詞出現(xiàn)頻率的增高,它被采樣保留的概率越來(lái)越小,我們還可以看到一些有趣的結(jié)論:
● 當(dāng) Z(ωi) <= 0.0026 時(shí),P(ωi) = 1.0 。當(dāng)單詞在語(yǔ)料中出現(xiàn)的頻率小于 0.0026 時(shí),它是 100% 被保留的,這意味著只有那些在語(yǔ)料中出現(xiàn)頻率超過(guò) 0.26% 的單詞才會(huì)被采樣。
● 當(dāng)時(shí) Z(ωi) = 0.00746 時(shí),P(ωi) = 0.5,意味著這一部分的單詞有 50% 的概率被保留。
● 當(dāng) Z(ωi) = 1.0 時(shí),P(ωi) = 0.033,意味著這部分單詞以 3.3% 的概率被保留。
如果你去看那篇論文的話,你會(huì)發(fā)現(xiàn)作者在論文中對(duì)函數(shù)公式的定義和在C語(yǔ)言代碼的實(shí)現(xiàn)上有一些差別,但我認(rèn)為C語(yǔ)言代碼的公式實(shí)現(xiàn)是更權(quán)威的一個(gè)版本。
訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)意味著要輸入訓(xùn)練樣本并且不斷調(diào)整神經(jīng)元的權(quán)重,從而不斷提高對(duì)目標(biāo)的準(zhǔn)確預(yù)測(cè)。每當(dāng)神經(jīng)網(wǎng)絡(luò)經(jīng)過(guò)一個(gè)訓(xùn)練樣本的訓(xùn)練,它的權(quán)重就會(huì)進(jìn)行一次調(diào)整。
正如我們上面所討論的,vocabulary的大小決定了我們的Skip-Gram神經(jīng)網(wǎng)絡(luò)將會(huì)擁有大規(guī)模的權(quán)重矩陣,所有的這些權(quán)重需要通過(guò)我們數(shù)以億計(jì)的訓(xùn)練樣本來(lái)進(jìn)行調(diào)整,這是非常消耗計(jì)算資源的,并且實(shí)際中訓(xùn)練起來(lái)會(huì)非常慢。
負(fù)采樣(negative sampling)解決了這個(gè)問(wèn)題,它是用來(lái)提高訓(xùn)練速度并且改善所得到詞向量的質(zhì)量的一種方法。不同于原本每個(gè)訓(xùn)練樣本更新所有的權(quán)重,負(fù)采樣每次讓一個(gè)訓(xùn)練樣本僅僅更新一小部分的權(quán)重,這樣就會(huì)降低梯度下降過(guò)程中的計(jì)算量。
當(dāng)我們用訓(xùn)練樣本 ( input word: "fox",output word: "quick") 來(lái)訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)時(shí),“ fox”和“quick”都是經(jīng)過(guò)one-hot編碼的。如果我們的vocabulary大小為10000時(shí),在輸出層,我們期望對(duì)應(yīng)“quick”單詞的那個(gè)神經(jīng)元結(jié)點(diǎn)輸出1,其余9999個(gè)都應(yīng)該輸出0。在這里,這9999個(gè)我們期望輸出為0的神經(jīng)元結(jié)點(diǎn)所對(duì)應(yīng)的單詞我們稱為“negative” word。
當(dāng)使用負(fù)采樣時(shí),我們將隨機(jī)選擇一小部分的negative words(比如選5個(gè)negative words)來(lái)更新對(duì)應(yīng)的權(quán)重。我們也會(huì)對(duì)我們的“positive” word進(jìn)行權(quán)重更新(在我們上面的例子中,這個(gè)單詞指的是”quick“)。
在論文中,作者指出指出對(duì)于小規(guī)模數(shù)據(jù)集,選擇5-20個(gè)negative words會(huì)比較好,對(duì)于大規(guī)模數(shù)據(jù)集可以僅選擇2-5個(gè)negative words。
回憶一下我們的隱層-輸出層擁有300 x 10000的權(quán)重矩陣。如果使用了負(fù)采樣的方法我們僅僅去更新我們的positive word-“quick”的和我們選擇的其他5個(gè)negative words的結(jié)點(diǎn)對(duì)應(yīng)的權(quán)重,共計(jì)6個(gè)輸出神經(jīng)元,相當(dāng)于每次只更新 300 x 6 = 1800 個(gè)權(quán)重。對(duì)于3百萬(wàn)的權(quán)重來(lái)說(shuō),相當(dāng)于只計(jì)算了0.06%的權(quán)重,這樣計(jì)算效率就大幅度提高。
我們使用“一元模型分布(unigram distribution)”來(lái)選擇“negative words”。
要注意的一點(diǎn)是,一個(gè)單詞被選作negative sample的概率跟它出現(xiàn)的頻次有關(guān),出現(xiàn)頻次越高的單詞越容易被選作negative words。
在word2vec的C語(yǔ)言實(shí)現(xiàn)中,你可以看到對(duì)于這個(gè)概率的實(shí)現(xiàn)公式。每個(gè)單詞被選為“negative words”的概率計(jì)算公式與其出現(xiàn)的頻次有關(guān)。
代碼中的公式實(shí)現(xiàn)如下:
每個(gè)單詞被賦予一個(gè)權(quán)重,即 f(ωi), 它代表著單詞出現(xiàn)的頻次。
公式中開3/4的根號(hào)完全是基于經(jīng)驗(yàn)的,論文中提到這個(gè)公式的效果要比其它公式更加出色。你可以在google的搜索欄中輸入“plot y = x^(3/4) and y = x”,然后看到這兩幅圖(如下圖),仔細(xì)觀察x在[0,1]區(qū)間內(nèi)時(shí)y的取值,x^(3/4) 有一小段弧形,取值在 y = x 函數(shù)之上。
負(fù)采樣的C語(yǔ)言實(shí)現(xiàn)非常的有趣。unigram table有一個(gè)包含了一億個(gè)元素的數(shù)組,這個(gè)數(shù)組是由詞匯表中每個(gè)單詞的索引號(hào)填充的,并且這個(gè)數(shù)組中有重復(fù),也就是說(shuō)有些單詞會(huì)出現(xiàn)多次。那么每個(gè)單詞的索引在這個(gè)數(shù)組中出現(xiàn)的次數(shù)該如何決定呢,有公式,也就是說(shuō)計(jì)算出的負(fù)采樣概率*1億=單詞在表中出現(xiàn)的次數(shù)。
有了這張表以后,每次去我們進(jìn)行負(fù)采樣時(shí),只需要在0-1億范圍內(nèi)生成一個(gè)隨機(jī)數(shù),然后選擇表中索引號(hào)為這個(gè)隨機(jī)數(shù)的那個(gè)單詞作為我們的negative word即可。一個(gè)單詞的負(fù)采樣概率越大,那么它在這個(gè)表中出現(xiàn)的次數(shù)就越多,它被選中的概率就越大。
到目前為止,Word2Vec中的Skip-Gram模型就講完了,對(duì)于里面具體的數(shù)學(xué)公式推導(dǎo)細(xì)節(jié)這里并沒有深入。這篇文章只是對(duì)于實(shí)現(xiàn)細(xì)節(jié)上的一些思想進(jìn)行了闡述。
如果想了解更多的實(shí)現(xiàn)細(xì)節(jié),可以去查看C語(yǔ)言的實(shí)現(xiàn)源碼:
其他Word2Vec教程請(qǐng)參考:
下一部分將會(huì)介紹如何用 TensorFlow 實(shí)現(xiàn)一個(gè) Word2Vec 中的 Skip-Gram 模型。
雷鋒網(wǎng)相關(guān)閱讀:
一文詳解 Word2vec 之 Skip-Gram 模型(結(jié)構(gòu)篇)
一文詳解 Word2vec 之 Skip-Gram 模型(實(shí)現(xiàn)篇)
25 行 Python 代碼實(shí)現(xiàn)人臉檢測(cè)——OpenCV 技術(shù)教程
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。