詞向量學習總結 [獨熱表示-分佈式表示-word2vec -Glove - fast text - ELMO - BERT]

最近面試**公司,被問到word2vec和Glove的損失函數的區別,有點忘記了,回來後便看了一下。

參考博客資料:NLP中詞向量對比:word2vec/glove/fastText/elmo/GPT/bert

該博客的目錄:

想知道具體的解釋,可以點進上方的鏈接!

一、文本表示和各詞向量間的對比 
1、文本表示哪些方法?
2、怎麼從語言模型理解詞向量?怎麼理解分佈式假設?
3、傳統的詞向量有什麼問題?怎麼解決?各種詞向量的特點是什麼?
4、word2vec和NNLM對比有什麼區別?(word2vec vs NNLM)
5、word2vec和fastText對比有什麼區別?(word2vec vs fastText)
6、glove和word2vec、 LSA對比有什麼區別?(word2vec vs glove vs LSA)
7、 elmo、GPT、bert三者之間有什麼區別?(elmo vs GPT vs bert)
二、深入解剖word2vec
1、word2vec的兩種模型分別是什麼?
2、word2vec的兩種優化方法是什麼?它們的目標函數怎樣確定的?訓練過程又是怎樣的?
三、深入解剖Glove詳解
1、GloVe構建過程是怎樣的?
2、GloVe的訓練過程是怎樣的?
3、Glove損失函數是如何確定的?
四、深入解剖bert(與elmo和GPT比較)
1、爲什麼bert採取的是雙向Transformer Encoder,而不叫decoder?
2、elmo、GPT和bert在單雙向語言模型處理上的不同之處?
3、bert構建雙向語言模型不是很簡單嗎?不也可以直接像elmo拼接Transformer decoder嗎?
4、爲什麼要採取Marked LM,而不直接應用Transformer Encoder?
5、bert爲什麼並不總是用實際的[MASK]token替換被“masked”的詞彙?

1、詞的離散化表示

詞的獨熱表示(one -hot representation)是將每一個詞寫成一個N維的向量,其中只有一個分量爲1,其他爲零。N代表的是現有語料庫的詞彙表的大小。這種方法被稱爲詞的離散化表示,單離散表示有很大的缺點:維數災難,內存佔用大,速度慢。  所以引出將詞表示成一個定長的連續的稠密向量,詞向量形式。

2、詞向量表示

基於此,學者們提出了分佈式的詞表現形式,即詞向量。它主要擁有以下優點:

  • 預訓練獲得,習得一個好的詞向量可以在多個任務中被繼續使用
  • 可以表示單詞之間的聯繫和差異,讓模型更好地“讀”懂單詞和句子
  • 它是一個定長連續的稠密向量,佔用資源少,計算速度快

直觀理解:目前業界常用的是谷歌的300維詞向量(即用一個300維的列向量來表示一個單詞),它通常是通過神經網絡訓練而來的。若是將這些高維詞進行降維處理並投影到座標上,可以看到相近的詞會傾向集中在一起,無關的詞會遠離,反映了詞向量下單詞的聯繫與差異。

詞向量的缺點:

誠然,我們在上文已經看到詞向量的種種優點了,但是詞向量也仍然有着它的缺點。

  • 可解釋性較弱 ,我們沒辦法確切知道各個維度代表什麼含義,這使它看起來有點黑箱。
  • 多義詞歧義問題。我們知道一個單詞是可以有多重含義的,比如蘋果,它既可以代表我們日常使用的蘋果,也可以代表喬布斯老爺子的蘋果公司。而這兩重含義在我們的日常語料中都是大量存在的,而詞向量在學習的過程中強行把這兩種含義放在一個詞向量裏面,這就使得它變得有點“不倫不類”,誰都不像。
  • 偏見問題 。這個其實本身並非是詞向量的問題,而是人類的問題。詞向量是通過人們的語料進行學習的,它在學習的時候是沒有辨別能力的,所以它可能會學到人們的一些缺點,比如性別歧視、種族歧視和地域歧視等等。

3.Word2Vec向量表示:【CBOW 和 Skip-Gram表示】

這兩種有着相似的思想,只是在實現方面有一些差異,且word2vec屬於神經網絡語言模型(NNLM)中的一個特例,

                    

詞向量是上述神經網絡模型的一個具體產物,兩者的區別如下:

  • CBOW 在已知 context(w) 的情況下,預測 w
  • Skip-Gram在已知 w 的情況下預測 context(w) ;

與NNLM相比,word2vec的主要目的是生成詞向量而不是語言模型,在CBOW中,投射層將詞向量直接相加而不是拼接起來,並捨棄了隱層,這些犧牲都是爲了減少計算量,使訓練更快。

舉例如下:

