在上一篇文章中,我們簡述了skip gram版word2vector的基本原理寇钉,留下一個問題待解決刀疙,那就是網(wǎng)絡(luò)非常大,這將導(dǎo)致如下幾個困難:1扫倡、在上面訓(xùn)練梯度下降會比較慢谦秧;2、需要數(shù)量巨大的數(shù)據(jù)來喂到網(wǎng)絡(luò)中撵溃;3疚鲤、非常容易過擬合。這一節(jié)就是專門介紹實際訓(xùn)練中的技巧的缘挑。原文在這里:http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
當(dāng)然集歇,我不會生硬地翻譯這篇文章,而是按照自己的理解语淘,盡可能用自己的邏輯將它寫出來诲宇,期望能夠比原文更加清晰一些际歼。
總得來講,共有三個技巧姑蓝,我們一個個看鹅心。
一、將詞組和短語看作獨立的單詞
這個技巧的原理非常簡單纺荧。比如文本中有“中華人民共和國”旭愧,此時,按照機(jī)械的劃分虐秋,中華榕茧、人民、共和國應(yīng)該是三個詞客给,但是顯然用押,中華人民共和國作為一個單獨的詞會更加合理一些。
如何從文本中發(fā)現(xiàn)詞組和短語是一個專門的算法靶剑,這里略過了蜻拨,因為超出了我們今天的主題。
二桩引、對高頻詞進(jìn)行抽樣
讓我們回顧一下上一節(jié)構(gòu)造訓(xùn)練數(shù)據(jù)單詞對的方法缎讼。
在上面的構(gòu)建單詞對的過程中,對那些常見的詞坑匠,如“the”存在兩個問題:
- 1血崭、類似(fox,the)這樣的單詞對并沒有什么用厘灼,因為此處的the并沒有對理解fox產(chǎn)生什么貢獻(xiàn)夹纫,它太普遍了,以至于在大多數(shù)單詞的周圍都可以發(fā)現(xiàn)它设凹。此時舰讹,我們只能說the在fox 的周圍,卻不構(gòu)成fox 的context闪朱。
- 2月匣、上面的辦法會產(chǎn)生太多(the,...)樣式的單詞對奋姿,這對于學(xué)習(xí)單詞the的vector來說锄开,實在是太多了。
解決這兩個問題的辦法就是subsampling胀蛮,具體意思是:
當(dāng)我們掃描文本中的詞時院刁,會根據(jù)一定的概率刪除這個詞,也就是相當(dāng)于文本中此處沒有了這個詞粪狼。這個概率大小取決于該詞在整個語料庫中的出現(xiàn)頻率退腥。出現(xiàn)頻率越高任岸,那么我們刪除該詞的概率就越大。
這個很容易理解狡刘,以上面的the為例享潜,由于它在整個語料庫中出現(xiàn)的頻率很高,我們就會刪除相當(dāng)一部分的the嗅蔬,以便減少訓(xùn)練量剑按。
再具體一點,假設(shè)我們刪除了jump over the
lazy dog 中的the澜术,我們的窗口大小是2艺蝴,那么,the與其前后各兩個詞組成的詞對就不會稱為訓(xùn)練數(shù)據(jù)鸟废,因為the已經(jīng)被刪除了猜敢,其次,以the前后各兩個詞作為輸入的詞對中盒延,都會減少一個(*缩擂,the)的詞對。
那么添寺,接下來一個問題就是如何確定刪除一個詞的概率胯盯?直接上公式:
P(wi)是保留單詞wi的概率,z(wi)是該詞在整個語料庫出現(xiàn)的比例计露。
我們可以將上面的公式畫成圖來看看:
Note:要得到這個圖博脑,只需在google中輸入
Graph for (sqrt(x/0.001)+1)*0.001/x即可。
至于這個公式怎么來的票罐,說實話趋厉,我也不清楚,鑒于它不是本文的重點胶坠,我也沒有深究,如果有清楚的伙伴繁堡,歡迎留言補(bǔ)充沈善。
三、負(fù)抽樣
這個辦法才是本文的重頭戲椭蹄,其中的思想對人很有啟發(fā)性闻牡。剛剛聽完螞蟻金服張家興老師分享的螞蟻金服人工智能實踐铛嘱,里面提到了問題匹配模型訓(xùn)練中的一個技巧啄育,其思想與負(fù)抽樣很相似〗旁可見技術(shù)是具體的翼馆,但技術(shù)背后反映出的解決問題的思想?yún)s是共通的割以。
負(fù)抽樣技術(shù)主要解決的問題就是模型難以訓(xùn)練金度。所以,我們先來看看模型為什么難以訓(xùn)練严沥。
使用SGD訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程就是取出一條樣本數(shù)據(jù)猜极,然后據(jù)此去調(diào)整神經(jīng)網(wǎng)絡(luò)的所有權(quán)重,以便網(wǎng)絡(luò)能夠?qū)@條數(shù)據(jù)的預(yù)測更加準(zhǔn)確一些消玄。這里的重點是所有權(quán)重跟伏!
調(diào)整所有的權(quán)重是多大的工作量呢?在上篇文章中翩瓜,我們已經(jīng)有過解釋受扳,請參考上篇文章⊥玫總之勘高,所有權(quán)重是一個巨大數(shù)量的系數(shù)。對每一條樣本浮定,每訓(xùn)練一次相满,這么多的系數(shù)都要進(jìn)行輕微的調(diào)整。顯然桦卒,超多的訓(xùn)練數(shù)據(jù)立美,巨多的權(quán)重系數(shù),將使得神經(jīng)網(wǎng)絡(luò)的訓(xùn)練非常緩慢和困難方灾。
負(fù)抽樣解決這一問題的辦法就是使得對每一條樣本的每一次訓(xùn)練建蹄,只更新很小一部分的權(quán)重,而不是全都更新裕偿。下面我們深入細(xì)節(jié)來看一下洞慎。
假設(shè)我們的訓(xùn)練數(shù)據(jù)是(fox,quick)單詞對嘿棘,回憶一下劲腿,此條訓(xùn)練數(shù)據(jù)的標(biāo)簽就是quick,用one-hot編碼后鸟妙,就是一個8維向量焦人,quick所對應(yīng)的維度為1,其他維度為0重父。
也就是說花椭,我們希望神經(jīng)網(wǎng)絡(luò)輸出的8維向量中,對應(yīng)quick的維度是1房午,其他維度是0矿辽。在輸出層,每一個輸出維度實際上對應(yīng)著一個神經(jīng)元。
在我們的例子中袋倔,我們看到其他應(yīng)當(dāng)為0的維度有7個雕蔽,在實際工作中,這個維度的數(shù)量是非常大的奕污,因為我們的詞表一般會很大萎羔。
所謂負(fù)抽樣,即是從這些應(yīng)當(dāng)為0的維度中隨機(jī)抽取幾個碳默,只更新這幾個維度對應(yīng)的神經(jīng)元的權(quán)重贾陷,這既是負(fù)抽樣的確切含義。當(dāng)然嘱根,同時還要加上輸出應(yīng)當(dāng)為1的維度所對應(yīng)的神經(jīng)元髓废。
具體負(fù)抽樣時抽幾個維度的神經(jīng)元,取決于具體的問題该抒,google的論文中建議是5到20個慌洪。
讓我們用一個例子來具體感受一下。假設(shè)我們負(fù)抽樣的維度數(shù)為5凑保,我們的詞表中有10000個單詞冈爹,詞向量的維度為300,也即是隱藏層有300個神經(jīng)元欧引。
那么频伤,在輸出層,權(quán)重矩陣的大小將是300*10000≈ゴ耍現(xiàn)在我們抽取了5個負(fù)的維度(輸出應(yīng)當(dāng)為0的維度)憋肖,加上輸出為1的維度,只更新這6個維度所對應(yīng)的神經(jīng)元婚苹。那么需要更新的權(quán)重系數(shù)是300*6=1800個岸更。這只占輸出層中所有權(quán)重系數(shù)的0.06%!膊升!
另外怎炊,在隱藏層,我們還要更新輸入的單詞所對應(yīng)的300個權(quán)重廓译。這是無論用不用負(fù)抽樣结胀,都要更新的權(quán)重。
如果不好理解责循,我們就具體一點,隱藏層可以看作一個10000*300的矩陣攀操,其中每一行都代表一個單詞的300維詞向量院仿,我們更新的就是輸入單詞所對應(yīng)的那一行的300個權(quán)重系數(shù)。
四、負(fù)抽樣應(yīng)當(dāng)抽誰的樣歹垫?
上一節(jié)中剥汤,我們說了負(fù)抽樣,一般抽5到20 個維度排惨。問題來了吭敢,假設(shè)是抽5個維度,那么暮芭,應(yīng)當(dāng)抽哪5個維度呢鹿驼?負(fù)的維度實在太多,如果詞表為10000辕宏,那么負(fù)的維度就有9999個畜晰。從這里面抽5個,難道是隨機(jī)抽嗎瑞筐?
答案是否定的凄鼻。在抽取這5個維度時,是按照單詞在語料庫中出現(xiàn)的次數(shù)多少來的聚假, 出現(xiàn)次數(shù)越多块蚌,那么越可能被抽中。具體是按照如下公式來決定的:
P(w_i)就是w_i這個單詞被負(fù)抽樣抽中的概率膘格。
f(w_i)即是w_i在語料庫中出現(xiàn)的次數(shù)峭范。
至于為什么要取一次3/4次方,據(jù)說是基于經(jīng)驗闯袒,這樣效果會更好虎敦。
五、無總結(jié)政敢,不進(jìn)步
通過這兩篇文章其徙,我簡要地敘述了skip-gram版的word2vector的原理和部分實現(xiàn)細(xì)節(jié)。
我覺得最重要的在于體會作者設(shè)計這樣的神經(jīng)網(wǎng)絡(luò)喷户,用n-gram來構(gòu)造訓(xùn)練數(shù)據(jù)背后所隱含的思想唾那。這些思想才是我們在實際工作中最緊缺的。
這里留一個問題供大家思考褪尝,在負(fù)抽樣時闹获,為什么要按照單詞出現(xiàn)的頻率來抽樣,這樣有什么好處河哑?