NLP面試問題個人總結-詞向量技術


(引用自:https://zhuanlan.zhihu.com/p/49271699  ,本文作個人學習用)

1 語言模型介紹

什么是語言模型?其實看上面這張PPT上扣下來的圖就明白了,為了能夠量化地衡量哪個句子更像一句人話,可以設計如上圖所示函數,核心函數P的思想是根據句子里面前面的一系列前導單詞預測后面跟哪個單詞的概率大小(理論上除了上文之外,也可以引入單詞的下文聯合起來預測單詞出現概率)

2 Word2Vec

 Word2Vec有兩種訓練方法,一種叫CBOW,核心思想是從一個句子里面把一個詞摳掉,用這個詞的上文和下文去預測被摳掉的這個詞;第二種叫做Skip-gram,和CBOW正好反過來,輸入某個單詞,要求網絡預測它的上下文單詞。這里用到了負采樣的思想。

可以發現,Bert的訓練機制(mask token)和Word2Vec的CBOW形式有點相似。


這片在Word Embedding頭上籠罩了好幾年的烏雲是什么?是多義詞問題

我們知道,多義詞是自然語言中經常出現的現象,也是語言靈活性和高效性的一種體現。多義詞對Word Embedding來說有什么負面影響?如上圖所示,比如多義詞Bank,有兩個常用含義,但是Word Embedding在對bank這個單詞進行編碼的時候,是區分不開這兩個含義的,因為它們盡管上下文環境中出現的單詞不同,但是在用語言模型訓練的時候,不論什么上下文的句子經過word2vec,都是預測相同的單詞bank,而同一個單詞占的是同一行的參數空間,這導致兩種不同的上下文信息都會編碼到相同的word embedding空間里去。所以word embedding無法區分多義詞的不同語義,這就是它的一個比較嚴重的問題。

ELMO提供了一種簡潔優雅的解決方案。

 

3 ELMO

ELMO是“Embedding from Language Models”的簡稱,其實這個名字並沒有反應它的本質思想,提出ELMO的論文題目:“Deep contextualized word representation”更能體現其精髓,而精髓在哪里?

在deep contextualized這個短語,一個是deep,一個是context,其中context更關鍵。在此之前的Word Embedding本質上是個靜態的方式,所謂靜態指的是訓練好之后每個單詞的表達就固定住了,以后使用的時候,不論新句子上下文單詞是什么,這個單詞的Word Embedding不會跟着上下文場景的變化而改變,

所以對於比如Bank這個詞,它事先學好的Word Embedding中混合了幾種語義 ,在應用中來了個新句子,即使從上下文中(比如句子包含money等詞)明顯可以看出它代表的是“銀行”的含義,但是對應的Word Embedding內容也不會變,它還是混合了多種語義。這是為何說它是靜態的,這也是問題所在。

 

ELMO的本質思想是:我事先用語言模型學好一個單詞的Word Embedding,此時多義詞無法區分,不過這沒關系。

在我實際使用Word Embedding的時候,單詞已經具備了特定的上下文了,這個時候我可以根據上下文單詞的語義去調整單詞的Word Embedding表示,這樣經過調整后的Word Embedding更能表達在這個上下文中的具體含義,自然也就解決了多義詞的問題了。所以ELMO本身是個根據當前上下文對Word Embedding動態調整的思路

 

 

 ELMO采用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在做下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding作為新特征補充到下游任務中。

上圖展示的是其預訓練過程,它的網絡結構采用了雙層雙向LSTM,目前語言模型訓練的任務目標是根據單詞 [公式] 的上下文去正確預測單詞 [公式] , [公式] 之前的單詞序列Context-before稱為上文,之后的單詞序列Context-after稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外 [公式] 的上文Context-before右端的逆向雙層LSTM代表反方向編碼器,輸入的是從右到左的逆序的句子下文Context-after

每個編碼器的深度都是兩層LSTM疊加。這個網絡結構其實在NLP中是很常用的。使用這個網絡結構利用大量語料做語言模型任務就能預先訓練好這個網絡,如果訓練好這個網絡后,輸入一個新句子 [公式] ,句子中每個單詞都能得到對應的三個Embedding:最底層是單詞的Word Embedding,往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法信息更多一些;再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義信息更多一些。

也就是說,ELMO的預訓練過程不僅僅學會單詞的Word Embedding,還學會了一個雙層雙向的LSTM網絡結構,而這兩者后面都有用。

 

上面介紹的是ELMO的第一階段:預訓練階段。那么預訓練好網絡結構后,如何給下游任務使用呢?

上圖展示了下游任務的使用過程,比如我們的下游任務仍然是QA問題,此時對於問句X,我們可以先將句子X作為預訓練好的ELMO網絡的輸入,這樣句子X中每個單詞在ELMO網絡中都能獲得對應的三個Embedding,之后給予這三個Embedding中的每一個Embedding一個權重a,這個權重可以學習得來,根據各自權重累加求和,將三個Embedding整合成一個。然后將整合后的這個Embedding作為X句在自己任務的那個網絡結構中對應單詞的輸入,以此作為補充的新特征給下游任務使用。

對於上圖所示下游任務QA中的回答句子Y來說也是如此處理。因為ELMO給下游提供的是每個單詞的特征形式,所以這一類預訓練的方法被稱為“Feature-based Pre-Training”。

而使用ELMO,根據上下文動態調整后的embedding不僅能夠找出對應的“Bank”的相同語義的句子,而且還可以保證找出的句子中的Bank對應的詞性也是相同的,這是超出期待之處。

之所以會這樣,是因為我們上面提到過,第一層LSTM編碼了很多句法信息,這在這里起到了重要作用。

 

4 GPT

GPT是“Generative Pre-Training”的簡稱,從名字看其含義是指的生成式的預訓練。

GPT也采用兩階段過程,第一個階段是利用語言模型進行預訓練,第二階段通過Fine-tuning的模式解決下游任務。

上圖展示了GPT的預訓練過程,其實和ELMO是類似的,主要不同在於兩點:

首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到過它的特征抽取能力要強於RNN,這個選擇很明顯是很明智的;

其次,GPT的預訓練雖然仍然是以語言模型作為目標任務,但是采用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓練的任務目標是根據 [公式] 單詞的上下文去正確預測單詞 [公式] , [公式] 之前的單詞序列Context-before稱為上文,之后的單詞序列Context-after稱為下文。ELMO在做語言模型預訓練的時候,預測單詞 [公式] 同時使用了上文和下文,而GPT則只采用Context-before這個單詞的上文來進行預測,而拋開了下文。這個選擇現在看不是個太好的選擇,原因很簡單,它沒有把單詞的下文融合進來,這限制了其在更多應用場景的效果,比如閱讀理解這種任務,在做任務的時候是可以允許同時看到上文和下文一起做決策的。如果預訓練時候不把單詞的下文嵌入到Word Embedding中,是很吃虧的,白白丟掉了很多信息。

下游任務

上圖展示了GPT在第二階段如何使用。首先,對於不同的下游任務來說,本來你可以任意設計自己的網絡結構,現在不行了,你要向GPT的網絡結構看齊,把任務的網絡結構改造成和GPT的網絡結構是一樣的。(其實就是不能抽取詞向量了,直接加輸出層做下游

然后,在做下游任務的時候,利用第一步預訓練好的參數初始化GPT的網絡結構,這樣通過預訓練學到的語言學知識就被引入到你手頭的任務里來了,這是個非常好的事情。

再次,你可以用手頭的任務去訓練這個網絡,對網絡參數進行Fine-tuning,使得這個網絡更適合解決手頭的問題。


GPT論文給了一個改造施工圖如上,其實也很簡單:對於分類問題,不用怎么動,加上一個起始和終結符號即可;對於句子關系判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;對文本相似性判斷問題,把兩個句子順序顛倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;對於多項選擇問題,則多路輸入,每一路把文章和答案選項拼接作為輸入即可。從上圖可看出,這種改造還是很方便的,不同任務只需要在輸入部分施工即可。

BERT解決了GPT中單向語言模型的方法,變為雙向。

 

4 BERT

 Bert采用和GPT完全相同的兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下游任務。和GPT的最主要不同在於在預訓練階段采用了類似ELMO的雙向語言模型,當然另外一點是語言模型的數據規模要比GPT大。所以這里Bert的預訓練過程不必多講了。

 下游:

對於句子關系類任務,很簡單,和GPT類似,加上一個起始和終結符號,句子之間加個分隔符即可。

對於輸出來說,把第一個起始符號對應的Transformer最后一層位置上面串接一個softmax分類層即可。

對於分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關系判斷任務類似改造;

對於序列標注問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最后一層每個單詞對應位置都進行分類即可。

其實對於機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。只需要附着在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。

區別和改進:

對於Transformer來說,怎么才能在這個結構上做雙向語言模型任務呢?

看看ELMO的網絡結構圖,只需要把兩個LSTM替換成兩個Transformer,一個負責正向,一個負責反向特征提取,其實應該就可以。

當然這是我自己的改造,Bert沒這么做。那么Bert是怎么做的呢?

我們前面不是提過Word2Vec嗎?我前面肯定不是漫無目的地提到它,提它是為了在這里引出那個CBOW訓練方法,它的核心思想是:在做語言模型任務的時候,我把要預測的單詞摳掉,然后根據它的上文Context-Before和下文Context-after去預測單詞。

Bert就是這么做的。從這里可以看到方法間的繼承關系。當然Bert作者沒提Word2Vec及CBOW方法,這是我的判斷,Bert作者說是受到完形填空任務的啟發,這也很可能,但是我覺得他們要是沒想到過CBOW估計是不太可能的。

 


 

第一個任務:

隨機把一句話中$15 \% $$token$替換成以下內容:
1) 這些$token$$80 \% $的幾率被替換成$[mask]$;
2) 有$10 \%$的幾率被替換成任意一個其他的$token$;
3) 有$10 \%$的幾率原封不動.

 

