NLP學習-Task 2: 詞向量和詞義Word Senses

NLP學習

更新流程↓
Task 1: 簡介和詞向量Word Vectors
Task 2: 詞向量和詞義Word Senses
Task 3: 子詞模型Subword Models
Task 4: Contextual詞嵌入
Task 5: 大作業
女 生 行 爲 圖 鑑
監 控 行 爲 大 賞
WRONG WAY


詞向量和詞義Word Senses




1. 詞向量

 1.1. 基於統計的詞向量

  詞向量目的:希望通過低維稠密向量來表示詞的含義

在這裏插入圖片描述  以上三個句子中,對每一個單詞的左右兩個單詞出現次數進行統計。
  例1:I的左右出現了2like1enjoy,故I所對應的詞向量中,like和enjoy維的值爲2和1。
  例2:like的左右出現了2I1deep1NLP,故like所對應的詞向量中,I、deep和NLP維的值爲2、1和1。

  但這些預訓練模型也存在不足:

  • 詞梳理很多時,矩陣很大,維度很高,需要的存儲空間也很大
  • 當詞的數目是在不斷增長,則詞向量的維度也在不斷增長
  • 矩陣很稀疏,即詞向量很稀疏,會遇到稀疏計算的問題

拓展瞭解:https://pdfs.semanticscholar.org/73e6/351a8fb61afc810a8bb3feaa44c41e5c5d7b.pdf



 1.2. Word2vec

  Word2vec有兩種模型是CBOWSkip-gram

  1. CBOW是在已知context(w)的情況下預測 w,即通過附近詞預測中心詞。
  2. Skip-gram在已知w的情況下預測context(w),即 通過中心詞預測附近的詞。
    在這裏插入圖片描述

  1.2.1. CBOW

  通過目標詞ww的上下文context(w)context(w)的詞預測目標詞,圖中就是取大小爲2的窗口,通過目標詞前後兩個詞預測目標詞。
  具體的做法是,設定詞向量的維度dd,對所有的詞隨機初始化爲一個dd維的向量,然後要對上下文所有的詞向量編碼得到一個隱藏層的向量,通過這個隱藏層的向量預測目標詞,CBOW中的做法是簡單的相加,然後做一個softmaxsoftmax的分類,例如詞彙表中一個有VV個不同的詞,就是隱藏層dd維的向量乘以一個WW矩陣(Rd×V)(\mathbb{R}^{d \times V})轉化爲一個VV維的向量,然後做一個softmaxsoftmax的分類。由於VV詞彙的數量一般是很大的,每次訓練都要更新整個WW矩陣計算量會很大,同時這是一個樣本不均衡的問題,不同的詞的出現次數會有很大的差異,所以論文中採用了兩種不同的優化方法多層softmaxsoftmax負採樣


  1.2.2. Skip-gram

  跟CBOW的原理相似,它的輸入是目標詞,先是將目標詞映射爲一個隱藏層向量,根據這個向量預測目標詞上下文兩個詞,因爲詞彙表大和樣本不均衡,同樣也會採用多層softmaxsoftmax負採樣優化。


  1.2.3. 多層softmaxsoftmax

在這裏插入圖片描述
  由於單詞出現的頻率是不一樣的,所以用哈夫曼編碼構建一個二叉樹,出現頻率高的詞放在前面可以減少計算量,用哈夫曼編碼記錄路徑,例如圖中單詞2(w2w_{2}規定左邊走是1,右邊走是0)的哈夫曼編碼就是1110,在路徑上每到一個節點就是一個sigmoidsigmoid的二分類,所以叫多層softmaxsoftmax。具體來說每個節點處會有一個dd維的向量參數θ\theta,每個單詞也是dd維的向量xwx_{w} ,一個sigmoidigmoid的方程決定向左或者右走的概率,往左走的概率是:
