GPT對比GPT-2

前一陣子Bert火的一塌糊塗,本以爲會佔據頂峯很長一段時間,結果還沒多久就出現的了GPT-2,它不僅效果顯著,而且還解決了Bert無法解決的生成文本的問題,一下子躍上神壇~

其實,GPT-2與GPT一樣,都使用的是單向語言模型,那爲何GPT-2的效果會如此驚人呢?驚人之處又體現在哪裏呢?且聽我慢慢道來~


傳送門
GPT
原文:https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
代碼:openai/finetune-transformer-lm(TensorFlow)
huggingface/pytorch-openai-transformer-lm(Pytorch)
GPT-2
原文:https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf
代碼:openai/gpt-2

一、GPT

我們先來了解一下GPT~

簡單來說,GPT的底層架構是transformer,是由pre-training和fine-tuning兩部分構成的

之前有人(好像是張俊林大佬~)就說過,如果GPT做成雙向的,那就沒Bert什麼事了(不過Bert的Masked LM和Next Sentence Prediction的思想也是功不可沒噠~)。之所以這麼說,是因爲Bert底層架構也是transformer,也是由pre-training和fine-tuning兩部分構成的,只不過在transformer那採用的是雙向而已~

下面,我們分別從GPT的pre-training、fine-tuning兩部分來講:

1. 無監督pre-training

每天進步一點點:NLP——圖解認識transformer全貌,想知道的都在這​zhuanlan.zhihu.com圖標

pre-training是採用transformer框架進行的,不過對transformer改動了一小下。transformer之前我有篇文章(見上面鏈接~)專門詳細的講過,這裏就不贅述了,主要講一下GPT中用的transformer。

我們知道transformer裏有encoder層和decoder層,而GPT裏主要用的是decoder層,不過做了一點改變,就是去掉了中間的Encoder-Decoder Attention層(因爲沒有encoder層,所以也就不需要Encoder-Decoder Attention這一層啦~)。也有人說用到的是encoder層,做的改變是將Multi-Head Attention換成了Masked Multi-Head Attention。

那麼可能有人會問,這兩種說法到底哪個正確呢?其實,這兩種說法都對,因爲仔細分析一下就會發現這兩種說法是一個意思,不就是 Masked Multi-Head Attention + Feed Forward 嘛😎~ 如下圖所示:

GPT Transformer

整個過程如上圖所示,詞向量(token embedding)和位置向量(position embedding)的和作爲輸入,經過12層的Masked Multi-Head Attention和Feed Forward(當然中間也包括Layer Norm),得到預測的向量和最後一個詞的向量,最後一個詞的詞向量會作爲後續fine-tuning的輸入。

問題1:無監督訓練的終止條件是什麼呢?訓練到什麼時候可以停止呢?像聚類是訓練到分類比較穩定的情況下就停止了~

答:我們可以通過準確率來評價訓練何時停止。訓練的時候生成的文本和原文本進行比對,得到準確率,通過準確率是否達到預期值或是準確率是否一直上下波動等來確定是否該停止訓練。

2. 有監督fine-tuning

筆者對於微調的粗略理解:

先將大部分的參數通過無監督預訓練訓練好,然後通過微調確定最後一個參數w的值,以適應不同的任務。利用無監督最後一個詞的向量作爲微調的輸入(個人認爲其實可以整句話的詞向量作爲輸入,但是沒必要)。

上圖展示了對於不同NLP任務的微調過程:

分類任務:輸入就是文本,最後一個詞的向量直接作爲微調的輸入,得到最後的分類結果(可以多分類)

推理任務:輸入是 先驗+分隔符+假設,最後一個詞的向量直接作爲微調的輸入,得到最後的分類結果,即:是否成立

句子相似性:輸入是 兩個句子相互顛倒,得到的最後一個詞的向量再相加,然後進行Linear,得到最後分類結果,即:是否相似

問答任務:輸入是上下文和問題放在一起與多個回答,中間也是分隔符分隔,對於每個回答構成的句子的最後一個詞的向量作爲微調的輸入,然後進行Linear,將多個Linear的結果進行softmax,得到最後概率最大的

問題2:對於問答任務,最後多個Linear的結果如何進行softmax?

對於問答任務來說,一個問題對應多個回答,而最後我要取最準確的回答(分值最高)作爲結果,我通過對多對問題答案做transformer後,再分別做linear,可以將維度統一,然後對多個linear進行softmax~之前都是對一個linear做softmax,直接取概率值最大的即可,但是現在多個linear如何進行softmax呢?

以上就是GPT的大致描述,採用無監督的預訓練和有監督的微調可以實現大部分的NLP任務,而且效果顯著,但是還是不如Bert的效果好。不過GPT採用單向transformer可以解決Bert無法解決的生成文本任務。

二、GPT-2

GPT-2依然沿用GPT單向transformer的模式,只不過做了一些改進與改變。那GPT-2相對於GPT有哪些不同呢?看看下面幾方面:

1. GPT-2去掉了fine-tuning層:不再針對不同任務分別進行微調建模,而是不定義這個模型應該做什麼任務,模型會自動識別出來需要做什麼任務。這就好比一個人博覽羣書,你問他什麼類型的問題,他都可以順手拈來,GPT-2就是這樣一個博覽羣書的模型。

2. 增加數據集:既然要博覽羣書,當然得先有書,所以GPT-2收集了更加廣泛、數量更多的語料組成數據集。該數據集包含800萬個網頁,大小爲40G。當然這些數據集是過濾後得到的高質量文本,這樣效果才能更好的哦~

3. 增加網絡參數:GPT-2將Transformer堆疊的層數增加到48層,隱層的維度爲1600,參數量更是達到了15億。15億什麼概念呢,Bert的參數量也才只有3億哦~當然,這樣的參數量也不是說誰都能達到的,這也得取決於money的多少啊~

4. 調整transformer:將layer normalization放到每個sub-block之前,並在最後一個Self-attention後再增加一個layer normalization。論文中這塊感覺說的模棱兩可,如果給個圖就好了。不過可以通過代碼瞭解這一細節,下圖是我理解如何加layer normalization的示意圖,給大家做個參考~~~

GPT-2 Transformer

5. 其他:GPT-2將詞彙表數量增加到50257個;最大的上下文大小 (context size) 從GPT的512提升到了1024 tokens;batchsize增加到512。

三、總結

GPT-2理論部分基本就是這樣,可以看到GPT-2在GPT基礎上的創新不大,都是用transformer單向建預研模型,只不過是規模要大很多。因此效果也是真的好,目前的效果甚至超過了Bert。

值得一提的是,GPT-2將fine-tuning去掉後,引入大量的訓練文本,效果就非常好,這也說明只要訓練文本夠大,網絡夠大,模型是可以自己根據輸入內容判斷需要做的任務是什麼的。

突然想起來,還有一點忘了說~

GPT-2的輸入是完全的文本,什麼提示都不加嗎?

當然不是,它也會加入提示詞,比如:“TL;DR:”,GPT-2模型就會知道是做摘要工作了輸入的格式就是 文本+TL;DR:,然後就等待輸出就行了~

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