機(jī)器學(xué)習(xí)必須熟悉的算法之word2vector(二)

在上一篇文章中,我們簡(jiǎn)述了skip gram版word2vector的基本原理,留下一個(gè)問(wèn)題待解決,那就是網(wǎng)絡(luò)非常大,這將導(dǎo)致如下幾個(gè)困難:1、在上面訓(xùn)練梯度下降會(huì)比較慢;2、需要數(shù)量巨大的數(shù)據(jù)來(lái)喂到網(wǎng)絡(luò)中;3、非常容易過(guò)擬合。這一節(jié)就是專門介紹實(shí)際訓(xùn)練中的技巧的。原文在這里:http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
當(dāng)然,我不會(huì)生硬地翻譯這篇文章,而是按照自己的理解,盡可能用自己的邏輯將它寫(xiě)出來(lái),期望能夠比原文更加清晰一些。

總得來(lái)講,共有三個(gè)技巧,我們一個(gè)個(gè)看。

一、將詞組和短語(yǔ)看作獨(dú)立的單詞

這個(gè)技巧的原理非常簡(jiǎn)單。比如文本中有“中華人民共和國(guó)”,此時(shí),按照機(jī)械的劃分,中華、人民、共和國(guó)應(yīng)該是三個(gè)詞,但是顯然,中華人民共和國(guó)作為一個(gè)單獨(dú)的詞會(huì)更加合理一些。
如何從文本中發(fā)現(xiàn)詞組和短語(yǔ)是一個(gè)專門的算法,這里略過(guò)了,因?yàn)槌隽宋覀兘裉斓闹黝}。

二、對(duì)高頻詞進(jìn)行抽樣

讓我們回顧一下上一節(jié)構(gòu)造訓(xùn)練數(shù)據(jù)單詞對(duì)的方法。


construct data

在上面的構(gòu)建單詞對(duì)的過(guò)程中,對(duì)那些常見(jiàn)的詞,如“the”存在兩個(gè)問(wèn)題:

  • 1、類似(fox,the)這樣的單詞對(duì)并沒(méi)有什么用,因?yàn)榇颂幍膖he并沒(méi)有對(duì)理解fox產(chǎn)生什么貢獻(xiàn),它太普遍了,以至于在大多數(shù)單詞的周圍都可以發(fā)現(xiàn)它。此時(shí),我們只能說(shuō)the在fox 的周圍,卻不構(gòu)成fox 的context。
  • 2、上面的辦法會(huì)產(chǎn)生太多(the,...)樣式的單詞對(duì),這對(duì)于學(xué)習(xí)單詞the的vector來(lái)說(shuō),實(shí)在是太多了。
    解決這兩個(gè)問(wèn)題的辦法就是subsampling,具體意思是:
    當(dāng)我們掃描文本中的詞時(shí),會(huì)根據(jù)一定的概率刪除這個(gè)詞,也就是相當(dāng)于文本中此處沒(méi)有了這個(gè)詞。這個(gè)概率大小取決于該詞在整個(gè)語(yǔ)料庫(kù)中的出現(xiàn)頻率。出現(xiàn)頻率越高,那么我們刪除該詞的概率就越大。
    這個(gè)很容易理解,以上面的the為例,由于它在整個(gè)語(yǔ)料庫(kù)中出現(xiàn)的頻率很高,我們就會(huì)刪除相當(dāng)一部分的the,以便減少訓(xùn)練量。

再具體一點(diǎn),假設(shè)我們刪除了jump over the
lazy dog 中的the,我們的窗口大小是2,那么,the與其前后各兩個(gè)詞組成的詞對(duì)就不會(huì)稱為訓(xùn)練數(shù)據(jù),因?yàn)閠he已經(jīng)被刪除了,其次,以the前后各兩個(gè)詞作為輸入的詞對(duì)中,都會(huì)減少一個(gè)(*,the)的詞對(duì)。

那么,接下來(lái)一個(gè)問(wèn)題就是如何確定刪除一個(gè)詞的概率?直接上公式:


image.png

P(wi)是保留單詞wi的概率,z(wi)是該詞在整個(gè)語(yǔ)料庫(kù)出現(xiàn)的比例。
我們可以將上面的公式畫(huà)成圖來(lái)看看:


image.png

Note:要得到這個(gè)圖,只需在google中輸入
Graph for (sqrt(x/0.001)+1)*0.001/x即可。

至于這個(gè)公式怎么來(lái)的,說(shuō)實(shí)話,我也不清楚,鑒于它不是本文的重點(diǎn),我也沒(méi)有深究,如果有清楚的伙伴,歡迎留言補(bǔ)充。

三、負(fù)抽樣

這個(gè)辦法才是本文的重頭戲,其中的思想對(duì)人很有啟發(fā)性。剛剛聽(tīng)完螞蟻金服張家興老師分享的螞蟻金服人工智能實(shí)踐,里面提到了問(wèn)題匹配模型訓(xùn)練中的一個(gè)技巧,其思想與負(fù)抽樣很相似??梢?jiàn)技術(shù)是具體的,但技術(shù)背后反映出的解決問(wèn)題的思想?yún)s是共通的。

負(fù)抽樣技術(shù)主要解決的問(wèn)題就是模型難以訓(xùn)練。所以,我們先來(lái)看看模型為什么難以訓(xùn)練。
使用SGD訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過(guò)程就是取出一條樣本數(shù)據(jù),然后據(jù)此去調(diào)整神經(jīng)網(wǎng)絡(luò)的所有權(quán)重,以便網(wǎng)絡(luò)能夠?qū)@條數(shù)據(jù)的預(yù)測(cè)更加準(zhǔn)確一些。這里的重點(diǎn)是所有權(quán)重!

