關於ELMo的若干問題整理 & 思考

1.ELMo的基本原理是什麼?

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

第一階段:利用語言模型進行預訓練

第一階段模型總覽:

img

上圖展示的是其預訓練過程,它的網絡結構採用了雙層雙向LSTM,其中單詞(token)特徵這一塊採用的是單詞的embedding(是否是預訓練好的論文中沒有告知)或者採用字符卷積得到其embedding表示(論文原文中說的是:via token embeddings or a CNN over characters,字符卷積可以參考論文:Character-Aware Neural Language Models),目前語言模型訓練的任務目標是根據單詞WiW_i的上下文去正確預測單詞 WiW_iWiW_i之前的單詞序列Context-before稱爲上文,WiW_i之後的單詞序列Context-after稱爲下文。

上圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外WiW_i的上文Context-before;右端的逆向雙層LSTM代表反方向編碼器,輸入的是從右到左的逆序的句子下文Context-after;每個編碼器的深度都是兩層LSTM疊加。

需要注意的是上述殘差結構是在訓練深層LSTM網絡時常用的結構,簡單做法就是將LSTM層的輸入加到輸出上,在官方tensorflow源碼中token的embedding沒有加到第一層LSTM的輸出上

使用這個網絡結構利用大量語料做語言模型任務就能預先訓練好這個網絡,如果訓練好這個網絡後,輸入一個新句子SnewS_{new},句子中每個單詞都能得到對應的三個Embedding:

  • 最底層是單詞的Word Embedding
  • 往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法信息更多一些;
  • 再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義信息更多一些。

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

第二階段:下游任務利用預訓練好的embedding

第二階段模型總覽:

img

以QA問題爲例,展示下游任務如何利用預訓練好的embedding。對於問句X,我們可以先將句子X作爲預訓練好的ELMO網絡的輸入,這樣句子X中每個單詞在ELMO網絡中都能獲得對應的三個Embedding,之後給予這三個Embedding中的每一個Embedding一個權重a,這個權重可以學習得來,根據各自權重累加求和,將三個Embedding整合成一個。然後將整合後的這個Embedding作爲X句在自己任務的那個網絡結構中對應單詞的輸入,以此作爲補充的新特徵給下游任務使用。對於上圖所示下游任務QA中的回答句子Y來說也是如此處理。因爲ELMO給下游提供的是每個單詞的特徵形式,所以這一類預訓練的方法被稱爲“Feature-based Pre-Training”。

2.ELMo的訓練過程是什麼樣的?損失函數是什麼?

ELMo的訓練過程實際上指的是其第一階段的預訓練過程,第一階段實際上就是在訓練一個雙向語言模型,假設給定一個序列,該序列含有NN個token (t1,t2,,tN)\left(t_{1}, t_{2}, \ldots, t_{N}\right) ,那麼:

  • 前向語言模型通過在給定上文(t1,,tk1)\left(t_{1}, \ldots, t_{k-1}\right)(Context-before)的情況下對token tkt_k的概率建模來計算序列出現的概率:
    p(t1,t2,,tN)=k=1Np(tkt1,t2,,tk1) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right)

    • 許多主流的神經語言模型都會先給序列中的token計算一個上下文無關的token表示xkLM\mathbf{x}_{k}^{L M},然後將它傳遞給L層前向LSTM。這樣的話,在每個位置kk,每個LSTM層輸出一個上下文相關的表示hk,jLM\overrightarrow{\mathbf{h}}_{k, j}^{L M},其中j=1,,Lj = 1, \ldots, L(在ELMo中L取2)
  • 後向語言模型與前向類似,但是它是“從後往前建模的”,通過在給定下文(tk+1,,tN)\left(t_{k+1}, \ldots, t_{N}\right)(Context-after)的情況下對token tkt_k的概率建模來計算序列出現的概率:
    p(t1,t2,,tN)=k=1Np(tktk+1,tk+2,,tN) 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)

    • 與前向語言模型類似,後向語言模型在每個位置kk,每個LSTM層同樣會輸出一個上下文相關的表示hk,jLM\overleftarrow{\mathbf{h}}_{k, j}^{L M},其中j=1,,Lj = 1, \ldots, L
    • 需要注意的是,上述上下文無關的token表示xkLM\mathbf{x}_{k}^{L M}是前後向語言模型共享的

因此,由於ELMo結合了前後向語言模型,故其目標是同時最大化前後向語言模型的對數似然:
k=1N(logp(tkt1,,tk1;Θx,ΘLSTM,Θs)+logp(tktk+1,,tN;Θx,ΘLSTM,Θs)) \begin{array}{l}{\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)\right.} \\ {\left.\quad+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow \Theta_{L S T M}, \Theta_{s}\right)\right)}\end{array}
其中:

  • Θx\Theta_{x}爲token表示的參數(前後向語言模型共享)
  • Θs\Theta_{s}爲softmax分類的參數(前後向語言模型共享)
  • ΘLSTM,ΘLSTM\overrightarrow{\Theta}_{L S T M}, \overleftarrow \Theta_{L S T M}分別表示前後向語言模型LSTM層的參數

綜上所述,ELMo的訓練過程即爲一個前後向語言模型的訓練過程,通過上述描述則一目瞭然,而其損失函數即爲簡單的分類損失,取決於源碼實現,不同源碼中的實現可能略有不同。

3.ELMo訓練好了之後如何使用?

