假設語料庫中有這樣一行句子:html
I love deep learning and NLPpython
中心詞爲deep,那麼在計算梯度的時候則能夠獲得以下的梯度向量。ide
能夠很明顯地看到該向量很是稀疏。常見的解決辦法有兩種:一是使用稀疏矩陣更新運算來更新矩陣的特定的列向量。二是使用哈希來更新,即key爲word string,value是對應的列向量。svg
下圖公式中的分子計算起來比較簡單,而分母則比較困難了,由於須要想加的項太多,並且每一項的內積運算也是一個工做量。因此爲了提升計算效率提出了 負採樣(negative sampling)。函數
主要思路就是除了對中心詞窗口大小附近的上下文詞取樣之外(即true pairs),還會隨機抽取一些噪聲和中心詞配對(即noise pairs)進行計算,而不是遍歷整個詞庫。優化
使用了負採樣後的目標函數爲
lua
其中是sigmoid函數。spa
公式(2)中第一項表示咱們但願能同時出現的兩個詞的機率最大化。第二項的sigmoid函數中取了負號,因此其做用是最小化負採樣獲得的詞與中心詞共同出現的機率。3d
另外公式(2)中的第二項的表示每一個樣本j以p(w)的機率進行採樣。而這個p(w)能夠根據須要自定義,可是通常是採用unigram分佈,即根據某個詞出現的頻率進行抽樣。code
unigram 一元分詞,把句子分紅一個一個的漢字
bigram 二元分詞,把句子從頭至尾每兩個字組成一個詞語
trigram 三元分詞,把句子從頭至尾每三個字組成一個詞語.
你可能會想萬一隨機抽樣獲得的詞與第一項中的上下文詞彙重複了怎麼辦?首先這個機率很低,由於詞庫很是的大;另外即便重複也不要緊,由於重複的機率很小,因此影響不是很大。k通常取10左右。
由上面總結的步驟能夠觀察到這種方式多多少少仍是缺少效率的。假如語料庫有以下三個句子組成:
按照word2vec思路,假設窗口大小爲2(即左右長度),那麼若是要計算I和like同時出現的機率,就得移動窗口遍歷,而後每一個窗口或者幾個窗口都要進行一次參數更新。要知道,不少詞串出現的頻次是很高的。能不能遍歷一遍語料,迅速獲得結果呢?
其實在word2vec以前就有這麼個方法了,這些方法是基於統計共現矩陣的方法。若是在窗口級別上統計詞性和語義共現,能夠獲得類似的詞。若是在文檔級別上統計,則會獲得類似的文檔(潛在語義分析LSA)。使用該方法對上面三個句子進行統計的示例以下:
爲方便說明,假設窗口大小爲1,那麼遍歷一遍語料庫後可獲得以下表格(或共生矩陣):
這種方法簡單易懂,可是實際上語料庫很是龐大,這樣獲得的矩陣一樣會很是大,且具備高稀疏性。另外每次須要添加新的word時,有須要從新計算一遍。
共生矩陣太大且稀疏,很天然的一個想法是將該矩陣降維,用更加稠密的矩陣進行信息存儲。那麼如何降維呢?咱們可使用奇異值分解(SVD),示意圖以下。
奇異值分解可閱讀以前作的筆記:
上面使用SVD存在以下缺點:
下圖給出了兩種類型的方法總結,能夠看到有兩類,分別是count based(基於計數的方法) 和 direct prediction(直接預測的方法)
這些基於計數的方法在中小規模語料訓練很快,有效地利用了統計信息。但用途受限於捕捉詞語類似度,也沒法拓展到大規模語料。
而NNLM, HLBL, RNN, Skip-gram/CBOW這類進行預測的模型必須遍歷全部的窗口訓練,也沒法有效利用單詞的全局統計信息。但它們顯著地提升了上級NLP任務,其捕捉的不只限於詞語類似度。
GloVe是將**count based* 和 direct prediction的優點結合起來提出的一種方法,其目標函數以下:
GloVe的優勢是訓練筷,可擴展到大規模語料,也適用於小規模的語料。
下圖展現了GloVe的結果示例,能夠看到與frog相近的詞中含有不多見的詞彙,也就是說它能在全局的範圍內對詞進行分類。
前面介紹了不少超參數,例如window size,vector size等等。那麼咱們如何評估這些參數對模型帶來的影響呢?
評測的方法分兩類:Intrinsic(內部) vs. Extrinsic(外部)
一般指對特定的子任務或者中間任務進行評估,例如咱們會觀察向量之間的差別性或類似性及向量內積與人類對於類似性的判斷有多大關係。
該類方法的好處以下:
- 計算速度快
- 可以幫助咱們快速理解系統是如何工做的,咱們可以知道哪一類超參數可以對類似性度量產生影響。
固然有好處也就會有缺點:一般咱們不知道模型在實際應用中表現如何。也就是說也許這種評估方法是好的,可是在實際應用中表現卻不好。好比有人花了幾年時間提升了在某個數據集上的分數,當將其詞向量用於真實任務時並無多少提升效果,想一想真悲哀。
常見的評估方法是詞向量同義詞。即若是已知單詞a和單詞b是類似詞,那麼單詞c的類似詞是什麼?
a:b → c:?
計算公式以下:
舉個栗子:假如已知man對woman,那king對應的單詞是哪個呢?
上面公式中的對應woman,對應man,對應king,須要作的就是遍歷語料庫找到使得cosine距離最大的單詞(粗略地理解就是找到一個點i使得其與king組成的連線能與man和woman組成的連線儘量平行,這樣就知足類似詞的關係。)
除了找同義詞還能夠有其餘做用:
下圖展現了在GloVe即以前提出的方法的比較,其中Dim表示Dimension,Size表示數據大小,Sem表示semantic(語義),Syn表示Syntactic(句法),Tot表示total,即將前面兩個指標取均值。
能夠看到GloVe表現最爲優秀,而且由最下面一部分表格能夠看到並非維度越高越好,由於維度爲300的時候要比1000表現更好;另外數據仍是禮多人不怪,越多越好。
下圖展現了三個不一樣超參數對最終結果的影響。
第一個是保持窗口對稱,且窗口大小固定的狀況下,向量維度對最終模型表現的影響。能夠看到最初隨着維度增長,模型表現也愈佳,可是當維度增長到300以上後,模型表現沒有很明顯的變化。雖然semantic評估有略微增加,可是維度增長,對資源的消耗也會增長,因此考慮到成本,通常會選擇300做爲最終的維度。
第二個是指保持窗口對稱,維度固定的狀況下,窗口大小對模型的影響。
第三個是指窗口不對稱,也就是說只考慮前面或者後面的單詞,維度固定的狀況下,窗口大小對模型的影響。
下圖表示對GloVe來說,迭代次數越多越小,效果很穩定:
維基百科語料上獲得的效果比新聞語料要好:
經過對外部實際應用的效果提高來體現。缺點很明顯就是耗時較長,另外在實際應用中可能會同時優化多個子系統,也許最終整個系統表現獲得了提高,可是這樣並不能知道是哪個子系統對系統起到了提高做用。這類評測中,每每會用pre-train的向量在外部任務的語料上retrain。
由下圖也可看出GloVe與許多方法相比依舊錶現出色。
PS:這一視頻感受聽得模模糊糊的,先後沒什麼關聯。。。不少細節沒有提到,看來仍是須要閱讀其餘的課外資料了。