[深度学习]自然语言处理 --- ELMo
原文鏈接:Deep contextualized word representations
ELMO,是Embedding from Language Model的縮寫( Peters等人,2018年),通過無監督預訓練多層雙向LSTM模型來學習帶上下文信息的(Contextualized)單詞表示。
1. Motivation
詞向量在目前NLP技術發展和應用中具有重要作用,高質量的詞向量對下游任務的效果至關重要。
傳統word2vec等模型對一個詞的表示是固定的,一成不變的,但現實場景中,同樣的詞在不同語境中往往表達不同的含義,為此,ELMo應運而生。ELMo(Embeddings from Language Models)是一種動態的,語境化的詞向量表示方法,可以根據上下文語境來生成相應詞的向量表示。
2014年的GloVe的工作中,每個詞對應一個vector,對于多義詞無能為力。ELMo的工作對于此,提出了一個較好的解決方案。不同于以往的一個詞對應一個向量,是固定的。在ELMo世界里,預訓練好的模型不再只是向量對應關系,而是一個訓練好的模型。使用時,將一句話或一段話輸入模型,模型會根據上線文來推斷每個詞對應的詞向量。這樣做之后明顯的好處之一就是對于多義詞,可以結合前后語境對多義詞進行理解。比如appele,可以根據前后文語境理解為公司或水果。
ELMo通過深度雙向語言模型(biLM)進行訓練,主要解決了兩個問題:
(1) 學習詞匯用法的復雜特性,如語法和語義;
(2) 學習詞匯不同語境下的一詞多義性;
?
一個簡單的例子就是 “蘋果”的詞向量:
句子1:“我 買了 1斤 蘋果”
句子2:“我 新 買了 1個 蘋果 X”
在word2vec算法中,“蘋果”的詞向量固定,無法區分這兩句話的區別,而ELMo可以解決語言中的二義性問題,可以帶來性能的顯著提升。
上面兩個文本序列中都出現了“蘋果”這個詞匯,但是在不同的句子中,它們我的含義顯示是不同的,一個屬于水果領域,一個屬于電子產品呢領域,如果針對“蘋果”這個詞匯同時訓練兩個詞向量來分別刻畫不同領域的信息呢?答案就是使用ELMo。
PS:
ELMo在中文上確實會比word2vec好很多, 使用中文語料測試成功了, 使用200m新聞語料訓練語言模型, 然后在對該新聞語料進行分類(10類)。最終測試結果使用ELMO比word2vector高近2個百分點, 而且這還是沒有對ELMO優化的情況下。
2. Introduction
2.1 ELMo詞向量表示理念
與傳統詞向量用固定向量的表示不同,ELMo是一種動態詞向量表示方法,其最終訓練得到一個語言模型。當需要文本s中某個詞w的詞向量表示時,ELMo通過將s作為輸入,得到文本的向量表示,繼而獲得詞w在文本s語境下的詞向量表示。
ELMo模型從大規模語料上訓練得到的深度雙向語言模型(deep biLM)的內部狀態學習得到,因此,ELMo的詞向量表示是深度的,是biLM內部各層狀態的線性組合,而非僅僅取LSTM的最后一層。
2.2 ELMo理念的物理意義
ELMo認為,通過聯合biLM的各層內部狀態來表示詞向量可以表達詞語更為豐富的信息,模型底層隱狀態表達詞語的語法信息(eg:適用于詞性標注任務),而上層隱狀態則捕捉了詞語的語義信息(eg:適用于詞義消歧任務)。
大量實驗證明,ELMo在多種NLP任務中都獲得極好的效果;另外,前人的工作以及論文最后對ELMo與GoVe的分析則證明,詞向量的深度表示比僅利用LSTM的最后一層的效果更好。
?
3. ELMo原理介紹
前面也說過ELMo最重要的一點是就是訓練語言模型,語言模型的結構如下:
?
他們使用的是一個雙向的LSTM語言模型,由一個前向和一個后向語言模型構成,目標函數就是取這兩個方向語言模型的最大似然。
前向LSTM結構:
??雙向語言模型( bi-LM )是ELMO的基礎。模型的輸入是由n個token構成的序列,( x1,…,xn),語言模型根據歷史的序列預測(x1.....xi-1)下一個token xi的概率。在正向計算(forwar pass)過程中,根據歷史之前的序列(x1.....xi-1)預測第i個token xi的概率
?
反向LSTM結構:
在反向計算(backward pass)過程中,根據歷史之后的序列(xi+1......xn)預測第i個token xi的概率,
兩個方向上的預測過程都是由多層LSTMs建模的,給定輸入token xi得到隱狀態為h→i,?和h←i,?。最后一層的輸出的隱狀態為hi,L=[h→i,L;h←i,L]作為輸出層的輸入,用于得到最終的輸出yi。模型共享embedding層和softmax層,分別由θe和θs參數化表示。
?
?
最大似然函數:
該模型的目標函數(loss function)是最小化兩個方向的負對數似然( =最大化真實單詞的對數似然) :
?
ELMo通過以某種方式將隱藏狀態(和初始嵌入)組合在一起來提出情境化嵌入(連接后加權求和)。
?
ELMo中最后的向量是將詞的embedding和兩個LSTM的輸出向量做線性疊加。
ELMo是雙向語言模型biLM的多層表示的組合,對于某一個詞語 t,一個L層的雙向語言模型biLM能夠由2L+1個向量表示:
LMo使用雙層BiLSTM來訓練語言模型,創新是線性組合不同層的word vectors, 作為最終的word representation. 核心公式:
- 第一層是普通的word embedding 可以用wrod2vec或者glove來得到,或者使用character level得到token embedding, 這部分是general embedding,上下文無關。文中使用的character level的CNN+Highway.
- 后面連接兩個biLSTM 去encode 輸入(同時也有殘差連接), 每一層LSTM得到的輸出(隱狀態) 作為每個詞的上下文相關的word vectors.
- 這樣每個詞就會有(L+1)個詞向量,L為biLSTM的層數.
- 詞向量的線性組合,針對不同的任務,不同層的向量做不同的權重加和。 其中權重s是一個維度為L的vector,參與訓練。
因此ELMo的基本輸入單元為句子,每個詞沒有固定的詞向量,是根據詞的上下文環境來動態產生當前詞的詞向量,常見的場景可以較好解決一詞多義的問題,這一點跟word2vec與glove等通用詞向量模型是不同的。
?
4. ELMo實際使用
將BiLMs應用到有監督NLP任務
給定一個預訓練好的biLM模型和一個有監督的NLP任務,可以很簡單的使用biLM來提升任務效果,我們只需要用biLM預測每句話中的詞在biLM各層下的表示。然后,用端任務模型學習這些表示的線性組合,具體如下:
首先對于大多數NLP任務最底層(靠近輸入層)的結構基本都一樣,這讓我們可以使用統一的方式將ELMo加進去。給定一個詞序列 (t1,....,tN),常規操作是使用預訓練好的詞嵌入(以及可選的字表示)將這個序列轉化為一個上下文無關的詞表示 (x1,..., xk) ,然后模型下一步輸出一個上下文相關的表示 hk,這一步可以用RNNs, CNNs,或者前饋神經網絡。
要將ELMo加入到這個模型,我們首先固定住biLM的權重然后拼接ELMo向量 ELMo-k和 xk ,得到 [xk; ELMo-k] ,將其傳入任務模型,比如RNN模型。對于一些任務我們發現將RNN模型的RNN輸出hk替換為 [hk; ELMo-k]能帶來進一步提升。模型其他部分不做改變,我們甚至可以應用到更加復雜的神經網絡中,比如第四部分的SNLI實驗,其biLSTMs后面接了一個雙向注意力層,又比如指代解析實驗中在biLSTMs上面有一個聚類模型作為一層。
最后,我們發現可以對ELMo添加適當的dropout,某些望情況下loss上加L2的正則化會帶來好處,通過對ELMo的權重添加歸納偏置讓其和biLM層的均值保持接近。
?
ELMO 的本質思想是:我事先用語言模型學好一個單詞的 Word Embedding,此時多義詞無法區分,不過這沒關系。在我實際使用 Word Embedding 的時候,單詞已經具備了特定的上下文了,這個時候我可以根據上下文單詞的語義去調整單詞的 Word Embedding 表示,這樣經過調整后的 Word Embedding 更能表達在這個上下文中的具體含義,自然也就解決了多義詞的問題了。所以 ELMO 本身是個根據當前上下文對 Word Embedding 動態調整的思路。
?
ELMO 采用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在做下游任務時,從預訓練網絡中提取對應單詞的網絡各層的 Word Embedding 作為新特征補充到下游任務中。
上圖展示的是其預訓練過程,它的網絡結構采用了雙層雙向 LSTM,目前語言模型訓練的任務目標是根據單詞Wi 的上下文去正確預測單詞 Wi , 之前的單詞序列 Context-before 稱為上文,之后的單詞序列 Context-after 稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞Wi外 的上文 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”。至于為何這么做能夠達到區分多義詞的效果,你可以想一想,其實比較容易想明白原因。
?
5. ELMo缺點
ELMO仍然存在兩個比較明顯的不足:
??? 1、使用Bi-LSTM模型構建語言模型,捕捉語義、長距離依賴和task-specific特征抽取、并行計算的能力弱于基于Self-Attention的Transformer模型。論文《Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures》,已經證明Transformer已經在捕捉長距離特征依賴、語義特征、任務相關特征和并行計算的能力,優于LSTM和CNN。關于CNN、LSTM和Transformer的詳細對比,可以參考張俊林老師的文章:《放棄幻想,全面擁抱Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較》。
?2、通過拼接(word embedding,Forward hidden state,backward hidden state)方式融合特征的方式,削弱了語言模型特征抽取的能力。
因此,GPT、BERT、MT-DNN和GPT-2基于Transformer構建LM,解決了問題一;對各種NLP任務進行改造,以適應pre-trained模型,即預訓練的模型結構不變,只是改變輸入的組織方式,很好的避免了問題2;具體的任務改造基本類似。
?
參考:
NAACL2018:高級詞向量(ELMo)詳解(超詳細) 經典
?
?
?
?
?
總結
以上是生活随笔為你收集整理的[深度学习]自然语言处理 --- ELMo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [kubernetes] 证书详细总结
- 下一篇: html button标签是什么意思?h