詞嵌入向量(Word Embedding)的建模

1、Embedding函數

從前面的定義,我們期望在隱層中找到一個/組嵌入函數W(這裏採用lookup table的方式),使得![][3]具體的,假設指定固定的向量維度,W("籃球")=(0.2, -0.4, 0.7, ...),W("蘋果")=(0.0, 0.6, -0.1, ...),W初始化時可以賦值給每個維度一個隨機數,並通過與output層連接建立學習模型/任務後得到有意義的向量。

2、建模

接下來來看看如何建立和訓練模型。

  • 數據準備
    爲給模型準備數據,我們首先需要定義或獲取n個樣本:![][4]
    假如我們有一個句子“姚明 的 籃球 打得 很不錯”。常規方式是首先由統計語言模型,由中間詞預測周圍詞(SKIP-GRAM),或由周圍詞預測中間詞(CBOW)等方式,然後以指定的窗口向前推進。以SKIP-GRAM方式爲例,假設推進窗口爲2(以籃球爲中心),我們可以得到樣本對:("籃球","的"),("籃球","姚明"),("籃球","打得"),("籃球","很不錯"),X skip至"打得"時(以打得爲中心),得到樣本對 :("打得","籃球"),("打得","的"),("打得","很不錯"),以此類推...我們可以得到用於模型的訓練樣本。

  • 樣本表示
    樣本拆解出來了,接下來如何用數值來表達這些樣本對呢?常用的辦法是將所有的訓練數據,即“word”對抽取出唯一不重複的單詞來構建詞典表(vocabulary),然後將樣本數據中的“word”表達成one-hot編碼,編碼時只對有值的位置上爲1其他位置均爲0,以上面例子爲例,“姚明 的 籃球 打得 很不錯”。基於這個句子可以構建維度爲5的詞典表:{:0 "姚明",  :1, "的"  :2,"籃球"  :3,"打得"  :4,"很不錯" },那麼訓練樣本("籃球","姚明")即可表達爲([0,0,1,0,0],0),看起來比較像常規的多分類數據了,這裏爲了好理解Y表示成了位置編號,後續在模型中仍以one-hot向量表達。

  • 各層條件分佈
    神經網絡基於這些訓練樣本將會輸出一個概率分佈,這個概率代表着我們的詞典中的每個詞是output word的可能性。更一般的,假設隱層有K個節點(即生成word對應vector向量的維度),對每個樣本,我們需要做兩件事情:

    • 給定隱層後預測output word的概率,即需要建個模型來估計![][5]
    • 將觀測到的input word餵給隱層嵌入函數,得到隱層的概率分佈,![][6]用連接函數表達即上面提到的(常見的一般會是K個關於x線性組合的方程組,後面會講到爲何不用該方式)![][3]

    接下來我們需要構建整體的似然函數進行優化:

  • 目標函數
    分別建立input層-隱層及隱層-output層的連接函數(RGLM),input層和隱層的函數上面已給出,如果假設p(y|w)爲正態分佈,則 log-likelihood loss便是(negative) L2 loss:![][7],如果假設p(y|w)爲多項分佈,則likelihood loss便是softmax loss:![][8]從訓練樣本可以看出,output層爲多分類,即隱層-output可採用softmax loss.
    爲了準確預測output word,該網絡需要根據上述損失函數學習參數矩陣W和R(output層),實際上,對於我們來說,整個學習任務是爲了學習隱層的W函數,即隱層節點參數。當然對於其他任務,比如神經網絡推薦或Fasttext,網絡構造過程類似,只是學習的任務是學習輸出層的參數和結構。

  • 模型訓練
    常規優化方法會採用梯度下降和反向傳播,由上面的樣本定義,我們的訓練樣本中input和output均以one-hot表示,向量極其稀疏(通常完整字典表會是幾十萬維,假設200000),僅有一個位置的數值爲1,其餘均爲0,如果input到隱層的嵌入函數採用常見方式的話,假設節點數即嵌入向量維度爲200,則隱層參數矩陣每個樣本的迭代將會是1x200000的向量和200000x200矩陣的相乘,顯然會帶來巨大計算資源的消耗,其實每個樣本的隱層參數僅需要根據one-hot向量中數值爲1的索引對應的隱層參數參數矩陣的該索引行對應的向量取出即可:

     

    經過抽象後我們可以得到上面定義的Embedding函數/參數矩陣:

  • 這種方式其實聯繫上面提到的lookup table就容易理解了,即模型中的隱層權重矩陣便成了一個”查找表“(lookup table),進行矩陣計算時,只需要直接去查輸入的one-hot向量中提取非零位置的索引,在隱層的對應行輸出就是每個輸入單詞的“嵌入詞向量”,該過程即完成了嵌入的動作。
    對於輸出層:
    經過隱層的嵌入計算,input word會被映射爲1x200的dense向量,再餵給輸出層經過softmax的分類器的計算,對隨機給定任意output word的嵌入向量計算其預測概率:![][8],這樣基於同一input word,替換不同的beta(output word的嵌入向量)得到不同output word的預測概率。

    至此,數據的表示及目標損失函數的定義以及模型訓練過程已拆解完畢。接下來,再看看訓練性能提升和優化的方法。

3、抽樣

基於上面的拆解,我們會發現其實訓練過程涉及的參數數量會非常龐大,以上面的200000個單詞的字典表爲例,隱層嵌入200維的詞向量,那麼每次迭代的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 200000 x 200 = 4000萬個權重,在如此龐大的神經網絡中進行梯度下降是相當慢的,而且需要大量的訓練數據來調整這些權重並且避免過擬合。所以對性能的要求仍然很高,雖然上面已經採用lookup table的方式簡化了一些計算,針對這個問題,Word2Vec的作者在論文提出了有效的方法,叫“negative sampling”,每個訓練樣本的訓練只會更新一小部分的模型權重,從而降低計算負擔,甚至是詞向量的質量。基於對假設是,我們的數據中存在大量冗餘和噪音,舉例:對於“的”這種常用高頻單詞,我們會發現一些問題:當我們得到成對的單詞訓練樣本時,**("的", "籃球") *這樣的訓練樣本並不會給我們提供關於“籃球”更多的語義信息,因爲“的”這樣的噪音詞在大部分單詞的上下文中幾乎都會出現。由於在語料中“的”這樣的常用詞出現概率很大,因此我們將會有大量的(”的“,...)這樣的訓練樣本,而這些樣本數量遠遠超過了我們學習“的”這個詞向量所需的訓練樣本數。所以在設計抽樣方法的時候可以對這樣的樣本直接排除在訓練樣本之外,對於其他樣本對隨機抽取少量的負樣本進行參數的更新,而不是對one-hot向量中所有200000個位置對樣本都進行計算,從而大大提高訓練效率。
上面敘述的有點繁雜,總結起來就是在對給定input word計算softmax時,不去更新所有詞表中word的輸出概率,而是從該樣本的output word之外隨機抽樣有限個(比如只抽樣5個word)作爲負樣本計算其概率,進一步進行梯度和參數的更新。也就是說通過負樣本抽樣對於每次訓練只更新(5+1)個beta向量對應的參數,也就是2006=1200個參數,這樣與4000萬個相比,需要更新的參數佔比僅爲0.003%,效率提升可想而知。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章