P(+)=σ(xwTθ)=11+exwTθP(+)=σ(x_{w}^{T}\theta )=\frac{1}{1+e^{-x_{w}^{T}\theta }}  將路徑上的概率連乘,極大化這個概率值,就是模型的訓練目標,每次用一個樣本更新梯度,使用對數似然函數:L=j=2lw(1djw)log[sigma(xwTθj1w)]+djwlog[1sigma(xwTθj1w)]L=\sum_{j=2}^{l_{w}}(1-d_{j}^{w})log[sigma(x_{w}^{T}\theta_{j-1}^{w})]+d_{j}^{w}log[1-sigma(x_{w}^{T}\theta_{j-1}^{w})]  其中lwl_{w}代表目標詞在哈夫曼樹中的深度,djwd_{j}^{w}代表在jj層中目標詞根據哈夫曼編碼的路徑應該向左還是向右走,左是1右是0,可以看到整個目標函數跟邏輯迴歸是基本相似的,梯度的計算也跟邏輯迴歸基本一樣。

  • 對於CBOW,多層softmaxsoftmax是將窗口內的2c2c個詞求平均得到xwx_{w},放入哈夫曼樹的網絡中,每一層得到的梯度更新哈夫曼樹中的參數,同時梯度同步更新到2c2c個單詞的向量中。
  • 對於Skip-gram,多層softmax是用目標詞的詞向量爲xwx_{w},然後遍歷窗口內的2c2c個詞,一個進行2c2c次的訓練,每次將xwx_{w} 放進哈夫曼樹中,更新xwx_{w}和樹中的參數。

  1.2.4. 負採樣

  負採樣也是把模型變爲二元的邏輯迴歸,每個詞對應一個詞向量xwx_{w}和詞的網絡參數θwθ_{w},每個詞附近有2c2c個詞,通過負採樣,隨機採樣nn個反例,讓正例詞對目標詞的詞向量和窗口內詞的網絡參數的乘積儘可能的大,反例的儘可能小,是模型的訓練目標。
  例如在Skip-gram中目標詞AA的詞向量是xAx_{A},它2c2c的窗口內附近一個詞的網絡參數是θBθ_{B},讓這兩個的乘積儘可能的大,σ(xATθB)\sigma(x_A^T \theta_B) )儘可能大,反例,隨機採樣出來的詞乘積儘可能小。
  同理CBOW中是將2c2c個詞相加求平均,然後與目標詞的網絡參數相乘,也是讓窗口內真實存在的詞乘積儘可能大,隨機採樣出的詞儘可能小。
  負採樣的方式是根據詞出現的頻率進行採樣,出現頻率越高,越可能被採樣到,原文中是根據出現頻率的3/4次方然後做一個歸一化作爲概率進行採樣。




2. GloVe

  GloVe 的全稱叫 Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具。

  GloVe目標是綜合基於統計和基於預測的兩種方法的優點。它首先基於語料庫構建詞的共現矩陣,然後基於共現矩陣和GloVe模型學習詞向量

  模型目標:詞進行向量化表示,使得向量之間儘可能多地蘊含語義和語法的信息

  流程輸入語料庫–> 統計共現矩陣–> 訓練詞向量–>輸出詞向量



 2.1. 構建統計共現矩陣X

  設共現矩陣爲XX,其元素爲Xi,jX_{i,j}Xi,jX_{i,j}的意義爲:在整個語料庫中,單詞ii和單詞jj共同出現在一個窗口中的次數。

# 例:設語料庫
I love you but you love him I am sad

  這個小小的語料庫只有1個句子,涉及到7個單詞:I、love、you、but、him、am、sad。如果我們採用一個窗口寬度爲5(左右長度都爲2)的統計窗口,那麼就有以下窗口內容:

