丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給AI研習(xí)社-譯站
發(fā)送

0

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

本文作者: AI研習(xí)社-譯站 2018-12-27 10:47
導(dǎo)語(yǔ):Word2Vec被認(rèn)為是自然語(yǔ)言處理(NLP)領(lǐng)域中最大、最新的突破之一。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :

An implementation guide to Word2Vec using NumPy and Google Sheets

作者 | Derek Chia

翻譯 | mui

校對(duì) | 醬番梨       整理 | 菠蘿妹

原文鏈接:

https://medium.com/@derekchia/an-implementation-guide-to-word2vec-using-numpy-and-google-sheets-13445eebd281


Word2Vec被認(rèn)為是自然語(yǔ)言處理(NLP)領(lǐng)域中最大、最新的突破之一。其的概念簡(jiǎn)單,優(yōu)雅,(相對(duì))容易掌握。Google一下就會(huì)找到一堆關(guān)于如何使用諸如Gensim和TensorFlow的庫(kù)來(lái)調(diào)用Word2Vec方法的結(jié)果。另外,對(duì)于那些好奇心強(qiáng)的人,可以查看Tomas Mikolov基于C語(yǔ)言的原始實(shí)現(xiàn)。原稿也可以在這里找到。

本文的主要重點(diǎn)是詳細(xì)介紹Word2Vec。為此,我在Python上使用Numpy(在其他教程的幫助下)實(shí)現(xiàn)了Word2Vec,還準(zhǔn)備了一個(gè)Google Sheet來(lái)展示計(jì)算結(jié)果。以下是代碼和Google Sheet的鏈接。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖1.一步一步來(lái)介紹Word2Vec。由代碼和Google Sheet呈現(xiàn)


  直觀上看

Word2Vec的目標(biāo)是生成帶有語(yǔ)義的單詞的向量表示,用于進(jìn)一步的NLP任務(wù)。每個(gè)單詞向量通常有幾百個(gè)維度,語(yǔ)料庫(kù)中每個(gè)唯一的單詞在空間中被分配一個(gè)向量。例如,單詞“happy”可以表示為4維向量[0.24、0.45、0.11、0.49],“sad”具有向量[0.88、0.78、0.45、0.91]。

這種從單詞到向量的轉(zhuǎn)換也被稱(chēng)為單詞嵌入(word embedding)。這種轉(zhuǎn)換的原因是機(jī)器學(xué)習(xí)算法可以對(duì)數(shù)字(在向量中的)而不是單詞進(jìn)行線性代數(shù)運(yùn)算。

為了實(shí)現(xiàn)Word2Vec,有兩種風(fēng)格可以選擇,Continuous Bag-of-Words(CBOW)或Skip-gram(SG)。簡(jiǎn)單來(lái)說(shuō),CBOW嘗試從相鄰單詞(上下文單詞)猜測(cè)輸出(目標(biāo)單詞),而Skip-Gram從目標(biāo)單詞猜測(cè)上下文單詞。實(shí)際上,Word2Vec是基于分布假說(shuō),其認(rèn)為每個(gè)單詞的上下文都在其附近的單詞中。因此,通過(guò)查看它的相鄰單詞我們可以嘗試對(duì)目標(biāo)單詞進(jìn)行預(yù)測(cè)。

根據(jù)Mikolov(引用于這篇文章),以下是Skip-gram和CBOW之間的區(qū)別:

Skip-gram:能夠很好地處理少量的訓(xùn)練數(shù)據(jù),而且能夠很好地表示不常見(jiàn)的單詞或短語(yǔ)

CBOW:比skip-gram訓(xùn)練快幾倍,對(duì)出現(xiàn)頻率高的單詞的準(zhǔn)確度稍微更好一些

更詳細(xì)地說(shuō),由于Skip-gram學(xué)習(xí)用給定單詞來(lái)預(yù)測(cè)上下文單詞,所以萬(wàn)一兩個(gè)單詞(一個(gè)出現(xiàn)頻率較低,另一個(gè)出現(xiàn)頻率較高)放在一起,那么當(dāng)最小化loss值時(shí),兩個(gè)單詞將進(jìn)行有相同的處理,因?yàn)槊總€(gè)單詞都將被當(dāng)作目標(biāo)單詞和上下文單詞。與CBOW相比,不常見(jiàn)的單詞將只是用于預(yù)測(cè)目標(biāo)單詞的上下文單詞集合的一部分。因此,該模型將給不?,F(xiàn)的單詞分配一個(gè)低概率。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖2—Word2Vec—CBOW和skip-gram模型架構(gòu)。感謝:IDIL


  實(shí)現(xiàn)過(guò)程

