Word2vec是一種可以進(jìn)行高效率詞嵌套學(xué)習(xí)的預(yù)測(cè)模型浓体。其兩種變體分別為:
● 連續(xù)詞袋模型(CBOW)
● Skip-Gram模型耕姊。
從算法角度看稿饰,這兩種方法非常相似舔稀,其區(qū)別為CBOW根據(jù)源詞上下文詞匯('the cat sits on the')來預(yù)測(cè)目標(biāo)詞匯(例如元镀,‘mat’)绍填,而Skip-Gram模型做法相反,它通過目標(biāo)詞匯來預(yù)測(cè)源詞匯栖疑。
Skip-Gram模型采取CBOW的逆過程的動(dòng)機(jī)在于:CBOW算法對(duì)于很多分布式信息進(jìn)行了平滑處理(例如將一整段上下文信息視為一個(gè)單一觀察量)讨永。很多情況下,對(duì)于小型的數(shù)據(jù)集遇革,這一處理是有幫助的住闯。相形之下,Skip-Gram模型將每個(gè)“上下文-目標(biāo)詞匯”的組合視為一個(gè)新觀察量澳淑,這種做法在大型數(shù)據(jù)集中會(huì)更為有效比原。
譬如: 對(duì)同樣一個(gè)句子:Shenzhen is a nice city。我們要構(gòu)造一個(gè)語境與目標(biāo)詞匯的映射關(guān)系杠巡,其實(shí)就是input與label的關(guān)系量窘。 這里假設(shè)滑窗尺寸為1,
CBOW可以制造的映射關(guān)系為:[Shenzhen,a]—>is,[is,nice]—>a氢拥,[a,city]—>nice
Skip-Gram可以制造的映射關(guān)系為(is,Shenzhen)蚌铜,(is,a),(a,is)嫩海, (a,nice)冬殃,(nice,a),(nice,city)
Skip-Gram詳解:
我們基于成對(duì)的單詞來對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練叁怪,訓(xùn)練樣本是 ( input word, output word ) 這樣的單詞對(duì)审葬,input word和output word都是one-hot編碼的向量。最終模型的輸出是一個(gè)概率分布奕谭。
skip-gram 模型結(jié)構(gòu):
Skip-gram: 最終的目標(biāo)就是學(xué)習(xí)這個(gè)隱層的權(quán)重矩陣涣觉,從而形成具體word的詞向量embeddings
實(shí)際訓(xùn)練中存在的問題:
舉個(gè)栗子,我們擁有10000個(gè)單詞的詞匯表血柳,我們?nèi)绻肭度?00維的詞向量官册,那么我們的輸入-隱層權(quán)重矩陣和隱層-輸出層的權(quán)重矩陣都會(huì)有 10000 x 300 = 300萬個(gè)權(quán)重,在如此龐大的神經(jīng)網(wǎng)絡(luò)中進(jìn)行梯度下降是相當(dāng)慢的难捌。更糟糕的是膝宁,你需要大量的訓(xùn)練數(shù)據(jù)來調(diào)整這些權(quán)重并且避免過擬合鸦难。百萬數(shù)量級(jí)的權(quán)重矩陣和億萬數(shù)量級(jí)的訓(xùn)練樣本意味著訓(xùn)練這個(gè)模型將會(huì)是個(gè)災(zāi)難(太兇殘了)。
可行的解決辦法:
● 將常見的單詞組合(word pairs)或者詞組作為單個(gè)“words”來處理员淫。(因?yàn)橐恍┰~組合起來與分開時(shí)意思完全不同合蔽,譬如New York,United Stated等其他 )
● 對(duì)高頻次單詞進(jìn)行抽樣來減少訓(xùn)練樣本的個(gè)數(shù)满粗。(譬如去掉高頻詞匯the , a, an~等組成的詞對(duì)輸入樣本)
● 對(duì)優(yōu)化目標(biāo)采用負(fù)采樣--“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)練過程中的計(jì)算負(fù)擔(dān),還提高了訓(xùn)練的詞向量的質(zhì)量捅彻。
負(fù)采樣原理:
負(fù)采樣(negative sampling)是用來提高訓(xùn)練速度并且改善所得到詞向量的質(zhì)量的一種方法组去。不同于原本每個(gè)訓(xùn)練樣本更新所有的權(quán)重,負(fù)采樣每次讓一個(gè)訓(xùn)練樣本僅僅更新一小部分的權(quán)重步淹,這樣就會(huì)降低梯度下降過程中的計(jì)算量从隆。
當(dāng)我們用訓(xùn)練樣本 ( input word: "fox",output word: "quick") 來訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)時(shí)缭裆,“ fox”和“quick”都是經(jīng)過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)來更新對(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*6=1800
個(gè)權(quán)重。對(duì)于3百萬的權(quán)重來說快鱼,相當(dāng)于只計(jì)算了0.06%的權(quán)重颠印,這樣計(jì)算效率就大幅度提高纲岭。
PS:一個(gè)單詞被選作negative sample的概率跟它出現(xiàn)的頻次有關(guān),出現(xiàn)頻次越高的單詞越容易被選作negative words线罕。
Skip-gram 原理詳解paper:
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/