0
本文作者: AI研習(xí)社-譯站 | 2018-06-19 14:43 |
雷鋒網(wǎng)按:本文為雷鋒網(wǎng)字幕組編譯的技術(shù)博客,原標(biāo)題 A、Word2Vec?—?a baby step in Deep Learning but a giant leap towards Natural Language Processing,作者為機(jī)器學(xué)習(xí)工程師 Suvro Banerjee
翻譯 | 于志鵬 林驍 校對(duì) | 程思婕 整理 | 孔令雙
原文鏈接:
引言
Word2Vec 模型用來(lái)學(xué)習(xí)單詞的向量表示,我們稱(chēng)為「詞嵌入」。通常作為一種預(yù)處理步驟,在這之后詞向量被送入判別模型(通常是 RNN)生成預(yù)測(cè)結(jié)果和執(zhí)行各種有趣的操作。
圖像和聲音處理系統(tǒng)所需豐富、高維的數(shù)據(jù)集,按各原始圖像的像素強(qiáng)度被編碼為向量的形式,所有信息都被編碼在這樣的數(shù)據(jù)中,因此就可以在系統(tǒng)中建立各種實(shí)體(如 cat 和 dog)之間的關(guān)系。
但是,傳統(tǒng)的自然語(yǔ)言處理系統(tǒng)通常將單詞視為離散的原子符號(hào),所以 cat 可以被表示為 Id537,dog 可以表示為 Id143。這些編碼是任意的并且不能向系統(tǒng)提供任何關(guān)于各個(gè)原子符號(hào)之間關(guān)系的信息。這意味著,模型在處理 dogs 的數(shù)據(jù)時(shí)不能與模型已經(jīng)學(xué)習(xí)過(guò)的 cats 的特征聯(lián)系起來(lái)(如它們都有是動(dòng)物,都有四條腿,都是寵物等等)。
將單詞表示為唯一的、離散的 ID 還會(huì)進(jìn)一步導(dǎo)致數(shù)據(jù)稀疏,還意味著我們可能需要更多的數(shù)據(jù)才能成功訓(xùn)練統(tǒng)計(jì)模型。使用向量表示就可以避免這些問(wèn)題。
讓我們來(lái)看一個(gè)例子
傳統(tǒng)的 NLP 方法涉及許多語(yǔ)言學(xué)領(lǐng)域知識(shí),要求你理解諸如「音素」及「詞素」等術(shù)語(yǔ),因?yàn)檎Z(yǔ)言學(xué)中有很多分類(lèi),音素學(xué)和詞素學(xué)是其中的兩種。讓我們來(lái)看看傳統(tǒng)的 NLP 方法如何嘗試?yán)斫庀旅娴膯卧~。
假設(shè)我們要獲取關(guān)于單詞的一些信息(諸如它所表達(dá)的情緒、它的定義等),運(yùn)用語(yǔ)言學(xué)的方法我們將詞分為 3 個(gè)部分。即前綴、后綴、詞干。
比如,我們知道「un」前綴表示相反或否定的意思,我們也知道「ed」可以指定表示單詞的時(shí)態(tài)(過(guò)去時(shí))。我們可以從「interest」的詞干中很容易的推斷出整個(gè)詞的含義和表達(dá)的情感. 是不是非常簡(jiǎn)單?然而,當(dāng)考慮所有不同的前后綴時(shí)需要非常嫻熟的語(yǔ)言學(xué)家來(lái)理解所有可能組合的含義。
深度學(xué)習(xí),本質(zhì)上就是表示學(xué)習(xí)。我們將要采用一些方法通過(guò)大數(shù)據(jù)集的訓(xùn)練來(lái)創(chuàng)建單詞的表示。
假設(shè)我們用一個(gè) d 維向量表示每一個(gè)單詞,假設(shè) d=6。我們想要為句子中的每個(gè)不重復(fù)單詞創(chuàng)建單詞詞向量。
現(xiàn)在來(lái)考慮一下如何賦值,我們希望可以用某種方式來(lái)表示這個(gè)單詞和它的上下文、含義、語(yǔ)義。一種方法是創(chuàng)建一個(gè)共生矩陣。
共生矩陣是這樣一種矩陣,它包含這個(gè)詞在所有語(yǔ)料庫(kù)(或訓(xùn)練集)中和所有其他詞組合出現(xiàn)的次數(shù)。我們來(lái)看一下共生矩陣的樣子。
通過(guò)上面這個(gè)簡(jiǎn)單的共生矩陣的例子,我們可以獲得很多相當(dāng)有用的信息。比如,我們注意到「love」和「like」這兩個(gè)詞向量中都含有若干個(gè) 1,這是對(duì)他們所接名詞(NLP 和 dogs)的記數(shù)。對(duì)「I」的記數(shù)也含若干個(gè)1,因此表明這個(gè)單詞一定是某個(gè)動(dòng)詞。當(dāng)處理多句的大數(shù)據(jù)集時(shí),你可以想象這種相似性會(huì)變得更加清晰,比如「like」、「love」和其他同義詞將具有相似的詞向量,因?yàn)樗麄冊(cè)谙嗨频恼Z(yǔ)境中。
目前,雖然我們有了一個(gè)很好的開(kāi)端,但是我們也要注意到每個(gè)單詞的維度將隨著語(yǔ)料庫(kù)的增大而線(xiàn)性增加。如果我們有 100 萬(wàn)個(gè)單詞 (在 NLP 的標(biāo)準(zhǔn)中并不是很多),我們將會(huì)有一個(gè) 100 萬(wàn)*100 萬(wàn)大小的矩陣,并且是非常稀疏的(大量 0 元素)。在存儲(chǔ)效率方面這個(gè)顯然不是最好的方案。在尋找表示這些詞向量的最佳方法中有很多改進(jìn)。其中最著名的就是 Word2Vec 。
向量空間模型(VSMs)在連續(xù)向量空間中表示(嵌入) 單詞,其中語(yǔ)義相似的單詞被映射到臨近點(diǎn)(嵌入在彼此附近)。VSMs 在 NLP 發(fā)展中有著悠久的歷史,但都依賴(lài)于分布式假設(shè),該假設(shè)指出,出現(xiàn)在相同語(yǔ)境中的單詞具有相似語(yǔ)義。利用這一原則的方法可以分為兩類(lèi):
1.基于記數(shù)的方法(例如:潛在語(yǔ)義的分析);
2.預(yù)測(cè)方法(例如:神經(jīng)概率語(yǔ)言模型)
他們的區(qū)別是--
用計(jì)數(shù)的方法計(jì)算某個(gè)詞在大型文本語(yǔ)料庫(kù)中與其相鄰詞匯共同出現(xiàn)的頻率的統(tǒng)計(jì)數(shù)據(jù),然后將這些統(tǒng)計(jì)數(shù)據(jù)的每個(gè)詞映射為小且密集的向量。
預(yù)測(cè)模型直接嘗試根據(jù)學(xué)習(xí)的小密集嵌入向量(考慮模型的參數(shù))來(lái)預(yù)測(cè)來(lái)自其鄰居的單詞。
Word2vec 是一種特別有效的計(jì)算預(yù)測(cè)模型,用于從原始文本中學(xué)習(xí)單詞嵌入。它有兩種形式,即連續(xù)字袋模型(CBOW)和 the Skip-Gram 模型。在算法上,這些模型是相似的,除了 CBOW 從源上下文單詞中預(yù)測(cè)目標(biāo)單詞,而 the skip-Gram 相反并預(yù)測(cè)來(lái)自目標(biāo)單詞源上下文的單詞。
在接下來(lái)的討論中,我們將重點(diǎn)討論 skipg 模型。
傳統(tǒng)上,神經(jīng)概率語(yǔ)言模型使用最大似然原理進(jìn)行訓(xùn)練,以 softmax 函數(shù)的形式使給定前面的單詞 h(「history」)的下一個(gè)單詞 wt(「target」)的概率最大化。
利用 score(wt, h) 計(jì)算目標(biāo)詞 wt 與上下文 h 的兼容性(通常使用點(diǎn)積運(yùn)算)。
我們通過(guò)在訓(xùn)練集上最大化它的對(duì)數(shù)似然來(lái)訓(xùn)練這個(gè)模型。所以,我們最大化以下?lián)p失函數(shù)。
這為語(yǔ)言建模提供了一個(gè)合適的標(biāo)準(zhǔn)化概率模型。
這個(gè)相同的論點(diǎn)也可以用稍微不同的公式來(lái)表示,它清楚地顯示了為了使這個(gè)目標(biāo)最大化而改變的變量(或參數(shù))。
我們的目標(biāo)是找到一些詞匯表示,這些詞匯可以用于預(yù)測(cè)當(dāng)前單詞的周?chē)~匯。特別是,我們希望最大化我們整個(gè)語(yǔ)料庫(kù)的平均對(duì)數(shù)概率:
這個(gè)方程從本質(zhì)上說(shuō),有一些概率 p 觀察當(dāng)前單詞 wt 的大小為 c 的窗口內(nèi)的特定單詞。這個(gè)概率取決于當(dāng)前單詞 wt 和參數(shù)θ的一些設(shè)置(由我們的模型確定)。我們希望設(shè)置這些參數(shù)θ,以便在整個(gè)語(yǔ)料庫(kù)中這個(gè)概率最大化。
基本 skip-gram 模型定義了通過(guò) softmax 函數(shù)的概率 p,正如我們前面看到的那樣。如果我們認(rèn)為 wi 維數(shù)為 N 和θ的單熱編碼矢量,并且它是一個(gè) N×K 矩陣嵌入矩陣,這表示我們的詞匯表中有 N 個(gè)詞,而我們學(xué)習(xí)的嵌入具有維數(shù) K,那么我們可以定義 -
值得注意的是,在學(xué)習(xí)之后,矩陣theta可以被認(rèn)為是嵌入查找矩陣。
在架構(gòu)方面,它是一個(gè)簡(jiǎn)單的三層神經(jīng)網(wǎng)絡(luò)。
搭建三層網(wǎng)絡(luò)結(jié)構(gòu)(一個(gè)輸入層,一個(gè)隱藏層,一個(gè)輸出層)
傳入一個(gè)單詞,并讓它訓(xùn)練其附近的單詞
移除輸出層,但保留輸入層和隱藏層
接著,從詞匯表中輸入一個(gè)單詞。隱藏層給出的輸出是輸入單詞的「單詞嵌入」
這種參數(shù)化有一個(gè)主要的缺點(diǎn),限制了它在大型的語(yǔ)料庫(kù)中的用處。具體來(lái)說(shuō),我們注意到為了計(jì)算我們模型的單個(gè)正向通過(guò),我們必須對(duì)整個(gè)語(yǔ)料庫(kù)詞匯進(jìn)行總結(jié),以評(píng)估 softmax 函數(shù)。對(duì)于大型數(shù)據(jù)集來(lái)說(shuō)這是非常奢侈的,所以我們?yōu)榱擞?jì)算效率考慮這個(gè)模型的替代近似。
對(duì)于 word2vec 中的特征學(xué)習(xí),我們不需要完整的概率模型。CBOW 和 skip-gram 模型是使用二分類(lèi)目標(biāo)(邏輯回歸)來(lái)訓(xùn)練的,以在相同的上下文中將真實(shí)目標(biāo)詞語(yǔ)(wt)與 k 個(gè)虛數(shù)(干擾)詞語(yǔ) w 進(jìn)行區(qū)分。
在數(shù)學(xué)上,該操作是對(duì)每個(gè)對(duì)象進(jìn)行最大化。
當(dāng)模型將高概率分配給真實(shí)詞,并將低概率分配給噪音詞,這個(gè)目標(biāo)被最大化。 從技術(shù)上講,這被稱(chēng)為負(fù)采樣,它提出的更新近似于極限中softmax函數(shù)的更新。 但是在計(jì)算上它特別有吸引力,因?yàn)橛?jì)算損失函數(shù)現(xiàn)在只能根據(jù)我們選擇的噪音詞的數(shù)量(k)而不是詞匯表(V)中的所有單詞, 這使它訓(xùn)練速度更快。 像Tensorflow這樣的軟件包使用了一種非常相似的損失函數(shù),稱(chēng)為噪聲對(duì)比估計(jì)(NCE)損失。
作為一個(gè)示例,我們需要考慮數(shù)據(jù)集-
the quick brown fox jumped over the lazy dog
我們首先形成一個(gè)單詞數(shù)據(jù)集和它們出現(xiàn)的上下文?,F(xiàn)在,讓我們堅(jiān)持使用 the vanilla 定義,并將「上下文」分別將單詞窗口定義為目標(biāo)單詞左側(cè)和右側(cè)。使用窗口大小為 1,我們就有了 (context, target) 對(duì)的數(shù)據(jù)集。
([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...
回想一下,skip-gram 會(huì)顛倒上下文和目標(biāo),并試圖從目標(biāo)詞中預(yù)測(cè)每個(gè)上下文單詞,因此任務(wù)將從「quick」,「quick」和「fox」中預(yù)測(cè)「the」和「brown」」。
因此我們的數(shù)據(jù)集成為(input,output),如下所示:
(quick, the), (quick, brown), (brown, quick), (brown, fox), ...
目標(biāo)函數(shù)是在整個(gè)數(shù)據(jù)集上定義的,但我們通常使用隨機(jī)梯度下降(SGD)對(duì)每個(gè)示例(或 batch_size 示例的「minibatch」進(jìn)行優(yōu)化,其中通常為 16 <= batch_size <= 512)進(jìn)行優(yōu)化。讓我們來(lái)看一下這個(gè)過(guò)程的一個(gè)步驟。
讓我們想象一下,在訓(xùn)練步驟中,我們觀察上面的第一個(gè)訓(xùn)練案例,其中的目標(biāo)是快速預(yù)測(cè)。我們通過(guò)從一些噪聲分布(通常是單字符分布)中選擇 num_noise 噪聲(對(duì)比)例子的數(shù)目來(lái)選擇(該單元假設(shè)每個(gè)詞語(yǔ)的出現(xiàn)與所有其他詞語(yǔ)的出現(xiàn)無(wú)關(guān),也就是說(shuō)我們可以將生成過(guò)程看作是一個(gè)骰子序列滾動(dòng)序列 P(w)。
為了簡(jiǎn)單起見(jiàn),我們假設(shè) num_noise = 1,我們選擇 sheep 作為一個(gè)干擾的例子。接下來(lái)我們計(jì)算這對(duì)觀察到的和有噪聲例子的損失,即在時(shí)間步驟「t」的目標(biāo)變成 -
我們的目標(biāo)是對(duì)嵌入?yún)?shù)θ進(jìn)行更新以最大化該目標(biāo)函數(shù)。 我們通過(guò)推導(dǎo)關(guān)于嵌入?yún)?shù)θ的損失梯度來(lái)做到這一點(diǎn)。
然后,我們通過(guò)向梯度方向的移動(dòng)來(lái)更新嵌入?yún)?shù)。當(dāng)這個(gè)過(guò)程在整個(gè)訓(xùn)練集上重復(fù)時(shí),這會(huì)對(duì)每個(gè)單詞產(chǎn)生「移動(dòng)」嵌入向量的效果,直到模型成功地區(qū)分真實(shí)單詞和噪音單詞為止。
我們可以通過(guò)將它們向下投影到 3 維來(lái)可視化學(xué)習(xí)向量。當(dāng)我們觀察這些可視化變量時(shí),很明顯,這些向量捕獲了一些關(guān)于單詞的語(yǔ)義信息以及它們之間的關(guān)系,在實(shí)際應(yīng)用上時(shí)非常有用的。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。