AI基础:词嵌入基础和Word2vec
0.導(dǎo)語(yǔ)
詞嵌入是自然語(yǔ)言處理(NLP)中語(yǔ)言模型與表征學(xué)習(xí)技術(shù)的統(tǒng)稱。概念上而言,它是指把一個(gè)維數(shù)為所有詞的數(shù)量的高維空間嵌入到一個(gè)維數(shù)低得多的連續(xù)向量空間中,每個(gè)單詞或詞組被映射為實(shí)數(shù)域上的向量。
在此之前,我已經(jīng)寫了以下幾篇AI基礎(chǔ)的快速入門,本篇文章講解詞嵌入基礎(chǔ)和Word2vec。
目前已經(jīng)發(fā)布:
AI 基礎(chǔ):Python 簡(jiǎn)易入門
AI 基礎(chǔ):Numpy 簡(jiǎn)易入門
AI 基礎(chǔ):Pandas 簡(jiǎn)易入門
AI 基礎(chǔ):Scipy(科學(xué)計(jì)算庫(kù)) 簡(jiǎn)易入門
AI基礎(chǔ):數(shù)據(jù)可視化簡(jiǎn)易入門(matplotlib和seaborn)
AI基礎(chǔ):特征工程-類別特征
AI基礎(chǔ):特征工程-數(shù)字特征處理
AI基礎(chǔ):特征工程-文本特征處理
后續(xù)持續(xù)更新
本文作者:
jalammar(https://jalammar.github.io)
翻譯:
黃海廣(https://github.com/fengdu78)
本文代碼可以在github下載:
https://github.com/fengdu78/Data-Science-Notes/tree/master/8.deep-learning/word2vec
圖解Word2vec
正文開(kāi)始
我發(fā)現(xiàn)嵌入的概念是機(jī)器學(xué)習(xí)中最迷人的想法之一。如果您曾經(jīng)使用Siri,Google智能助理,Alexa,谷歌翻譯,甚至智能手機(jī)鍵盤進(jìn)行下一詞預(yù)測(cè),那么您很有可能從這個(gè)已經(jīng)成為自然語(yǔ)言處理模型核心的想法中受益。在過(guò)去的幾十年中,使用嵌入技術(shù)進(jìn)行神經(jīng)模型已有相當(dāng)大的發(fā)展(最近的發(fā)展包括BERT和GPT2 等尖端模型的語(yǔ)境化嵌入)。
自2013年以來(lái),Word2vec一直是一種有效創(chuàng)建單詞嵌入的方法。除了詞嵌入字的方法之外,它的一些概念已經(jīng)被證明可以在非語(yǔ)言任務(wù)中有效地創(chuàng)建推薦引擎和理解順序數(shù)據(jù)。比如Airbnb,阿里巴巴,Spotify和Anghami這樣的公司都從NLP世界中創(chuàng)造出這一優(yōu)秀的工具并將其用于生產(chǎn)中,從而為新型推薦引擎提供支持。
我們將討論嵌入的概念,以及使用word2vec生成嵌入的機(jī)制。
讓我們從一個(gè)例子開(kāi)始,了解使用向量來(lái)表示事物。
您是否知道五個(gè)數(shù)字(向量)的列表可以代表您的個(gè)性?
個(gè)性嵌入:你的個(gè)性怎么樣?
使用0到100的范圍表示你的個(gè)性(其中0是最內(nèi)向的,100是最外向的)。
五大人格特質(zhì)測(cè)試,這些測(cè)試會(huì)問(wèn)你一個(gè)問(wèn)題列表,然后在很多方面給你打分,內(nèi)向/外向就是其中之一。
圖:測(cè)試結(jié)果示例。它可以真正告訴你很多關(guān)于你自己的事情,并且在學(xué)術(shù)、個(gè)人和職業(yè)成功方面都具有預(yù)測(cè)能力。假設(shè)我的測(cè)試得分為38/100。我們可以用這種方式繪制:
讓我們將范圍切換到從-1到1:
了解一個(gè)人,一個(gè)維度的信息不夠,所以讓我們添加另一個(gè)維度 - 測(cè)試中另一個(gè)特征的得分。
你可能不知道每個(gè)維度代表什么,但仍然可以從一個(gè)人的個(gè)性的向量表示中獲得了很多有用的信息。
我們現(xiàn)在可以說(shuō)這個(gè)向量部分代表了我的個(gè)性。當(dāng)你想要將另外兩個(gè)人與我進(jìn)行比較時(shí),這種表示的有用性就出現(xiàn)了。在下圖中,兩個(gè)人中哪一個(gè)更像我?
處理向量時(shí),計(jì)算相似度得分的常用方法是余弦相似度:
一號(hào)人物與我的余弦相似度得分高,所以我們的性格比較相似。
然而,兩個(gè)方面還不足以捕獲有關(guān)不同人群的足夠信息。幾十年的心理學(xué)研究已經(jīng)研究了五個(gè)主要特征(以及大量的子特征)。所以我們?cè)诒容^中使用所有五個(gè)維度:
我們沒(méi)法在二維上繪制出來(lái)五個(gè)維度,這是機(jī)器學(xué)習(xí)中的常見(jiàn)挑戰(zhàn),我們經(jīng)常需要在更高維度的空間中思考。但好處是余弦相似度仍然有效。它適用于任意數(shù)量的維度:
嵌入的兩個(gè)中心思想:
我們可以將人(事物)表示為數(shù)字的向量。
我們可以很容易地計(jì)算出相似的向量彼此之間的關(guān)系。
詞嵌入
我們導(dǎo)入在維基百科上訓(xùn)練的GloVe向量
import gensim import gensim.downloader as api model = api.load('glove-wiki-gigaword-50') 單詞“king”的詞嵌入表示: model["king"] array([ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 ,-0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 ,-0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 ,-0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 ,0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 ,1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 ,0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 ,-1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 ,-0.64426 , -0.51042 ], dtype=float32)查看“king”最相似的單詞
model.most_similar("king") [('prince', 0.8236179351806641),('queen', 0.7839042544364929),('ii', 0.7746230363845825),('emperor', 0.7736247181892395),('son', 0.766719400882721),('uncle', 0.7627150416374207),('kingdom', 0.7542160749435425),('throne', 0.7539913654327393),('brother', 0.7492411136627197),('ruler', 0.7434253096580505)]這是一個(gè)包含50個(gè)數(shù)字的列表,我們無(wú)法說(shuō)清楚里面的值代表什么。我們把所有這些數(shù)字放在一行,以便我們可以比較其他單詞向量。讓我們根據(jù)它們的值對(duì)單元格進(jìn)行顏色編碼(如果它們接近2則為紅色,如果它們接近0則為白色,如果它們接近-2則為藍(lán)色)
import seaborn as sns import matplotlib.pyplot as plt import numpy as npplt.figure(figsize=(15, 1)) sns.heatmap([model["king"]],xticklabels=False,yticklabels=False,cbar=False,vmin=-2,vmax=2,linewidths=0.7) plt.show()我們將忽略數(shù)字并僅查看顏色以指示單元格的值,我們將“King”與其他詞語(yǔ)進(jìn)行對(duì)比:
plt.figure(figsize=(15, 4)) sns.heatmap([model["king"],model["man"],model["woman"],model["king"] - model["man"] + model["woman"],model["queen"], ],cbar=True,xticklabels=False,yticklabels=False,linewidths=1) plt.show()看看“man”和“woman”是如何彼此更相似的,他們中的任何一個(gè)都是“king”?這告訴你一些事情。這些向量表示捕獲了這些單詞的信息/含義/關(guān)聯(lián)。
這是另一個(gè)示例列表(通過(guò)垂直掃描列來(lái)查找具有相似顏色的列):
有幾點(diǎn)需要指出:
所有這些不同的單詞都有一個(gè)直的紅色列。它們?cè)谶@個(gè)維度上是相似的(我們不知道每個(gè)維度代碼是什么)
你可以看到“woman”和“girl”在很多地方是如何相似的。與“man”和“boy”一樣
“boy”和“girl”也有彼此相似的地方,但與“woman”或“man”不同。這些是否可以編寫一個(gè)模糊的青年概念?可能。
除了最后一個(gè)字之外的所有字都代表著人。我添加了一個(gè)對(duì)象“water”來(lái)顯示類別之間的差異。例如,您可以看到藍(lán)色列一直向下并在嵌入“water”之前停止。
有一個(gè)明顯的地方,“king”和“queen”彼此相似,并與所有其他人不同。
類比
我們可以添加和減去單詞嵌入并獲得有趣的結(jié)果,最有名的例子是公式:“king” - “man” + “woman”:
model.most_similar(positive=["king","woman"],negative=["man"]) [('queen', 0.8523603677749634),('throne', 0.7664334177970886),('prince', 0.759214460849762),('daughter', 0.7473883032798767),('elizabeth', 0.7460220456123352),('princess', 0.7424569725990295),('kingdom', 0.7337411642074585),('monarch', 0.7214490175247192),('eldest', 0.7184861898422241),('widow', 0.7099430561065674)]我們可以像以前一樣想象這個(gè)類比:
語(yǔ)言建模
如果想要給出NLP應(yīng)用程序的示例,最好的示例之一將是智能手機(jī)鍵盤的下一個(gè)字(詞)預(yù)測(cè)功能。這是數(shù)十億人每天使用數(shù)百次的功能。
下一個(gè)字(詞)預(yù)測(cè)是一項(xiàng)可以通過(guò)語(yǔ)言模型解決的任務(wù)。語(yǔ)言模型可以采用單詞列表(比方說(shuō)兩個(gè)單詞),并嘗試預(yù)測(cè)它們之后的單詞。
在上面的屏幕截圖中,我們可以將模型視為接受這兩個(gè)綠色單詞(thou shalt)并返回建議列表(“not”是具有最高概率的那個(gè)字)的模型:
我們可以把模型想象成這個(gè)黑盒子:
但實(shí)際上,該模型不會(huì)只輸出一個(gè)單詞。它實(shí)際上輸出了它所知道的所有單詞的概率分?jǐn)?shù)(模型的“詞匯表”,其范圍可以從幾千到一百多萬(wàn)個(gè)字(詞))。然后應(yīng)用程序必須找到分?jǐn)?shù)最高的單詞,并將其呈現(xiàn)給用戶。
圖:神經(jīng)語(yǔ)言模型的輸出是模型知道的所有單詞的概率分?jǐn)?shù)。我們?cè)谶@里將概率稱為百分比,比如概率40%將在輸出向量中表示為0.4。
經(jīng)過(guò)訓(xùn)練,早期的神經(jīng)語(yǔ)言模型(Bengio 2003)將分三步計(jì)算預(yù)測(cè):
在討論嵌入時(shí),第一步對(duì)我們來(lái)說(shuō)最相關(guān)。訓(xùn)練過(guò)程的結(jié)果之一是這個(gè)矩陣包含我們?cè)~匯表中每個(gè)單詞的嵌入。在預(yù)測(cè)時(shí)間內(nèi),我們只查找輸入字的嵌入,并使用它們來(lái)計(jì)算預(yù)測(cè):
現(xiàn)在讓我們轉(zhuǎn)到訓(xùn)練過(guò)程,以了解嵌入矩陣是如何工作的。
語(yǔ)言模型的訓(xùn)練
與大多數(shù)其他機(jī)器學(xué)習(xí)模型相比,語(yǔ)言模型具有巨大優(yōu)勢(shì)。即:我們所有的書籍,文章,維基百科內(nèi)容和其他形式的大量文本數(shù)據(jù)可以作為訓(xùn)練數(shù)據(jù)。與此相比,許多其他機(jī)器學(xué)習(xí)模型需要手動(dòng)設(shè)計(jì)特征和專門收集的數(shù)據(jù)。
單詞通過(guò)我們查看它們往往會(huì)出現(xiàn)在旁邊的其他單詞來(lái)嵌入。其機(jī)制就是這樣
我們獲得了大量文本數(shù)據(jù)(例如,所有維基百科文章)。然后
我們有一個(gè)窗口(比如說(shuō)三個(gè)單詞),我們會(huì)對(duì)所有文本進(jìn)行滑動(dòng)。
滑動(dòng)窗口為我們的模型生成訓(xùn)練樣本
當(dāng)這個(gè)窗口滑動(dòng)文本時(shí),我們(虛擬地)生成一個(gè)用于訓(xùn)練模型的數(shù)據(jù)集。為了準(zhǔn)確看看它是如何完成的,讓我們看看滑動(dòng)窗口如何處理這個(gè)短語(yǔ):
當(dāng)我們開(kāi)始時(shí),窗口在句子的前三個(gè)單詞上:
我們將前兩個(gè)單詞作為特征,將第三個(gè)單詞作為標(biāo)簽:
我們現(xiàn)在已經(jīng)在數(shù)據(jù)集中生成了第一個(gè)樣本,我們稍后可以使用它來(lái)訓(xùn)練語(yǔ)言模型。
然后我們將窗口滑動(dòng)到下一個(gè)位置并創(chuàng)建第二個(gè)樣本:
現(xiàn)在生成第二個(gè)示例。
很快我們就會(huì)有一個(gè)更大的數(shù)據(jù)集,在不同的單詞對(duì)之后,這些數(shù)據(jù)集會(huì)出現(xiàn):
在實(shí)踐中,模型往往在我們滑動(dòng)窗口時(shí)進(jìn)行訓(xùn)練。但我發(fā)現(xiàn)邏輯上將“數(shù)據(jù)集生成”階段與訓(xùn)練階段分開(kāi)是更清楚的。除了基于神經(jīng)網(wǎng)絡(luò)的語(yǔ)言建模方法之外,一種稱為N-gram的技術(shù)通常用于訓(xùn)練語(yǔ)言模型。
要了解這種從N-gram到神經(jīng)模型的轉(zhuǎn)換如何反映現(xiàn)實(shí)世界的產(chǎn)品,建議看這篇2015年博客文章,介紹他們的神經(jīng)語(yǔ)言模型并將其與之前的N-gram模型進(jìn)行比較。
兩邊看
給了你句子前面的內(nèi)容,進(jìn)行填空:
我在這里給你的背景是空格之前的五個(gè)字(以及之前提到的“bus”)。我相信大多數(shù)人都會(huì)猜到空格里的這個(gè)詞會(huì)是“bus”。但是,如果我再給你一條信息:空格之后的一句話,那會(huì)改變你的答案嗎?
這完全改變了應(yīng)該留在空格中的內(nèi)容。“red”這個(gè)詞現(xiàn)在最可能填到空格中。我們從中學(xué)到的是特定詞語(yǔ)之前和之后的詞語(yǔ)都具有信息價(jià)值。事實(shí)證明,考慮兩個(gè)方向(我們猜測(cè)的單詞左側(cè)和右側(cè)的單詞)會(huì)讓詞嵌入做得更好。
讓我們看看我們?nèi)绾握{(diào)整我們訓(xùn)練模型的方式來(lái)解決這個(gè)問(wèn)題。
Skipgram
我們不僅可以查看在目標(biāo)詞之前的兩個(gè)單詞,還可以查看其后的兩個(gè)單詞。
如果我們這樣做,我們實(shí)際構(gòu)建和訓(xùn)練模型的數(shù)據(jù)集將如下所示:
這被稱為連續(xù)詞袋結(jié)構(gòu),并在word2vec論文 one of the word2vec papers 中進(jìn)行過(guò)描述。
另一種結(jié)構(gòu)與連續(xù)詞袋結(jié)構(gòu)略有不同,但也可以也顯示出良好結(jié)果。這個(gè)結(jié)構(gòu)試圖使用當(dāng)前詞來(lái)猜測(cè)相鄰詞,而不是根據(jù)其上下文(它之前和之后的詞)猜測(cè)一個(gè)詞。我們可以想到它在訓(xùn)練文本上滑動(dòng)的窗口如下所示:
圖:綠色框中的字將是輸入字,每個(gè)粉色框?qū)⑹强赡艿妮敵觥7凵蚓哂胁煌年幱?#xff0c;因?yàn)榇嘶瑒?dòng)窗口實(shí)際上在我們的訓(xùn)練數(shù)據(jù)集中創(chuàng)建了四個(gè)單獨(dú)的樣本:此方法稱為skipgram架構(gòu)。我們可以執(zhí)行以下操作將滑動(dòng)窗口可視化:
這會(huì)將這四個(gè)樣本添加到我們的訓(xùn)練數(shù)據(jù)集中:
然后我們將窗口滑動(dòng)到下一個(gè)位置:
這將產(chǎn)生我們的下四個(gè)樣本:
接著滑動(dòng)幾個(gè)位置之后,我們有更多的樣本:
重新審視訓(xùn)練過(guò)程
現(xiàn)在我們已經(jīng)從現(xiàn)有的運(yùn)行文本中提取了我們的skipgram訓(xùn)練數(shù)據(jù)集,讓我們看看我們?nèi)绾问褂盟鼇?lái)訓(xùn)練預(yù)測(cè)相鄰單詞的基本神經(jīng)語(yǔ)言模型。
我們從數(shù)據(jù)集中的第一個(gè)樣本開(kāi)始。我們把特征提供給未經(jīng)訓(xùn)練的模型,要求它預(yù)測(cè)一個(gè)合適的相鄰單詞。
該模型進(jìn)行三個(gè)步驟并輸出預(yù)測(cè)向量(概率分配給其詞匯表中的每個(gè)單詞)。由于該模型未經(jīng)過(guò)訓(xùn)練,因此在此階段的預(yù)測(cè)肯定是錯(cuò)誤的。但那沒(méi)關(guān)系。我們知道應(yīng)該它將猜到哪個(gè)詞:我們目前用于訓(xùn)練模型的行中的標(biāo)簽/輸出單元格:
圖:“目標(biāo)向量”的詞(字)概率為1,其他詞(字)的概率都是0。我們減去兩個(gè)向量,得到一個(gè)誤差向量:現(xiàn)在可以使用此誤差向量來(lái)更新模型,以便下次當(dāng)“not”作為輸入時(shí),模型更有可能猜測(cè)“thou”。
這就是訓(xùn)練的第一步。我們繼續(xù)使用數(shù)據(jù)集中的下一個(gè)樣本進(jìn)行相同的處理,然后是下一個(gè)樣本,直到我們覆蓋了數(shù)據(jù)集中的所有樣本。這就結(jié)束了一個(gè)epcho的訓(xùn)練。我們繼續(xù)訓(xùn)練多個(gè)epcho,然后我們就有了訓(xùn)練好的模型,我們可以從中提取嵌入矩陣并將其用于任何其他應(yīng)用。
雖然這加深了我們對(duì)該過(guò)程的理解,但仍然不是word2vec實(shí)際上的訓(xùn)練過(guò)程。
負(fù)采樣
回想一下這個(gè)神經(jīng)語(yǔ)言模型如何計(jì)算其預(yù)測(cè)的三個(gè)步驟:
從計(jì)算的角度來(lái)看,第三步非常消耗資源:尤其是我們將在數(shù)據(jù)集中為每個(gè)訓(xùn)練樣本做一次(很可能數(shù)千萬(wàn)次)。我們需要做一些事情來(lái)提高效率。
一種方法是將目標(biāo)分成兩個(gè)步驟:
生成高質(zhì)量的單詞嵌入(不要擔(dān)心下一個(gè)單詞預(yù)測(cè))。
使用這些高質(zhì)量的嵌入來(lái)訓(xùn)練語(yǔ)言模型(進(jìn)行下一個(gè)單詞預(yù)測(cè))。
我們將專注于第1步,因?yàn)槲覀儗W⒂谇度搿R褂酶咝阅苣P蜕筛哔|(zhì)量嵌入,我們可以從預(yù)測(cè)相鄰單詞切換模型的任務(wù):
并將其切換到一個(gè)取輸入和輸出字的模型,并輸出一個(gè)分?jǐn)?shù),表明它們是否是鄰居(0表示“不是鄰居”,1表示“鄰居”)。
這個(gè)簡(jiǎn)單的改變,將我們需要的模型從神經(jīng)網(wǎng)絡(luò)改為邏輯回歸模型:因此它變得更簡(jiǎn)單,計(jì)算速度更快。
這個(gè)改變要求我們切換數(shù)據(jù)集的結(jié)構(gòu) - 標(biāo)簽現(xiàn)在是一個(gè)值為0或1的新列。它們將全部為1,因?yàn)槲覀兲砑拥乃袉卧~都是鄰居。
現(xiàn)在可以以極快的速度計(jì)算 - 在幾分鐘內(nèi)處理數(shù)百萬(wàn)個(gè)示例。但是我們需要關(guān)閉一個(gè)漏洞。如果我們所有的例子都是正面的(目標(biāo):1),我們打開(kāi)自己的智能模型的可能性總是返回1 - 達(dá)到100%的準(zhǔn)確性,但什么都不學(xué)習(xí)并生成垃圾嵌入。
為了解決這個(gè)問(wèn)題,我們需要在數(shù)據(jù)集中引入負(fù)樣本 - 不是鄰居的單詞樣本。我們的模型需要為這些樣本返回0。現(xiàn)在這是一個(gè)挑戰(zhàn),模型必須努力解決,而且速度還要快。
圖:對(duì)于我們數(shù)據(jù)集中的每個(gè)樣本,我們添加了負(fù)樣本。它們具有相同的輸入詞和0標(biāo)簽。但是我們填寫什么作為輸出詞?我們從詞匯表中隨機(jī)抽取單詞這個(gè)想法的靈感來(lái)自Noise-contrastive estimation。我們將實(shí)際信號(hào)(相鄰單詞的正例)與噪聲(隨機(jī)選擇的不是鄰居的單詞)進(jìn)行對(duì)比。這是計(jì)算量和統(tǒng)計(jì)效率的巨大折衷。
帶負(fù)采樣的skipgram(SGNS)
我們現(xiàn)在已經(jīng)介紹了word2vec中的兩個(gè)核心思想:
skipgram和負(fù)采樣。
Word2vec訓(xùn)練流程
現(xiàn)在我們已經(jīng)建立了skipgram和負(fù)采樣的兩個(gè)中心思想,我們可以繼續(xù)仔細(xì)研究實(shí)際的word2vec訓(xùn)練過(guò)程。
在訓(xùn)練過(guò)程開(kāi)始之前,我們預(yù)先處理我們正在訓(xùn)練模型的文本。在這一步中,我們確定詞匯量的大小(我們稱之為vocab_size,比如說(shuō),將其視為10,000)以及哪些詞屬于它。在訓(xùn)練階段的開(kāi)始,我們創(chuàng)建兩個(gè)矩陣 - Embedding矩陣和Context矩陣。這兩個(gè)矩陣在我們的詞匯表中嵌入了每個(gè)單詞(這vocab_size是他們的維度之一)。第二個(gè)維度是我們希望每次嵌入的時(shí)間長(zhǎng)度(embedding_size- 300是一個(gè)常見(jiàn)值,但我們?cè)诒疚那懊娴睦邮?0。)。
在訓(xùn)練過(guò)程開(kāi)始時(shí),我們用隨機(jī)值初始化這些矩陣。然后我們開(kāi)始訓(xùn)練過(guò)程。在每個(gè)訓(xùn)練步驟中,我們采取一個(gè)正樣本及其相關(guān)的負(fù)樣本。我們來(lái)看看我們的第一組:
現(xiàn)在我們有四個(gè)單詞:輸入單詞not和輸出/上下文單詞:( thou實(shí)際鄰居),aaron,和taco(負(fù)樣本)。我們繼續(xù)查找它們的嵌入 - 對(duì)于輸入詞,我們查看Embedding矩陣。對(duì)于上下文單詞,我們查看Context矩陣(即使兩個(gè)矩陣都在我們的詞匯表中嵌入了每個(gè)單詞)。
然后,我們計(jì)算輸入嵌入與每個(gè)上下文嵌入的點(diǎn)積。。在每種情況下,會(huì)產(chǎn)生一個(gè)數(shù)字,該數(shù)字表示輸入和上下文嵌入的相似性。
現(xiàn)在我們需要一種方法將這些分?jǐn)?shù)轉(zhuǎn)化為看起來(lái)像概率的東西 :使用sigmoid函數(shù)把概率轉(zhuǎn)換為0和1。
現(xiàn)在我們可以將sigmoid操作的輸出視為這些樣本的模型輸出。您可以看到taco得分最高aaron,并且在sigmoid操作之前和之后仍然具有最低分。既然未經(jīng)訓(xùn)練的模型已做出預(yù)測(cè),并且看到我們有一個(gè)實(shí)際的目標(biāo)標(biāo)簽要比較,那么讓我們計(jì)算模型預(yù)測(cè)中的誤差。為此,我們只從目標(biāo)標(biāo)簽中減去sigmoid分?jǐn)?shù)。
圖:這是“機(jī)器學(xué)習(xí)”的“學(xué)習(xí)”部分。現(xiàn)在,我們可以利用這個(gè)錯(cuò)誤分?jǐn)?shù)調(diào)整`not`,`thou`,`aaron`和`taco`的嵌入,使下一次我們做出這一計(jì)算,結(jié)果會(huì)更接近目標(biāo)分?jǐn)?shù)。?訓(xùn)練步驟到此結(jié)束。我們從這一步驟中得到稍微好一點(diǎn)的嵌入(`not`,`thou`,`aaron`和`taco`)。我們現(xiàn)在進(jìn)行下一步(下一個(gè)正樣本及其相關(guān)的負(fù)樣本),并再次執(zhí)行相同的過(guò)程。?
當(dāng)我們循環(huán)遍歷整個(gè)數(shù)據(jù)集多次時(shí),嵌入繼續(xù)得到改進(jìn)。然后我們可以停止訓(xùn)練過(guò)程,丟棄`Context`矩陣,并使用`Embeddings`矩陣作為下一個(gè)任務(wù)的預(yù)訓(xùn)練嵌入。
窗口大小和負(fù)樣本數(shù)量
word2vec訓(xùn)練過(guò)程中的兩個(gè)關(guān)鍵超參數(shù)是窗口大小和負(fù)樣本的數(shù)量。
不同的窗口大小可以更好地提供不同的任務(wù)。
一種啟發(fā)式方法是較小的窗口嵌入(2-15),其中兩個(gè)嵌入之間的高相似性得分表明這些單詞是可互換的(注意,如果我們只查看周圍的單詞,反義詞通常可以互換 - 例如,好的和壞的經(jīng)常出現(xiàn)在類似的情境中)。
使用較大的窗口嵌入(15-50,甚至更多)會(huì)得到相似性更能指示單詞相關(guān)性的嵌入。實(shí)際上,您通常需要對(duì)嵌入過(guò)程提供注釋指導(dǎo),為您的任務(wù)帶來(lái)有用的相似感。
Gensim默認(rèn)窗口大小為5(輸入字本身加上輸入字之前的兩個(gè)字和輸入字之后的兩個(gè)字)。
負(fù)樣本的數(shù)量是訓(xùn)練過(guò)程的另一個(gè)因素。原始論文里負(fù)樣本數(shù)量為5-20。它還指出,當(dāng)你擁有足夠大的數(shù)據(jù)集時(shí),2-5似乎已經(jīng)足夠了。Gensim默認(rèn)為5個(gè)負(fù)樣本。
結(jié)論
我希望你現(xiàn)在對(duì)詞嵌入和word2vec算法有所了解。我也希望現(xiàn)在當(dāng)你讀到一篇提到“skip gram with negative sampling”(SGNS)的論文時(shí),你會(huì)對(duì)這些概念有了更好的認(rèn)識(shí)。
本文作者:jalammar(https://twitter.com/jalammar)。
參考文獻(xiàn)和進(jìn)一步閱讀材料
Distributed Representations of Words and Phrases and their Compositionality?[pdf]
Efficient Estimation of Word Representations in Vector Space?[pdf]
A Neural Probabilistic Language Model?[pdf]
Speech and Language Processing?by Dan Jurafsky and James H. Martin is a leading resource for NLP. Word2vec is tackled in Chapter 6.
Neural Network Methods in Natural Language Processing?by?Yoav Goldberg?is a great read for neural NLP topics.
Chris McCormick?has written some great blog posts about Word2vec. He also just released?The Inner Workings of word2vec, an E-book focused on the internals of word2vec.
Want to read the code? Here are two options:
Gensim’s?python implementation?of word2vec
Mikolov’s original?implementation in C?– better yet, this?version with detailed comments?from Chris McCormick.
Evaluating distributional models of compositional semantics
On word embeddings,?part 2
Dune
總結(jié)
以上是生活随笔為你收集整理的AI基础:词嵌入基础和Word2vec的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从Excel到Python:最常用的36
- 下一篇: AI基础:一文看懂BERT