作者: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 表示的 和 是正交的
另外一種思路就是通過每個詞在語料文本中的分佈相似性來代表某個單詞,可以通過生成一個稠密向量表示單詞來預測這個詞在語料庫中的上下文。通過神經網絡獲得詞嵌入向量的具體做法是通過定義一個模型,通過最大化給定中心詞的條件下出現語料中上下文的概率或者最小化損失函數:
損失函數可以表示:
其中 表示中心詞所有的上下文。對於概率分不到額損失函數一般會問到交叉熵損失(爲什麼用交叉熵?常見的損失函數有哪些?有什麼優缺點? )
2、word2vec
兩個算法:
- Skip-grams :給定目標中心詞預測上下文
- CBOW(連續詞袋模型) : 通過上下文預測目標中心詞
兩種訓練方式:
- Hierarchical softmax
- Negative sampling
詳細的算法數學原理可以參考這個博客:點我
Skip-gram:
通過中心詞來預測上下文
具體的算法細節:
對於詞彙表中的每個單詞 ,預測窗口大小爲m的每個上下文單詞,目標函數我們可以定義爲最大化在給定中心詞的情況下上下文出現的概率:
取負的對數似然:
對於 :
其中:
和 分別代表詞彙表的下標位置,分母中的 代表詞彙表的大小,最開始訓練模型的時候都會將嵌入矩陣進行隨機初始化, 和 表示中心詞和外圍詞的向量表示,這樣最終訓練出來每個單詞有兩個不同的向量表示,這樣會讓訓練更簡單一些。
下圖是skipgram 訓練流程:
- 通過輸入one-hot向量
- 在最開始隨機初始化輸入嵌入矩陣中look up 找到對應的詞向量
- 將詞向量與外圍嵌入矩陣 相乘得到一個 的向量
- 經過一個 softmax層
- 通過與實際語料的上下文one-hot 結果偏差優化
其中模型的所有的參數集 ,每個單詞都有兩個詞向量,通過優化損失函數去獲得最終的詞向量表示:
通過梯度下降最小化損失函數,不斷去優化更新詞向量:
通過對 求偏導後發現,上式中的第2項通過計算上下文中可能出現的每一個單詞的概率來得到一個期望向量,它是所有可能的上下文向量的平均,用它們出現的似然值來加權,通過不斷調節模型中的向量值來使它們相等。對其他上下文向量也通過同樣的方式來優化。
爲了最小化損失函數,在語料中的所有窗口計算一次梯度進行更新:
while True:
theta_grad = evaluate_gradient(J,corpus,theta)
theta = theta - alpha * theta_grad
在實際應用中,一樣數據量會很大,所以不會每次處理完所有的語料之後進行一次梯度下降,而是會採用隨機梯度下降的方式,在對沒個窗口進行一次計算後來更新參數:
while True:
theta_grad = evaluate_gradient(J,window,theta)
theta = theta - alpha * theta_grad