窗口符號 中心詞 窗口內容
0 I I love you
1 love I love you but
2 you I love you but you
3 but love you but you love
4 you you but you love him
5 love but you love him I
6 him you love him I am
7 I love him I am sad
8 am him I am sad
9 sad I am sad

  窗口0、1、8、9長度小於5是因爲中心詞左側或右側內容少於2個。
  以窗口5爲例說明如何構造共現矩陣:中心詞爲love,語境詞爲but、you、him、I;則執行:Xlove,but+=1X_{love,but}+=1Xlove,you+=1X_{love,you}+=1Xlove,him+=1X_{love,him}+=1Xlove,I+=1X_{love,I}+=1。使用窗口將整個語料庫遍歷一遍,即可得到共現矩陣XX



 2.2. GloVe具體實現

  GloVe的實現分爲以下三步:

  1. 根據語料庫(corpus)構建一個共現矩陣(Co-ocurrence Matrix)XX(什麼是共現矩陣?),矩陣中的每一個元素XijX_{ij}代表單詞和上下文單詞jj在特定大小的上下文窗口(context window)內共同出現的次數。 一般而言,這個次數的最小單位是1,但是GloVe不這麼認爲:它根據兩個單詞在上下文窗口的距離dd,提出了一個衰減函數(decreasing weighting):deacy=1/ddeacy=1/d用於計算權重,也就是說距離越遠的兩個單詞所佔總計數(total count)的權重越小。

  2. 構建詞向量(Word Vector)和共現矩陣(Co-ocurrence Matrix)之間的近似關係,論文的作者提出以下的公式可以近似地表達兩者之間的關係:
    wiTw~j+bi+bj=log(Xij)        (1)w^T_{i}\tilde{w}_j+b_i+b_j=log(X_{ij})\; \; \; \; (1) 其中,wiTw^T_{i}w~j\tilde{w}_j是我們最終要求解的詞向量;bib_{i}bj~\tilde{b_j}分別是兩個詞向量的bias term。當然你對這個公式一定有非常多的疑問,比如它到底是怎麼來的,爲什麼要使用這個公式,爲什麼要構造兩個詞向量wiTw^T_{i}w~j\tilde{w}_j?下文我們會詳細介紹。

  3. 有了公式(1)之後我們就可以構造它的loss function了:
    j=i,j=1Vf(Xij)(wiTw~j+bi+bjlog(Xij))2j= \sum_{i,j=1}^{V} f(X_{ij})(w_i^T \tilde{w}_j +b_i+b_j−log(X_{ij}))^2
    這個loss function的基本形式就是最簡單的mean square loss,只不過在此基礎上加了一個權重函數f(Xij)f(X_{ij}),那麼這個函數起了什麼作用,爲什麼要添加這個函數呢?我們知道在一個語料庫中,肯定存在很多單詞他們在一起出現的次數是很多的(frequent co-occurrences),那麼我們希望:
     (1) 這些單詞的權重要大於那些很少在一起出現的單詞(rare co-occurrences),所以這個函數要是非遞減函數(non-decreasing)。
     (2) 但我們也不希望這個權重過大(overweighted)當到達一定程度之後應該不再增加。
     (3) 如果兩個單詞沒有在一起出現,也就是Xij=0X_{ij}=0,那麼他們應該不參與到loss function的計算當中去,也就是f(x)f(x)要滿足f(0)=0f(0)=0滿足以上兩個條件的函數有很多,作者採用瞭如下形式的分段函數:f(x)={(x/xmax)α,x<xmax1,otherwisef(x)=\left\{\begin{matrix} (x/x_{max})^{\alpha}, &x<x_{max} \\ 1,& otherwise \end{matrix}\right.這個函數圖像如下所示:
    在這裏插入圖片描述

  這篇論文中的所有實驗,αα的取值都是0.75,而xmaxx_{max} 取值都是100。以上就是GloVe的實現細節。




3. 參考鏈接

  • https://blog.csdn.net/xiayto/article/details/84730009
  • https://www.infoq.cn/article/PFvZxgGDm27453BbS24W
  • https://github.com/datawhalechina/team-learning/tree/master/04%20%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/Lecture/Lecture2/reference
  • https://blog.csdn.net/Yolanda71/article/details/76165154
  • https://blog.csdn.net/mawenqi0729/article/details/80698350
  • https://blog.csdn.net/XB_please/article/details/103602964
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章