CS224n笔记3 高级词向量表示
本文轉自:http://www.hankcs.com/nlp/cs224n-advanced-word-vector-representations.html
這節課從傳統的基于計數的全局方法出發,過渡到結合兩者優勢的GloVe,并介紹了詞向量的調參與評測方法。
復習:word2vec的主要思路
-
遍歷整個語料庫中的每個詞
-
預測每個詞的上下文:
-
然后在每個窗口中計算梯度做SGD
SGD與詞向量
但每個窗口最多只有2m + 1個單詞,所以?θJt(θ)會非常稀疏:
實際上有正確答案需要去對比的只有窗口中的詞語。所以每次更新只更新W矩陣中的少數列,或者為每個詞語建立到詞向量的哈希映射:
近似:負采樣
還有一個問題亟待解決,詞表V的量級非常大,以至于下式的分母很難計算:
于是,練習1中要求用negative sampling實現skip-gram。這是一種采樣子集簡化運算的方法。
具體做法是,對每個正例(中央詞語及上下文中的一個詞語)采樣幾個負例(中央詞語和其他隨機詞語),訓練binary logistic regression(也就是二分類器)。
negative sampling和skip-gram
目標函數:
這里t是某個窗口,k是采樣個數,P(w)是一個unigram分布,詳見:http://www.hankcs.com/nlp/word2vec.html#h3-12?
σ是sigmoid函數:
根據上次課講的,內積可以代表相關性。那么這個目標函數就是要最大化中央詞與上下文的相關概率,最小化與其他詞語的概率。
word2vec通過把相似的詞語放到同一個地方附近來增大目標函數:
?
?
其他方法
word2vec將窗口視作訓練單位,每個窗口或者幾個窗口都要進行一次參數更新。要知道,很多詞串出現的頻次是很高的。能不能遍歷一遍語料,迅速得到結果呢?
早在word2vec之前,就已經出現了很多得到詞向量的方法,這些方法是基于統計共現矩陣的方法。如果在窗口級別上統計詞性和語義共現,可以得到相似的詞。如果在文檔級別上統計,則會得到相似的文檔(潛在語義分析LSA)。
基于窗口的共現矩陣
比如窗口半徑為1,在如下句子上統計共現矩陣:
-
I like deep learning.?
-
I like NLP.
-
I enjoy flying.
會得到:
樸素共現向量的問題
根據這個矩陣,的確可以得到簡單的共現向量。但是它存在非常多的局限性:
-
當出現新詞的時候,以前的舊向量連維度都得改變
-
高緯度(詞表大小)
-
高稀疏性
解決辦法:低維向量
用25到1000的低維稠密向量來儲存重要信息。如何降維呢?
SVD吧:
r維降到d維,取奇異值最大的兩列作為二維坐標可視化:
改進
-
限制高頻詞的頻次,或者干脆停用詞
-
根據與中央詞的距離衰減詞頻權重
-
用皮爾遜相關系數代替詞頻
效果
方法雖然簡單,但效果也還不錯:
SVD的問題
-
不方便處理新詞或新文檔
-
與其他DL模型訓練套路不同
Count based vs direct prediction
這些基于計數的方法在中小規模語料訓練很快,有效地利用了統計信息。但用途受限于捕捉詞語相似度,也無法拓展到大規模語料。
而NNLM, HLBL, RNN, Skip-gram/CBOW這類進行預測的模型必須遍歷所有的窗口訓練,也無法有效利用單詞的全局統計信息。但它們顯著地提高了上級NLP任務,其捕捉的不僅限于詞語相似度。
綜合兩者優勢:GloVe
這種模型的目標函數是:
?
優點是訓練快,可以拓展到大規模語料,也適用于小規模語料和小向量。
明眼人會發現這里面有兩個向量u和v,它們都捕捉了共現信息,怎么處理呢?試驗證明,最佳方案是簡單地加起來:
相對于word2vec只關注窗口內的共現,GloVe這個命名也說明這是全局的(我覺得word2vec在全部語料上取窗口,也不是那么地local,特別是負采樣)。
評測方法
有兩種方法:Intrinsic(內部) vs extrinsic(外部)
Intrinsic:專門設計單獨的試驗,由人工標注詞語或句子相似度,與模型結果對比。好處是是計算速度快,但不知道對實際應用有無幫助。有人花了幾年時間提高了在某個數據集上的分數,當將其詞向量用于真實任務時并沒有多少提高效果,想想真悲哀。
Extrinsic:通過對外部實際應用的效果提升來體現。耗時較長,不能排除是否是新的詞向量與舊系統的某種契合度產生。需要至少兩個subsystems同時證明。這類評測中,往往會用pre-train的向量在外部任務的語料上retrain。
Intrinsic word vector evaluation
也就是詞向量類推,或說“A對于B來講就相當于C對于哪個詞?”。這可以通過余弦夾角得到:
我曾經通過這些方法驗證了民間很多流行的word2vec實現準確率比原版低幾十個百分點:http://www.hankcs.com/nlp/word2vec.html#h2-15?
這種方法可視化出來,會發現這些類推的向量都是近似平行的:
下面這張圖說明word2vec還可以做語法上的類比:
其他有趣的類比:
這在數學上是沒有證明的。
結果對比
在不同大小的語料上,訓練不同維度的詞向量,在語義和語法數據集上的結果如下:
GloVe的效果顯著地更好。另外,高緯度并不一定好。而數據量越多越好。
調參
窗口是否對稱(還是只考慮前面的單詞),向量維度,窗口大小:
大約300維,窗口大小8的對稱窗口效果挺好的,考慮到成本。
對GloVe來講,迭代次數越多越小,效果很穩定:
維基百科語料上得到的效果比新聞語料要好:
另一個數據集
還有直接人工標注詞語相似度的:
www.cs.technion.ac.il/~gabr/resources/data/wordsim353/?
對某個單詞相似度排序后,得到最相關的詞語。于是可以量化評測了。
Extrinsic word vector evaluation
做NER實驗:
GloVe效果依然更好,但從數據上來看只好那么一點點。
視頻中還談了談一些適合word vector的任務,比如單詞分類。有些不太適合的任務,比如情感分析。課件中則多了一張談消歧的,中心思想是通過對上下文的聚類分門別類地重新訓練。
相同顏色的是同一個單詞的不同義項。
TA也講過這個問題。
轉載于:https://www.cnblogs.com/koocn/p/7699051.html
總結
以上是生活随笔為你收集整理的CS224n笔记3 高级词向量表示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node.js上传图片
- 下一篇: Android 四大组件之Activit