日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

机器学习算法(十三):word2vec

發(fā)布時(shí)間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习算法(十三):word2vec 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1 單詞表達(dá)?

1.1?Word embedding

1.2 獨(dú)熱(One hot representation)

1.2.1 獨(dú)熱編碼介紹

1.2.2?優(yōu)缺點(diǎn)分析

1.3?Dristributed representation

1.4?共現(xiàn)矩陣 (Cocurrence matrix)

3?word2vec

3.1 word2vec介紹

3.2?CBOW模型

3.2.1?Simple CBOW Model

?3.2.2?CBOW Multi-Word Context Model

?3.2.3?訓(xùn)練連續(xù)詞袋模型

3.3?Skip-gram 模型

3.3.1?Skip-gram 模型介紹

3.3.2?訓(xùn)練跳字模型

3.4?使用gensim進(jìn)行訓(xùn)練

3.5?tricks1:hierarchical softmax (CBOW)

3.5.1?Huffman Tree(哈夫曼樹(shù))

3.5.2 預(yù)備知識(shí)

3.5.3?word2vec的hierarchical softmax結(jié)構(gòu)

3.5.4 目標(biāo)函數(shù)

3.5.5?參數(shù)更新

3.5.5?偽代碼

3.6 tricks1:hierarchical softmax (Skip-gram)

3.6.1?Skip-gram模型網(wǎng)絡(luò)結(jié)構(gòu)

3.6.2?Skip-gram的目標(biāo)函數(shù)

3.6.3?參數(shù)更新

3.6.4 偽代碼

3.7 tricks2:negative sampling?(CBOW)

3.8 tricks2:negative sampling?(Skip-gram)

3.9 關(guān)于Word2Vec若干問(wèn)題的思考

3.10 python實(shí)現(xiàn)(gensim)


1 單詞表達(dá)?

1.1?Word embedding

? ? ? ? Embedding是數(shù)學(xué)領(lǐng)域的有名詞,是指某個(gè)對(duì)象 X 被嵌入到另外一個(gè)對(duì)象 Y 中,映射 f : X → Y ,例如有理數(shù)嵌入實(shí)數(shù)。

? ? ? ? Word embedding 是NLP中一組語(yǔ)言模型(language modeling)和特征學(xué)習(xí)技術(shù)(feature learning techniques)的總稱(chēng),這些技術(shù)會(huì)把詞匯表中的單詞或者短語(yǔ)(words or phrases)映射成由實(shí)數(shù)構(gòu)成的向量上。?

? ? ? ? Word embedding就是要從數(shù)據(jù)中自動(dòng)學(xué)習(xí)?輸入空間到Distributed representation空間的映射f?。

? ? ? ? 最簡(jiǎn)單的一種Word Embedding方法,就是基于詞袋(BOW)One-Hot表示,還有另外一個(gè)方法:共現(xiàn)矩陣 (Cocurrence matrix)。

1.2 獨(dú)熱(One hot representation)

1.2.1 獨(dú)熱編碼介紹

? ? ? ? 獨(dú)熱編碼即 One-Hot 編碼,又稱(chēng)一位有效編碼,其方法是使用N位狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有它獨(dú)立的寄存器位,并且在任意時(shí)候,其中只有一位有效。舉個(gè)例子,假設(shè)我們有四個(gè)樣本(行),每個(gè)樣本有三個(gè)特征(列),如圖:

? ? ? ? 我們的feature_1有兩種可能的取值,比如是男/女,這里男用1表示,女用2表示。feature_2 和feature_3各有4種取值(狀態(tài))。one-hot編碼就是保證每個(gè)樣本中的單個(gè)特征只有1位處于狀態(tài)1,其他的都是0。上述狀態(tài)用one-hot編碼如下圖所示:

考慮一下三個(gè)特征:

  • ["male", "female"]
  • ["from Europe", "from US", "from Asia"]
  • ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]

將它換成獨(dú)熱編碼后,應(yīng)該是:

  • feature1=[01,10]
  • feature2=[001,010,100]
  • feature3=[0001,0010,0100,1000]

1.2.2?優(yōu)缺點(diǎn)分析

  • 優(yōu)點(diǎn):一是解決了分類(lèi)器不好處理離散數(shù)據(jù)的問(wèn)題,二是在一定程度上也起到了擴(kuò)充特征的作用。
  • 缺點(diǎn):在文本特征表示上有些缺點(diǎn)就非常突出了。首先,它是一個(gè)詞袋模型,不考慮詞與詞之間的順序(文本中詞的順序信息也是很重要的);其次,它假設(shè)詞與詞相互獨(dú)立(在大多數(shù)情況下,詞與詞是相互影響的);最后,它得到的特征是離散稀疏的。

? ? ? ? 為什么得到的特征是離散稀疏的?

? ? ? ?上面舉例比較簡(jiǎn)單,但現(xiàn)實(shí)情況可能不太一樣。比如如果將世界所有城市名稱(chēng)作為語(yǔ)料庫(kù)的話(huà),那這個(gè)向量會(huì)過(guò)于稀疏,并且會(huì)造成維度災(zāi)難。

  • 杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
  • 上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
  • 寧波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
  • 北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

? ? ? ? 在語(yǔ)料庫(kù)中,杭州、上海、寧波、北京各對(duì)應(yīng)一個(gè)向量,向量中只有一個(gè)值為1,其余都為0。

? ? ? ? 能不能把詞向量的維度變小呢?

? ? ? ? Dristributed representation(詞向量)可以解決One hot representation的問(wèn)題。

1.3?Dristributed representation(詞向量)

? ? ? ? 然而每個(gè)單詞彼此無(wú)關(guān)這個(gè)特點(diǎn)明顯不符合我們的現(xiàn)實(shí)情況。我們知道大量的單詞都是有關(guān)。

  • 語(yǔ)義:girl和woman雖然用在不同年齡上,但指的都是女性。
  • 復(fù)數(shù):word和words僅僅是復(fù)數(shù)和單數(shù)的差別。
  • 時(shí)態(tài):buy和bought表達(dá)的都是“買(mǎi)”,但發(fā)生的時(shí)間不同。

? ? ? ? 所以用one hot representation的編碼方式,上面的特性都沒(méi)有被考慮到。

? ? ? ? 我們更希望用諸如“語(yǔ)義”,“復(fù)數(shù)”,“時(shí)態(tài)”等維度去描述一個(gè)單詞。每一個(gè)維度不再是0或1,而是連續(xù)的實(shí)數(shù),表示不同的程度。

? ? ? ? Dristributed representation可以解決One hot representation的問(wèn)題,它的思路是通過(guò)訓(xùn)練,將每個(gè)詞都映射到一個(gè)較短的詞向量上來(lái)。所有的這些詞向量就構(gòu)成了向量空間,進(jìn)而可以用普通的統(tǒng)計(jì)學(xué)的方法來(lái)研究詞與詞之間的關(guān)系。這個(gè)較短的詞向量維度是多大呢?這個(gè)一般需要我們?cè)谟?xùn)練時(shí)自己來(lái)指定。

? ? ? ? 比如下圖我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個(gè)維度來(lái)表示,King這個(gè)詞對(duì)應(yīng)的詞向量可能是(0.99,0.99,0.05,0.7)。當(dāng)然在實(shí)際情況中,我們并不能對(duì)詞向量的每個(gè)維度做一個(gè)很好的解釋。

? ? ? ? 我們將king這個(gè)詞從一個(gè)可能非常稀疏的向量所在的空間,映射到現(xiàn)在這個(gè)四維向量所在的空間,必須滿(mǎn)足以下性質(zhì):

(1)這個(gè)映射是單射(單射:任給x1和x2屬于X,若x1≠x2,則f(x1)≠f(x2),稱(chēng)f為單射);
(2)映射之后的向量不會(huì)丟失之前的那種向量所含的信息。

? ? ? ? 這個(gè)過(guò)程稱(chēng)為word embedding(詞嵌入),即將高維詞向量嵌入到一個(gè)低維空間。如圖

? ? ? ? 經(jīng)過(guò)我們一系列的降維神操作,有了用Dristributed representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關(guān)系了,比如我們將詞的維度降維到2維,有一個(gè)有趣的研究表明,用下圖的詞向量表示我們的詞時(shí),我們可以發(fā)現(xiàn):

? ? ? ? 出現(xiàn)這種現(xiàn)象的原因是,我們得到最后的詞向量的訓(xùn)練過(guò)程中引入了詞的上下文。

