第六章:表徵學習與關係嵌入

6.1 語言模型

詞向量模型與語言模型非常緊密地交織在一起。語言模型的質量評估是基於它們對詞語用概率分佈的表徵能力。事實上,許多最先進的詞向量模型都在攻堅的任務就是已有一串詞語序列,預測下一個出現的詞語將會是什麼。

語言模型是幹嘛的?chunking

語言模型可以計算任何句子的概率。

例如,“I love you too”的概率是多少?用數學語言表述,NN元語言模型(bi-gram model)根據一個詞語的前N−1個詞語,來計算這個詞語的概率。

如果我們有了一個2元模型,“I love you”的概率就等亍P(I)×P(love|I)×P(you|love)P(I)(最後一段解釋原因)。

2元模型用一個矩陣來表示,比如對於一個有10000個詞的語料庫,這個語料庫的2元模型就是一個10000×10000的矩陣,第mm行第nn列表示在第mm個詞語的條件下,第nn個詞語出現的概率,即第mm個詞語後面跟着第nn個詞語的概率。如果我們知道了語言模型,我們就可以像計算“I love you”那樣,計算任何一個句子的概率。

語言模型有什麼用?

語言模型在自然語言處理中佔有重要的地位,在語音識別,機器翻譯,漢語自動分詞和句法分析等都有應用。因爲這些模型都會有噪聲,都會有幾種不同的結果等着我們去選擇,這時候就需要知道每種結果的概率,來幫助我們選擇。

爲什麼叫“語言模型”?

因爲這是統計學意義上的模型,又跟語言相關,所以叫語言模型。統計模型指一系列分佈,參數模型指一系列可用有限個參數表示的模型。語言模型就是一種參數模型,它的參數是矩陣的所有cell。

如何計算語言模型的參數?

參數無法精確計算,只能大概估計。這裏用的方法是極大似然估計。對於某個語料庫,極大似然估計的意思是,哪個語言模型(什麼樣的參數)最有可能產生這個語料庫呢?把這個問題分解成許多個小問題:當P(you|I)是多少時(love和I可以換成別的所有的詞),最有可能產生這個語料庫呢?自然而然我們會想到,統計語料庫裏一共有多少個I,一共有多少個I love,然後做一下除法,就得到了我們想要的概率,這個概率最有可能產生這個語料庫。我們對這個語料庫裏所有的詞對做相同的計數和除法,就得到了我們想要的參數,也就得到了這個語料庫的語言模型。

原因:馬爾科夫假設

爲什麼I love you的概率可以通過P(I)×P(love|I)×P(you|love)P(I)計算呢?

其實這麼算只是在某個假設下的近似計算,這個假設就是一個詞出現的概率只取決於它前N−1個詞。所以在二元模型下,I love you的概率可以那麼算。

以此類推,三元模型下,I love you的概率就要這麼算了:P(I)×P(love|I)×P(you|I,love)P(I)

例子:計算bigram 概率

公式:

第六章:表徵學習與關係嵌入

三句話的例子:

第六章:表徵學習與關係嵌入

9222句話的例子:

第六章:表徵學習與關係嵌入

第六章:表徵學習與關係嵌入

6.2 詞向量

• 詞向量的來歷

自上世紀90年×××始,特徵空間模型就應用於分佈式語言理解中。在當時,許多模型用連續型的表徵來表示詞語,包括潛在語義分析(Latent Semantic Analysis)和潛在狄利克雷分配(Latent Dirichlet Allocation)模型。這篇文章詳細介紹了詞向量方法在那個階段的發展。

Bengio等人在2003年首先提出了詞向量的概念,當時是將其與語言模型的參數一併訓練得到的。Collobert和Weston則第一次正式使用預訓練的詞向量。Collobert和Weston的那篇里程碑式的論文A unified architecture for natural language processing 不僅將詞向量方法作爲處理下游任務的有效工具,而且還引入了神經網絡模型結構,爲目前許多方法的改進和提升奠定了基礎。

詞向量的真正推廣要歸因於Mikolov等人於2013年開發的Word2vec,word2vec可以訓練和使用詞向量。在2014年,Pennington等人發佈了GloVe,這是一套預訓練得到的完整詞向量集,它標誌着詞向量方法
已經成爲了NLP領域的主流。

詞向量方法是無監督式學習的少數幾個成功應用之一。它的優勢在於不需要人工標註語料,直接使用未標註的文本訓練集作爲輸入。輸出的詞向量可以用於下游的業務處理。

一般來說,神經網絡將詞表中的詞語作爲輸入,輸出一個低維度的向量表示這個詞語,然後用反向傳播的方法不斷優化參數。輸出的低維向量是神經網絡第一層的參數,這一層通常也稱作Embedding Layer。

生成詞向量的神經網絡模型分爲兩種,一種是像word2vec,這類模型的目的就是生成詞向量,另一種是將詞向量作爲副產品產生,兩者的區別在於計算量不同。若詞表非常龐大,用深層結構的模型訓練詞向量需要許多計算資源。這也是直到2013年詞向量纔開始被廣泛用於NLP領域的原因。計算複雜度是使
用詞向量方法需要權衡的一個因素,我們在後面還有討論。

• 什麼是 Word2vec

在聊 Word2vec 之前,先聊聊 NLP (自然語言處理)。NLP 裏面,最細粒度的是詞語,詞語組成句子,句子再組成段落、篇章、文檔。所以處理 NLP 的問題,首先就要拿詞語開刀。