之后讓模型 預測和還原被遮蓋掉或替換掉的部分, 模型最終輸出的隱藏層的計算結果的維度是:
$X_{hidden}: [batch\_size, \ seq\_len, \  embedding\_dim]$
我們初始化一個映射層的權重 $W_{vocab}$:
$W_{vocab}: [embedding\_dim, \ vocab\_size]$
我們用 $W_{vocab}$完成隱藏維度到字向量數量的映射, 只要求 $X_{hidden}$$W_{vocab}$的矩陣乘(點積):
$X_{hidden}W_{vocab}: [batch\_size, \ seq\_len, \ vocab\_size] $ 之后把上面的計算結果在 $vocab\_size$(最后一個)維度做 $softmax$歸一化, 是每個字對應的 $vocab\_size$的和為 $1$, 我們就可以通過 $vocab\_size$里概率最大的字來得到模型的預測結果, 就可以和我們准備好的 $Label$做損失( $Loss$)並反傳梯度了.
注意做損失的時候, 只計算在第1步里當句中 隨機遮蓋或替換的部分, 其余部分不做損失, 對於其他部分, 模型輸出什么東西, 我們不在意.
也就是新的矩陣XW的三個維度,最后一個維度是vocab_size
 

 

第二個任務:

論文中指出的Masked 語言模型和Next Sentence Prediction