? ? ? ? You shall know a word by the company it keeps.

? ? ? ? 舉個(gè)例子:

? ? ? ? 你想到得到"learning"的詞向量,但訓(xùn)練過(guò)程中,你同時(shí)考慮了它左右的上下文,那么就可以使"learning"帶有語(yǔ)義信息了。通過(guò)這種操作,我們可以得到近義詞,甚至cat和它的復(fù)數(shù)cats的向量極其相近。

1.4?共現(xiàn)矩陣 (Cocurrence matrix)

? ? ? ? ?一個(gè)非常重要的思想是,我們認(rèn)為某個(gè)詞的意思跟它臨近的單詞是緊密相關(guān)的。這時(shí)我們可以設(shè)定一個(gè)窗口(大小一般是5~10),如下窗口大小是2,那么在這個(gè)窗口內(nèi),與rests 共同出現(xiàn)的單詞就有l(wèi)ife、he、in、peace。然后我們就利用這種共現(xiàn)關(guān)系來(lái)生成詞向量。

? ? ? ??

? ? ? ? 例如,現(xiàn)在我們的語(yǔ)料庫(kù)包括下面三份文檔資料:

? ? ? ? I like deep learning.?

? ? ? ? I like NLP.?

? ? ? ? I enjoy flying.

? ? ? ? ?作為示例,我們?cè)O(shè)定的窗口大小為1,也就是只看某個(gè)單詞周?chē)o鄰著的那個(gè)單詞。此時(shí),將得到一個(gè)對(duì)稱(chēng)矩陣——共現(xiàn)矩陣。因?yàn)樵谖覀兊恼Z(yǔ)料庫(kù)中,I 和 like做為鄰居同時(shí)出現(xiàn)在窗口中的次數(shù)是2,所以下表中I 和like相交的位置其值就是2。這樣我們也實(shí)現(xiàn)了將word變成向量的設(shè)想,在共現(xiàn)矩陣每一行(或每一列)都是對(duì)應(yīng)單詞的一個(gè)向量表示。

? ? ? ? 雖然Cocurrence matrix一定程度上解決了單詞間相對(duì)位置也應(yīng)予以重視這個(gè)問(wèn)題。但是它仍然面對(duì)維度災(zāi)難。也即是說(shuō)一個(gè)word的向量表示長(zhǎng)度太長(zhǎng)了。這時(shí),很自然地會(huì)想到SVD或者PCA等一些常用的降維方法。當(dāng)然,這也會(huì)帶來(lái)其他的一些問(wèn)題,例如,我們的詞匯表中有新詞加入,那么就很難為他分配一個(gè)新的向量。

3?word2vec

3.1 word2vec介紹

? ? ? ? word2vec模型其實(shí)就是簡(jiǎn)單化的神經(jīng)網(wǎng)絡(luò)。word2vec是用一個(gè)一層的神經(jīng)網(wǎng)絡(luò)(即CBOW)把one-hot形式的稀疏詞向量映射稱(chēng)為一個(gè)n維(n一般為幾百)的稠密向量的過(guò)程。為了加快模型訓(xùn)練速度,其中的tricks包括Hierarchical softmaxnegative samplingHuffman Tree等。

? ? ? ? 在NLP中,最細(xì)粒度的對(duì)象是詞語(yǔ)。如果我們要進(jìn)行詞性標(biāo)注,用一般的思路,我們可以有一系列的樣本數(shù)據(jù)(x,y)。其中x表示詞語(yǔ),y表示詞性。而我們要做的,就是找到一個(gè)x -> y的映射關(guān)系,傳統(tǒng)的方法包括BayesSVM等算法。但是我們的數(shù)學(xué)模型,一般都是數(shù)值型的輸入。但是NLP中的詞語(yǔ),是人類(lèi)的抽象總結(jié),是符號(hào)形式的(比如中文、英文、拉丁文等等),所以需要把他們轉(zhuǎn)換成數(shù)值形式,或者說(shuō)——嵌入到一個(gè)數(shù)學(xué)空間里,這種嵌入方式,就叫詞嵌入(word embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。

? ? ? ? 輸入是One-Hot VectorHidden Layer沒(méi)有激活函數(shù),也就是線(xiàn)性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。當(dāng)這個(gè)模型訓(xùn)練好以后,我們并不會(huì)用這個(gè)訓(xùn)練好的模型處理新的任務(wù),我們真正需要的是這個(gè)模型通過(guò)訓(xùn)練數(shù)據(jù)所學(xué)得的參數(shù),例如隱層的權(quán)重矩陣

? ? ? ? 這個(gè)模型是如何定義數(shù)據(jù)的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words)Skip-Gram兩種模型。

  • CBOW模型訓(xùn)練輸入是某一個(gè)特征詞的上下文相關(guān)的詞對(duì)應(yīng)的詞向量,而輸出就是這特定的一個(gè)詞的詞向量。 
  • Skip-Gram模型CBOW的思路是反著來(lái)的,即輸入是特定的一個(gè)詞的詞向量,而輸出是特定詞對(duì)應(yīng)的上下文詞向量。

? ? ? ? CBOW對(duì)小型數(shù)據(jù)庫(kù)比較合適,而Skip-Gram大型語(yǔ)料中表現(xiàn)更好。

? ? ? ? Word2Vec模型實(shí)際上分為了兩個(gè)部分,第一部分為建立模型,第二部分是通過(guò)模型獲取嵌入詞向量。Word2Vec的整個(gè)建模過(guò)程實(shí)際上與自編碼器(auto-encoder)的思想很相似,即先基于訓(xùn)練數(shù)據(jù)構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò),當(dāng)這個(gè)模型訓(xùn)練好以后,我們并不會(huì)用這個(gè)訓(xùn)練好的模型處理新的任務(wù),我們真正需要的是這個(gè)模型通過(guò)訓(xùn)練數(shù)據(jù)所學(xué)得的參數(shù),例如隱層的權(quán)重矩陣——后面我們將會(huì)看到這些權(quán)重在Word2Vec中實(shí)際上就是我們?cè)噲D去學(xué)習(xí)的“word vectors”。基于訓(xùn)練數(shù)據(jù)建模的過(guò)程,我們給它一個(gè)名字叫“Fake Task”,意味著建模并不是我們最終的目的。

上面提到的這種方法實(shí)際上會(huì)在無(wú)監(jiān)督特征學(xué)習(xí)(unsupervised feature learning)中見(jiàn)到,最常見(jiàn)的就是自編碼器(auto-encoder):通過(guò)在隱層將輸入進(jìn)行編碼壓縮,繼而在輸出層將數(shù)據(jù)解碼恢復(fù)初始狀態(tài),訓(xùn)練完成后,我們會(huì)將輸出層“砍掉”,僅保留隱層。

3.2?CBOW模型

? ? ? ? 連續(xù)詞袋模型與跳字模型類(lèi)似。與跳字模型最大的不同在于,連續(xù)詞袋模型假設(shè)基于某中心詞在文本序列前后的背景詞來(lái)生成該中心詞。在同樣的文本序列“the”“man”“l(fā)oves”“his”“son”里,以“l(fā)oves”作為中心詞,且背景窗口大小為2時(shí),連續(xù)詞袋模型關(guān)心的是,給定背景詞“the”“man”“his”“son”生成中心詞“l(fā)oves”的條件概率,也就是

3.2.1?Simple CBOW Model

? ? ? ? 先從Simple CBOW model(僅輸入一個(gè)詞,輸出一個(gè)詞)框架說(shuō)起。

如上圖所示:

  • input layer輸入的X是單詞的one-hot representation(考慮一個(gè)詞表V,里面的每一個(gè)詞??都有一個(gè)編號(hào)i∈{1,...,|V|},那么詞??的one-hot表示就是一個(gè)維度為|V|的向量,其中第i個(gè)元素值非零,其余元素全為0,例如:);
  • 輸入層到隱藏層之間有一個(gè)權(quán)重矩陣W,隱藏層得到的值是由輸入X乘上權(quán)重矩陣得到的(細(xì)心的人會(huì)發(fā)現(xiàn),0-1向量乘上一個(gè)矩陣,就相當(dāng)于選擇了權(quán)重矩陣的某一行,如圖:輸入的向量X是[0,0,1,0,0,0],W的轉(zhuǎn)置乘上X就相當(dāng)于從矩陣中選擇第3行[2,1,3]作為隱藏層的值);
  • 隱藏層到輸出層也有一個(gè)權(quán)重矩陣W',因此,輸出層向量y的每一個(gè)值,其實(shí)就是隱藏層的向量點(diǎn)乘權(quán)重向量W'的每一列,比如輸出層的第一個(gè)數(shù)7,就是向量[2,1,3]和列向量[1,2,1]點(diǎn)乘之后的結(jié)果;
  • 最終的輸出需要經(jīng)過(guò)softmax函數(shù),將輸出向量中的每一個(gè)元素歸一化到0-1之間的概率,概率最大的,就是預(yù)測(cè)的詞。

