1. 程式人生 > >大白話講解word2vec到底在做些什麼

大白話講解word2vec到底在做些什麼

轉自https://blog.csdn.net/mylove0414/article/details/61616617

 

詞向量

word2vec也叫word embeddings,中文名“詞向量”,作用就是將自然語言中的字詞轉為計算機可以理解的稠密向量(Dense Vector)。在word2vec出現之前,自然語言處理經常把字詞轉為離散的單獨的符號,也就是One-Hot Encoder。

杭州 [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]1234

比如上面的這個例子,在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值為1,其餘都為0。但是使用One-Hot Encoder有以下問題。一方面,城市編碼是隨機的,向量之間相互獨立,看不出城市之間可能存在的關聯關係。其次,向量維度的大小取決於語料庫中字詞的多少。如果將世界所有城市名稱對應的向量合為一個矩陣的話,那這個矩陣過於稀疏,並且會造成維度災難。 
使用Vector Representations可以有效解決這個問題。Word2Vec可以將One-Hot Encoder轉化為低維度的連續值,也就是稠密向量,並且其中意思相近的詞將被對映到向量空間中相近的位置。 
如果將embed後的城市向量通過PCA降維後視覺化展示出來,那就是這個樣子。

我們可以發現,華盛頓和紐約聚集在一起,北京上海聚集在一起,且北京到上海的距離與華盛頓到紐約的距離相近。也就是說模型學習到了城市的地理位置,也學習到了城市地位的關係。

模型拆解

word2vec模型其實就是簡單化的神經網路。

輸入是One-Hot Vector,Hidden Layer沒有啟用函式,也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax迴歸。我們要獲取的dense vector其實就是Hidden Layer的輸出單元。有的地方定為Input Layer和Hidden Layer之間的權重,其實說的是一回事。 


CBOW與Skip-Gram模式

word2vec主要分為CBOW(Continuous Bag of Words)和Skip-Gram兩種模式。CBOW是從原始語句推測目標字詞;而Skip-Gram正好相反,是從目標字詞推測出原始語句。CBOW對小型資料庫比較合適,而Skip-Gram在大型語料中表現更好。 
對同樣一個句子:Hangzhou is a nice city。我們要構造一個語境與目標詞彙的對映關係,其實就是input與label的關係。 
這裡假設滑窗尺寸為1(滑窗尺寸……這個……不懂自己google吧-_-|||) 
CBOW可以製造的對映關係為:[Hangzhou,a]—>is,[is,nice]—>a,[a,city]—>nice 
Skip-Gram可以製造的對映關係為(is,Hangzhou),(is,a),(a,is), (a,nice),(nice,a),(nice,city)

訓練優化

額,到這裡,你可能會注意到,這個訓練過程的引數規模非常巨大。假設語料庫中有30000個不同的單詞,hidden layer取128,word2vec兩個權值矩陣維度都是[30000,128],在使用SGD對龐大的神經網路進行學習時,將是十分緩慢的。而且,你需要大量的訓練資料來調整許多權重,避免過度擬合。數以百萬計的重量數十億倍的訓練樣本意味著訓練這個模型將是一個野獸。 
一般來說,有Hierarchical Softmax、Negative Sampling等方式來解決。

推薦點其他word2vec學習資料吧


Word2Vec Tutorial—The Skip-Gram Model
Word Embedding Explained and Visualized
Vector Representation of Words
--------------------- 
作者:Scorpio_Lu 
來源:CSDN 
原文:https://blog.csdn.net/mylove0414/article/details/61616617 
版權宣告:本文為博主原創文章,轉載請附上博文連結!