1. 程式人生 > >談談Word2Vec的CBOW模型

談談Word2Vec的CBOW模型

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:詞庫的迭代次數