?3.2.2?CBOW Multi-Word Context Model

? ? ? ? ?把單個(gè)輸入換成多個(gè)輸入(劃紅線(xiàn)部分)。

  • 輸入層(Input Layer):上下文單詞的onehot,假設(shè)單詞向量空間dim為V,上下文單詞個(gè)數(shù)為C。
  • 所有onehot分別乘以共享的輸入權(quán)重矩陣W,(V,N)矩陣,N為自己設(shè)定的數(shù),初始化權(quán)重矩陣W。
  • 隱藏層(Hidden Layer):所得的向量 (因?yàn)槭莖nehot所以為向量)?相加求平均作為隱層向量, size為1N.
  • 乘以輸出權(quán)重矩陣W' (NV)
  • 輸出層(Output Layer):得到向量 (1V) 激活函數(shù)處理得到V-dim概率分布(因?yàn)槭莖nehot,其中的每一維代表著一個(gè)單詞)
  • 概率最大的index所指示的單詞為預(yù)測(cè)出的中間詞(target word)與true label的onehot做比較,誤差越小越好(根據(jù)誤差更新權(quán)重矩陣)
  • ? ? ? ? ? 因?yàn)檫B續(xù)詞袋模型的背景詞有多個(gè),我們將這些背景詞向量取平均,然后使用和跳字模型一樣的方法來(lái)計(jì)算條件概率。設(shè)和分別表示詞典中索引為 i 的詞作為背景詞中心詞的向量(注意符號(hào)的含義與跳字模型中的相反)。設(shè)中心詞在詞典中索引為 c,背景詞,在詞典中索引為,那么給定背景詞生成中心詞的條件概率

    ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? 為了讓符號(hào)更加簡(jiǎn)單,我們記,且,那么上式可以簡(jiǎn)寫(xiě)成:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? 給定一個(gè)長(zhǎng)度為 T 的文本序列,設(shè)時(shí)間步 t 的詞為,背景窗口大小為m。連續(xù)詞袋模型的似然函數(shù)是由背景詞生成任一中心詞的概率:

    ? ? ? ? ? ? ? ?

    ? ? ? ? 此處使用點(diǎn)積來(lái)表示相似性,兩個(gè)向量的相似性越大,他們的點(diǎn)積就越大。

    ?3.2.3?訓(xùn)練連續(xù)詞袋模型

    ? ? ? ? 訓(xùn)練連續(xù)詞袋模型同訓(xùn)練跳字模型基本一致。連續(xù)詞袋模型的最大似然估計(jì):

    ? ? ? ???

    ? ? ? ? 等價(jià)于最小化損失函數(shù)

    ? ? ? ? ? ? ?

    ? ? ? ? ? =? ?

    ? ? ? ? ?注意到:

    ? ? ? ? ? ? ? ? ? 因?yàn)?#xff1a;

    ? ? ? ? ? ? ? ? ? ?所以:

    ? ? ? ? 通過(guò)微分,我們可以計(jì)算出上式中條件概率的對(duì)數(shù)有關(guān)任一背景詞向量的梯度:

    ? ? ? ??

    ? ? ? ? 有關(guān)其他詞向量的梯度同理可得。同跳字模型不一樣的一點(diǎn)在于,我們一般使用連續(xù)詞袋模型的背景詞向量作為詞的表征向量。

    3.3?Skip-gram 模型

    3.3.1?Skip-gram 模型介紹

    ? ? ? ? 從直觀上理解,Skip-Gram是通過(guò)給定輸入,即input word來(lái)預(yù)測(cè)上下文。

    ? ? ??

    • 輸入層(Input Layer):輸入層的輸入是數(shù)據(jù)的數(shù)字表示,那么該如何用數(shù)字表示文本數(shù)據(jù)呢?其實(shí),它的輸入使用的是one-hot編碼。假設(shè)有n個(gè)詞,則每一個(gè)詞可以用一個(gè)n維的向量來(lái)表示,這個(gè)n維向量只有一個(gè)位置是1,其余位置都是0。
    • 隱藏層(Hidden Layer):隱藏層的神經(jīng)單元數(shù)量,代表著每一個(gè)詞用向量表示的維度大小。假設(shè)我們的hidden_size取300,也就是我們的隱藏層有300個(gè)神經(jīng)元,那么對(duì)于每一個(gè)詞,我們的向量表示就是一個(gè)1*N的向量。有多少個(gè)詞,就有多少個(gè)這樣的向量。所以對(duì)于輸入層隱藏層之間的權(quán)值矩陣W,它的形狀應(yīng)該是[vocab_size, hidden_size]的矩陣。
    • 輸出層(Output Layer):從上面的圖上可以看出來(lái),輸出層是一個(gè)[vocab_size]大小的向量,每一個(gè)值代表著輸出一個(gè)詞的概率。為什么要這樣輸出?因?yàn)槲覀兿胍?#xff0c;對(duì)于一個(gè)輸入詞,它接下來(lái)的詞最有可能的若干個(gè)詞是哪些,換句話(huà)說(shuō),我們需要知道它接下來(lái)的詞的概率分布。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。

    ? ? ? ? 跳字模型假設(shè)基于某個(gè)詞來(lái)生成它在文本序列周?chē)脑~。舉個(gè)例子,假設(shè)文本序列是“the”“man”“l(fā)oves”“his”“son”。以“l(fā)oves”作為中心詞,設(shè)背景窗口大小為2。如圖10.1所示,跳字模型所關(guān)心的是,給定中心詞“l(fā)oves”,生成與它距離不超過(guò)2個(gè)詞的背景詞“the”“man”“his”“son”的條件概率,即?

    ? ? ? ? ??

    ? ? ? ? 假設(shè)給定中心詞的情況下,背景詞的生成是相互獨(dú)立的,那么上式可以改寫(xiě)成

    ? ? ? ? 在word2vec的兩個(gè)模型中,有一個(gè)叫做skip_window,即C的參數(shù),它代表著我們從當(dāng)前輸入數(shù)據(jù)的數(shù)字表示,即input word的一側(cè)(左邊或右邊)選取詞的數(shù)量。如果我們選定句子“The quick brown fox jumps over lazy dog”,設(shè)定窗口大小為2(window_size=2),也就是說(shuō)我們僅選輸入詞前后各兩個(gè)詞和輸入詞進(jìn)行組合。下圖中,藍(lán)色代表input word,方框內(nèi)代表位于窗口內(nèi)的單詞。

    ? ? ? ??

    ? ? ? ?在跳字模型中,每個(gè)詞被表示成兩個(gè) d 維向量,用來(lái)計(jì)算條件概率。假設(shè)這個(gè)詞在詞典中索引為 i,當(dāng)它為中心詞時(shí)向量表示為 ,而為背景詞時(shí)向量表示為。設(shè)中心詞在詞典中索引為 c,背景詞在詞典中索引為 o,給定中心詞生成背景詞的條件概率可以通過(guò)對(duì)向量?jī)?nèi)積做softmax運(yùn)算而得到:

    ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? 其中詞典索引集。假設(shè)給定一個(gè)長(zhǎng)度為 T 的文本序列,設(shè)時(shí)間步 t的詞為。假設(shè)給定中心詞的情況下背景詞的生成相互獨(dú)立,當(dāng)背景窗口大小為 m 時(shí),跳字模型的似然函數(shù)即給定任一中心詞生成所有背景詞的概率:

    ? ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? ?這里小于1或大于T的時(shí)間步可以被忽略。

    同款疑問(wèn):word2vec的skip-gram輸出層時(shí)是怎么回事? - 知乎

    ? ? ? ? 假設(shè)Vocabulary大小為C,embedding以后的向量大小為v。

    ? ? ? ? 則Word2Vec中的權(quán)重個(gè)數(shù)為2C*v個(gè),其中輸入層到隱層的W1為[C, v]的一個(gè)矩陣,隱層到輸出層W2 同樣也是[C, v]的矩陣。W1代表center word的向量,W2代表context words的向量。

    ? ? ? ? 隱層出來(lái)的center word的向量去乘W2,此時(shí)實(shí)際是在計(jì)算centor word和context words中每個(gè)詞向量的similarity(logits),計(jì)算出的logits用softmax歸一化以后,再用label優(yōu)化就好了,label部分只有對(duì)應(yīng)的那個(gè)詞的位置是1,其余都是0。

    3.3.2?訓(xùn)練跳字模型

    ? ? ? ? ?假設(shè)現(xiàn)在有一個(gè)文本序列:I, want, to, learn, NLP

    ? ? ? ? ?首先遍歷這句話(huà),選取中心詞,假設(shè)現(xiàn)在遍歷到了“to”這個(gè)單詞,然后這里有一個(gè)超參數(shù)叫做window size。假設(shè)window_size=2,則這個(gè)window中包括中心詞前后各兩個(gè)單詞。根據(jù)skip-gram,給定中心詞“to”,生成窗口內(nèi)單詞的概率(注意這里暫時(shí)不考慮停用詞):

    ? ? ? ????

    ? ? ? ?假設(shè)在給定中心詞的條件下每個(gè)單詞出現(xiàn)的概率是獨(dú)立的,這里很類(lèi)似樸素貝葉斯的條件獨(dú)立性假設(shè),可以大大的簡(jiǎn)化運(yùn)算。

    ? ? ? ? ?

    ? ? ? ? 上面模型介紹中也提到,輸出層通過(guò)一個(gè)softmax將結(jié)果轉(zhuǎn)換成了概率分布,因此計(jì)算的概率公式如下:

    ? ? ? ? ???

    ? ? ? ? ? ?其中分別代表上下文詞和中心詞,代表上下文詞詞向量和中心向量,是全體詞庫(kù)。這個(gè)概率就是給定中心詞的條件下,某個(gè)詞是上下文詞的概率。根據(jù)上面的簡(jiǎn)化:

    ? ? ? ? ? ?每個(gè)詞的條件概率相互獨(dú)立,所以可以寫(xiě)成連乘的形式:

    ? ? ? ?

    ? ? ? ?其中,t表示中心詞的位置,m是窗口大小這樣就得到了每個(gè)中心詞的計(jì)算上下文詞的概率,在這個(gè)式子中變量是上下文向量和中心詞向量,于 是只要改變參數(shù)使概率最大化就可以了。在這里使用極大似然估計(jì),首先對(duì)上式進(jìn)行化簡(jiǎn),對(duì)上式取負(fù)對(duì)數(shù):?

    ? ? ? ? ? ?

    ? ? ? ? 跳字模型的參數(shù)是每個(gè)詞所對(duì)應(yīng)的中心詞向量和背景詞向量。訓(xùn)練中我們通過(guò)最大化似然函數(shù)來(lái)學(xué)習(xí)模型參數(shù),即最大似然估計(jì)。這等價(jià)于最小化以下?lián)p失函數(shù)

    ? ? ? ? ? ? ??

    ? ? ? ? 如果使用隨機(jī)梯度下降,那么在每一次迭代里我們隨機(jī)采樣一個(gè)較短的子序列來(lái)計(jì)算有關(guān)該子序列的損失,然后計(jì)算梯度來(lái)更新模型參數(shù)。梯度計(jì)算的關(guān)鍵是條件概率的對(duì)數(shù)有關(guān)中心詞向量和背景詞向量的梯度。根據(jù)定義,首先看到

    ? ? ? ? ? ? ? ?

    ? ? ? ? 通過(guò)微分,我們可以得到上式中的梯度

    ? ? ? ? ? ? ? ?

    ? ? ? ? 它的計(jì)算需要詞典中所有詞以為中心詞的條件概率。有關(guān)其他詞向量的梯度同理可得。

    ? ? ? ? 訓(xùn)練結(jié)束后,對(duì)于詞典中的任一索引為 i 的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量和。在自然語(yǔ)言處理應(yīng)用中,一般使用跳字模型的中心詞向量作為詞的表征向量。

    ? ? ? ?訓(xùn)練完畢后,輸入層的每個(gè)單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個(gè)矩陣(所有單詞的word embedding)也叫做 look up table,其實(shí)這個(gè)look up table就是矩陣W自身,也就是說(shuō),任何一個(gè)單詞的onehot乘以這個(gè)矩陣都將得到自己的詞向量。有了look up table就可以免去訓(xùn)練過(guò)程直接查表得到單詞的詞向量了。

    注意:

    • skip-gram并沒(méi)有考慮語(yǔ)序問(wèn)題。
    • 建模是fake task,真正目的是獲得權(quán)重矩陣,權(quán)重矩陣的每行分別是每個(gè)單詞的詞向量。
    • 在隱層只是用了矩陣乘法將高維onehot向量映射為一個(gè)低維稠密向量,這個(gè)向量就是中心詞向量,并沒(méi)有使用激活函數(shù)。
    • 在輸出層是將隱層輸出的中心詞向量和上下文詞向量相乘后輸入softmax分類(lèi)器,最終輸出的是概率分布。
    • 在訓(xùn)練時(shí)每個(gè)詞都會(huì)交替變成中心詞向量和上下文詞向量

    3.4?使用gensim進(jìn)行訓(xùn)練

    用gensim學(xué)習(xí)word2vec

    示例:

    >>> from gensim.test.utils import common_texts, get_tmpfile >>> from gensim.models import Word2Vec >>> path = get_tmpfile("word2vec.model") >>> model = Word2Vec(common_texts, sg=1, size=100, window=5, min_count=1, workers=4) >>> model.save("word2vec.model") >>> print(model.wv.similarity('沙瑞金'.decode('utf-8'), '高育良'.decode('utf-8'))) >>> print(model.wv["沙瑞金"]

    ? ? ? ? 其中,sg=1是skip-gram算法,對(duì)低頻詞敏感;默認(rèn)sg=0為CBOW算法。

    ? ? ? ? 其余參數(shù)說(shuō)明參見(jiàn)models.word2vec – Word2vec embeddings — gensim。

    ? ? "model = Word2Vec(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)\n",
    ? ? "# 參數(shù)解釋:\n",
    ? ? "# 1. sentences??第一個(gè)參數(shù)是預(yù)處理后的訓(xùn)練語(yǔ)料庫(kù)。是可迭代列表,但是對(duì)于較大的語(yǔ)料庫(kù),可以考慮直接從磁盤(pán)/網(wǎng)絡(luò)傳輸句子的迭代。對(duì)于大語(yǔ)料集,建議使用BrownCorpus,Text8Corpus或lineSentence構(gòu)建。\n",
    ? ? "# 2. sg=1是skip-gram算法,對(duì)低頻詞敏感;默認(rèn)sg=0為CBOW算法。\n",
    ? ? "# 3. size(int) 是輸出詞向量的維數(shù),默認(rèn)值是100。這個(gè)維度的取值與我們的語(yǔ)料的大小相關(guān),比如小于100M的文本語(yǔ)料,則使用默認(rèn)值一般就可以了。如果是超大的語(yǔ)料,建議增大維度。值太小會(huì)導(dǎo)致詞映射因?yàn)闆_突而影響結(jié)果,值太大則會(huì)耗內(nèi)存并使算法計(jì)算變慢,一般值取為100到200之間,不過(guò)見(jiàn)的比較多的也有300維的。\n",
    ? ? "# 4. alpha: 是初始的學(xué)習(xí)速率,在訓(xùn)練過(guò)程中會(huì)線(xiàn)性地遞減到min_alpha。\n",
    ? ? "# 5. window(int)即詞向量上下文最大距離,是一個(gè)句子中當(dāng)前單詞和預(yù)測(cè)單詞之間的最大距離,skip-gram和cbow算法是基于滑動(dòng)窗口來(lái)做預(yù)測(cè),window越大,則和某一詞較遠(yuǎn)的詞也會(huì)產(chǎn)生上下文關(guān)系。默認(rèn)值為5。windows越大所需要枚舉的預(yù)測(cè)此越多,計(jì)算的時(shí)間越長(zhǎng)。對(duì)于一般的語(yǔ)料這個(gè)值推薦在[5,10]之間。\n",
    ? ? "# 6. min_count 忽略所有頻率低于此值的單詞。默認(rèn)值為5。\n",
    ? ? "# 7. max_vocab_size: 設(shè)置詞向量構(gòu)建期間的RAM限制,設(shè)置成None則沒(méi)有限制。\n",
    ? ? "# 8. seed: 用于隨機(jī)數(shù)發(fā)生器。與初始化詞向量有關(guān)。\n",
    ? ? "# 9. workers表示訓(xùn)練詞向量時(shí)使用的線(xiàn)程數(shù),默認(rèn)是當(dāng)前運(yùn)行機(jī)器的處理器核數(shù)。workers控制訓(xùn)練的并行,此參數(shù)只有在安裝了Cpython后才有效,否則只能使用單核。\n",
    ? ? "# 10. min_alpha: 由于算法支持在迭代的過(guò)程中逐漸減小步長(zhǎng),min_alpha給出了最小的迭代步長(zhǎng)值。隨機(jī)梯度下降中每輪的迭代步長(zhǎng)可以由iter,alpha,?min_alpha一起得出。對(duì)于大語(yǔ)料,需要對(duì)alpha,?min_alpha,iter一起調(diào)參,來(lái)選擇合適的三個(gè)值。\n",
    ? ? "# 11. hs: 即我們的word2vec兩個(gè)解法的選擇了,如果是0, 則是Negative Sampling,是1的話(huà)并且負(fù)采樣個(gè)數(shù)negative大于0, 則是Hierarchical Softmax。默認(rèn)是0即Negative Sampling。\n",
    ? ? "# 12. negative:如果大于零,則會(huì)采用negative sampling,用于設(shè)置多少個(gè)noise words(一般是5-20)。\n",
    ? ? "# 13.?cbow_mean: 僅用于CBOW在做投影的時(shí)候,為0,則采用上下文的詞向量之和,為1則為上下文的詞向量的平均值。默認(rèn)值也是1,不推薦修改默認(rèn)值。\n",
    ? ? "# 14.?hashfxn: hash函數(shù)來(lái)初始化權(quán)重,默認(rèn)使用python的hash函數(shù)。\n",
    ? ? "# 15.?iter: 隨機(jī)梯度下降法中迭代的最大次數(shù),默認(rèn)是5。對(duì)于大語(yǔ)料,可以增大這個(gè)值。\n",
    ? ? "# 16. trim_rule: 用于設(shè)置詞匯表的整理規(guī)則,指定那些單詞要留下,哪些要被刪除。可以設(shè)置為None(min_count會(huì)被使用)。\n",
    ? ? "# 17. sorted_vocab: 如果為1(默認(rèn)),則在分配word index 的時(shí)候會(huì)先對(duì)單詞基于頻率降序排序。\n",
    ? ? "# 18. batch_words:每一批的傳遞給線(xiàn)程的單詞的數(shù)量,默認(rèn)為10000。\n",
    ? ? "# 19. negative和sample可根據(jù)訓(xùn)練結(jié)果進(jìn)行微調(diào),sample表示更高頻率的詞被隨機(jī)下采樣到所設(shè)置的閾值,默認(rèn)值為1e-3。"

    Word2Vec中的數(shù)學(xué):???????有道云筆記

    3.5?tricks1:hierarchical softmax (CBOW)

    69-負(fù)采樣和Hierarchical Softmax-詞嵌入模型-自然語(yǔ)言處理-深度學(xué)習(xí)-pytorch_嗶哩嗶哩_bilibili

    具體內(nèi)容見(jiàn) Word2Vec中的數(shù)學(xué):???????有道云筆記4.1 節(jié)

    ? ? ?基于hierarchical Softmax 的?word2vec 與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)詞向量語(yǔ)言模型相比有兩個(gè)改進(jìn):

    • 首先,對(duì)于從輸入層到隱藏層的映射,沒(méi)有采取神經(jīng)網(wǎng)絡(luò)的線(xiàn)性變換加激活函數(shù)的方法,而是采用簡(jiǎn)單的對(duì)所有輸入詞向量求和并取平均的方法。比如輸入的是三個(gè)4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我們word2vec映射后的詞向量就是(5,6,7,8)。這里是從多個(gè)詞向量變成了一個(gè)詞向量。
    • 第二個(gè)改進(jìn)就是從隱藏層到輸出的softmax層這里的計(jì)算量個(gè)改進(jìn)。為了避免要計(jì)算所有詞的softmax概率,基于hierarchical Softmax 的采用了霍夫曼樹(shù)來(lái)代替從隱藏層到輸出softmax層的映射。

    ? ? ? ? word2vec在最后預(yù)測(cè)輸出向量時(shí)候,大小是1*V的向量,本質(zhì)上是個(gè)多分類(lèi)的問(wèn)題。通過(guò)hierarchical softmax的技巧,把V分類(lèi)的問(wèn)題變成了log(V)次二分類(lèi)。

    3.5.1?Huffman Tree(哈夫曼樹(shù))

    ? ? ? ? 哈夫曼樹(shù)是一種帶權(quán)路徑長(zhǎng)度最短的二叉樹(shù),也稱(chēng)為最優(yōu)二叉樹(shù)

    哈夫曼樹(shù)的構(gòu)造:

    ?例子:有A B C D 四個(gè)詞,數(shù)字表示詞頻,構(gòu)造過(guò)程如下:

    ?哈夫曼樹(shù)編碼:

    左子樹(shù)為0,右子樹(shù)為1:

    ? ? ? ? ?那么D編碼為0,B編碼為10,C編碼為110,A編碼為111。

    3.5.2 預(yù)備知識(shí)

    3.5.3?word2vec的hierarchical softmax結(jié)構(gòu)

    ?

    • 輸入層:是指??中所包含的??個(gè)詞的詞向量?
    • 投影層:指的是直接對(duì)??個(gè)詞向量進(jìn)行累加,累加之后得到下式:
    • 輸出層:是一個(gè)Huffman樹(shù),其中葉子節(jié)點(diǎn)共N個(gè),對(duì)應(yīng)于N個(gè)單詞,非葉子節(jié)點(diǎn)N-1個(gè)(對(duì)應(yīng)上圖中標(biāo)成黃色的結(jié)點(diǎn))。Word2Vec基于層次Softmax的方式主要的精華部分都集中在了哈夫曼樹(shù)這部分

    ? ? ? ? ?

    ? ? ? ? 和傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)輸出不同的是,word2vec的hierarchical softmax結(jié)構(gòu)是把輸出層改成了一顆哈夫曼樹(shù),其中圖中

    • 白色的葉子節(jié)點(diǎn)表示詞匯表中所有的|V|個(gè)詞,
    • 黑色節(jié)點(diǎn)表示非葉子節(jié)點(diǎn),

    ? ? ? ? 每一個(gè)葉子節(jié)點(diǎn)也就是每一個(gè)單詞,都對(duì)應(yīng)唯一的一條從root節(jié)點(diǎn)出發(fā)的路徑。我們的目的是使的w=wO這條路徑的概率最大,即: P(w=wO|wI)最大,假設(shè)最后輸出的條件概率是W2最大,那么我只需要去更新從根結(jié)點(diǎn)到w2這一個(gè)葉子結(jié)點(diǎn)的路徑上面節(jié)點(diǎn)的向量即可,而不需要更新所有的詞的出現(xiàn)概率,這樣大大的縮小了模型訓(xùn)練更新的時(shí)間。

    ? ? ? ? 我們應(yīng)該如何得到某個(gè)葉子結(jié)點(diǎn)的概率呢?

    ? ? ? ? ?假設(shè)我們要計(jì)算W2葉子節(jié)點(diǎn)的概率,我們需要從根節(jié)點(diǎn)到葉子結(jié)點(diǎn)計(jì)算概率的乘積。我們知道,本模型替代的只是原始模型的softmax層,因此,某個(gè)非葉子節(jié)點(diǎn)的值即隱藏層到輸出層的結(jié)果仍然是uj,我們對(duì)這個(gè)結(jié)果進(jìn)行sigmoid之后,得到節(jié)點(diǎn)往左子樹(shù)走的概率p1-p則為往右子樹(shù)走的概率。??

    3.5.4 目標(biāo)函數(shù)

    3.5.5?參數(shù)更新

    3.5.5?偽代碼

    ? ? ? ? CBOW模型中采用隨機(jī)梯度上升更新各參數(shù)的偽代碼:

    Hierarchical Softmax(層次Softmax):Hierarchical Softmax(層次Softmax) - 知乎

    3.6 tricks1:hierarchical softmax (Skip-gram)

    3.6.1?Skip-gram模型網(wǎng)絡(luò)結(jié)構(gòu)

    ? ? ? ? 下圖給出了Skip-gram模型的網(wǎng)絡(luò)結(jié)構(gòu),同CBOW模型的網(wǎng)絡(luò)結(jié)構(gòu)一樣,它也包括三層:輸入層、投影層和輸出層。下面以樣本??為例,對(duì)這三層做簡(jiǎn)要說(shuō)明。

    • 輸入層:只含當(dāng)前樣本的中心詞??的詞向量??。
    • 投影層:這是個(gè)恒等投影,把??投影到??。因此,這個(gè)投影層其實(shí)是多余的,這里之所以保留投影層主要是方便和CBOW模型的網(wǎng)絡(luò)結(jié)構(gòu)做對(duì)比。
    • 輸出層:和CBOW模型一樣,輸出層也是一顆Huffman樹(shù)。

    3.6.2?Skip-gram的目標(biāo)函數(shù)

    ?至此,已經(jīng)推導(dǎo)出了Skip-gram模型的目標(biāo)函數(shù)(公式11),接下來(lái)同樣利用隨機(jī)梯度上升法對(duì)其進(jìn)行優(yōu)化。而梯度類(lèi)算法的關(guān)鍵是給出相應(yīng)的梯度計(jì)算公式,進(jìn)行反向傳播。

    3.6.3?參數(shù)更新

    3.6.4 偽代碼

    ?

    ? ? ? ? ?e:可以看作梯度的累加。

    3.7 tricks2:negative sampling?(CBOW)

    69-負(fù)采樣和Hierarchical Softmax-詞嵌入模型-自然語(yǔ)言處理-深度學(xué)習(xí)-pytorch_嗶哩嗶哩_bilibili

    negative sampling解決了之前說(shuō)的兩個(gè)問(wèn)題:

    • 僅對(duì)K個(gè)參數(shù)進(jìn)行采樣
    • 放棄softmax函數(shù),采用sigmoid函數(shù),這樣就不存在先求一遍窗口中所有單詞的‘“得分”的情況了。

    ? ? ? ? 本質(zhì)上是對(duì)訓(xùn)練集進(jìn)行了采樣,從而減小了訓(xùn)練集的大小。

    ? ? ? ? 本節(jié)將介紹基于Negative Sampling的CBOW和Skip-gram模型。Negative Sampling(簡(jiǎn)稱(chēng)為NEG)是Tomas Mikolov等人在論文《Distributed Representations of Words and Phrases and their Compositionality》中提出的,它是NCE(Noise Contrastive Estimation)的一個(gè)簡(jiǎn)化版,目的是用來(lái)提高訓(xùn)練速度并改善所得詞向量的質(zhì)量。與Hierarchical Softmax相比,NEG不再使用復(fù)雜的Huffman樹(shù),而是利用相對(duì)簡(jiǎn)單的隨機(jī)負(fù)采樣,能大幅度提高性能,因而可作為Hierarchical Softmax的一種替代。

    ? ? ? ? NCE 的細(xì)節(jié)有點(diǎn)復(fù)雜,其本質(zhì)是利用已知的概率密度函數(shù)來(lái)估計(jì)未知的概率密度函數(shù)。簡(jiǎn)單來(lái)說(shuō),假設(shè)未知的概率密度函數(shù)為X,已知的概率密度為Y,如果得到了X和Y的關(guān)系,那么X也就可以求出來(lái)了。具體可以參考論文《 Noise-contrastive estimation of unnormalized statistical models, with applications to natural image statistics》。

    ?

    3.8 tricks2:negative sampling?(Skip-gram)

    ?

    ?

    3.9 關(guān)于Word2Vec若干問(wèn)題的思考

    ???????【Embedding】Word2Vec:詞嵌入的一枚銀彈 - 云+社區(qū) - 騰訊云

    (1)Word2Vec兩個(gè)算法模型的原理是什么,網(wǎng)絡(luò)結(jié)構(gòu)怎么畫(huà)?

    (2)網(wǎng)絡(luò)輸入輸出是什么?隱藏層的激活函數(shù)是什么?輸出層的激活函數(shù)是什么?

    (3)目標(biāo)函數(shù)/損失函數(shù)是什么?

    (4)Word2Vec如何獲取詞向量?

    (5)推導(dǎo)一下Word2Vec參數(shù)如何更新?

    (6)Word2Vec的兩個(gè)模型哪個(gè)效果好哪個(gè)速度快?為什么?

    ? ? ? ? ?效果:CBOW 像是小學(xué)時(shí)做的填空題:I come ___ China,而 Skip-Gram 像是給你一個(gè) from 讓你預(yù)測(cè)上下文,理論上來(lái)說(shuō)應(yīng)該是 CBOW 的效果更好,但實(shí)際情況卻恰恰相反。我覺(jué)得可能是因?yàn)?CBOW 是取上下文的輸入向量的質(zhì)心從而導(dǎo)致一部分有效信息損失,而 Skip-Gram 雖然看起來(lái)荒唐,但每個(gè)單詞都會(huì)得到單獨(dú)的訓(xùn)練不會(huì)損失有效信息,其實(shí) Skip-Gram 比 CBOW 的效果好,主要是針對(duì)低頻詞而言,舉個(gè)例子,讓你補(bǔ)全 It is a ___ day,是不是突然有很多可能的答案,你大概率會(huì)填寫(xiě)一個(gè)高頻詞匯,如:nice、sun 等,而不會(huì)想到要填寫(xiě) gorgeous,而給你 gorgeous 單詞,其特征很明顯會(huì)想到這可以用來(lái)形容 day、moon、girl 等等。其次 gorgeous 本身用量就沒(méi)有 nice 那么多,如果再和其他上下文放在一起取質(zhì)心,其很容易被忽略,從而沒(méi)法充分訓(xùn)練。
    ? ? ? ? ? 速度:我覺(jué)得 Skip-Gram 的速度慢可能是因?yàn)槠漕A(yù)測(cè)值比較多,需要分別計(jì)算多個(gè) Softmax,時(shí)間復(fù)雜度為 O(kn),而 CBOW 雖然也有多個(gè)輸入,但我們求其質(zhì)心簡(jiǎn)化了操作,時(shí)間復(fù)雜度為 O(n)。

    ? ? ? ? 需要說(shuō)明的是,當(dāng)語(yǔ)料較少時(shí)使用CBOW方法比較好,當(dāng)語(yǔ)料較多時(shí)采用skip-gram表示比較好。

    (7)Word2Vec加速訓(xùn)練的方法有哪些?

    ? ? ? ? 當(dāng)語(yǔ)料比較大時(shí),詞典規(guī)模會(huì)比較大,求softmax速度會(huì)變得很慢,嚴(yán)重影響了訓(xùn)練速度。此時(shí)有兩種方法進(jìn)行改進(jìn):(1)分層softmax; (2)負(fù)采樣。分層softmax的原理很簡(jiǎn)單,就是構(gòu)建Huffman樹(shù)(使得計(jì)算概率的次數(shù)最小),正例詞都在葉子結(jié)點(diǎn),其他詞為中間節(jié)點(diǎn),分層進(jìn)行softmax。負(fù)采樣的思想也很簡(jiǎn)單,就是不計(jì)算所有詞的概率算softmax,而是采樣一些負(fù)樣本,算對(duì)數(shù)sigmoid函數(shù),近似softmax。具體原理就是最大化正例概率,最小化負(fù)例出現(xiàn)的概率。

    (8)介紹下Negative Sampling,對(duì)詞頻低的和詞頻高的單詞有什么影響?為什么?

    ? ? ? ? 通過(guò)負(fù)采樣避免更新全部參數(shù),對(duì)詞頻高的友好;

    (9)Word2Vec和隱狄利克雷模型(LDA)有什么區(qū)別與聯(lián)系?

    ? ? ? ? 談到Word2Vec與LDA的區(qū)別和聯(lián)系,首先,LDA是利用文檔中單詞的共現(xiàn)關(guān)系來(lái)對(duì)單詞按主題聚類(lèi),也可以理解為對(duì)“文檔-單詞”矩陣進(jìn)行分解,得到“文檔-主題”和“主題-單詞”兩個(gè)概率分布。而Word2Vec其實(shí)是對(duì)“上下文-單詞”矩陣進(jìn)行學(xué)習(xí),其中上下文由周?chē)膸讉€(gè)單詞組成,由此得到的詞向量表示更多地融入上下文共現(xiàn)的特征。也就是說(shuō),如果兩個(gè)單詞所對(duì)應(yīng)的Word2Vec向量相似度較高,那么它們很可能經(jīng)常在同樣的上下文中出現(xiàn)。需要說(shuō)明的是,上述分析的是?

    ? ? ? ? LDA與Word2Vec的不同,不應(yīng)該作為主題模型和詞嵌入兩類(lèi)方法的主要差異。主題模型通過(guò)一定的結(jié)構(gòu)調(diào)整可以基于“上下文-單詞”矩陣進(jìn)行主題推理。同樣地,詞嵌入方法也可以根據(jù)“文檔-單詞”矩陣學(xué)習(xí)出詞的隱含向量表示。主題模型和詞嵌入兩類(lèi)方法最大的不同其實(shí)在于模型本身,主題模型是一種基于概率圖模型的生成式模型,其似然函數(shù)可以寫(xiě)成若干條件概率連乘的形式,其中包括需要推測(cè)的隱含變量(即主題);而詞嵌入模型一般表達(dá)為神經(jīng)網(wǎng)絡(luò)的形式,似然函數(shù)定義在網(wǎng)絡(luò)的輸出之上,需要通過(guò)學(xué)習(xí)網(wǎng)絡(luò)的權(quán)重以得到單詞的稠密向量表示。

    (10)介紹下Hierarchical Softmax的計(jì)算過(guò)程,怎么把 Huffman 放到網(wǎng)絡(luò)中的?參數(shù)是如何更新的?對(duì)詞頻低的和詞頻高的單詞有什么影響?為什么?

    ? ? ? ? Hierarchical Softmax利用了Huffman樹(shù)依據(jù)詞頻建樹(shù),詞頻大的節(jié)點(diǎn)離根節(jié)點(diǎn)較近,詞頻低的節(jié)點(diǎn)離根節(jié)點(diǎn)較遠(yuǎn),距離遠(yuǎn)參數(shù)數(shù)量就多,在訓(xùn)練的過(guò)程中,低頻詞的路徑上的參數(shù)能夠得到更多的訓(xùn)練,所以效果會(huì)更好。所以 Hierarchical Softmax 對(duì)詞頻低的單詞效果會(huì)更好。

    (11)Word2Vec有哪些參數(shù),有沒(méi)有什么調(diào)參的建議?

    • Skip-Gram 的速度比CBOW慢一點(diǎn),小數(shù)據(jù)集中對(duì)低頻次的效果更好;
    • Sub-Sampling Frequent Words可以同時(shí)提高算法的速度和精度,Sample 建議取值為??;
    • Hierarchical Softmax對(duì)低詞頻的更友好;
    • Negative Sampling對(duì)高詞頻更友好;
    • 向量維度一般越高越好,但也不絕對(duì);
    • Window Size,Skip-Gram一般10左右,CBOW一般為5左右。

    (12)Word2Vec有哪些局限性?

    Word2Vec作為一個(gè)簡(jiǎn)單易用的算法,其也包含了很多局限性:

    • Word2Vec只考慮到上下文信息,而忽略的全局信息;
    • Word2Vec只考慮了上下文的共現(xiàn)性,而忽略的了彼此之間的順序性;

    ?(13)Hierarchical Softmax 方法中哈夫曼樹(shù)是如何初始化生成的?也就是哈夫曼樹(shù)是如何構(gòu)建的呢?

    答:Hierarchical Softmax 依據(jù)詞頻構(gòu)建 Huffman 樹(shù),詞頻大的節(jié)點(diǎn)離根節(jié)點(diǎn)較近,詞頻低的節(jié)點(diǎn)離根節(jié)點(diǎn)較遠(yuǎn),距離遠(yuǎn)參數(shù)數(shù)量就多。

    (14)Negative Sampling 是一種什么采樣方式?是均勻采樣還是其它采樣方法?

    答:詞典?D?中的詞在語(yǔ)料?C?中出現(xiàn)的次數(shù)有高有低,對(duì)于那些高頻詞,被選為負(fù)樣本的概率就應(yīng)該比較大,反之,對(duì)于那些低頻詞,其被選中的概率就應(yīng)該比較小。這就是我們對(duì)采樣過(guò)程的一個(gè)大致要求,本質(zhì)上就是一個(gè)帶權(quán)采樣問(wèn)題。

    (15)詳細(xì)介紹一下 Word2Vec 中負(fù)采樣方法?

    答:先將概率以累積概率分布的形式分布到一條線(xiàn)段上,以?a=0.2,b=0.3,c=0.5?為例,?a所處線(xiàn)段為[0,0.2]?,b所處線(xiàn)段為?[0.2,0.5]?,?c?所處線(xiàn)段為?[0.5,1]?,然后定義一個(gè)大小為M?的數(shù)組,并把數(shù)組等距離劃分為?m個(gè)單元,然后與上面的線(xiàn)段做一次映射,這樣我們便知道了數(shù)組內(nèi)的每個(gè)單元所對(duì)應(yīng)的字符了,這種情況下算法的時(shí)間復(fù)雜度為O(1)?,空間復(fù)雜度為O(M)?,?m越小精度越大。

    (16)gensim中word2vec 結(jié)果解釋

    syn0數(shù)組實(shí)際上保存了原始的單詞向量。從用于訓(xùn)練單詞向量的神經(jīng)網(wǎng)絡(luò)的角度來(lái)看,這些向量是一個(gè)“投影層”,可以將單詞的一次性編碼轉(zhuǎn)換為正確維度的密集嵌入向量。

    在gensim4.0.0之后,想要獲得與model.syn0一樣的輸出需要使用:

    model.wv.vectors

    syn0 :就是詞向量的大矩陣,第i行表示vocab中下標(biāo)為i的詞
    syn1:用hs算法時(shí)用到的輔助矩陣,即文章中的Wx
    syn1neg:negative sampling算法時(shí)用到的輔助矩陣,組成的矩陣。
    Next_random:作者自己生成的隨機(jī)數(shù),線(xiàn)程里面初始化就是:

    ?(17)word2vec增量訓(xùn)練

    【技術(shù)分享】修改word2vec源碼實(shí)現(xiàn)詞向量增量更新 - 云+社區(qū) - 騰訊云

    基于Gensim實(shí)現(xiàn)word2vec詞向量增量訓(xùn)練_Steven灬的博客-CSDN博客

    (18)word2vec沒(méi)有對(duì)詞向量進(jìn)行正則化?

    word2vec沒(méi)有對(duì)詞向量進(jìn)行正則化? - 知乎:

    word2vec在嘗試用哈夫曼和EM的思路為自然語(yǔ)言提供了新的正則方案。

    word2vec的前身是同樣基于CBOW和Skip-gram的概率多層神經(jīng)網(wǎng)絡(luò),其本質(zhì)類(lèi)似于一個(gè)Encoder-Decoder模型,前端將文字映射到一定維度模擬適用于自然語(yǔ)言的降維到詞向量的過(guò)程,達(dá)到去噪的效果,而Decoder則起到還原詞向量到文字的作用。而既然是神經(jīng)網(wǎng)絡(luò),當(dāng)然可以采用傳統(tǒng)正則,不管是regularize還是dropout。

    而這個(gè)方案在自然語(yǔ)言并不是個(gè)很優(yōu)的解,因?yàn)椴还苁荂BOW還是Skip-gram都要求用滑窗對(duì)文本遍歷,也就意味著樣本遠(yuǎn)遠(yuǎn)多于正常的模型,這時(shí)候regularize或是dropout顯得過(guò)慢。word2vec選擇將輸出換為哈夫曼樹(shù),這樣在訓(xùn)練過(guò)程中,每當(dāng)前端神經(jīng)網(wǎng)絡(luò)產(chǎn)生出Encoder過(guò)后的詞向量的預(yù)測(cè),哈夫曼樹(shù)會(huì)對(duì)其產(chǎn)生一個(gè)最小熵的編碼,也就類(lèi)似于求當(dāng)前詞向量方式的Expectation,而后下次再做Encoder時(shí),就會(huì)用這個(gè)局部最優(yōu)的Expectation去生成預(yù)測(cè),也就是M的過(guò)程。而哈弗曼樹(shù)編碼最小對(duì)應(yīng)著一個(gè)足夠短的詞向量,這樣才能盡可能少的作樹(shù)的分叉。因此在word2vec通過(guò)E過(guò)程和M過(guò)程的相互影響,用哈弗曼樹(shù)對(duì)詞向量進(jìn)行一定程度的正則。而這種正則是自適應(yīng)的,比傳統(tǒng)人為設(shè)置超參數(shù)的正則要更快更好。

    word2vec中目標(biāo)函數(shù)為什么不用加正則化項(xiàng)?_技術(shù)交流_牛客網(wǎng):

    加正則的本質(zhì)是減少數(shù)據(jù)中的誤差對(duì)模型的影響。word2vec中輸入數(shù)據(jù)是one hot encoding沒(méi)有誤差所以不用加。

    靈魂拷問(wèn)之word2vec - 知乎

    (19)cbow 與 skip-gram的比較?

    • CBOW是利用上下文預(yù)測(cè)中心詞,Skip-gram是利用中心詞預(yù)測(cè)上下文
    • Skip-gram效果比CBOW好。?
    • Skip-gram訓(xùn)練時(shí)間長(zhǎng),但是對(duì)低頻詞(生僻詞)效果好;CBOW訓(xùn)練時(shí)間短,對(duì)低頻詞效果比較差。
  • 為什么?

  • ? ? ? ? cbow和skip-gram都是在word2vec中用于將文本進(jìn)行向量表示的實(shí)現(xiàn)方法,具體的算法實(shí)現(xiàn)細(xì)節(jié)可以去看word2vec的原理介紹文章。我們這里大體講下兩者的區(qū)別,尤其注意在使用當(dāng)中的不同特點(diǎn)。

    ? ? ? ?在cbow方法中,是用周?chē)~預(yù)測(cè)中心詞,從而利用中心詞的預(yù)測(cè)結(jié)果情況,使用GradientDesent方法,不斷的去調(diào)整周?chē)~的向量。當(dāng)訓(xùn)練完成之后,每個(gè)詞都會(huì)作為中心詞,把周?chē)~的詞向量進(jìn)行了調(diào)整,這樣也就獲得了整個(gè)文本里面所有詞的詞向量。

    ? ? ? ? 要注意的是, cbow的對(duì)周?chē)~的調(diào)整是統(tǒng)一的:求出的gradient的值會(huì)同樣的作用到每個(gè)周?chē)~的詞向量當(dāng)中去。

    ? ? ? ? 可以看到,cbow預(yù)測(cè)行為的次數(shù)跟整個(gè)文本的詞數(shù)幾乎是相等的(每次預(yù)測(cè)行為才會(huì)進(jìn)行一次backpropgation, 而往往這也是最耗時(shí)的部分),復(fù)雜度大概是O(V);

    ? ? ? ? 而skip-gram是用中心詞來(lái)預(yù)測(cè)周?chē)脑~。在skip-gram中,會(huì)利用周?chē)脑~的預(yù)測(cè)結(jié)果情況,使用GradientDecent來(lái)不斷的調(diào)整中心詞的詞向量,最終所有的文本遍歷完畢之后,也就得到了文本所有詞的詞向量。

    ? ? ? ? 可以看出,skip-gram進(jìn)行預(yù)測(cè)的次數(shù)是要多于cbow的:因?yàn)?strong>每個(gè)詞在作為中心詞時(shí),都要使用周?chē)~進(jìn)行預(yù)測(cè)一次???????。這樣相當(dāng)于比cbow的方法多進(jìn)行了K次(假設(shè)K為窗口大小),因此時(shí)間的復(fù)雜度為O(KV),訓(xùn)練時(shí)間要比cbow要長(zhǎng)。

    ? ? ? ? 但是在skip-gram當(dāng)中,每個(gè)詞都要受到周?chē)脑~的影響,每個(gè)詞在作為中心詞的時(shí)候,都要進(jìn)行K次的預(yù)測(cè)、調(diào)整。因此, 當(dāng)數(shù)據(jù)量較少,或者詞為生僻詞出現(xiàn)次數(shù)較少時(shí), 這種多次的調(diào)整會(huì)使得詞向量相對(duì)的更加準(zhǔn)確。因?yàn)楸M管cbow從另外一個(gè)角度來(lái)說(shuō),某個(gè)詞也是會(huì)受到多次周?chē)~的影響(多次將其包含在內(nèi)的窗口移動(dòng)),進(jìn)行詞向量的跳幀,但是他的調(diào)整是跟周?chē)脑~一起調(diào)整的,grad的值會(huì)平均分到該詞上, 相當(dāng)于該生僻詞沒(méi)有收到專(zhuān)門(mén)的訓(xùn)練,它只是沾了周?chē)~的光而已。?

    ? ?? ? 因此,從更通俗的角度來(lái)說(shuō):

    ? ? ? ?在skip-gram里面,每個(gè)詞在作為中心詞的時(shí)候,實(shí)際上是 1個(gè)學(xué)生 VS K個(gè)老師,K個(gè)老師(周?chē)~)都會(huì)對(duì)學(xué)生(中心詞)進(jìn)行“專(zhuān)業(yè)”的訓(xùn)練,這樣學(xué)生(中心詞)的“能力”(向量結(jié)果)相對(duì)就會(huì)扎實(shí)(準(zhǔn)確)一些,但是這樣肯定會(huì)使用更長(zhǎng)的時(shí)間;

    ? ? ? ? cbow是 1個(gè)老師 VS K個(gè)學(xué)生,K個(gè)學(xué)生(周?chē)~)都會(huì)從老師(中心詞)那里學(xué)習(xí)知識(shí),但是老師(中心詞)是一視同仁的,教給大家的一樣的知識(shí)。至于你學(xué)到了多少,還要看下一輪(假如還在窗口內(nèi)),或者以后的某一輪,你還有機(jī)會(huì)加入老師的課堂當(dāng)中(再次出現(xiàn)作為周?chē)~),跟著大家一起學(xué)習(xí),然后進(jìn)步一點(diǎn)。因此相對(duì)skip-gram,你的業(yè)務(wù)能力肯定沒(méi)有人家強(qiáng),但是對(duì)于整個(gè)訓(xùn)練營(yíng)(訓(xùn)練過(guò)程)來(lái)說(shuō),這樣肯定效率高,速度更快。

    3.10 python實(shí)現(xiàn)(gensim)

    #!/usr/bin/env python # -*- coding: UTF-8 -*-# @Time : 2021/10/25 17:02 # @Author : song.xiangyuimport gensim import jieba from gensim.models import Word2Vec from gensim.models.word2vec import LineSentencedef word_seg(source_file, target_file):with open(source_file) as f:with open(target_file, "w") as f1:line_num = 1line = f.readline()while line:print("---- processing ", line_num, "article----------------")a = jieba.cut(line)line_seg = " ".join(a)f1.writelines(line_seg)line_num = line_num+1line = f.readline()def w2v(target_file):with open(target_file) as f:sentences = LineSentence(f)model = Word2Vec(LineSentence(f), sg=1, vector_size=123, window=10, min_count=0, workers=15, sample=1e-3, hs=1, negative=0)# model = gensim.models.Word2Vec() # 建立一個(gè)空的模型對(duì)象# model.build_vocab(sentences) # 遍歷一次語(yǔ)料庫(kù)建立詞典# model.train(sentences) # 第二次遍歷語(yǔ)料庫(kù)建立神經(jīng)網(wǎng)絡(luò)模型# 輸出內(nèi)容print(model.wv["女兒"])print(model.wv.similarity('女兒', '錢(qián)鐘書(shū)'))print(model.wv.index_to_key)print(1)if __name__ =="__main__":source_file = "/home/pythonCode/practice_new/embedding_practice/we.txt"target_file = "/home/pythonCode/practice_new/embedding_practice/target.txt"# word_seg(source_file, target_file)w2v(target_file)

    詳見(jiàn)word2vec 中的數(shù)學(xué)原理詳解:word2vec 中的數(shù)學(xué)原理詳解 - peghoty - 博客園

    文章正在審核中... - 簡(jiǎn)書(shū)

    ?Word2Vec中的數(shù)學(xué):有道云筆記

    深入淺出Word2Vec原理解析:深入淺出Word2Vec原理解析 - 知乎

    10.1. 詞嵌入(word2vec) — 《動(dòng)手學(xué)深度學(xué)習(xí)》 文檔

    word2vec(cbow+skip-gram+hierarchical softmax+Negative sampling)模型深度解析 - 知乎

    深度學(xué)習(xí)推薦系統(tǒng)中各類(lèi)流行的 Embedding 方法(上) - AIQ

    總結(jié)

    以上是生活随笔為你收集整理的机器学习算法(十三):word2vec的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。