調(diào)整所有的權(quán)重是多大的工作量呢?在上篇文章中,我們已經(jīng)有過(guò)解釋,請(qǐng)參考上篇文章??傊?,所有權(quán)重是一個(gè)巨大數(shù)量的系數(shù)。對(duì)每一條樣本,每訓(xùn)練一次,這么多的系數(shù)都要進(jìn)行輕微的調(diào)整。顯然,超多的訓(xùn)練數(shù)據(jù),巨多的權(quán)重系數(shù),將使得神經(jīng)網(wǎng)絡(luò)的訓(xùn)練非常緩慢和困難。

負(fù)抽樣解決這一問(wèn)題的辦法就是使得對(duì)每一條樣本的每一次訓(xùn)練,只更新很小一部分的權(quán)重,而不是全都更新。下面我們深入細(xì)節(jié)來(lái)看一下。

假設(shè)我們的訓(xùn)練數(shù)據(jù)是(fox,quick)單詞對(duì),回憶一下,此條訓(xùn)練數(shù)據(jù)的標(biāo)簽就是quick,用one-hot編碼后,就是一個(gè)8維向量,quick所對(duì)應(yīng)的維度為1,其他維度為0。

也就是說(shuō),我們希望神經(jīng)網(wǎng)絡(luò)輸出的8維向量中,對(duì)應(yīng)quick的維度是1,其他維度是0。在輸出層,每一個(gè)輸出維度實(shí)際上對(duì)應(yīng)著一個(gè)神經(jīng)元。

在我們的例子中,我們看到其他應(yīng)當(dāng)為0的維度有7個(gè),在實(shí)際工作中,這個(gè)維度的數(shù)量是非常大的,因?yàn)槲覀兊脑~表一般會(huì)很大。

所謂負(fù)抽樣,即是從這些應(yīng)當(dāng)為0的維度中隨機(jī)抽取幾個(gè),只更新這幾個(gè)維度對(duì)應(yīng)的神經(jīng)元的權(quán)重,這既是負(fù)抽樣的確切含義。當(dāng)然,同時(shí)還要加上輸出應(yīng)當(dāng)為1的維度所對(duì)應(yīng)的神經(jīng)元。

具體負(fù)抽樣時(shí)抽幾個(gè)維度的神經(jīng)元,取決于具體的問(wèn)題,google的論文中建議是5到20個(gè)。
讓我們用一個(gè)例子來(lái)具體感受一下。假設(shè)我們負(fù)抽樣的維度數(shù)為5,我們的詞表中有10000個(gè)單詞,詞向量的維度為300,也即是隱藏層有300個(gè)神經(jīng)元。
那么,在輸出層,權(quán)重矩陣的大小將是300*10000。現(xiàn)在我們抽取了5個(gè)負(fù)的維度(輸出應(yīng)當(dāng)為0的維度),加上輸出為1的維度,只更新這6個(gè)維度所對(duì)應(yīng)的神經(jīng)元。那么需要更新的權(quán)重系數(shù)是300*6=1800個(gè)。這只占輸出層中所有權(quán)重系數(shù)的0.06%??!

另外,在隱藏層,我們還要更新輸入的單詞所對(duì)應(yīng)的300個(gè)權(quán)重。這是無(wú)論用不用負(fù)抽樣,都要更新的權(quán)重。
如果不好理解,我們就具體一點(diǎn),隱藏層可以看作一個(gè)10000*300的矩陣,其中每一行都代表一個(gè)單詞的300維詞向量,我們更新的就是輸入單詞所對(duì)應(yīng)的那一行的300個(gè)權(quán)重系數(shù)。

四、負(fù)抽樣應(yīng)當(dāng)抽誰(shuí)的樣?

上一節(jié)中,我們說(shuō)了負(fù)抽樣,一般抽5到20 個(gè)維度。問(wèn)題來(lái)了,假設(shè)是抽5個(gè)維度,那么,應(yīng)當(dāng)抽哪5個(gè)維度呢?負(fù)的維度實(shí)在太多,如果詞表為10000,那么負(fù)的維度就有9999個(gè)。從這里面抽5個(gè),難道是隨機(jī)抽嗎?

答案是否定的。在抽取這5個(gè)維度時(shí),是按照單詞在語(yǔ)料庫(kù)中出現(xiàn)的次數(shù)多少來(lái)的, 出現(xiàn)次數(shù)越多,那么越可能被抽中。具體是按照如下公式來(lái)決定的:


image.png

P(w_i)就是w_i這個(gè)單詞被負(fù)抽樣抽中的概率。
f(w_i)即是w_i在語(yǔ)料庫(kù)中出現(xiàn)的次數(shù)。

至于為什么要取一次3/4次方,據(jù)說(shuō)是基于經(jīng)驗(yàn),這樣效果會(huì)更好。

五、無(wú)總結(jié),不進(jìn)步

通過(guò)這兩篇文章,我簡(jiǎn)要地?cái)⑹隽藄kip-gram版的word2vector的原理和部分實(shí)現(xiàn)細(xì)節(jié)。
我覺(jué)得最重要的在于體會(huì)作者設(shè)計(jì)這樣的神經(jīng)網(wǎng)絡(luò),用n-gram來(lái)構(gòu)造訓(xùn)練數(shù)據(jù)背后所隱含的思想。這些思想才是我們?cè)趯?shí)際工作中最緊缺的。

這里留一個(gè)問(wèn)題供大家思考,在負(fù)抽樣時(shí),為什么要按照單詞出現(xiàn)的頻率來(lái)抽樣,這樣有什么好處?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容