轉載自:http://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]
- 1
- 2
- 3
- 4
比如上面的這個例子,在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值為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等方式來解決。