ELMo訓練好了該如何使用實際上指的是其第一階段的預訓練過程訓練完畢,下游任務如何利用預訓練好的embedding,在問題1中已經有了比較詳細的解讀,在該問題則對其進行公式化的說明。首先由1可知,對於序列中的每個token,一個L層的雙向語言模型就會得到其2L+1個表示,即爲:
Rk={xkLM,hk,jLM,hk,jLMj=1,,L}={hk,jLMj=0,,L} \begin{aligned} R_{k} &=\left\{\mathbf{x}_{k}^{L M}, \overrightarrow{\mathbf{h}}_{k, j}^{L M}, \overleftarrow{\mathbf{h}}_{k, j}^{L M} | j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} | j=0, \ldots, L\right\} \end{aligned}
其中,hk,0LM\mathbf{h}_{k, 0}^{L M}爲token的表示(即hk,0LM=xkLM\mathbf{h}_{k, 0}^{L M} = \mathbf{x}_{k}^{L M}),hk,jLM=[hk,jLM;hk,jLM]\mathbf{h}_{k, j}^{L M}=[\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \overleftarrow{\mathbf{h}}_{k, j}^{L M}]爲每個雙向LSTM層得到的表示。

需要注意的是,這裏是將整個句子輸入到雙向語言模型(這裏用的是雙向LSTM網絡)中,正向和反向LSTM網絡共享token embedding的輸入,源碼中token embedding、正向、反向LSTM的hidden state均爲512維度,一個長度爲nsentences的句子,經過ELMo預訓練網絡,最後得到的embedding的維度爲:(n_sentences, 3, max_sentence_length, 1024)

那麼下游任務如何利用這些表示呢?下游任務將所有表示都利用起來,並給他們分配權重,即爲:
ELMoktask=E(Rk;Θtask)=γtaskj=0Lsjtaskhk,jLMsjtask=esj/iNesi \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{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} \mathbf{h}_{k, j}^{L M},\quad s_{j}^{t a s k}=e^{s_{j}} / \sum_{i}^{N} e^{s_{i}}
其中,stasks^{t a s k}是經過softmax歸一化之後的權重,標量參數γtask\gamma^{t a s k}允許任務模型縮放整個ELMo向量。需要注意的是,γtask\gamma^{t a s k}是一個超參數,實際上這個參數是經驗參數,一定程度上能夠增強模型的靈活性。總結起來,整個爲下游任務獲取embedding的過程即爲:
在這裏插入圖片描述

4.ELMo的優點是什麼?ELMo爲什麼有效?

ELMo利用了深度上下文單詞表徵,該模型的優點:

  • 引入雙向語言模型,其實是 2 個單向語言模型(前向和後向)的集成;
  • 通過保存預訓練好的 2 層 biLSTM,通過特徵集成或 finetune 應用於下游任務;

總結來說,通過上述結構,ELMo能夠達到區分多義詞的效果,每個單詞(token)不再是隻有一個上下文無關的embedding表示。

那麼ELMo爲什麼有效呢?我認爲主要原因有以下幾點:

  • 首先,ELMo的假設前提是一個詞的詞向量不應該是固定的,所以在多義詞區分方面ELMo的效果必然比word2vec要好。
  • 另外,ELMo通過語言模型生成的詞向量是通過特定上下文的“傳遞”而來,再根據下游任務,對原本上下文無關的詞向量以及上下文相關的詞向量表示引入一個權重,這樣既在原來的詞向量中引入了上下文的信息,又能根據下游任務適時調整各部分的權重(權重是在網絡中學習得來的),因此這也是ELMo有效的一個原因。

5.ELMo爲什麼能夠達到區分多義詞的效果?

在ELMo第一階段訓練完成之後,將句子輸入模型中在線提取各層embedding的時候,每個單詞(token)對應兩邊LSTM網絡的對應節點,那兩個節點得到的embedding是動態改變的,會受到上下文單詞的影響,周圍單詞的上下文不同應該會強化某種語義,弱化其它語義,這樣就達到區分多義詞的效果了。需要注意的是,第一個單詞和最後一個單詞也是有上下文的,譬如說第一個單詞的上文是一個特殊的token <BOS>,下文是除第一個單詞外的所有單詞,最後一個單詞的下文是一個特殊的token <EOS>,上文是除最後一個單詞外的所有單詞。

論文中也舉例說明了這個問題,圖示如下:
在這裏插入圖片描述

上圖對於Glove訓練出的word embedding來說,多義詞比如play,根據它的embedding找出的最接近的其它單詞大多數集中在體育領域,這很明顯是因爲訓練數據中包含play的句子中體育領域的數量明顯佔優導致;而使用ELMo,根據上下文動態調整後的embedding不僅能夠找出對應的“演出”的相同語義的句子,而且還可以保證找出的句子中的play對應的詞性也是相同的,這是超出期待之處(當然也可能是因爲論文中給出的例子都是比較好的例子,不過ELMo這樣的做法是值得學習的)。

6.ELMo把三種不同的向量疊加的意義是什麼?這樣做能達到什麼樣的效果?

因爲通過ELMo模型,句子中每個單詞都能得到對應的三個Embedding:最底層是單詞的Word Embedding,往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法信息更多一些;再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義信息更多一些。需要注意的是,這裏得到的結論是通過實驗驗證的,是在這樣的模型設計中,能夠得到上述結論,可能不同模型結構,得到的結論又是不一樣的。

ELMo把三種不同的向量疊加的意義主要體現在以下兩個點:

  • 一是之前很多方法都只用了最頂層LSTM的hidden state,但是通過實驗驗證,在很多任務中,將每一層hidden state融合在一起會取得更好的效果;
  • 二是在上述實驗中得到結論,每一層LSTM得到單詞的embedding所蘊含的信息是不一樣的,因此將所有信息融合起來,會讓單詞embedding的表達更豐富。

這樣做能夠起到區分多義詞的效果,如問題5,而且在論文展示的6個任務中都取得了SOTA的效果。

參考:

從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史

The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)

ELMo-TensorFlow源碼

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