【cls表示開始    sep表示結束】

而Masked語言模型上面講了,本質思想其實是CBOW,但是細節方面有改進。

至於說“Next Sentence Prediction”,指的是做語言模型預訓練的時候,分兩種情況選擇兩個句子,一種是選擇語料中真正順序相連的兩個句子;另外一種是第二個句子從語料庫中拋色子,隨機選擇一個拼到第一個句子后面。我們要求模型除了做上述的Masked語言模型任務外,附帶再做個句子關系預測,判斷第二個句子是不是真的是第一個句子的后續句子。之所以這么做,是考慮到很多NLP任務是句子關系判斷任務,單詞預測粒度的訓練到不了句子關系這個層級,增加這個任務有助於下游句子關系判斷任務。所以可以看到,它的預訓練是個多任務過程。這也是Bert的一個創新。

 


 

輸入:

它的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最后增加兩個標識符號。

每個單詞有三個embedding:

位置信息embedding,這是因為NLP中單詞順序是很重要的特征,需要在這里對位置信息進行編碼;

單詞embedding,這個就是我們之前一直提到的單詞embedding;

第三個是句子embedding,因為前面提到訓練數據都是由兩個句子構成的,

那么每個句子有個句子整體的embedding項對應給每個單詞。把單詞對應的三個embedding疊加,就形成了Bert的輸入。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM