NLP《詞彙表示方法(六)ELMO》

我們已經學習了多種詞向量的表示方法,嵌入詞向量,基本上都是通過學習語言模型LM學習來的副產品。

但是都有一個很大的缺點就是,每一個單詞都假設只有一個特定的嵌入向量表示,這顯然還是不太符合我們的語言習慣,因爲顯然有時候同一個詞語會有不同的意思,也就是一詞多義,不論是中文英文都有這現象。例如單獨看一個詞語 Apple,我們不能確定說它的含義是「蘋果」還是「蘋果公司」,單詞表示固然重要,但是必須得結合上下文才能具體表達含義。也就是該詞向量一旦訓練完成,詞向量都是不會變化了的,不論將來使用的上下文如何變化,詞向量依然保持數值不變。這個數值不變,帶來的影響就是詞向量沒有很好攜帶上下文的信息,是獨立於上下文的存在。

我們希望在談論水果的時候,詞向量「Apple」和「watermelon」更加接近,談論科技公司的時候,詞向量「Apple」和「HUAWEI」更加接近,而不是二者之間取了個均和值,用一個值來代表這個多義詞。

ELMo模型就用於解決上述問題。So, Let’s start…

一:整體介紹
在這裏插入圖片描述

這個模型就定義好了,訓練的話就是根據預料庫輸入每個句子,進行語言模型的訓練。

它是一個多層雙向的LSTM的RNN模型,用於訓練LM,論文中給的是雙層雙向的。

當前有一個句子s={t1, t2, t3, t4,…,tN},有N個token
前向LSTM,根據前K-1個token預測第K個token的條件概率。
在這裏插入圖片描述

後向LSTM,根據後(N-k)個token預測第K個token的條件概率。
在這裏插入圖片描述

嗯,很符合基於雙向LSTM的LM的概念定義哈,如果這裏不熟悉可以參考之前學習的基於RNN的語言模型文章NLP《語言模型(三)-- 基於循環神經網絡的RNNLM語言模型》。

最後我們希望用極大似然估計出目標token的最大概率值,目標函數如下,此處是求最大,加上負號就是轉換成了求最小。

在這裏插入圖片描述

我們需要注意的幾個向量,假設模型是L層的,對於每一個token,t_k來說,有2L+1層個向量。
在這裏插入圖片描述

這些向量很有用,每一層越往上越能學習一些高級的特性,從單詞,到句法,再到語法語義,都是逐漸學習更深層的含義,包含了上下文的信息。

如上,我們LM訓練好了,我們得到一堆的向量,正如上式所描述那樣。至此,ELMo的第一階段,訓練LM全部結束了。

使用的話,到底怎麼用呢?簡單一點的話,直接使用最上層(最後一層)的向量作爲詞向量不就好了麼,但是更加普遍的做法是「我全都要」,因爲每層lstm輸出,或者每層lstm學到的東西是不一樣的,針對每個任務每層的向量重要性也不一樣。

值得注意的是,每一層有一個前向lstm的輸出,一個後向lstm的輸出,兩者就是簡單的拼接起來的。也就是如果分別都是m1維的列向量,拼完之後就是2m1的列向量,就這麼簡單。這樣的話,從數量上,也就是將2L+1個向量轉換爲了L+1個向量。

如果是雙層雙向的LSTM模型,那麼就會產生3個向量,
每次輸入一個新的句子,它的輸出是多個Embedding向量,除了原生的和word2vec一樣的E1向量(這個是固定的),還多了一些根據上下文語義形成的其他Embedding向量,E2,E3,等等,這些更高層的向量是根據上下文動態生成的帶有語義信息的向量,因此能解決多義詞的問題,越往上的向量,攜帶的信息量就越多。

因此,如下圖所示,每一層的向量我都要,通過加權來決定向量的重要程度,加權的參數是通過下游任務訓練共同訓練出來的。
在這裏插入圖片描述

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

總結一下,不像傳統的詞向量,每一個詞只對應一個詞向量,ELMo利用預訓練好的雙向語言模型,然後根據具體輸入從該語言模型中可以得到上下文依賴的當前詞表示(對於不同上下文的同一個詞的表示是不一樣的),再當成特徵加入到具體的NLP有監督模型裏。其詞向量是動態生成的。

它的缺點是: 1:不能並行化,因爲是RNN模型,只能遞歸預算,無法並行。