在本文中,我們將實(shí)現(xiàn)Skip-gram體系結(jié)構(gòu)。為了便于閱讀,內(nèi)容分為以下幾個(gè)部分:

1.數(shù)據(jù)準(zhǔn)備——定義語(yǔ)料庫(kù)、整理、規(guī)范化和分詞

2.超參數(shù)——學(xué)習(xí)率、訓(xùn)練次數(shù)、窗口尺寸、嵌入(embedding)尺寸

3.生成訓(xùn)練數(shù)據(jù)——建立詞匯表,對(duì)單詞進(jìn)行one-hot編碼,建立將id映射到單詞的字典,以及單詞映射到id的字典

4.模型訓(xùn)練——通過(guò)正向傳遞編碼過(guò)的單詞,計(jì)算錯(cuò)誤率,使用反向傳播調(diào)整權(quán)重和計(jì)算loss值

5.結(jié)論——獲取詞向量,并找到相似的詞

6.進(jìn)一步的改進(jìn) —— 利用Skip-gram負(fù)采樣(Negative Sampling)和Hierarchical Softmax提高訓(xùn)練速度


1.數(shù)據(jù)準(zhǔn)備

首先,我們從以下語(yǔ)料庫(kù)開(kāi)始:

natural language processing and machine learning is fun and exciting

簡(jiǎn)單起見(jiàn),我們選擇了一個(gè)沒(méi)有標(biāo)點(diǎn)和大寫(xiě)的橘子。而且,我們沒(méi)有刪除停用詞“and”和“is”。

實(shí)際上,文本數(shù)據(jù)是非結(jié)構(gòu)化的,甚至可能很“很不干凈”清理它們涉及一些步驟,例如刪除停用詞、標(biāo)點(diǎn)符號(hào)、將文本轉(zhuǎn)換為小寫(xiě)(實(shí)際上取決于你的實(shí)際例子)和替換數(shù)字等。KDnuggets 上有一篇關(guān)于這個(gè)步驟很棒的文章。另外,Gensim也提供了執(zhí)行簡(jiǎn)單文本預(yù)處理的函數(shù)——gensim.utils.simple_preprocess,它將文檔轉(zhuǎn)換為由小寫(xiě)的詞語(yǔ)(Tokens )組成的列表,并忽略太短或過(guò)長(zhǎng)的詞語(yǔ)。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

在預(yù)處理之后,我們開(kāi)始對(duì)語(yǔ)料庫(kù)進(jìn)行分詞。我們按照單詞間的空格對(duì)我們的語(yǔ)料庫(kù)進(jìn)行分詞,結(jié)果得到一個(gè)單詞列表:

[“natural”, “l(fā)anguage”, “processing”, “ and”, “ machine”, “ learning”, “ is”, “ fun”, “and”, “ exciting”]


2.超參數(shù)

在進(jìn)入word2vec的實(shí)現(xiàn)之前,讓我們先定義一些稍后需要用到的超參數(shù)。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

[window_size/窗口尺寸]:如之前所述,上下文單詞是與目標(biāo)單詞相鄰的單詞。但是,這些詞應(yīng)該有多遠(yuǎn)或多近才能被認(rèn)為是相鄰的呢?這里我們將窗口尺寸定義為2,這意味著目標(biāo)單詞的左邊和右邊最近的2個(gè)單詞被視為上下文單詞。參見(jiàn)下面的圖3,可以看到,當(dāng)窗口滑動(dòng)時(shí),語(yǔ)料庫(kù)中的每個(gè)單詞都會(huì)成為一個(gè)目標(biāo)單詞。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖3,在window_size為2的情況下,目標(biāo)單詞用橙色高亮顯示,上下文單詞用綠色高亮顯示

