cs224n 第二課:詞向量表示 word2vec

作者:deta 
時間:2018/07/26 

1、計算機中怎樣表達每個詞的含義了?

在英文中,一般用WordNet等分類資源來處理詞義,啥意思了?就像我們查中華字典一樣,查熊貓的解釋是:有胎盤的、活的、哺乳類動物, 通過這樣一種 is-a 的關係來處理詞義,自己可以裝上nltk包跑下課程上的代碼:

from nltk.corpus import wordnet as wn 
panda = wn.synset('panda.n.01')
hyper = lambda s: s.hypernyms()
list(panda.closure(hyper)

這種離散的表徵方式存在一些問題,會遺漏一些詞之間的信息,大量的基於規則和統計型NLP的工作都是將單詞作爲原子(最小)符號,用向量空間表示的話就是一個 one-hot 向量,命中某個單詞的得向量位置爲1,其他爲都是0,但是這種方法有很多缺點:

  • 詞彙表一般維度都很高
  • 不能體現 相似詞語之間的相關性,就比如通過one-hot 表示的 hotelmotel 是正交的

這裏寫圖片描述


另外一種思路就是通過每個詞在語料文本中的分佈相似性來代表某個單詞,可以通過生成一個稠密向量表示單詞來預測這個詞在語料庫中的上下文。通過神經網絡獲得詞嵌入向量的具體做法是通過定義一個模型,通過最大化給定中心詞的條件下出現語料中上下文的概率或者最小化損失函數:

p(context|wt)=...

損失函數可以表示:

J=1p(wt|wt)

其中 wt 表示中心詞所有的上下文。對於概率分不到額損失函數一般會問到交叉熵損失(爲什麼用交叉熵?常見的損失函數有哪些?有什麼優缺點? )

2、word2vec

兩個算法:

  • Skip-grams :給定目標中心詞預測上下文
  • CBOW(連續詞袋模型) : 通過上下文預測目標中心詞

兩種訓練方式:

  • Hierarchical softmax
  • Negative sampling

詳細的算法數學原理可以參考這個博客:點我

Skip-gram:

通過中心詞來預測上下文

這裏寫圖片描述

具體的算法細節:

對於詞彙表中的每個單詞t=1...T ,預測窗口大小爲m的每個上下文單詞,目標函數我們可以定義爲最大化在給定中心詞的情況下上下文出現的概率:

J(θ)=t=1Tmjmj0P(wt+j|wt;θ)

取負的對數似然:

J(θ)=1Tt=1Tmjmj0logP(wt+j|wt;θ)

對於 p(wt+j|wt)

p(o|c)=exp(uoTvc)w=1Vexp(uwTvc)

其中:

uTv=u.v=i=1muivi

oc 分別代表詞彙表的下標位置,分母中的V 代表詞彙表的大小,最開始訓練模型的時候都會將嵌入矩陣進行隨機初始化,vcuo 表示中心詞和外圍詞的向量表示,這樣最終訓練出來每個單詞有兩個不同的向量表示,這樣會讓訓練更簡單一些。

下圖是skipgram 訓練流程:

  • 通過輸入one-hot向量
  • 在最開始隨機初始化輸入嵌入矩陣中look up 找到對應的詞向量
  • 將詞向量與外圍嵌入矩陣 W 相乘得到一個V×1 的向量
  • 經過一個 softmax
  • 通過與實際語料的上下文one-hot 結果偏差優化

這裏寫圖片描述
其中模型的所有的參數集 θ ,每個單詞都有兩個詞向量,通過優化損失函數去獲得最終的詞向量表示:

這裏寫圖片描述

通過梯度下降最小化損失函數,不斷去優化更新詞向量:

這裏寫圖片描述
通過對vc 求偏導後發現,上式中的第2項通過計算上下文中可能出現的每一個單詞的概率來得到一個期望向量,它是所有可能的上下文向量的平均,用它們出現的似然值來加權,通過不斷調節模型中的向量值來使它們相等。對其他上下文向量也通過同樣的方式來優化。


爲了最小化損失函數,在語料中的所有窗口計算一次梯度進行更新:

θnew=θoldαθJ(θ)
while True:
    theta_grad = evaluate_gradient(J,corpus,theta)
    theta = theta - alpha * theta_grad

在實際應用中,一樣數據量會很大,所以不會每次處理完所有的語料之後進行一次梯度下降,而是會採用隨機梯度下降的方式,在對沒個窗口進行一次計算後來更新參數:

θnew=θoldαθJt(θ)
while True:
    theta_grad = evaluate_gradient(J,window,theta)
    theta = theta - alpha * theta_grad
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章