談談Word2Vec的CBOW模型
阿新 • • 發佈:2018-12-29
0x00 背景
最近在做畢設,需要使用Google的word2vec。查閱了相關資料,總結後,寫下這篇。
0X01 簡介
word2vec是Google與2013年開源推出的一個用於獲取word vecter的工具包,利用神經網路為單詞尋找一個連續向量看空間中的表示。
word2vec有兩種網路模型,分別為:
Continous Bag of Words Model (CBOW) Skip-Gram Model
在開始之前,需要一些準備知識(統計語言模型):
吳軍博士的《數學之美》
0X02 CBOW網路模型
假設當前詞為W,Context(W)由W前後C個詞構成。
所以輸入層中有2c個詞向量,
v(Context(W)1), ······,v(Context(W)2c)
將輸入層的2c個向量累加,即
輸出層為一棵二叉樹,以詞庫中的詞作為葉子結點,並以詞頻為權重構造出來的Huffman樹,如果詞庫中有D個詞,則有D個葉子結點。
0X03 CBOW模型流程舉例
假設 Courpus = { I drik coffee everyday } ,根據 “I”“drink”“everyday”來預測“coffee”。
投影層將每個詞向量加起來,
這裡Xw即上圖Uo ,當Xw傳導到輸出層時,因為輸出層為一棵二叉樹,每一次分支都可視為進行一次二分類,將分到左邊為負類,分到右邊為正類。
根據sigmoid函式,可將二分類函式寫成:
所以,一個結點被分到正類的概率是:
被分到負類的概率是:
這裡Θ向量是待定引數。
將每個分支的概率相乘就是所需的 P( W | Context(W) )
對概率函式取對數,即
並對式子求 Xw的偏導 和 Θ 的偏導。
詳細過程在《word2vec中的數學原理詳解》
最終,通過大量的資料迭代,使用梯度下降更新W和W’,來最小化loss函式,訓練結束後的W就是詞向量的矩陣,任何一個單詞的One-Hot表示乘以這個矩陣W就可以得到其詞向量的表示。
0X04 word2vec的使用
我用的是python的gensim庫
from gensim.models.word2vec import Word2vec
model = Word2Vec(data_set,size,window,negative,iter)
model.save(file ) // 訓練完後儲存
model = Word2Vec.load(file)
model.wv['compute'] // 詞向量儲存在wv例項裡,得到“compute”的詞向量
model.wv.similarity('woman', 'man') // 求詞與詞之間的相關性
幾個重要的引數:
sg : 為0則cbow(預設),為1則Skip-gram
size:特徵向量的維度
window:預測詞與當前詞的最大距離
negative:if > 0 ,使用負樣本,通常5-20,預設5個噪聲詞
iter:詞庫的迭代次數