[n]:這是單詞嵌入(word embedding)的維度,通常其的大小通常從100到300不等,取決于詞匯庫(kù)的大小。超過(guò)300維度會(huì)導(dǎo)致效益遞減(參見(jiàn)圖2(a)的1538頁(yè))。請(qǐng)注意,維度也是隱藏層的大小。

[epochs]  :表示遍歷整個(gè)樣本的次數(shù)。在每個(gè)epoch中,我們循環(huán)通過(guò)一遍訓(xùn)練集的樣本。

[learning_rate/學(xué)習(xí)率]:學(xué)習(xí)率控制著損失梯度對(duì)權(quán)重進(jìn)行調(diào)整的量。


3.生成訓(xùn)練數(shù)據(jù)

在本節(jié)中,我們的主要目標(biāo)是將語(yǔ)料庫(kù)轉(zhuǎn)換one-hot編碼表示,以方便Word2vec模型用來(lái)訓(xùn)練。從我們的語(yǔ)料庫(kù)中,圖4中顯示了10個(gè)窗口(#1到#10)中的每一個(gè)。每個(gè)窗口都由目標(biāo)單詞及其上下文單詞組成,分別用橙色和綠色高亮顯示。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖4,每個(gè)目標(biāo)單詞及其上下文單詞的one hot編碼

第一個(gè)和最后一個(gè)訓(xùn)練窗口中的第一個(gè)和最后一個(gè)元素的示例如下所示:

# 1 [目標(biāo)單詞(natural)], [上下文單詞 (language, processing)][list([1, 0, 0, 0, 0, 0, 0, 0, 0])
 list([[0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0]])]

*****#2 to #9 省略****#10 

[ 目標(biāo)單詞   (exciting)], [ 上下文單詞  (fun, and)]
[list([0, 0, 0, 0, 0, 0, 0, 0, 1])
 list([[0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0]])]

為了生成one-hot訓(xùn)練數(shù)據(jù),我們首先初始化word2vec()對(duì)象,然后使用對(duì)象w2v通過(guò)settings 和corpus 參數(shù)來(lái)調(diào)用函數(shù)generate_training_data。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

在函數(shù)generate_training_data內(nèi)部,我們進(jìn)行以下操作:

  1. self.v_count: 詞匯表的長(zhǎng)度(注意,詞匯表指的就是語(yǔ)料庫(kù)中不重復(fù)的單詞的數(shù)量)

  2. self.words_list: 在詞匯表中的單詞組成的列表

  3. self.word_index: 以詞匯表中單詞為key,索引為value的字典數(shù)據(jù)

  4. self.index_word: 以索引為key,以詞匯表中單詞為value的字典數(shù)據(jù)

  5. for循環(huán)給用one-hot表示的每個(gè)目標(biāo)詞和其的上下文詞添加到training_data中,one-hot編碼用的是word2onehot函數(shù)。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec


4.模型訓(xùn)練

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖5,Word2Vec——skip-gram的網(wǎng)絡(luò)結(jié)構(gòu)

擁有了training_data,我們現(xiàn)在可以準(zhǔn)備訓(xùn)練模型了。訓(xùn)練從w2v.train(training_data)開(kāi)始,我們傳入訓(xùn)練數(shù)據(jù),并執(zhí)行train函數(shù)。

Word2Vec2模型有兩個(gè)權(quán)重矩陣(w1和w2),為了展示,我們把值初始化到形狀分別為(9x10)和(10x9)的矩陣。這便于反向傳播誤差的計(jì)算,這部分將在后文討論。在實(shí)際的訓(xùn)練中,你應(yīng)該隨機(jī)初始化這些權(quán)重(比如使用np.random.uniform())。想要這么做,把第九第十行注釋掉,把11和12行取消注釋就好。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec


訓(xùn)練——向前傳遞

接下來(lái),我們開(kāi)始用第一組訓(xùn)練樣本來(lái)訓(xùn)練第一個(gè)epoch,方法是把w_t 傳入forward_pass 函數(shù),w_t 是表示目標(biāo)詞的one-hot向量。在forward_pass 函數(shù)中,我們執(zhí)行一個(gè)w1 和w_t 的點(diǎn)乘積,得到h (原文是24行,但圖中實(shí)際是第22行)。然后我們執(zhí)行w2和h 點(diǎn)乘積,得到輸出層的u( 原文是26行,但圖中實(shí)際是第24行  )。最后,在返回預(yù)測(cè)向量y_pred和隱藏層h 和輸出層u 前,我們使用softmax把u 的每個(gè)元素的值映射到0和1之間來(lái)得到用來(lái)預(yù)測(cè)的概率(第28行)。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