舉個簡單例子,判斷一個詞的詞性,是動詞還是名詞。用機器學習的思路,我們有一系列樣本(x,y),這裏 x 是詞語,y 是它們的詞性,我們要構建 f(x)->y 的映射,但這裏的數學模型 f(比如神經網絡、SVM)
只接受數值型輸入,而 NLP裏的詞語,是人類的抽象總結,是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉換成數值形式,或者說——嵌入到一個數學空間裏,這種嵌入方式,就是詞嵌入(word
embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。

• Word2vec 的Skip-gram 和 CBOW 模型

• 如果是用一個詞語作爲輸入,來預測它周圍的上下文,那這個模型叫做
『Skip-gram 模型』

• 而如果是拿一個詞語的上下文輸入,來預測這個詞語本身,則是
『CBOW 模型』

• CBOW 和Skip-gram 模型迭代的方法

目前基於迭代的方法獲取詞向量大多是基於語言模型的訓練得到的,對
於一個合理的句子,希望語言模型能夠給予一個較大的概率,同理,對
於一個不合理的句子,給予較小的概率評估。具體的形式化表示如下:

第六章:表徵學習與關係嵌入

如上圖所示,第一個公式:一元語言模型,假設當前詞的概率只和自己有關;第二個
公式:二元語言模型,假設當前詞的概率和前一個詞有關。那麼問題來
了,如何從語料庫中學習給定上下文預測當前詞的概率值呢?

A、Continuous Bag of Words Model(CBOW)

給定上下文預測目標詞的概率分佈,例如,給定{The,cat,(),over,the,puddle}預測中心詞是jumped的概率,模型的結構如下:

第六章:表徵學習與關係嵌入

B、Skip-Gram Model

下圖Skip-gram 的網絡結構了,x 就是上面提到的 one-hot encoder 形式的輸入,y 是在這 V (字典)個詞上輸出的概率,我們希望跟真實的y 的 one-hot encoder 一樣。

https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html

隱層的激活函數其實是線性的,相當於沒做任何處理(這也是Word2vec 簡化之前語言模型的獨到之處),我們要訓練這個神經網絡,用反向傳播算法,本質上是鏈式求導 ,在此不展開說明了,

當模型訓練完後,最後得到的其實是神經網絡的權重,比如現在輸入一個 x 的 one-hot encoder: [0,1,0,...,0],對應剛說的那個詞語『吳彥祖』,則在輸入層到隱含層的權重裏,叧有對應 1 這個位置的權重被激活,這些權重的個數,跟隱含層節點數是一致的,從而這些權重組成一個向量 vx 來表示x,而因爲每個詞語的 one-hot encoder 裏面 1 的位置是不同的,所以,這個向量 vx 就可以用來唯一表示 x。

word2vec對這個模型做了改進,首先,對於從輸入層到隱藏層的映射,沒有采取神經網絡的線性變換加激活函數的方法,而是採用簡單的對所有輸入詞向量求和並取平均的方法。比如輸入的是三個4維詞向量:
(1,2,3,4),(9,6,11,8),(5,10,7,12),那麼我們word2vec映射後的詞向量就是(5,6,7,8)。由於這裏是從多個詞向量變成了一個詞向量。

• Skip-gram公式推導

第六章:表徵學習與關係嵌入

對於skip-ngram模型也需要設定一個目標函數,隨後採用優化方法找到該model的最佳參數解,目標函數如下:

第六章:表徵學習與關係嵌入

word2vec原理及代碼

1.word2vec原理

理解 Word2Vec 之 Skip-Gram 模型
https://zhuanlan.zhihu.com/p/27234078

這個將原理講解的非常清楚

基於TensorFlow實現Skip-Gram模型
https://zhuanlan.zhihu.com/p/27296712

這個將代碼步驟實現講解的非常清楚,但是隻有Skip-Gram模型的代碼

2.代碼來源

https://github.com/hankcs/udacity-deep-learning/blob/master/5_word2vec.py

這個是我在網上找到,不僅含有Skip-Gram模型的代碼,還含有CBOW模型的代碼,兩者的區別僅僅是def generate_batch(batch_size, bag_window):的不同【注意:基於負採樣】

其他需要注意的

1.採樣和負採樣不同,原理在上邊的原理講解已經介紹過了。在上我在我的代碼裏我也做了註釋了,採樣是在處理數據的時候去除高頻噪聲詞,負採樣在計算loss時使用。

2.tf版本的word2vec的loss計算的時候沒有看到負採樣,是因爲封裝在

tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, train_labels,)

中了,具體可看解釋:https://blog.csdn.net/jiasudu1234/article/details/78676922

3.另外,tf裏的負採樣用的比較多,下面這個進行了介紹,同時也介紹了tf.nn.sampled_softmax_loss和 tf.nn.nce_loss的區別:

它們的不同點在於 Sampled Softmax Loss 只支持 Single-Label 分類,而 NCE 支持 Multi-Label 分類。

TensorFlow 中的候選採樣
http://www.algorithmdog.com/tf-candidate-sampling

4.由於word2vec有兩種改進方法,一種是基於Hierarchical Softmax的,另一種是基於Negative Sampling的。我們的代碼是基於負採樣的,分級softmax(Hierarchical Softmax)方法在下面鏈接會由詳細介紹

https://www.cnblogs.com/pinard/p/7243513.html

5.另外這個介紹了霍夫曼編碼爲什麼能用在Hierarchical Softmax

https://zhuanlan.zhihu.com/p/35074402

第六章:表徵學習與關係嵌入

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