[轉] ELMO


兩篇講ELMO的好文,mark

from : https://zhuanlan.zhihu.com/p/63115885

and: https://blog.csdn.net/triplemeng/article/details/82380202

介紹

之前的glove以及word2vec的word embedding在nlp任務中都取得了最好的效果,,現在幾乎沒有一個NLP的任務中不加word embedding。我們常用的獲取embedding方法都是通過訓練language model,將language model中預測的hidden state做為word的表示,給定N個tokens的序列(t1,t2,...,tn), 前向language model就是通過前k-1個輸入序列(t1,t2,...,tk)的hidden表示, 預測第k個位置的token, 反向的language model就是給定后面的序列, 預測之前的。然后將language model的第k個位置的hidden輸出做為word embedding。之前的做法的缺點是對於每一個單詞都有唯一的一個embedding表示, 而對於多義詞顯然這種做法不符合直覺, 而單詞的意思又和上下文相關, ELMo的做法是我們只預訓練language model,而word embedding是通過輸入的句子實時輸出的, 這樣單詞的意思就是上下文相關的了,這樣就很大程度上緩解了歧義的發生

在此之前的 Word Embedding 本質上是個靜態的方式,所謂靜態指的是訓練好之后每個單詞的表達就固定住了,以后使用的時候,不論新句子上下文單詞是什么,這個單詞的 Word Embedding 不會跟着上下文場景的變化而改變,所以對於比如 Bank 這個詞,它事先學好的 Word Embedding 中混合了幾種語義,在應用中來了個新句子,即使從上下文中(比如句子包含 money 等詞)明顯可以看出它代表的是「銀行」的含義,但是對應的 Word Embedding 內容也不會變,它還是混合了多種語義。這是為何說它是靜態的,這也是問題所在

ELMo用到上文提到的雙向的language model,給定N個tokens (t1, t2,…,tN), language model通過給定前面的k-1個位置的token序列計算第k個token的出現的概率:

p(t_1, t_2, ..., t_N) = \prod_{k=1}^N p(t_k|t_1, t_2, ..., t_{k-1})

后向的計算方法與前向相似:

p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{k+1}, t_{k+2}, \ldots, t_{N}\right)

biLM訓練過程中的目標就是最大化:

\sum_{k=1}^{N}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \Theta_{x}, \vec{\Theta}_{L S T M}, \Theta_{s}\right)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \stackrel{\leftarrow}{\Theta}_{L S T M}, \Theta_{s}\right)\right)

ELMo對於每個token t_k , 通過一個L層的biLM計算出2L+1個表示:

R_k = \{x_k^{LM}, \overrightarrow{h}_{k,j}^{LM}, \overleftarrow{h}_{k, j}^{LM} \vert j=1, ..., L\} = \{h_{k,j}^{LM} \vert j=0,..., L\}

其中 x_k^{LM} 是對token進行直接編碼的結果(這里是字符通過CNN編碼), \mathbf{h}_{k, 0}^{L M} 代表 x_k^{LM} h_{k,j}^{LM} = [\overrightarrow{h}_{k,j}^{LM}; \overleftarrow{h}_{k, j}^{LM}] 是每個biLSTM層輸出的結果。在實驗中還發現不同層的biLM的輸出的token表示對於不同的任務效果不同.最上面一層的輸出 \overrightarrow{\mathbf{h}}_{k, L}^{L M} 是用softmax來預測下面一個單詞 t_{k+1}

應用中將ELMo中所有層的輸出R壓縮為單個向量, ELMo_k = E(R_k;\Theta _\epsilon),最簡單的壓縮方法是取最上層的結果做為token的表示: E(R_k) = h_{k,L}^{LM} ,更通用的做法是通過一些參數來聯合所有層的信息:

E L M o_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} h_{k, j}^{L M}

其中 \mathbf{s}^{\operatorname{tas} k} 是一個softmax出來的結果, γ是一個任務相關的scale參數,我試了平均每個層的信息和學出來 \mathbf{s}^{\operatorname {task}} 發現學習出來的效果會好很多。 文中提到γ在不同任務中取不同的值效果會有較大的差異, 需要注意, 在SQuAD中設置為0.01取得的效果要好於設置為1時。

文章中提到的Pre-trained的language model是用了兩層的biLM, 對token進行上下文無關的編碼是通過CNN對字符級進行編碼, 然后將三層的輸出scale到1024維, 最后對每個token輸出3個1024維的向量表示。 這里之所以將3層的輸出都作為token的embedding表示是因為實驗已經證實不同層的LM輸出的信息對於不同的任務作用是不同的, 也就是所不同層的輸出捕捉到的token的信息是不相同的。

參考:ELMoELMo

ELMO 的本質思想是:我事先用語言模型學好一個單詞的 Word Embedding,此時多義詞無法區分,不過這沒關系。在我實際使用 Word Embedding 的時候,單詞已經具備了特定的上下文了,這個時候我可以根據上下文單詞的語義去調整單詞的 Word Embedding 表示,這樣經過調整后的 Word Embedding 更能表達在這個上下文中的具體含義,自然也就解決了多義詞的問題了。所以 ELMO 本身是個根據當前上下文對 Word Embedding 動態調整的思路。

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