這樣使得模型不管看到”orange”還是看到”apple”都要預測出”juice”,就”逼”着它讓它學習讓它認爲這兩個單詞是高度相似的,即我們最終得到的”orange”和”apple”詞向量是高度相似的。
而CBOW則與之相反,用的是上下文詞來預測中心詞。但是與skip-gram有一點差別的是,它獲得的訓練樣本並非是直觀以爲的(context: juice, center: orange)。而是將窗口內的所有上下文詞放在一起來預測中心詞,即(context: [glass, of, juice], center: orange),即:

Skip-Gram模型和CBOW模型有和異同?
我們先說相同點,Skip-Gram和CBOW模型都是構造Fake Task,利用句子中的詞去預測其它詞從而獲得單詞的詞向量。
而它們的不同點來源於上文提到的小差別。CBOW的一個訓練樣本是(context: [glass, of, juice], center: orange),它對周圍詞的調整是統一的,CBOW的訓練次數跟整個文本的詞數幾乎相等(每次訓練滑動一次中心詞窗格獲得一個訓練樣本,而Skip-Gram滑動一次中心詞窗格獲得多個訓練樣本)。
由此可看出,Skip-Gram的訓練次數是要多於CBOW的,訓練時間要比CBOW長。
Skip-Gram訓練時間長但也有它的好處。在skip-gram中,每個詞在作爲中心詞的時候,都要進行K次(window_size * 2)的訓練和調整。因此當訓練語料庫較小,或語料中多生僻詞時, 這種多次調整會使得詞向量更加精準(畢竟訓練了多次)。
而在CBOW中,單詞的詞向量是和周圍的詞一起平均調整的(比如上述中”glass”、”of”、”juice”是一起調整的),代表若是存在生僻詞,它並沒有得到因材施教和專門的訓練,而是和周圍的詞一起進行。

Skip-Gram與CBOW模型總結:

CBOW中的目標函數是使條件概率 P(w|context(w)) 最大化.

Skip-gram中的目標函數是使條件概率 P(context(w)|w) 最大化.


                          

 

4.Glove詞向量表示:

區別於Skip-Gram和CBOW,GLOVE模型的訓練並沒有使用神經網絡,而是計算共線矩陣通過統計的方法獲得。

GLOVE模型獲得詞向量的步驟可以簡單分爲兩步:

  1. 構造共現矩陣。
  2. 構造損失函數並訓練模型。

1. 構造共現矩陣

GLOVE模型訓練詞向量的第一步驟是根據語料庫構建共現矩陣X。假設語料庫的大小爲N(即有N個單詞),則共現矩陣是一個形狀爲(N, N)的二維向量,其中每個元素 X_{ij} 當窗口滑動遍歷完整個語料庫之後,即可更新得到共線矩陣X,比如代表單詞i和單詞j共同出現在一個窗口(window)中的頻數。

我們假設語料庫中有如下句子,共包含8個單詞:

I would like a glass of orange juice.

設置window_size=2,即中心詞左右2個單詞記爲上下文詞,其包括中心詞構成窗口裏面的詞。如果我們從左到右滑動窗口,每滑動一次記錄一個新的窗口,則會生成以下窗口內容:

                            

當窗口滑動到編號3時,中心詞爲like,窗口內的詞爲I、would、like、a、glass,因此對共現矩陣內的元素進行更新:

                                          

當窗口滑動遍歷完整個語料庫之後,即可更新得到共線矩陣X,比如:

 I would like a glass of orange juice.
 I like orange juice.

    

 應該還有一列,這是一個對稱矩陣,且對角線爲全零。

理解了Glove中的共現矩陣之後,我們將依此構造Glove模型的目標損失函數。

2 構造損失函數

 

在寫Glove的損失函數前,我們先看看最簡單的線性迴歸的損失函數,即平方誤差損失函數。

平方誤差損失函數:   

                                   

我們希望預測值wx_i +b 和實際值 y_i 的差距越小越好,反應在函數中即損失函數J的值越小越好(上圖中各灰色線段越短越好), 加上平方則是避免值爲負數且方便求導。可見,在平方誤差損失函數的訓練過程中,預測值和實際值的差距將越來越小。

從平方誤差損失函數出發,我們只需要找到兩個值,其中一個代表詞向量,另外一個代表它的真實標籤,我們就可以藉助平方誤差損失函數讓它們越來越接近,最後得到詞向量

然而我們並不能找到一個真實標籤來直接代表詞向量,所以在論文中採用了一種迂迴的方法,即以單詞i和單詞j共同出現在一個窗口(window)中的頻數作爲真實標籤,以詞向量的點乘作爲預測值。

由此我們先寫下一個Glove模型的簡化版損失函數。

                                                           

其中,v_i  和 v_j 是在初始階段單詞i和單詞j的詞向量(在後續的訓練中會逼近真實的詞向量), X_{ij}爲根據共現矩陣得到的單詞i和單詞j共同出現在一個窗口(window)中的頻數。

有線性代數基礎的同學應該知道向量的點乘結果類似餘弦相似度可以在一定程度上反映兩個向量的相近程度,此處就是使用兩個詞向量的點乘來反映預測相似度,以兩個單詞共同出現的頻數來反映實際相似度。通過對平方誤差損失函數的不斷訓練,可以讓預測相似度不斷地逼近實際相似度,當預測相似度和實際相似度非常的接近時,我們也就得到了我們想要的詞向量。

