cs224n Lecture 2 :Word2Vec Skip-Gram CBOW Negative Sampling 總結

詞向量表示法

One-Hot表示法

Word2Vec是NLP裏面一個非常重要的模型,以往是將單詞映射成一個One-Hot向量。有兩個問題,一個是一旦詞彙表巨大,每個單詞的One-Hot向量維度十分巨大,比如10W個詞,單個單詞的維度就是10W。二是任意兩個非等向量都正交,乘積爲0,無法表示出單詞間的關係。對於語言而言,這顯然是不行的,各個單詞之間都或多或少有關係。

Word-Net表示法

後來引入了一種叫Word-Net的方法,把每一個單詞分到不同的類別裏去,比如“熊貓”,它的類別有“浣熊類”、“食肉動物”、“哺乳動物”,等等。比如英文“Good”,可以是形容詞、副詞、名詞。這樣做,的確比One-Hot好多了,可以表示出兩個單詞的關係,比如“狗”,也有“食肉”、“哺乳動物”等屬性,但問題在於,這種離散的表示法無法表示兩個單詞到底有多像。比如“狗”跟“熊貓”所屬的類別,幾乎沒有差別,但事實上,兩種動物無論從形態還是習性上,差別都挺大的。比如“Good”和“Expert”,兩者的所屬的類也幾乎一樣,但你不能說“I am good at xxxx”所表達的感情跟"I am an expert in xxx "一樣。

Word Vector表示法

爲了解決以上問題,引入了一種新的表示法——Word Vector。Word Vecor跟One-Hot形式倒是挺像的,都是一個向量,只不過詞向量的Ont-Hot所有元素只有1個1,而Word Vector的值,是不同的連續值。那麼如何得到這些不同詞向量的值呢?顯然,人爲去算是不可能的,這個時候就要靠學習算法了,讓計算機自己學得詞向量。如何學習呢?有兩種比較經典的算法,一種是Skip-Gram,一種是CBOW(Continuous Bag of Words 連續詞包)。

詞向量學習模型

Skip-Gram

SG模型的訓練過程,簡單來說

第一步:初始化中心詞矩陣上下文矩陣、滑窗/半徑”的小大。比如詞彙表有W個詞,每個詞D個維度(信息),滑窗大小爲4。

第二步:選定一箇中心詞,找到其上下文詞,對每個上下文詞,從中心詞矩陣中,找到中心詞的詞向量(1*D),與上下文詞矩陣相乘(W*D),得到一個W*1的輸出,對這個輸出進行Softmax,找到概率最大(argmax)那個,看是什麼詞,與真實的上下文詞進行比較,計算損失。

第三步:通過對損失函數進行梯度下降,更新中心詞矩陣上下文矩陣的參數,得到詞向量的結果。

具體過程可以查看:

SkipGram教程

CBOW

CBOW跟SG很像,反過來了,輸入不是一箇中心詞向量,而是這個中心詞上下文詞向量的平均,輸出則是這個中心詞。兩者的關係:

詞向量訓練優化

Hierarchical Softmax

一種方法是基於傳統的Softmax,有個問題,當詞彙量很大時,每次迭代計算量十分巨大,要把所有例子加起來算一下softmax,顯然不太可取。所以就有了改進的softmax,基於樹的結構,可以把計算量從o(V)減小到o(logV)

Negative Sampling

改進的方法就是Negative Sampling,每一次迭代,不再計算所有單詞,而是隻選擇幾個“負樣本”來進行計算,可以把計算量大大縮小。爲什麼這麼做是合理的?因爲在一個龐大的語料裏面,跟中心詞相關的詞很少,大部分詞都跟中心詞無關,是稀疏的。所以,乾脆就隨機選擇幾個詞,也不失一般性。

兩者具體的數學推導及原理,可以參考:

word2vec原理(三) 基於Negative Sampling的模型

論文可以參考Mikolov的:Distributed representations of words and phrases and their compositionality

代碼實現可以參考鄙人的:https://blog.csdn.net/csdn_inside/article/details/86308157

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章