關於最近的NLP模型Bert、Elmo、GPT(上)

有些時沒有更新blog,最近被工做弄的很鬧心,拖了又拖,仍是把最近的一些nlp模型研究學一下。函數

雖然如今沒有這這一塊工做,可是總的來講,新出來的這些個模型,仍是沒有讓人眼前一亮的東西出來。Bert的出現多是暫時統一了江湖,可是底層結構不改,仍是在提高那1%。學習


Elmo

Elmo(Embeddings from Language Models),是allen NLP 在18年6月NAACL上發的一個詞向量訓練模型。3d

就是說,Elmo的做用就是訓練一個模型,用來表示某個詞,換句話說,和word2vec和GloVe功能是同樣的,這個新的訓練方法有兩點進步:orm

  1. 可以處理單詞用法中的複雜特性(好比句法和語義)
  2. 有些用法在不一樣的語言上下文中如何變化(好比爲詞的多義性建模)

具體是什麼意思呢,由於不少詞它表達的意思是隨着語境而變化的,好比說「今年的蘋果很貴,13塊一斤」和「今年的蘋果很貴,高配要1萬塊」。這兩個句子裏的蘋果顯然不是一個東西,可是咱們以前用的詞向量word2vec和GloVe,都不能表達出這兩個詞之間的差異。
因此Elmo要解決這個問題。blog

Elmo爲何能有這個能力來聯繫上下文表達出詞義。其實能夠想一想,什麼模型能夠聯繫上下文,無疑CRF和RNN對不對。而CRF是經過幾率圖的形式,將每一步的機率向下傳遞,這就沒辦法給出每個詞的輸出。可是咱們在LSTM中,每個cell是又兩個輸出的,一個是c(x)(細胞狀態),一個是h(x)(隱藏層狀態),這兩種狀態中都包含以前的信息。
這裏咱們想到,從前到後是一種信息,從後到前又是一種信息,因此用雙向模型所擁有的信息會更多。若是把雙向每個cell的隱藏層信息的向量組合起來,最後再接一個softmax(也有取最上一層的輸出),最後訓練出的向量即爲咱們想要的詞向量。get


13790629-ee64cf45091f6cdd.PNG
ELMo

你們其實看張圖已經能夠很清楚的看到ELMO的結構了,也沒有那麼複雜,對比和word2vec訓練出的詞向量:it

  1. ELMo的假設前提一個詞的詞向量不該該是固定的,因此在一詞多意方面ELMo的效果必定比word2vec要好。
  2. word2vec的學習詞向量的過程是經過中心詞的上下窗口去學習,學習的範圍過小了,而ELMo在學習語言模型的時候是從整個語料庫去學習的,然後再經過語言模型生成的詞向量就至關於基於整個語料庫學習的詞向量,更加準確表明一個詞的意思。
  3. ELMo還有一個優點,就是它創建語言模型的時候,能夠運用非任務的超大語料庫去學習,一旦學習好了,能夠平行的運用到類似問題。

上elmo的效果:io

  • Textual entailment: stanford natural language inference (SNLI)數據集上提高了1.4%。
  • Question answering: 在stanford question answering dataset (SQuAD)數據集上提高了4.2%,將ELMo加入到以前的state-of-the-art的ensemble模型中,提高了10%。
  • Semantic role labeling: 比以前的state-of-the-art模型提升了3.2%,將ELMo加入到以前的state-of-the-art的單模型中,提高了1.2%。
  • Coreference resolution: 比以前的state-of-the-art模型提升了3.2%,將ELMo加入到以前的state-of-the-art的ensemble模型中,提高了1.6%。
  • Named entity extraction: 在CoNLL 2003 NER task數據機上提升了2.06%
  • Sentiment analysis: 比以前的state-of-the-art模型提升了3.3%,將ELMo加入到以前的state-of-the-art模型中,提高了1%。
    也仍是1-3%左右的提高。

GPT

由於bert統治性的地位,bert我要單獨用一篇文章講。這裏來介紹GPT。
GPT是openAI早於BERT的一個模型,可是因爲宣傳緣由,致使GPT1.0並無出個大新聞,可是GPT的單項語言模型在GPT2.0爲本身正名,雖然尚未在GLUE上大展拳腳,可是我相信,按照目前的趨勢,GPT3.0必定會大展拳腳,打掉bert。這篇文章寫的很不錯GPT和BERT的現狀和前景form

說GPT以前,我想說結合Bert和GPT來看,LSTM頗有可能淘汰,而被Transformer全方位的取代,緣由有兩點:class

  1. Transformer能夠並行計算;
  2. Transformer有關聯上下文的能力

GPT採用了單項的Transformer完成預訓練任務,而且將12個Trm疊加起來,而訓練的過程其實很是的簡單,就是將句子n個詞的詞向量(第一個爲<SOS>)加上Positional Encoding後輸入到前面提到的Transfromer中,n個輸出分別預測該位置的下一個詞(<SOS>預測句子中的第一個詞,最後一個詞的預測結果不用於語言模型的訓練)。


13790629-97ba6e1088778b39.jpg
GPT的單項Transformer結構

13790629-3db9851d88a2e0d5.jpg
GPT的訓練方式

和Bert相同的是,GPT也是分兩個階段進行訓練,第一階段預訓練後還有一個fine-tune。(由於GPT發佈的比bert早,因此是否是bert抄GPT的呢?)

上一步中最後一個詞的輸出咱們沒有用到,在這一步中就要使用這一個輸出來做爲下游監督學習的輸入,這樣就運用少許的帶標籤數據對模型參數進行微調。
而後接下來一步就是我以爲這個模型很牛逼的地方了,爲避免Fine-Tuning使得模型陷入過擬合,文中還提到了輔助訓練目標的方法,相似於一個多任務模型或者半監督學習。具體方法就是在使用最後一個詞的預測結果進行監督學習的同時,前面的詞繼續上一步的無監督訓練,使得最終的損失函數成爲:


13790629-9dccc426f9c3d7ae.png
多任務的損失函數

針對不一樣任務,須要修改輸入數據的格式:


13790629-d0680b9e918b7f53.jpg
多任務輸入數據訓練格式

站着把監督和無監督都辦了,真是牛逼。這篇文章寫的很是好https://zhuanlan.zhihu.com/p/69290203

以上是GPT1.0,而GPT2.0主要改進我以爲除了對Transformer有細微的改動以外,還有就是增大了參數容量(變成了1.5億參數。。),還有訓練數據加大(800W高質量網頁內容)。這些改變就讓GPT2.0變得煊赫一時(好像是有錢就是牛逼,暴力提高法),不得不期待一下GPT3.0 能作到什麼地步。

好的,上到這裏就完了,下來好好講一講Transformer和Bert。