GPT、Bert、XLnet 的發布使得 預訓練的語言模型 火熱起來,而差不多一年前的大殺器:ELMO,似乎在逐漸被遺忘

從效果上說,ELMO的確不如之後陸續發布的語言模型好。

但麻雀雖小卻五臟俱全:預訓練-微調、雙向語言模型、基於大規模語料訓練等思想,早已囊括在ELMO之中!!!

論文地址:https://arxiv.org/pdf/1802.05365.pdf

代碼實現:https://github.com/allenai/allennlp

基於以下幾個問題展開:

1、ELMO的結構是怎麼樣的?

2、ELMO到底在解決一個什麼問題?

3、ELMO是怎麼進行預訓練的呢?如何使用它呢?

4、為什麼ELMO用兩個單向的LSTM代替一個雙向的LSTM呢?

1、ELMO的結構是怎麼樣的?

ELMO 由一層input層 和 兩層雙向LSTM 組合而成的

註:input層可看為embedding層,不過ELMO是通過字元卷積來得到embedding的,不是矩陣相乘;用兩個單向LSTM替代一個雙向LSTM。

如圖:

將對應字通過正向與反向語言模型得到的vector拼接

2、ELMO到底在解決一個什麼問題?

ELMO解決了大部分問題,其中最重要的一個是:它解決了一詞多義的問題。

拿word2vector來說,字與vector是一一對應的,輸入句子,然後輸出句子中每個字對應vector,可以看成查表的過程。

如:輸入 畫畫 ,word2vector就會輸出兩個一樣的vector,但是第一個畫是動詞、第二個畫是名詞,他們的vector應該是不一樣的,但word2vector並不能區分。即使在訓練過程中對embedding矩陣進行更新,它依舊還是一一對應的關係。

向ELMO輸入 畫畫 ,輸出的兩個向量是經過2層LSTM後的結果,它們是不同的。這是ELMO根據輸入句子的語境得到的結果。

3、ELMO什麼怎麼進行預訓練的呢?如何使用它呢?

論文這麼說到:

The top layer LSTM output, is used to predict the next token with a Softmax layer.

即,將ELMO輸出的向量映射到 vocab_size的長度,softmax後,取出概率最大的元素對應的下標,作為對下一個字的預測。相當於做一個分類,類別數量是詞表大小,類似自回歸。

label相對於input錯位一個字,如:

沒有找到訓練代碼,大致是這樣,知道的歡迎指正

使用:

ELMO有三層,每一層都有一個輸出,將這三層的輸出按比例相加後即為所得vector。這個比例是模型學習得到的。得到加權後的向量後,如何使用取決於任務的效果。

4、為什麼ELMO用兩個單向的LSTM代替一個雙向的LSTM呢?

這是關鍵!!!

用雙向的模型結構去訓練語言模型會導致「看到自己」或「看到答案」的問題。後來的預訓練語言模型也都在避免或解決這個問題,解決的程度也影響著模型效果。

以下是幾個模型的解決方法:

ELMO:使用兩個單向LSTM代替一個雙向LSTM

GPT :通過mask得分矩陣避免當前字看到之後所要預測的字,所以GPT是隻有正向的,缺失了反向信息

BERT:將所要預測的字用[MASK]字元代替,無論你是正向的還是反向的,你都不知道[MASK]這個字元原來的字是什麼,只有結合[MASK]左右兩邊的詞語信息來預測。這就達到了用雙向模型訓練的目的,但也引入了 預訓練-微調 不一致的問題

XLnet:不用[MASK]字元,結合GPT和BERT的思想,即:用mask得分矩陣的方法來替代[MASK]這個字元

可以看出,如果不考慮訓練數據大小的影響,誰更好的解決「如何將雙向融入語言模型」這個問題,誰效果就更好。

現在來說一下為什麼雙向LSTM會導致看見答案的問題:

如圖所示的正向LSTM,"克"是根據「撲」這個字 和 隱藏向量h2 來預測出來的。h2包含了<start>和打 這兩個字的信息,所以預測「克」這個字時,是根據前面所有的字來預測的。

但如果加上反向LSTM呢?

反向的話,「克」就是根據 「撲」和 h1 來預測的,但是 h1 包含了「克」的信息,所以反向的話會導致模型看到答案。

這就是雙向LSTM帶來的「看見答案」的問題。

Transformer 可以看成雙向結構,通過它,句子間任何兩個字的距離都是1,所以它是如何通過 mask 操作避免它看到下文信息的呢?這其中的原理又是什麼呢?

明後兩天寫寫


推薦閱讀:
相關文章