理解了簡化版Glove損失函數之後對Glove的理解就差不多了,剩下的細枝末節只是爲了讓模型更魯棒。

其中f(x)的設計,有3點考慮:

1.當x趨近於0時,由於log x的平方趨於無窮大,因此f(x)必須有較大的導數快速趨近於0,從而保證J不爆炸

2.f(x)需要是遞增的,從而保證罕見的Xij沒有過分重要

3.f(x)在x特別大時,應該相對不能太大,保證高頻的共現沒有過分重要

 

綜上,f(x)被設計爲:

 

3. Glove和Skip-Gram、CBOW的區別

Glove相對於Skip-Gram和CBOW利用了詞共現的信息,即不僅僅關注word2vector窗口大小的上下文,而是利用共現矩陣用到了全局的信息。

同時,Glove的優點是訓練快,可以拓展到大規模語料,也適用於小規模語料和小向量,且最終效果通常更好。

                  

5.預訓練詞向量方法:【ELMO + GPT + BERT】

bert的全稱是Bidirectional Encoder Representation from Transformers,bert的核心是雙向Transformer Encoder,提出以下問題並進行解答:

1、爲什麼bert採取的是雙向Transformer Encoder,而不叫decoder?

BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。雙向 Transformer 通常被稱爲“Transformer encoder”,而左側上下文被稱爲“Transformer decoder”,decoder是不能獲要預測的信息的。

2、elmo、GPT和bert在單雙向語言模型處理上的不同之處?

在上述3個模型中,只有bert共同依賴於左右上下文。那elmo不是雙向嗎?實際上elmo使用的是經過獨立訓練的從左到右和從右到左LSTM的串聯拼接起來的。而GPT使用從左到右的Transformer,實際就是“Transformer decoder”。

3、bert構建雙向語言模型不是很簡單嗎?不也可以直接像elmo拼接Transformer decoder嗎?

BERT 的作者認爲,這種拼接式的bi-directional 仍然不能完整地理解整個語句的語義。更好的辦法是用上下文全向來預測[mask],也就是用 “能/實現/語言/表徵/../的/模型”,來預測[mask]。BERT 作者把上下文全向的預測方法,稱之爲 deep bi-directional。

4、bert爲什麼要採取Marked LM,而不直接應用Transformer Encoder?

我們知道向Transformer這樣深度越深,學習效果會越好。可是爲什麼不直接應用雙向模型呢?因爲隨着網絡深度增加會導致標籤泄露。如下圖:

 

雙向編碼與網絡深度的衝突

深度雙向模型比left-to-right 模型或left-to-right and right-to-left模型的淺層連接更強大。遺憾的是,標準條件語言模型只能從左到右或從右到左進行訓練,因爲雙向條件作用將允許每個單詞在多層上下文中間接地“see itself”。

爲了訓練一個深度雙向表示(deep bidirectional representation),研究團隊採用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token,然後只預測那些被屏蔽的token。論文將這個過程稱爲“masked LM”(MLM)。

5、bert爲什麼並不總是用實際的[MASK]token替換被“masked”的詞彙?

NLP必讀 | 十分鐘讀懂谷歌BERT模型: 雖然這確實能讓團隊獲得雙向預訓練模型,但這種方法有兩個缺點。首先,預訓練和finetuning之間不匹配,因爲在finetuning期間從未看到[MASK]token。爲了解決這個問題,團隊並不總是用實際的[MASK]token替換被“masked”的詞彙。相反,訓練數據生成器隨機選擇15%的token。例如在這個句子“my dog is hairy”中,它選擇的token是“hairy”。然後,執行以下過程:
數據生成器將執行以下操作,而不是始終用[MASK]替換所選單詞:
80%的時間:用[MASK]標記替換單詞,例如,my dog is hairy → my dog is [MASK]
10%的時間:用一個隨機的單詞替換該單詞,例如,my dog is hairy → my dog is apple
10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向於實際觀察到的單詞。
Transformer encoder不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分佈式上下文表示。此外,因爲隨機替換隻發生在所有token的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。
使用MLM的第二個缺點是每個batch只預測了15%的token,這表明模型可能需要更多的預訓練步驟才能收斂。團隊證明MLM的收斂速度略慢於 left-to-right的模型(預測每個token),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。

bert模型的主要創新點都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。

下面給出了Transformer Encoder模型的整體結構:

                                               

Transformer Encoder

 

multi-head attention

 

Reference

  1. word2vec 中的數學原理詳解
  2. GloVe詳解
  3. 從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史
  4. NLP必讀 | 十分鐘讀懂谷歌BERT模型
  5. 谷歌BERT解析----2小時上手最強NLP訓練模型
  6. https://zhuanlan.zhihu.com/p/56382372

 

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