我附上一些截圖展示第一窗口(#1)中第一個(gè)訓(xùn)練樣本的計(jì)算,其中目標(biāo)詞是“natural”,上下文單詞是“l(fā)anguage”和“processing”。可以在這里查看Google Sheet中的公式。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖6,計(jì)算隱藏層,輸出層和softmax


訓(xùn)練——誤差,反向傳播和損失(loss)

誤差——對(duì)于y_pred、h 和u,我們繼續(xù)計(jì)算這組特定的目標(biāo)詞和上下文詞的誤差。這是通過(guò)對(duì)y_pred 與在w_c 中的每個(gè)上下文詞之間的差的加合來(lái)實(shí)現(xiàn)的。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖7,計(jì)算誤差——上下文單詞是“l(fā)anguage”和“processing”

反向傳播——接下來(lái),我們使用反向傳播函數(shù)backprop ,通過(guò)傳入誤差EI 、隱藏層h 和目標(biāo)字w_t 的向量,來(lái)計(jì)算我們所需的權(quán)重調(diào)整量。

為了更新權(quán)重,我們將權(quán)重的調(diào)整量(dl_dw1 和dl_dw2 )與學(xué)習(xí)率相乘,然后從當(dāng)前權(quán)重(w1 和w2 )中減去它。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖8,反向傳播——計(jì)算W1和W2的增量


手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖9,反向傳播——調(diào)整權(quán)重以得到更新后的W1和W2


手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

損失——最后,根據(jù)損失函數(shù)計(jì)算出每個(gè)訓(xùn)練樣本完成后的總損失。注意,損失函數(shù)包括兩個(gè)部分。第一部分是輸出層(在softmax之前)中所有元素的和的負(fù)數(shù)。第二部分是上下文單詞的數(shù)量乘以在輸出層中所有元素(在 exp之后)之和的對(duì)數(shù)。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖10,Skip-gram的損失函數(shù)。

引用至:https://arxiv.org/pdf/1411.2738.pdf


5. 推論和總結(jié)(Inferencing)

既然我們已經(jīng)完成了50個(gè)epoch的訓(xùn)練,兩個(gè)權(quán)重(w1和w2)現(xiàn)在都準(zhǔn)備好執(zhí)行推論了。

獲取單詞的向量

有了一組訓(xùn)練后的權(quán)重,我們可以做的第一件事是查看詞匯表中單詞的詞向量。我們可以簡(jiǎn)單地通過(guò)查找單詞的索引來(lái)對(duì)訓(xùn)練后的權(quán)重(w1)進(jìn)行查找。在下面的示例中,我們查找單詞“machine”的向量。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

> print(w2v.word_vec("machine"))
[ 0.76702922 -0.95673743  0.49207258  0.16240808 -0.4538815  
-0.74678226  0.42072706 -0.04147312  0.08947326 -0.24245257]


查詢(xún)相似的單詞

我們可以做的另一件事就是找到類(lèi)似的單詞。即使我們的詞匯量很小,我們?nèi)匀豢梢酝ㄟ^(guò)計(jì)算單詞之間的余弦相似度來(lái)實(shí)現(xiàn)函數(shù)vec_sim 。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

> w2v.vec_sim("machine", 3)

machine 1.0
fun 0.6223490454018772
and 0.5190154215400249


6.進(jìn)一步改進(jìn)

如果你還在讀這篇文章,做得好,謝謝!但這還沒(méi)結(jié)束。正如你在上面的反向傳播步驟中可能已經(jīng)注意到的,我們需要調(diào)整訓(xùn)練樣本中沒(méi)有涉及的所有其他單詞的權(quán)重。如果詞匯量很大(例如數(shù)萬(wàn)),這個(gè)過(guò)程可能需要很長(zhǎng)時(shí)間。

