机器学习算法(十三):word2vec
目錄
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(哈夫曼樹)
3.5.2 預(yù)備知識
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若干問題的思考
3.10 python實(shí)現(xiàn)(gensim)
1 單詞表達(dá)?
1.1?Word embedding
? ? ? ? Embedding是數(shù)學(xué)領(lǐng)域的有名詞,是指某個(gè)對象 X 被嵌入到另外一個(gè)對象 Y 中,映射 f : X → Y ,例如有理數(shù)嵌入實(shí)數(shù)。
? ? ? ? Word embedding 是NLP中一組語言模型(language modeling)和特征學(xué)習(xí)技術(shù)(feature learning techniques)的總稱,這些技術(shù)會把詞匯表中的單詞或者短語(words or phrases)映射成由實(shí)數(shù)構(gòu)成的向量上。?
? ? ? ? Word embedding就是要從數(shù)據(jù)中自動學(xué)習(xí)?輸入空間到Distributed representation空間的映射f?。
? ? ? ? 最簡單的一種Word Embedding方法,就是基于詞袋(BOW)的One-Hot表示,還有另外一個(gè)方法:共現(xiàn)矩陣 (Cocurrence matrix)。
1.2 獨(dú)熱(One hot representation)
1.2.1 獨(dú)熱編碼介紹
? ? ? ? 獨(dú)熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態(tài)寄存器來對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):一是解決了分類器不好處理離散數(shù)據(jù)的問題,二是在一定程度上也起到了擴(kuò)充特征的作用。
- 缺點(diǎn):在文本特征表示上有些缺點(diǎn)就非常突出了。首先,它是一個(gè)詞袋模型,不考慮詞與詞之間的順序(文本中詞的順序信息也是很重要的);其次,它假設(shè)詞與詞相互獨(dú)立(在大多數(shù)情況下,詞與詞是相互影響的);最后,它得到的特征是離散稀疏的。
? ? ? ? 為什么得到的特征是離散稀疏的?
? ? ? ?上面舉例比較簡單,但現(xiàn)實(shí)情況可能不太一樣。比如如果將世界所有城市名稱作為語料庫的話,那這個(gè)向量會過于稀疏,并且會造成維度災(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īng)一個(gè)向量,向量中只有一個(gè)值為1,其余都為0。
? ? ? ? 能不能把詞向量的維度變小呢?
? ? ? ? Dristributed representation(詞向量)可以解決One hot representation的問題。
1.3?Dristributed representation(詞向量)
? ? ? ? 然而每個(gè)單詞彼此無關(guān)這個(gè)特點(diǎn)明顯不符合我們的現(xiàn)實(shí)情況。我們知道大量的單詞都是有關(guān)。
- 語義:girl和woman雖然用在不同年齡上,但指的都是女性。
- 復(fù)數(shù):word和words僅僅是復(fù)數(shù)和單數(shù)的差別。
- 時(shí)態(tài):buy和bought表達(dá)的都是“買”,但發(fā)生的時(shí)間不同。
? ? ? ? 所以用one hot representation的編碼方式,上面的特性都沒有被考慮到。
? ? ? ? 我們更希望用諸如“語義”,“復(fù)數(shù)”,“時(shí)態(tài)”等維度去描述一個(gè)單詞。每一個(gè)維度不再是0或1,而是連續(xù)的實(shí)數(shù),表示不同的程度。
? ? ? ? Dristributed representation可以解決One hot representation的問題,它的思路是通過訓(xùn)練,將每個(gè)詞都映射到一個(gè)較短的詞向量上來。所有的這些詞向量就構(gòu)成了向量空間,進(jìn)而可以用普通的統(tǒng)計(jì)學(xué)的方法來研究詞與詞之間的關(guān)系。這個(gè)較短的詞向量維度是多大呢?這個(gè)一般需要我們在訓(xùn)練時(shí)自己來指定。
? ? ? ? 比如下圖我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個(gè)維度來表示,King這個(gè)詞對應(yīng)的詞向量可能是(0.99,0.99,0.05,0.7)。當(dāng)然在實(shí)際情況中,我們并不能對詞向量的每個(gè)維度做一個(gè)很好的解釋。
? ? ? ? 我們將king這個(gè)詞從一個(gè)可能非常稀疏的向量所在的空間,映射到現(xiàn)在這個(gè)四維向量所在的空間,必須滿足以下性質(zhì):
(1)這個(gè)映射是單射(單射:任給x1和x2屬于X,若x1≠x2,則f(x1)≠f(x2),稱f為單射);
(2)映射之后的向量不會丟失之前的那種向量所含的信息。
? ? ? ? 這個(gè)過程稱為word embedding(詞嵌入),即將高維詞向量嵌入到一個(gè)低維空間。如圖
? ? ? ? 經(jīng)過我們一系列的降維神操作,有了用Dristributed representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關(guān)系了,比如我們將詞的維度降維到2維,有一個(gè)有趣的研究表明,用下圖的詞向量表示我們的詞時(shí),我們可以發(fā)現(xiàn):
? ? ? ? 出現(xiàn)這種現(xiàn)象的原因是,我們得到最后的詞向量的訓(xùn)練過程中引入了詞的上下文。
? ? ? ? You shall know a word by the company it keeps.
? ? ? ? 舉個(gè)例子:
? ? ? ? 你想到得到"learning"的詞向量,但訓(xùn)練過程中,你同時(shí)考慮了它左右的上下文,那么就可以使"learning"帶有語義信息了。通過這種操作,我們可以得到近義詞,甚至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)系來生成詞向量。
? ? ? ??
? ? ? ? 例如,現(xiàn)在我們的語料庫包括下面三份文檔資料:
? ? ? ? I like deep learning.?
? ? ? ? I like NLP.?
? ? ? ? I enjoy flying.
? ? ? ? ?作為示例,我們設(shè)定的窗口大小為1,也就是只看某個(gè)單詞周圍緊鄰著的那個(gè)單詞。此時(shí),將得到一個(gè)對稱矩陣——共現(xiàn)矩陣。因?yàn)樵谖覀兊恼Z料庫中,I 和 like做為鄰居同時(shí)出現(xiàn)在窗口中的次數(shù)是2,所以下表中I 和like相交的位置其值就是2。這樣我們也實(shí)現(xiàn)了將word變成向量的設(shè)想,在共現(xiàn)矩陣每一行(或每一列)都是對應(yīng)單詞的一個(gè)向量表示。
? ? ? ? 雖然Cocurrence matrix一定程度上解決了單詞間相對位置也應(yīng)予以重視這個(gè)問題。但是它仍然面對維度災(zāi)難。也即是說一個(gè)word的向量表示長度太長了。這時(shí),很自然地會想到SVD或者PCA等一些常用的降維方法。當(dāng)然,這也會帶來其他的一些問題,例如,我們的詞匯表中有新詞加入,那么就很難為他分配一個(gè)新的向量。
3?word2vec
3.1 word2vec介紹
? ? ? ? word2vec模型其實(shí)就是簡單化的神經(jīng)網(wǎng)絡(luò)。word2vec是用一個(gè)一層的神經(jīng)網(wǎng)絡(luò)(即CBOW)把one-hot形式的稀疏詞向量映射稱為一個(gè)n維(n一般為幾百)的稠密向量的過程。為了加快模型訓(xùn)練速度,其中的tricks包括Hierarchical softmax,negative sampling,Huffman Tree等。
? ? ? ? 在NLP中,最細(xì)粒度的對象是詞語。如果我們要進(jìn)行詞性標(biāo)注,用一般的思路,我們可以有一系列的樣本數(shù)據(jù)(x,y)。其中x表示詞語,y表示詞性。而我們要做的,就是找到一個(gè)x -> y的映射關(guān)系,傳統(tǒng)的方法包括Bayes,SVM等算法。但是我們的數(shù)學(xué)模型,一般都是數(shù)值型的輸入。但是NLP中的詞語,是人類的抽象總結(jié),是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉(zhuǎn)換成數(shù)值形式,或者說——嵌入到一個(gè)數(shù)學(xué)空間里,這種嵌入方式,就叫詞嵌入(word embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。
? ? ? ? 輸入是One-Hot Vector,Hidden Layer沒有激活函數(shù),也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。當(dāng)這個(gè)模型訓(xùn)練好以后,我們并不會用這個(gè)訓(xùn)練好的模型處理新的任務(wù),我們真正需要的是這個(gè)模型通過訓(xùn)練數(shù)據(jù)所學(xué)得的參數(shù),例如隱層的權(quán)重矩陣。
? ? ? ? 這個(gè)模型是如何定義數(shù)據(jù)的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words)與Skip-Gram兩種模型。
- CBOW模型的訓(xùn)練輸入是某一個(gè)特征詞的上下文相關(guān)的詞對應(yīng)的詞向量,而輸出就是這特定的一個(gè)詞的詞向量?!?/li>
- Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個(gè)詞的詞向量,而輸出是特定詞對應(yīng)的上下文詞向量。
? ? ? ? CBOW對小型數(shù)據(jù)庫比較合適,而Skip-Gram在大型語料中表現(xiàn)更好。
? ? ? ? Word2Vec模型實(shí)際上分為了兩個(gè)部分,第一部分為建立模型,第二部分是通過模型獲取嵌入詞向量。Word2Vec的整個(gè)建模過程實(shí)際上與自編碼器(auto-encoder)的思想很相似,即先基于訓(xùn)練數(shù)據(jù)構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò),當(dāng)這個(gè)模型訓(xùn)練好以后,我們并不會用這個(gè)訓(xùn)練好的模型處理新的任務(wù),我們真正需要的是這個(gè)模型通過訓(xùn)練數(shù)據(jù)所學(xué)得的參數(shù),例如隱層的權(quán)重矩陣——后面我們將會看到這些權(quán)重在Word2Vec中實(shí)際上就是我們試圖去學(xué)習(xí)的“word vectors”?;谟?xùn)練數(shù)據(jù)建模的過程,我們給它一個(gè)名字叫“Fake Task”,意味著建模并不是我們最終的目的。
上面提到的這種方法實(shí)際上會在無監(jiān)督特征學(xué)習(xí)(unsupervised feature learning)中見到,最常見的就是自編碼器(auto-encoder):通過在隱層將輸入進(jìn)行編碼壓縮,繼而在輸出層將數(shù)據(jù)解碼恢復(fù)初始狀態(tài),訓(xùn)練完成后,我們會將輸出層“砍掉”,僅保留隱層。3.2?CBOW模型
? ? ? ? 連續(xù)詞袋模型與跳字模型類似。與跳字模型最大的不同在于,連續(xù)詞袋模型假設(shè)基于某中心詞在文本序列前后的背景詞來生成該中心詞。在同樣的文本序列“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è)詞)框架說起。
如上圖所示:
- input layer輸入的X是單詞的one-hot representation(考慮一個(gè)詞表V,里面的每一個(gè)詞??都有一個(gè)編號i∈{1,...,|V|},那么詞??的one-hot表示就是一個(gè)維度為|V|的向量,其中第i個(gè)元素值非零,其余元素全為0,例如:);
- 輸入層到隱藏層之間有一個(gè)權(quán)重矩陣W,隱藏層得到的值是由輸入X乘上權(quán)重矩陣得到的(細(xì)心的人會發(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)過softmax函數(shù),將輸出向量中的每一個(gè)元素歸一化到0-1之間的概率,概率最大的,就是預(yù)測的詞。
?3.2.2?CBOW Multi-Word Context Model
? ? ? ? ?把單個(gè)輸入換成多個(gè)輸入(劃紅線部分)。
? ? ? ? ? 因?yàn)檫B續(xù)詞袋模型的背景詞有多個(gè),我們將這些背景詞向量取平均,然后使用和跳字模型一樣的方法來計(jì)算條件概率。設(shè)和分別表示詞典中索引為 i 的詞作為背景詞和中心詞的向量(注意符號的含義與跳字模型中的相反)。設(shè)中心詞在詞典中索引為 c,背景詞,在詞典中索引為,那么給定背景詞生成中心詞的條件概率
? ? ? ? ? ? ? ? ? ??
? ? ? ? 為了讓符號更加簡單,我們記,且,那么上式可以簡寫成:
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 給定一個(gè)長度為 T 的文本序列,設(shè)時(shí)間步 t 的詞為,背景窗口大小為m。連續(xù)詞袋模型的似然函數(shù)是由背景詞生成任一中心詞的概率:
? ? ? ? ? ? ? ?
? ? ? ? 此處使用點(diǎn)積來表示相似性,兩個(gè)向量的相似性越大,他們的點(diǎn)積就越大。
?3.2.3?訓(xùn)練連續(xù)詞袋模型
? ? ? ? 訓(xùn)練連續(xù)詞袋模型同訓(xùn)練跳字模型基本一致。連續(xù)詞袋模型的最大似然估計(jì):
? ? ? ???
? ? ? ? 等價(jià)于最小化損失函數(shù):
? ? ? ? ? ? ?
? ? ? ? ? =? ?
? ? ? ? ?注意到:
? ? ? ? ? ? ? ? ? 因?yàn)?#xff1a;
? ? ? ? ? ? ? ? ? ?所以:
? ? ? ? 通過微分,我們可以計(jì)算出上式中條件概率的對數(shù)有關(guān)任一背景詞向量的梯度:
? ? ? ??
? ? ? ? 有關(guān)其他詞向量的梯度同理可得。同跳字模型不一樣的一點(diǎn)在于,我們一般使用連續(xù)詞袋模型的背景詞向量作為詞的表征向量。
3.3?Skip-gram 模型
3.3.1?Skip-gram 模型介紹
? ? ? ? 從直觀上理解,Skip-Gram是通過給定輸入,即input word來預(yù)測上下文。
? ? ??
- 輸入層(Input Layer):輸入層的輸入是數(shù)據(jù)的數(shù)字表示,那么該如何用數(shù)字表示文本數(shù)據(jù)呢?其實(shí),它的輸入使用的是one-hot編碼。假設(shè)有n個(gè)詞,則每一個(gè)詞可以用一個(gè)n維的向量來表示,這個(gè)n維向量只有一個(gè)位置是1,其余位置都是0。
- 隱藏層(Hidden Layer):隱藏層的神經(jīng)單元數(shù)量,代表著每一個(gè)詞用向量表示的維度大小。假設(shè)我們的hidden_size取300,也就是我們的隱藏層有300個(gè)神經(jīng)元,那么對于每一個(gè)詞,我們的向量表示就是一個(gè)1*N的向量。有多少個(gè)詞,就有多少個(gè)這樣的向量。所以對于輸入層和隱藏層之間的權(quán)值矩陣W,它的形狀應(yīng)該是[vocab_size, hidden_size]的矩陣。
- 輸出層(Output Layer):從上面的圖上可以看出來,輸出層是一個(gè)[vocab_size]大小的向量,每一個(gè)值代表著輸出一個(gè)詞的概率。為什么要這樣輸出?因?yàn)槲覀兿胍?#xff0c;對于一個(gè)輸入詞,它接下來的詞最有可能的若干個(gè)詞是哪些,換句話說,我們需要知道它接下來的詞的概率分布。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。
? ? ? ? 跳字模型假設(shè)基于某個(gè)詞來生成它在文本序列周圍的詞。舉個(gè)例子,假設(shè)文本序列是“the”“man”“l(fā)oves”“his”“son”。以“l(fā)oves”作為中心詞,設(shè)背景窗口大小為2。如圖10.1所示,跳字模型所關(guān)心的是,給定中心詞“l(fā)oves”,生成與它距離不超過2個(gè)詞的背景詞“the”“man”“his”“son”的條件概率,即?
? ? ? ? ??
? ? ? ? 假設(shè)給定中心詞的情況下,背景詞的生成是相互獨(dú)立的,那么上式可以改寫成
? ? ? ? 在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),也就是說我們僅選輸入詞前后各兩個(gè)詞和輸入詞進(jìn)行組合。下圖中,藍(lán)色代表input word,方框內(nèi)代表位于窗口內(nèi)的單詞。
? ? ? ??
? ? ? ?在跳字模型中,每個(gè)詞被表示成兩個(gè) d 維向量,用來計(jì)算條件概率。假設(shè)這個(gè)詞在詞典中索引為 i,當(dāng)它為中心詞時(shí)向量表示為 ,而為背景詞時(shí)向量表示為。設(shè)中心詞在詞典中索引為 c,背景詞在詞典中索引為 o,給定中心詞生成背景詞的條件概率可以通過對向量內(nèi)積做softmax運(yùn)算而得到:
? ? ? ? ? ? ? ? ? ??
? ? ? ? 其中詞典索引集。假設(shè)給定一個(gè)長度為 T 的文本序列,設(shè)時(shí)間步 t的詞為。假設(shè)給定中心詞的情況下背景詞的生成相互獨(dú)立,當(dāng)背景窗口大小為 m 時(shí),跳字模型的似然函數(shù)即給定任一中心詞生成所有背景詞的概率:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?這里小于1或大于T的時(shí)間步可以被忽略。
同款疑問: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的向量。
? ? ? ? 隱層出來的center word的向量去乘W2,此時(shí)實(shí)際是在計(jì)算centor word和context words中每個(gè)詞向量的similarity(logits),計(jì)算出的logits用softmax歸一化以后,再用label優(yōu)化就好了,label部分只有對應(yīng)的那個(gè)詞的位置是1,其余都是0。
3.3.2?訓(xùn)練跳字模型
? ? ? ? ?假設(shè)現(xiàn)在有一個(gè)文本序列:I, want, to, learn, NLP
? ? ? ? ?首先遍歷這句話,選取中心詞,假設(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ú)立的,這里很類似樸素貝葉斯的條件獨(dú)立性假設(shè),可以大大的簡化運(yùn)算。
? ? ? ? ?
? ? ? ? 上面模型介紹中也提到,輸出層通過一個(gè)softmax將結(jié)果轉(zhuǎn)換成了概率分布,因此計(jì)算的概率公式如下:
? ? ? ? ???
? ? ? ? ? ?其中分別代表上下文詞和中心詞,代表上下文詞詞向量和中心向量,是全體詞庫。這個(gè)概率就是給定中心詞的條件下,某個(gè)詞是上下文詞的概率。根據(jù)上面的簡化:
? ? ? ? ? ?每個(gè)詞的條件概率相互獨(dú)立,所以可以寫成連乘的形式:
? ? ? ?
? ? ? ?其中,t表示中心詞的位置,m是窗口大小這樣就得到了每個(gè)中心詞的計(jì)算上下文詞的概率,在這個(gè)式子中變量是上下文向量和中心詞向量,于 是只要改變參數(shù)使概率最大化就可以了。在這里使用極大似然估計(jì),首先對上式進(jìn)行化簡,對上式取負(fù)對數(shù):?
? ? ? ? ? ?
? ? ? ? 跳字模型的參數(shù)是每個(gè)詞所對應(yīng)的中心詞向量和背景詞向量。訓(xùn)練中我們通過最大化似然函數(shù)來學(xué)習(xí)模型參數(shù),即最大似然估計(jì)。這等價(jià)于最小化以下?lián)p失函數(shù):
? ? ? ? ? ? ??
? ? ? ? 如果使用隨機(jī)梯度下降,那么在每一次迭代里我們隨機(jī)采樣一個(gè)較短的子序列來計(jì)算有關(guān)該子序列的損失,然后計(jì)算梯度來更新模型參數(shù)。梯度計(jì)算的關(guān)鍵是條件概率的對數(shù)有關(guān)中心詞向量和背景詞向量的梯度。根據(jù)定義,首先看到
? ? ? ? ? ? ? ?
? ? ? ? 通過微分,我們可以得到上式中的梯度
? ? ? ? ? ? ? ?
? ? ? ? 它的計(jì)算需要詞典中所有詞以為中心詞的條件概率。有關(guān)其他詞向量的梯度同理可得。
? ? ? ? 訓(xùn)練結(jié)束后,對于詞典中的任一索引為 i 的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量和。在自然語言處理應(yīng)用中,一般使用跳字模型的中心詞向量作為詞的表征向量。
? ? ? ?訓(xùn)練完畢后,輸入層的每個(gè)單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個(gè)矩陣(所有單詞的word embedding)也叫做 look up table,其實(shí)這個(gè)look up table就是矩陣W自身,也就是說,任何一個(gè)單詞的onehot乘以這個(gè)矩陣都將得到自己的詞向量。有了look up table就可以免去訓(xùn)練過程直接查表得到單詞的詞向量了。
注意:
- skip-gram并沒有考慮語序問題。
- 建模是fake task,真正目的是獲得權(quán)重矩陣,權(quán)重矩陣的每行分別是每個(gè)單詞的詞向量。
- 在隱層只是用了矩陣乘法將高維onehot向量映射為一個(gè)低維稠密向量,這個(gè)向量就是中心詞向量,并沒有使用激活函數(shù)。
- 在輸出層是將隱層輸出的中心詞向量和上下文詞向量相乘后輸入softmax分類器,最終輸出的是概率分布。
- 在訓(xùn)練時(shí)每個(gè)詞都會交替變成中心詞向量和上下文詞向量
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算法,對低頻詞敏感;默認(rèn)sg=0為CBOW算法。
? ? ? ? 其余參數(shù)說明參見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)練語料庫。是可迭代列表,但是對于較大的語料庫,可以考慮直接從磁盤/網(wǎng)絡(luò)傳輸句子的迭代。對于大語料集,建議使用BrownCorpus,Text8Corpus或lineSentence構(gòu)建。\n",
? ? "# 2. sg=1是skip-gram算法,對低頻詞敏感;默認(rèn)sg=0為CBOW算法。\n",
? ? "# 3. size(int) 是輸出詞向量的維數(shù),默認(rèn)值是100。這個(gè)維度的取值與我們的語料的大小相關(guān),比如小于100M的文本語料,則使用默認(rèn)值一般就可以了。如果是超大的語料,建議增大維度。值太小會導(dǎo)致詞映射因?yàn)闆_突而影響結(jié)果,值太大則會耗內(nèi)存并使算法計(jì)算變慢,一般值取為100到200之間,不過見的比較多的也有300維的。\n",
? ? "# 4. alpha: 是初始的學(xué)習(xí)速率,在訓(xùn)練過程中會線性地遞減到min_alpha。\n",
? ? "# 5. window(int)即詞向量上下文最大距離,是一個(gè)句子中當(dāng)前單詞和預(yù)測單詞之間的最大距離,skip-gram和cbow算法是基于滑動窗口來做預(yù)測,window越大,則和某一詞較遠(yuǎn)的詞也會產(chǎn)生上下文關(guān)系。默認(rèn)值為5。windows越大所需要枚舉的預(yù)測此越多,計(jì)算的時(shí)間越長。對于一般的語料這個(gè)值推薦在[5,10]之間。\n",
? ? "# 6. min_count 忽略所有頻率低于此值的單詞。默認(rèn)值為5。\n",
? ? "# 7. max_vocab_size: 設(shè)置詞向量構(gòu)建期間的RAM限制,設(shè)置成None則沒有限制。\n",
? ? "# 8. seed: 用于隨機(jī)數(shù)發(fā)生器。與初始化詞向量有關(guān)。\n",
? ? "# 9. workers表示訓(xùn)練詞向量時(shí)使用的線程數(shù),默認(rèn)是當(dāng)前運(yùn)行機(jī)器的處理器核數(shù)。workers控制訓(xùn)練的并行,此參數(shù)只有在安裝了Cpython后才有效,否則只能使用單核。\n",
? ? "# 10. min_alpha: 由于算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機(jī)梯度下降中每輪的迭代步長可以由iter,alpha,?min_alpha一起得出。對于大語料,需要對alpha,?min_alpha,iter一起調(diào)參,來選擇合適的三個(gè)值。\n",
? ? "# 11. hs: 即我們的word2vec兩個(gè)解法的選擇了,如果是0, 則是Negative Sampling,是1的話并且負(fù)采樣個(gè)數(shù)negative大于0, 則是Hierarchical Softmax。默認(rèn)是0即Negative Sampling。\n",
? ? "# 12. negative:如果大于零,則會采用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ù)來初始化權(quán)重,默認(rèn)使用python的hash函數(shù)。\n",
? ? "# 15.?iter: 隨機(jī)梯度下降法中迭代的最大次數(shù),默認(rèn)是5。對于大語料,可以增大這個(gè)值。\n",
? ? "# 16. trim_rule: 用于設(shè)置詞匯表的整理規(guī)則,指定那些單詞要留下,哪些要被刪除??梢栽O(shè)置為None(min_count會被使用)。\n",
? ? "# 17. sorted_vocab: 如果為1(默認(rèn)),則在分配word index 的時(shí)候會先對單詞基于頻率降序排序。\n",
? ? "# 18. batch_words:每一批的傳遞給線程的單詞的數(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-詞嵌入模型-自然語言處理-深度學(xué)習(xí)-pytorch_嗶哩嗶哩_bilibili
具體內(nèi)容見 Word2Vec中的數(shù)學(xué):???????有道云筆記4.1 節(jié)
? ? ?基于hierarchical Softmax 的?word2vec 與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)詞向量語言模型相比有兩個(gè)改進(jìn):
- 首先,對于從輸入層到隱藏層的映射,沒有采取神經(jīng)網(wǎng)絡(luò)的線性變換加激活函數(shù)的方法,而是采用簡單的對所有輸入詞向量求和并取平均的方法。比如輸入的是三個(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 的采用了霍夫曼樹來代替從隱藏層到輸出softmax層的映射。
? ? ? ? word2vec在最后預(yù)測輸出向量時(shí)候,大小是1*V的向量,本質(zhì)上是個(gè)多分類的問題。通過hierarchical softmax的技巧,把V分類的問題變成了log(V)次二分類。
3.5.1?Huffman Tree(哈夫曼樹)
? ? ? ? 哈夫曼樹是一種帶權(quán)路徑長度最短的二叉樹,也稱為最優(yōu)二叉樹。
哈夫曼樹的構(gòu)造:
?例子:有A B C D 四個(gè)詞,數(shù)字表示詞頻,構(gòu)造過程如下:
?哈夫曼樹編碼:
左子樹為0,右子樹為1:
? ? ? ? ?那么D編碼為0,B編碼為10,C編碼為110,A編碼為111。
3.5.2 預(yù)備知識
3.5.3?word2vec的hierarchical softmax結(jié)構(gòu)
?
- 輸入層:是指??中所包含的??個(gè)詞的詞向量?
- 投影層:指的是直接對??個(gè)詞向量進(jìn)行累加,累加之后得到下式:
- 輸出層:是一個(gè)Huffman樹,其中葉子節(jié)點(diǎn)共N個(gè),對應(yīng)于N個(gè)單詞,非葉子節(jié)點(diǎn)N-1個(gè)(對應(yīng)上圖中標(biāo)成黃色的結(jié)點(diǎn))。Word2Vec基于層次Softmax的方式主要的精華部分都集中在了哈夫曼樹這部分
? ? ? ? ?
? ? ? ? 和傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)輸出不同的是,word2vec的hierarchical softmax結(jié)構(gòu)是把輸出層改成了一顆哈夫曼樹,其中圖中
- 白色的葉子節(jié)點(diǎn)表示詞匯表中所有的|V|個(gè)詞,
- 黑色節(jié)點(diǎn)表示非葉子節(jié)點(diǎn),
? ? ? ? 每一個(gè)葉子節(jié)點(diǎn)也就是每一個(gè)單詞,都對應(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,我們對這個(gè)結(jié)果進(jìn)行sigmoid之后,得到節(jié)點(diǎn)往左子樹走的概率p,1-p則為往右子樹走的概率。??
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)一樣,它也包括三層:輸入層、投影層和輸出層。下面以樣本??為例,對這三層做簡要說明。
- 輸入層:只含當(dāng)前樣本的中心詞??的詞向量??。
- 投影層:這是個(gè)恒等投影,把??投影到??。因此,這個(gè)投影層其實(shí)是多余的,這里之所以保留投影層主要是方便和CBOW模型的網(wǎng)絡(luò)結(jié)構(gòu)做對比。
- 輸出層:和CBOW模型一樣,輸出層也是一顆Huffman樹。
3.6.2?Skip-gram的目標(biāo)函數(shù)
?至此,已經(jīng)推導(dǎo)出了Skip-gram模型的目標(biāo)函數(shù)(公式11),接下來同樣利用隨機(jī)梯度上升法對其進(jìn)行優(yōu)化。而梯度類算法的關(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-詞嵌入模型-自然語言處理-深度學(xué)習(xí)-pytorch_嗶哩嗶哩_bilibili
negative sampling解決了之前說的兩個(gè)問題:
- 僅對K個(gè)參數(shù)進(jìn)行采樣
- 放棄softmax函數(shù),采用sigmoid函數(shù),這樣就不存在先求一遍窗口中所有單詞的‘“得分”的情況了。
? ? ? ? 本質(zhì)上是對訓(xùn)練集進(jìn)行了采樣,從而減小了訓(xùn)練集的大小。
? ? ? ? 本節(jié)將介紹基于Negative Sampling的CBOW和Skip-gram模型。Negative Sampling(簡稱為NEG)是Tomas Mikolov等人在論文《Distributed Representations of Words and Phrases and their Compositionality》中提出的,它是NCE(Noise Contrastive Estimation)的一個(gè)簡化版,目的是用來提高訓(xùn)練速度并改善所得詞向量的質(zhì)量。與Hierarchical Softmax相比,NEG不再使用復(fù)雜的Huffman樹,而是利用相對簡單的隨機(jī)負(fù)采樣,能大幅度提高性能,因而可作為Hierarchical Softmax的一種替代。
? ? ? ? NCE 的細(xì)節(jié)有點(diǎn)復(fù)雜,其本質(zhì)是利用已知的概率密度函數(shù)來估計(jì)未知的概率密度函數(shù)。簡單來說,假設(shè)未知的概率密度函數(shù)為X,已知的概率密度為Y,如果得到了X和Y的關(guān)系,那么X也就可以求出來了。具體可以參考論文《 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若干問題的思考
???????【Embedding】Word2Vec:詞嵌入的一枚銀彈 - 云+社區(qū) - 騰訊云
(1)Word2Vec兩個(gè)算法模型的原理是什么,網(wǎng)絡(luò)結(jié)構(gòu)怎么畫?
(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ù)測上下文,理論上來說應(yīng)該是 CBOW 的效果更好,但實(shí)際情況卻恰恰相反。我覺得可能是因?yàn)?CBOW 是取上下文的輸入向量的質(zhì)心從而導(dǎo)致一部分有效信息損失,而 Skip-Gram 雖然看起來荒唐,但每個(gè)單詞都會得到單獨(dú)的訓(xùn)練不會損失有效信息,其實(shí) Skip-Gram 比 CBOW 的效果好,主要是針對低頻詞而言,舉個(gè)例子,讓你補(bǔ)全 It is a ___ day,是不是突然有很多可能的答案,你大概率會填寫一個(gè)高頻詞匯,如:nice、sun 等,而不會想到要填寫 gorgeous,而給你 gorgeous 單詞,其特征很明顯會想到這可以用來形容 day、moon、girl 等等。其次 gorgeous 本身用量就沒有 nice 那么多,如果再和其他上下文放在一起取質(zhì)心,其很容易被忽略,從而沒法充分訓(xùn)練。
? ? ? ? ? 速度:我覺得 Skip-Gram 的速度慢可能是因?yàn)槠漕A(yù)測值比較多,需要分別計(jì)算多個(gè) Softmax,時(shí)間復(fù)雜度為 O(kn),而 CBOW 雖然也有多個(gè)輸入,但我們求其質(zhì)心簡化了操作,時(shí)間復(fù)雜度為 O(n)。
? ? ? ? 需要說明的是,當(dāng)語料較少時(shí)使用CBOW方法比較好,當(dāng)語料較多時(shí)采用skip-gram表示比較好。
(7)Word2Vec加速訓(xùn)練的方法有哪些?
? ? ? ? 當(dāng)語料比較大時(shí),詞典規(guī)模會比較大,求softmax速度會變得很慢,嚴(yán)重影響了訓(xùn)練速度。此時(shí)有兩種方法進(jìn)行改進(jìn):(1)分層softmax; (2)負(fù)采樣。分層softmax的原理很簡單,就是構(gòu)建Huffman樹(使得計(jì)算概率的次數(shù)最小),正例詞都在葉子結(jié)點(diǎn),其他詞為中間節(jié)點(diǎn),分層進(jìn)行softmax。負(fù)采樣的思想也很簡單,就是不計(jì)算所有詞的概率算softmax,而是采樣一些負(fù)樣本,算對數(shù)sigmoid函數(shù),近似softmax。具體原理就是最大化正例概率,最小化負(fù)例出現(xiàn)的概率。
(8)介紹下Negative Sampling,對詞頻低的和詞頻高的單詞有什么影響?為什么?
? ? ? ? 通過負(fù)采樣避免更新全部參數(shù),對詞頻高的友好;
(9)Word2Vec和隱狄利克雷模型(LDA)有什么區(qū)別與聯(lián)系?
? ? ? ? 談到Word2Vec與LDA的區(qū)別和聯(lián)系,首先,LDA是利用文檔中單詞的共現(xiàn)關(guān)系來對單詞按主題聚類,也可以理解為對“文檔-單詞”矩陣進(jìn)行分解,得到“文檔-主題”和“主題-單詞”兩個(gè)概率分布。而Word2Vec其實(shí)是對“上下文-單詞”矩陣進(jìn)行學(xué)習(xí),其中上下文由周圍的幾個(gè)單詞組成,由此得到的詞向量表示更多地融入上下文共現(xiàn)的特征。也就是說,如果兩個(gè)單詞所對應(yīng)的Word2Vec向量相似度較高,那么它們很可能經(jīng)常在同樣的上下文中出現(xiàn)。需要說明的是,上述分析的是?
? ? ? ? LDA與Word2Vec的不同,不應(yīng)該作為主題模型和詞嵌入兩類方法的主要差異。主題模型通過一定的結(jié)構(gòu)調(diào)整可以基于“上下文-單詞”矩陣進(jìn)行主題推理。同樣地,詞嵌入方法也可以根據(jù)“文檔-單詞”矩陣學(xué)習(xí)出詞的隱含向量表示。主題模型和詞嵌入兩類方法最大的不同其實(shí)在于模型本身,主題模型是一種基于概率圖模型的生成式模型,其似然函數(shù)可以寫成若干條件概率連乘的形式,其中包括需要推測的隱含變量(即主題);而詞嵌入模型一般表達(dá)為神經(jīng)網(wǎng)絡(luò)的形式,似然函數(shù)定義在網(wǎng)絡(luò)的輸出之上,需要通過學(xué)習(xí)網(wǎng)絡(luò)的權(quán)重以得到單詞的稠密向量表示。
(10)介紹下Hierarchical Softmax的計(jì)算過程,怎么把 Huffman 放到網(wǎng)絡(luò)中的?參數(shù)是如何更新的?對詞頻低的和詞頻高的單詞有什么影響?為什么?
? ? ? ? Hierarchical Softmax利用了Huffman樹依據(jù)詞頻建樹,詞頻大的節(jié)點(diǎn)離根節(jié)點(diǎn)較近,詞頻低的節(jié)點(diǎn)離根節(jié)點(diǎn)較遠(yuǎn),距離遠(yuǎn)參數(shù)數(shù)量就多,在訓(xùn)練的過程中,低頻詞的路徑上的參數(shù)能夠得到更多的訓(xùn)練,所以效果會更好。所以 Hierarchical Softmax 對詞頻低的單詞效果會更好。
(11)Word2Vec有哪些參數(shù),有沒有什么調(diào)參的建議?
- Skip-Gram 的速度比CBOW慢一點(diǎn),小數(shù)據(jù)集中對低頻次的效果更好;
- Sub-Sampling Frequent Words可以同時(shí)提高算法的速度和精度,Sample 建議取值為??;
- Hierarchical Softmax對低詞頻的更友好;
- Negative Sampling對高詞頻更友好;
- 向量維度一般越高越好,但也不絕對;
- Window Size,Skip-Gram一般10左右,CBOW一般為5左右。
(12)Word2Vec有哪些局限性?
Word2Vec作為一個(gè)簡單易用的算法,其也包含了很多局限性:
- Word2Vec只考慮到上下文信息,而忽略的全局信息;
- Word2Vec只考慮了上下文的共現(xiàn)性,而忽略的了彼此之間的順序性;
?(13)Hierarchical Softmax 方法中哈夫曼樹是如何初始化生成的?也就是哈夫曼樹是如何構(gòu)建的呢?
答:Hierarchical Softmax 依據(jù)詞頻構(gòu)建 Huffman 樹,詞頻大的節(jié)點(diǎn)離根節(jié)點(diǎn)較近,詞頻低的節(jié)點(diǎn)離根節(jié)點(diǎn)較遠(yuǎn),距離遠(yuǎn)參數(shù)數(shù)量就多。
(14)Negative Sampling 是一種什么采樣方式?是均勻采樣還是其它采樣方法?
答:詞典?D?中的詞在語料?C?中出現(xiàn)的次數(shù)有高有低,對于那些高頻詞,被選為負(fù)樣本的概率就應(yīng)該比較大,反之,對于那些低頻詞,其被選中的概率就應(yīng)該比較小。這就是我們對采樣過程的一個(gè)大致要求,本質(zhì)上就是一個(gè)帶權(quán)采樣問題。
(15)詳細(xì)介紹一下 Word2Vec 中負(fù)采樣方法?
答:先將概率以累積概率分布的形式分布到一條線段上,以?a=0.2,b=0.3,c=0.5?為例,?a所處線段為[0,0.2]?,b所處線段為?[0.2,0.5]?,?c?所處線段為?[0.5,1]?,然后定義一個(gè)大小為M?的數(shù)組,并把數(shù)組等距離劃分為?m個(gè)單元,然后與上面的線段做一次映射,這樣我們便知道了數(shù)組內(nèi)的每個(gè)單元所對應(yīng)的字符了,這種情況下算法的時(shí)間復(fù)雜度為O(1)?,空間復(fù)雜度為O(M)?,?m越小精度越大。
(16)gensim中word2vec 結(jié)果解釋
syn0數(shù)組實(shí)際上保存了原始的單詞向量。從用于訓(xùn)練單詞向量的神經(jīng)網(wǎng)絡(luò)的角度來看,這些向量是一個(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ù),線程里面初始化就是:
?(17)word2vec增量訓(xùn)練
【技術(shù)分享】修改word2vec源碼實(shí)現(xiàn)詞向量增量更新 - 云+社區(qū) - 騰訊云
基于Gensim實(shí)現(xiàn)word2vec詞向量增量訓(xùn)練_Steven灬的博客-CSDN博客
(18)word2vec沒有對詞向量進(jìn)行正則化?
word2vec沒有對詞向量進(jìn)行正則化? - 知乎:
word2vec在嘗試用哈夫曼和EM的思路為自然語言提供了新的正則方案。
word2vec的前身是同樣基于CBOW和Skip-gram的概率多層神經(jīng)網(wǎng)絡(luò),其本質(zhì)類似于一個(gè)Encoder-Decoder模型,前端將文字映射到一定維度模擬適用于自然語言的降維到詞向量的過程,達(dá)到去噪的效果,而Decoder則起到還原詞向量到文字的作用。而既然是神經(jīng)網(wǎng)絡(luò),當(dāng)然可以采用傳統(tǒng)正則,不管是regularize還是dropout。
而這個(gè)方案在自然語言并不是個(gè)很優(yōu)的解,因?yàn)椴还苁荂BOW還是Skip-gram都要求用滑窗對文本遍歷,也就意味著樣本遠(yuǎn)遠(yuǎn)多于正常的模型,這時(shí)候regularize或是dropout顯得過慢。word2vec選擇將輸出換為哈夫曼樹,這樣在訓(xùn)練過程中,每當(dāng)前端神經(jīng)網(wǎng)絡(luò)產(chǎn)生出Encoder過后的詞向量的預(yù)測,哈夫曼樹會對其產(chǎn)生一個(gè)最小熵的編碼,也就類似于求當(dāng)前詞向量方式的Expectation,而后下次再做Encoder時(shí),就會用這個(gè)局部最優(yōu)的Expectation去生成預(yù)測,也就是M的過程。而哈弗曼樹編碼最小對應(yīng)著一個(gè)足夠短的詞向量,這樣才能盡可能少的作樹的分叉。因此在word2vec通過E過程和M過程的相互影響,用哈弗曼樹對詞向量進(jìn)行一定程度的正則。而這種正則是自適應(yīng)的,比傳統(tǒng)人為設(shè)置超參數(shù)的正則要更快更好。
word2vec中目標(biāo)函數(shù)為什么不用加正則化項(xiàng)?_技術(shù)交流_??途W(wǎng):
加正則的本質(zhì)是減少數(shù)據(jù)中的誤差對模型的影響。word2vec中輸入數(shù)據(jù)是one hot encoding沒有誤差所以不用加。
靈魂拷問之word2vec - 知乎
(19)cbow 與 skip-gram的比較?
- CBOW是利用上下文預(yù)測中心詞,Skip-gram是利用中心詞預(yù)測上下文
- Skip-gram效果比CBOW好。?
- Skip-gram訓(xùn)練時(shí)間長,但是對低頻詞(生僻詞)效果好;CBOW訓(xùn)練時(shí)間短,對低頻詞效果比較差。
為什么?
? ? ? ? cbow和skip-gram都是在word2vec中用于將文本進(jìn)行向量表示的實(shí)現(xiàn)方法,具體的算法實(shí)現(xiàn)細(xì)節(jié)可以去看word2vec的原理介紹文章。我們這里大體講下兩者的區(qū)別,尤其注意在使用當(dāng)中的不同特點(diǎn)。
? ? ? ?在cbow方法中,是用周圍詞預(yù)測中心詞,從而利用中心詞的預(yù)測結(jié)果情況,使用GradientDesent方法,不斷的去調(diào)整周圍詞的向量。當(dāng)訓(xùn)練完成之后,每個(gè)詞都會作為中心詞,把周圍詞的詞向量進(jìn)行了調(diào)整,這樣也就獲得了整個(gè)文本里面所有詞的詞向量。
? ? ? ? 要注意的是, cbow的對周圍詞的調(diào)整是統(tǒng)一的:求出的gradient的值會同樣的作用到每個(gè)周圍詞的詞向量當(dāng)中去。
? ? ? ? 可以看到,cbow預(yù)測行為的次數(shù)跟整個(gè)文本的詞數(shù)幾乎是相等的(每次預(yù)測行為才會進(jìn)行一次backpropgation, 而往往這也是最耗時(shí)的部分),復(fù)雜度大概是O(V);
? ? ? ? 而skip-gram是用中心詞來預(yù)測周圍的詞。在skip-gram中,會利用周圍的詞的預(yù)測結(jié)果情況,使用GradientDecent來不斷的調(diào)整中心詞的詞向量,最終所有的文本遍歷完畢之后,也就得到了文本所有詞的詞向量。
? ? ? ? 可以看出,skip-gram進(jìn)行預(yù)測的次數(shù)是要多于cbow的:因?yàn)?strong>每個(gè)詞在作為中心詞時(shí),都要使用周圍詞進(jìn)行預(yù)測一次???????。這樣相當(dāng)于比cbow的方法多進(jìn)行了K次(假設(shè)K為窗口大小),因此時(shí)間的復(fù)雜度為O(KV),訓(xùn)練時(shí)間要比cbow要長。
? ? ? ? 但是在skip-gram當(dāng)中,每個(gè)詞都要受到周圍的詞的影響,每個(gè)詞在作為中心詞的時(shí)候,都要進(jìn)行K次的預(yù)測、調(diào)整。因此, 當(dāng)數(shù)據(jù)量較少,或者詞為生僻詞出現(xiàn)次數(shù)較少時(shí), 這種多次的調(diào)整會使得詞向量相對的更加準(zhǔn)確。因?yàn)楸M管cbow從另外一個(gè)角度來說,某個(gè)詞也是會受到多次周圍詞的影響(多次將其包含在內(nèi)的窗口移動),進(jìn)行詞向量的跳幀,但是他的調(diào)整是跟周圍的詞一起調(diào)整的,grad的值會平均分到該詞上, 相當(dāng)于該生僻詞沒有收到專門的訓(xùn)練,它只是沾了周圍詞的光而已。?
? ?? ? 因此,從更通俗的角度來說:
? ? ? ?在skip-gram里面,每個(gè)詞在作為中心詞的時(shí)候,實(shí)際上是 1個(gè)學(xué)生 VS K個(gè)老師,K個(gè)老師(周圍詞)都會對學(xué)生(中心詞)進(jìn)行“專業(yè)”的訓(xùn)練,這樣學(xué)生(中心詞)的“能力”(向量結(jié)果)相對就會扎實(shí)(準(zhǔn)確)一些,但是這樣肯定會使用更長的時(shí)間;
? ? ? ? cbow是 1個(gè)老師 VS K個(gè)學(xué)生,K個(gè)學(xué)生(周圍詞)都會從老師(中心詞)那里學(xué)習(xí)知識,但是老師(中心詞)是一視同仁的,教給大家的一樣的知識。至于你學(xué)到了多少,還要看下一輪(假如還在窗口內(nèi)),或者以后的某一輪,你還有機(jī)會加入老師的課堂當(dāng)中(再次出現(xiàn)作為周圍詞),跟著大家一起學(xué)習(xí),然后進(jìn)步一點(diǎn)。因此相對skip-gram,你的業(yè)務(wù)能力肯定沒有人家強(qiáng),但是對于整個(gè)訓(xùn)練營(訓(xùn)練過程)來說,這樣肯定效率高,速度更快。
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è)空的模型對象# model.build_vocab(sentences) # 遍歷一次語料庫建立詞典# model.train(sentences) # 第二次遍歷語料庫建立神經(jīng)網(wǎng)絡(luò)模型# 輸出內(nèi)容print(model.wv["女兒"])print(model.wv.similarity('女兒', '錢鐘書'))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)詳見word2vec 中的數(shù)學(xué)原理詳解:word2vec 中的數(shù)學(xué)原理詳解 - peghoty - 博客園
文章正在審核中... - 簡書
?Word2Vec中的數(shù)學(xué):有道云筆記
深入淺出Word2Vec原理解析:深入淺出Word2Vec原理解析 - 知乎
10.1. 詞嵌入(word2vec) — 《動手學(xué)深度學(xué)習(xí)》 文檔
word2vec(cbow+skip-gram+hierarchical softmax+Negative sampling)模型深度解析 - 知乎
深度學(xué)習(xí)推薦系統(tǒng)中各類流行的 Embedding 方法(上) - AIQ
總結(jié)
以上是生活随笔為你收集整理的机器学习算法(十三):word2vec的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 护壁桩嵌入深度_桥梁钻孔灌注桩嵌岩深度规
- 下一篇: JVM原理和优化详解