上圖展示的是其預訓練過程,它的網絡結構采用了雙層雙向 LSTM,目前語言模型訓練的任務目標是根據單詞 W_{i} 的上下文去正確預測單詞 W_{i} , W_{i} 之前的單詞序列 Context-before 稱為上文,之后的單詞序列 Context-after 稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外 W_{i} 的上文 Context-before;右端的逆向雙層 LSTM 代表反方向編碼器,輸入的是從右到左的逆序的句子下文 Context-after;每個編碼器的深度都是兩層 LSTM 疊加。這個網絡結構其實在 NLP 中是很常用的。

使用這個網絡結構利用大量語料做語言模型任務就能預先訓練好這個網絡,如果訓練好這個網絡后,輸入一個新句子Snew,句子中每個單詞都能得到對應的三個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”。至於為何這么做能夠達到區分多義詞的效果,你可以想一想,其實比較容易想明白原因。

上面這個圖是 TagLM 采用類似 ELMO 的思路做命名實體識別任務的過程,其步驟基本如上述 ELMO 的思路,所以此處不展開說了。TagLM 的論文發表在 2017 年的 ACL 會議上,作者就是 AllenAI 里做 ELMO 的那些人,所以可以將 TagLM 看做 ELMO 的一個前導工作。

前面我們提到靜態 Word Embedding 無法解決多義詞的問題,那么 ELMO 引入上下文動態調整單詞的 embedding 后多義詞問題解決了嗎?解決了,而且比我們期待的解決得還要好。

上圖給了個例子,對於 Glove 訓練出的 Word Embedding 來說,多義詞比如 play,根據它的 embedding 找出的最接近的其它單詞大多數集中在體育領域,這很明顯是因為訓練數據中包含 play 的句子中體育領域的數量明顯占優導致;而使用 ELMO,根據上下文動態調整后的 embedding 不僅能夠找出對應的「演出」的相同語義的句子,而且還可以保證找出的句子中的 play 對應的詞性也是相同的,這是超出期待之處。之所以會這樣,是因為我們上面提到過,第一層 LSTM 編碼了很多句法信息,這在這里起到了重要作用。

ELMO 經過這般操作,效果如何呢?實驗效果見上圖,6 個 NLP 任務中性能都有幅度不同的提升,最高的提升達到 25% 左右,而且這 6 個任務的覆蓋范圍比較廣,包含句子語義關系判斷,分類任務,閱讀理解等多個領域,這說明其適用范圍是非常廣的,普適性強,這是一個非常好的優點。

那么站在現在這個時間節點看,ELMO 有什么值得改進的缺點呢?首先,一個非常明顯的缺點在特征抽取器選擇方面,ELMO 使用了LSTM而不是新貴 Transformer,Transformer 是谷歌在 17 年做機器翻譯任務的“Attention is all you need”的論文中提出的,引起了相當大的反響,很多研究已經證明了 Transformer 提取特征的能力是要遠強於LSTM的。如果 ELMO 采取 Transformer 作為特征提取器,那么估計 Bert 的反響遠不如現在的這種火爆場面。另外一點,ELMO 采取雙向拼接這種融合特征的能力可能比 Bert 一體化的融合特征方式弱,但是,這只是一種從道理推斷產生的懷疑,目前並沒有具體實驗說明這一點。

 

這篇介紹一下ELMo算法(論文)。按道理應該加入前面的《關於句子embedding的一些工作簡介》系列,但是嚴格來講,只能說它通過自己產生的word embedding來影響了句子embedding, 所以干脆另寫一篇吧。

Introduction
Bidirectional language models
ELMo
Evaluation and Analysis
總結
Introduction
作者認為好的詞表征模型應該同時兼顧兩個問題:一是詞語用法在語義和語法上的復雜特點;二是隨着語言環境的改變,這些用法也應該隨之改變。作者提出了deep contextualized word representation 方法來解決以上兩個問題。

這種算法的特點是:每一個詞語的表征都是整個輸入語句的函數。具體做法就是先在大語料上以language model為目標訓練出bidirectional LSTM模型,然后利用LSTM產生詞語的表征。ELMo故而得名(Embeddings from Language Models)。為了應用在下游的NLP任務中,一般先利用下游任務的語料庫(注意這里忽略掉label)進行language model的微調,這種微調相當於一種domain transfer; 然后才利用label的信息進行supervised learning。

ELMo表征是“深”的,就是說它們是biLM的所有層的內部表征的函數。這樣做的好處是能夠產生豐富的詞語表征。高層的LSTM的狀態可以捕捉詞語意義中和語境相關的那方面的特征(比如可以用來做語義的消歧),而低層的LSTM可以找到語法方面的特征(比如可以做詞性標注)。如果把它們結合在一起,在下游的NLP任務中會體現優勢。

Bidirectional language models
ELMo顧名思義是從Language Models得來的embeddings,確切的說是來自於Bidirectional language models。具體可以表示為:



這里的(t1,t2,...,tN)(t1,t2,...,tN)是一系列的tokens
作為語言模型可能有不同的表達方法,最經典的方法是利用多層的LSTM,ELMo的語言模型也采取了這種方式。所以這個Bidirectional LM由stacked bidirectional LSTM來表示。

假設輸入是token的表示xLMkxkLM。在每一個位置kk,每一層LSTM上都輸出相應的context-dependent的表征h→LMk,jh→k,jLM。這里j=1,...,Lj=1,...,L。頂層的LSTM的輸出,h→LMk,Lh→k,LLM,通過Softmax層來預測下一個tokentk+1tk+1。

log likelihood表達如下:


這里的ΘxΘx代表token embedding, ΘsΘs代表softmax layer的參數。

ELMo
對於每一個token,一個L層的biLM要計算出共2L+12L+1個表征:


這里hLMk,jhk,jLM是簡寫,當j=0j=0時,代表token層。j>0j>0時,同時包括兩個方向的h。

在下游的任務中, ELMo把所有層的R壓縮在一起形成一個單獨的vector。(在最簡單的情況下,可以只保留最后一層的hLMk,Lhk,LLM。)


具體來講如何使用ElMo產生的表征呢?對於一個supervised NLP任務,可以分以下三步:

產生pre-trained biLM模型。模型由兩層bi-LSTM組成,之間用residual connection連接起來。
在任務語料上(注意是語料,忽略label)fine tuning上一步得到的biLM模型。可以把這一步看為biLM的domain transfer。
利用ELMo的word embedding來對任務進行訓練。通常的做法是把它們作為輸入加到已有的模型中,一般能夠明顯的提高原模型的表現。
印象中太深的NLP方面的模型基本沒有,這和Computer Vision領域非常不一樣。 當然這也是所解決問題的本質決定: Image的特征提取在人腦里就是從低階到高階的過程,深層網絡有助於高級特征的實現。對於語言來講很難定義這樣的一個過程,這篇文章的兩層biLM加residual connection的架構比較少見(Google的transformor是多層網絡+residual connection一個例子)。文章認為低層和高層的LSTM功能有差異:低層能夠提取語法方面的信息;高層擅於捕捉語義特征。

Evaluation and Analysis
效果
先看一下在QA,Textual entailment,Semanic role labeling, Coreference resolution, NER, 和 Sentiment analysis上的表現。


和state of art比基本上每個任務都有明顯的改善。表中的OUR BASELINE在論文中有詳細介紹,它指的是作者選定的某些已有的模型。ELMo+BASELINE指的是作者把ELMo的word representation作為輸入提供給選定的模型。這樣我們可以清楚的比較在使用和不使用ELMo詞嵌入時的效果。

多層和最后一層
公式(1)用各層表征的疊加來代表相應位置的向量,作者在下表中比較了僅僅使用最后一層的效果。

顯然多層的疊加效果好於僅使用最后的一層。
最后一列里的λλ代表的是網絡參數regularization的大小。結果說明合適的regularization有好處。

存在於輸入層和輸出層
其實ELMo不僅可以作為下游模型的輸入,也可以直接提供給下游模型的輸出層。

上表說明有時候同時提供給下游模型的輸入和輸出層效果更好。

biLM捕捉到的詞語信息
ELMo提高了模型的效果,這說明它產生的word vectors捕捉到其他的word vectors沒有的信息。直覺上來講,biLM一定能夠根據context區別詞語的用法。下表比較了Glove和biLM在play這個多義詞上的解釋。

對於Glove來說,play的近義詞同時涵蓋了不同的語法上的用法:動詞(playing, played), 名詞(players,game)。
但是biLM能夠同時區分語法和語義:第一個例子里的play名詞,表示擊球,第二個例子中play也是名詞,表示表演。顯然biLM能夠在表示詞語嵌入時考慮到context的信息。

總結
ELMo在處理很多NLP下游任務中表現非常優異。但是我想這跟它集中在產生更好的詞語級別的embedding是有關系的。過去介紹到的一些其他的算法,比如Quick thoughts也是利用了語言模型作為句子的encoder;還有InferSent使用biLSTM作為encoder。和ELMo相比,它們都顯得“野心”太大:它們為下游的NLP任務提供了句子embedding的解決方案:即直接利用它們的pretrained encoder,最終的預測無非是加上softmax的classifier。
對比而言ELMo要單純很多,它只提供了word級別的解決方案:利用它的pretrained biLM來產生word embedding,然后提供給下游的模型。這里的模型往往是sequence model,其效果已經在相應的NLP任務上得到驗證。這時有了新的兼具語法語義及環境特征的word embedding的加持,難怪效果會更好。更不要說,ELMo還在任務語料庫上小心翼翼的再進行過一輪微調,更是保證了對新domain的adaptation。

關注公眾號《沒啥深度》有關自然語言處理的深度學習應用,偶爾也有關計算機視覺
---------------------
作者:triplemeng
來源:CSDN
原文:https://blog.csdn.net/triplemeng/article/details/82380202
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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