為了解決這個(gè)問(wèn)題,您可以在Word2Vec中實(shí)現(xiàn)以下兩個(gè)特性,以加快速度:

  • Skip-gram Negative Sampling (SGNS)  有助于加快訓(xùn)練時(shí)間,提高最終的詞向量的質(zhì)量。這是通過(guò)訓(xùn)練網(wǎng)絡(luò)只修改一小部分的權(quán)重而不是全部的權(quán)重來(lái)實(shí)現(xiàn)?;叵胍幌律厦娴氖纠覀儗?duì)每一個(gè)詞的權(quán)重都進(jìn)行更新,若詞匯庫(kù)的尺寸很大,這可能需要很長(zhǎng)時(shí)間。對(duì)于SGNS,我們只需要更新目標(biāo)詞和少量(例如,5到20)隨機(jī)“否定”單詞的權(quán)重。

  • Hierarchical Softmax是用來(lái)替換原始softmax加速訓(xùn)練的另一個(gè)技巧。其主要思想是,不需要對(duì)所有輸出節(jié)點(diǎn)進(jìn)行評(píng)估來(lái)獲得概率分布,只需要評(píng)估它的對(duì)數(shù)個(gè)數(shù)(基為2)。使用二叉樹(shù)(Huffman編碼樹(shù))表示,其中輸出層中的節(jié)點(diǎn)表示為葉子,其節(jié)點(diǎn)由與其子節(jié)點(diǎn)的相應(yīng)的概率表示。

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

圖11,Hierarchical二叉樹(shù),被高亮的為從根到W2的路徑

除此之外,為什么不嘗試調(diào)整代碼來(lái)實(shí)現(xiàn)Continuous Bag-of-Words(Continuous Bag-of-Words,CBOW)構(gòu)架呢??


  結(jié)論

本文是對(duì)Word2Vec的介紹,并解除了單詞嵌入(word embedding)的世界。另外還值得注意的是,有預(yù)訓(xùn)練的嵌入可用,如GloVe、fastText和ELMo,你可以直接下載和使用。此外還有Word2Vec的擴(kuò)展,如Doc2Vec和最近的Code2Vec,在這倆方法中文檔和代碼被轉(zhuǎn)換成向量。

最后,我要感謝Ren Jie Tan、Raimi 和Yuxin抽出時(shí)間來(lái)閱讀和評(píng)論本文的草稿。


  參考

nathanrooy/word2vec-from-scratch-with-python
A very simple, bare-bones, inefficient, implementation of skip-gram word2vec from scratch with Python …github.com

Word2vec from Scratch with Python and NumPy
TL;DR - word2vec is awesome, it's also really simple. Learn how it works, and implement your own version. Since joining…nathanrooy.github.io

Why word2vec maximizes the cosine similarity between semantically similar words
Thanks for contributing an answer to Cross Validated! Some of your past answers have not been well-received, and you're…stats.stackexchange.com

Hierarchical softmax and negative sampling: short notes worth telling
Thanks to unexpected and very pleasant attention the audience has paid to my last (and the only) post here dedicated to…towardsdatascience.com


感謝 Ren Jie Tan 和 Raimi Bin Karim.


想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?

長(zhǎng)按鏈接點(diǎn)擊打開(kāi)或點(diǎn)擊底部【手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec】:

https://ai.yanxishe.com/page/TextTranslation/1317


AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

五個(gè)很厲害的 CNN 架構(gòu)

深度強(qiáng)化學(xué)習(xí)中的好奇心

用Pytorch做深度學(xué)習(xí)(第一部分)

手把手:用PyTorch實(shí)現(xiàn)圖像分類(lèi)器(第二部分)


等你來(lái)譯:

對(duì)混亂的數(shù)據(jù)進(jìn)行聚類(lèi) 

初學(xué)者怎樣使用Keras進(jìn)行遷移學(xué)習(xí) 

強(qiáng)化學(xué)習(xí):通往基于情感的行為系統(tǒng) 

如果你想學(xué)數(shù)據(jù)科學(xué),這 7 類(lèi)資源千萬(wàn)不能錯(cuò)過(guò)


雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知

手把手教你NumPy來(lái)實(shí)現(xiàn)Word2vec

分享:
相關(guān)文章

知情人士

AI研習(xí)社(yanxishe.com)譯站頻道,傳播前沿人工智能知識(shí),讓語(yǔ)言不再成為學(xué)習(xí)知識(shí)的門(mén)檻。(原雷鋒字幕組)
當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)