大家好,我是半虹,這篇文章來講 GPT \text{GPT} GPT ( G enerative P re- T raining \textbf{G}\text{enerative}\ \textbf{P}\text{re-}\textbf{T}\text{raining} Generative Pre-Training)
實際上, GPT \text{GPT} GPT 包括一系列論文,具體有 :
- GPT-1 \text{GPT-1} GPT-1: Improving Language Understanding by Generative Pre-Training \text{Improving Language Understanding by Generative Pre-Training} Improving Language Understanding by Generative Pre-Training
- GPT-2 \text{GPT-2} GPT-2: Language Models are Unsupervised Multitask Learners \text{Language Models are Unsupervised Multitask Learners} Language Models are Unsupervised Multitask Learners
- GPT-3 \text{GPT-3} GPT-3: Language Models are Few-Shot Learners \text{Language Models are Few-Shot Learners} Language Models are Few-Shot Learners
0 概述
GPT \text{GPT} GPT 本質上就是一個預訓練語言模型,其用大規模無标注語料、以自回歸的方式進行預訓練
GPT \text{GPT} GPT 通過不斷增加模型參數以及預訓練語料規模進行更新疊代,并最終取得令人驚豔的效果
值得一提的是, GPT \text{GPT} GPT 的模型參數以及預訓練語料規模非常誇張,我們來看一組資料就會清楚
注意量級換算, K ( Kilo ) = 1 0 3 , M ( Mega ) = 1 0 6 , G ( Giga ) = 1 0 9 , T ( Tera ) = 1 0 12 \text{K}(\text{Kilo}) = 10^3,\ \text{M}(\text{Mega}) = 10^6,\ \text{G}(\text{Giga}) = 10^9,\ \text{T}(\text{Tera}) = 10^{12} K(Kilo)=103, M(Mega)=106, G(Giga)=109, T(Tera)=1012
-
模型參數量為GPT-1
,預訓練語料有117M
5GB
-
模型參數量為GPT-2
,預訓練語料有1.5G
40GB
-
模型參數量為GPT-3
,預訓練語料有175G
45TB
最後再來簡單回顧一下, GPT \text{GPT} GPT 系列模型及其相關模型的發展曆程
2017 2017 2017 年 06 06 06 月, Transformer \text{Transformer} Transformer 橫空出世,在自然語言處理領域中掀起軒然大波
2018 2018 2018 年 06 06 06 月, GPT-1 \text{GPT-1} GPT-1 正式釋出,其用 Transformer \text{Transformer} Transformer 的解碼器訓練單向語言模型,引領預訓練模型熱潮
2018 2018 2018 年 10 10 10 月, BERT \text{BERT} BERT 随之釋出,其用 Transformer \text{Transformer} Transformer 的編碼器訓練掩碼語言模型,效果更超越 GPT-1 \text{GPT-1} GPT-1
2019 2019 2019 年 02 02 02 月, GPT-2 \text{GPT-2} GPT-2 沿着原有路線,增加更多資料,擴充更大模型,嘗試解決 zero-shot \text{zero-shot} zero-shot 任務
2020 2020 2020 年 05 05 05 月, GPT-3 \text{GPT-3} GPT-3 是暴力出奇迹,深度挖掘預訓練語言模型潛力,且最後在 few-shot \text{few-shot} few-shot 任務表現優秀
下面我們将會逐一介紹, GPT \text{GPT} GPT 系列模型的詳細内容及其細節
1 介紹 GPT-1
關鍵詞:無标注文本、自監督學習
1.1 動機
在自然語言處理領域,存在各種各樣的任務,這些任務都需要大量的标注資料進行訓練才有不錯的模型效果
但針對特定任務的高品質标注資料難以獲得,通常都需要花費大量的人力物力才能得到數量不多的有效資料
另一方面,在目前的網際網路上有海量的文本,但這些文本是沒有針對特定任務做标注的,被稱為無标注文本
是以很難将這些文本應用到特定任務的訓練,這未免有些遺憾和浪費
基于此情, GPT-1 \text{GPT-1} GPT-1 将預訓練和微調的範式引入到自然語言處理領域,使得模型能夠利用海量的無标注文本
具體來說就是先讓模型在大規模無标注資料上針對通用任務進行訓練,使模型具備了解語言的基礎能力
然後将預訓練好的模型在特定的有标注資料上針對下遊任務進行微調,使模型能夠适應不同的下遊任務
其中最重要的是設計預訓練任務讓模型能夠利用無标注文本進行訓練,這關系到預訓練模型基礎能力的強弱
怎麼利用無标注文本呢? GPT-1 \text{GPT-1} GPT-1 的想法就是做語言模型,簡單來說,就是根據之前的詞語預測下一個詞語
這是一個自監督的學習,是以不需要對文本做特殊的标注,隻需要把要預測的詞語掩蓋就行
1.2 模型結構
事實上, GPT-1 \text{GPT-1} GPT-1 可以看作是 Transformer \text{Transformer} Transformer 的解碼器,然後在此基礎上去掉解碼層中的多頭外注意力機制
解碼器由若幹個解碼層堆疊而成,而且模型中上一個解碼層的輸出會作為下一個解碼層的輸入
解碼層包括帶掩碼的多頭自注意力機制和前饋神經網絡兩個子子產品,每個子子產品後有殘差連接配接和層正則化
由于我們在之前的文章中已經詳細介紹過各個子產品細節,是以這裡就不再重複了,整體的結構如下圖所示

具體來說, GPT-1 \text{GPT-1} GPT-1 包含 12 12 12 個改過的 Transformer \text{Transformer} Transformer 的解碼層,這些解碼層會堆疊起來
最後一個解碼層的輸出表示會經過線性預測層得到要預測單詞的機率分布
而第一個解碼層的輸入表示由詞元嵌入和位置嵌入相加得到,這裡的嵌入是可學習向量,要通過資料訓練
輸入表示的示意圖如下所示:
1.3 模型訓練
GPT-1 \text{GPT-1} GPT-1 的思想是先在無标注語料上預訓練語言模型,再用預訓練模型在有标注語料對下遊任務進行微調
GPT-1 \text{GPT-1} GPT-1 首先要解決的問題是:怎麼預訓練語言模型
注意這裡的語言模型是單向的,簡單來說就是要模型根據之前若幹個詞語預測未來下一個詞語是什麼
形式化表達如下:
給定一個無标注語料庫 U \mathcal{U} U,其中包含文本序列 { u 1 , . . . , u n } \{u_1, ..., u_n\} {u1,...,un}
語言模型的優化目标是最大化下面的似然函數,其中 k k k 表示上下文視窗大小
L 1 ( U ) = ∑ i log P ( u i ∣ u i − k , . . . , u i − 1 ) L_1(\mathcal{U}) = \sum_{i}{\log P(u_i|u_{i-k},...,u_{i-1})} L1(U)=i∑logP(ui∣ui−k,...,ui−1)
GPT-1 \text{GPT-1} GPT-1 面臨的下一個問題是:怎麼對下遊任務微調
所謂微調就是用預訓練模型在有标注的資料集對特定下遊任務繼續訓練,使得模型能夠适應不同下遊任務
形式化表達如下:
給定一個有标注資料集 C \mathcal{C} C,其中每個樣本包含文本序列 { x 1 , . . . , x m } \{x^1,...,x^m\} {x1,...,xm} 和對應的标簽 y y y
微調模型的優化目标是最大化下面的似然函數
L 2 ( C ) = ∑ ( x , y ) log P ( y ∣ x 1 , . . . , x m ) L_2(\mathcal{C}) = \sum_{(x,\ y)}{\log P(y|x^1,...,x^m)} L2(C)=(x, y)∑logP(y∣x1,...,xm)
具體來說,我們會将預訓練模型用于初始化,并在此基礎上添加一個額外的線性預測層用于标簽預測
輸入序列經過預訓練模型後,取序列最後一個單詞在模型最後一層輸出作為整個序列的特征向量表示
最終這個特征向量經過新增的線性預測層後,就能得到預測标簽的機率分布
在對下遊任務進行微調時,将語言模型作為輔助目标,有利于加速模型收斂,并且提高模型的泛化性
是以,最終微調目标如下,其中 λ \lambda λ 為任務的權重系數
L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda L_1(\mathcal{C}) L3(C)=L2(C)+λL1(C)
上述介紹的微調過程可直接用于分類任務,以此類推,我們可以拓展出如何處理其他類型的下遊任務
核心是将不同類型下遊任務的輸入都轉化為文本序列,下面是幾個例子:
-
文本分類:給定單個句子,判斷這個句子的類别
解決方法:将這個句子直接輸入預訓練模型得到特征向量,然後經過預測層做分類
-
文本蘊涵:給定兩個句子,判斷兩個句子的關系
解決方法:将兩個句子拼接輸入預訓練模型得到特征向量,然後經過預測層做分類
-
語義相似:給定兩個句子,計算兩個句子相似度
解決方法:将兩個句子前和後兩次拼接輸入預訓練模型得到兩個特征向量
将兩個特征向量逐元素相加後經過預測層計算相似度得分
-
多項選擇:給定問題和多個選項,選擇一個作為正确答案
解決方法:将問題和多個選項分别拼接輸入預訓練模型得到多個特征向量
将多個特征向量分别經過預測層計算比對得分後選最大值作為答案
文本序列在輸入模型微調前都需要添加特殊标記, GPT-1 \text{GPT-1} GPT-1 中使用的特殊标記如下:
- 開始标記
添加在輸入文本開頭<s>
- 結尾标記
添加在輸入文本結尾<e>
- 分割标記
添加在拼接文本之間$
下面是示意圖:
2 介紹 GPT-2
關鍵詞:零樣本任務、多任務學習
2.1 動機
GPT-1 \text{GPT-1} GPT-1 已具備很強大的能力,但仍存在着一些不足,其中最重要的一點是:下遊任務不能泛化
GPT-1 \text{GPT-1} GPT-1 面對不同的下遊任務,都需要重新進行訓練,這要求各種下遊任務要有對應的标注資料
從另一方面來說, GPT-1 \text{GPT-1} GPT-1 出現後不久, BERT \text{BERT} BERT 以更多的資料、更大的模型全面超越了 GPT-1 \text{GPT-1} GPT-1
而為了進行反擊, GPT-2 \text{GPT-2} GPT-2 增加了資料和模型規模,并嘗試解決更困難的零樣本任務 ( zero-shot \text{zero-shot} zero-shot)
2.2 模型結構
GPT-2 \text{GPT-2} GPT-2 的模型結構與之前相比基本沒變,隻是做了一些細微的修改
概括來說,層正則化被移動到子子產品之前,另有一個新的層正則化被添加到最後的自注意力子產品之後
GPT-2 \text{GPT-2} GPT-2 并沒有對模型結構有太大的創新,其最重要的改變在于使用了更大的資料和更多的模型參數
具體來說,作者設計了以下幾種模型大小:
模型總參數 | 解碼層數量 | 隐藏層次元 | 備注 |
---|---|---|---|
117 M 117\ \text{M} 117 M | 12 12 12 | 768 768 768 | 與 BERT BASE \text{BERT}_\text{BASE} BERTBASE、 GPT-1 \text{GPT-1} GPT-1 對标 |
345 M 345\ \text{M} 345 M | 24 24 24 | 1024 1024 1024 | 與 BERT LARGE \text{BERT}_\text{LARGE} BERTLARGE 對标 |
762 M 762\ \text{M} 762 M | 36 36 36 | 1280 1280 1280 | 無 |
1542 M 1542\ \text{M} 1542 M | 48 48 48 | 1600 1600 1600 | 稱 GPT-2 \text{GPT-2} GPT-2 |
2.3 模型訓練
GPT-2 \text{GPT-2} GPT-2 的思想是在大規模無标注語料上預訓練語言模型,然後直接把預訓練模型應用到各種下遊任務
這樣的任務設定可以進一步引申為零樣本任務
所謂零樣本任務就是說預訓練模型對下遊任務進行預測時,不提供下遊任務的訓練樣本,而是直接開始預測
這意味着預訓練模型需要有泛化性,不用經過微調就可以應對各種下遊任務
怎麼使得預訓練模型具備此能力呢?要從預訓練過程入手,作者引入多任務學習的概念
所謂多任務學習就是說訓練模型時,用多個任務的資料集,并且保證模型在各個任務的資料集上都可以收斂
說回模型, GPT-2 \text{GPT-2} GPT-2 還是将單向語言模型作為預訓練任務,其訓練方式還是和 GPT-1 \text{GPT-1} GPT-1 一樣
不同在于, GPT-2 \text{GPT-2} GPT-2 會在更大型更豐富的語料上進行訓練,可以認為這些語料隐式包含翻譯、問答等的任務
與之對應, GPT-2 \text{GPT-2} GPT-2 的模型參數也增加了許多,使其能擁有更強大的學習能力
作者認為,當語言模型的容量足夠大且訓練語料的數量足夠多時,通過無監督訓練就能覆寫所有有監督任務
換句話說,所有有監督任務都是語言模型的子集,直覺的解釋是:理想的語言模型能真正了解語言
最後還有一點,預訓練模型進行預測時,是不能出現特殊标記的,因為模型無法了解預訓練時沒見過的東西
模型在預測時的輸入應該是純自然語言,用于明确待做任務類型,這在後來的文獻中稱為提示 ( prompt \text{prompt} prompt )
下面是示意圖, GPT-2 \text{GPT-2} GPT-2 所做的事情是:根據提示和輸入來續寫,進而完成各種下遊任務
3 介紹 GPT-3
關鍵詞:少樣本任務、上下文學習
3.1 動機
從 GPT-2 \text{GPT-2} GPT-2 的實驗結果能看到:随着模型參數和訓練語料的增加,模型的性能會不斷提升
故 GPT-3 \text{GPT-3} GPT-3 繼續沿着原有道路,進一步增加模型參數和訓練語料,在大規模預訓練模型上越走越遠
另一方面, GPT-3 \text{GPT-3} GPT-3 不再追求零樣本任務,而是轉為少樣本任務 ( few-shot \text{few-shot} few-shot)
這與人類的習慣更加相似,具有一定知識的人類,在給出若幹個例子後,就可以學會某種能力
3.2 模型結構
GPT-3 \text{GPT-3} GPT-3 的模型結構與之前相比基本沒變, 隻是做了一些細微的修改
概括來說,就是用 Sparse Transformer \text{Sparse Transformer} Sparse Transformer 中提出的稀疏自注意力機制代替原有的自注意力機制
GPT-3 \text{GPT-3} GPT-3 也沒有對模型結構有太大的創新,最重要的改變在于使用了更大的資料和更多的模型參數
具體來說,作者設計了以下幾種模型大小:
名稱 | 模型總參數 | 解碼層數量 | 隐藏層次元 |
---|---|---|---|
GPT-3 Small \text{GPT-3 Small} GPT-3 Small | 125 M 125\ \text{M} 125 M | 12 12 12 | 768 768 768 |
GPT-3 Medium \text{GPT-3 Medium} GPT-3 Medium | 350 M 350\ \text{M} 350 M | 24 24 24 | 1024 1024 1024 |
GPT-3 Large \text{GPT-3 Large} GPT-3 Large | 760 M 760\ \text{M} 760 M | 24 24 24 | 1536 1536 1536 |
GPT-3 XL \text{GPT-3 XL} GPT-3 XL | 1.3 B 1.3\ \text{B} 1.3 B | 24 24 24 | 2048 2048 2048 |
GPT-3 2.7B \text{GPT-3 2.7B} GPT-3 2.7B | 2.7 B 2.7\ \text{B} 2.7 B | 32 32 32 | 2560 2560 2560 |
GPT-3 6.7B \text{GPT-3 6.7B} GPT-3 6.7B | 6.7 B 6.7\ \text{B} 6.7 B | 32 32 32 | 4096 4096 4096 |
GPT-3 13B \text{GPT-3 13B} GPT-3 13B | 13 B 13\ \text{B} 13 B | 40 40 40 | 5140 5140 5140 |
GPT-3 175B \text{GPT-3 175B} GPT-3 175B / GPT-3 \text{GPT-3} GPT-3 | 175 B 175\ \text{B} 175 B | 96 96 96 | 12288 12288 12288 |
3.3 模型訓練
GPT-3 \text{GPT-3} GPT-3 的思想是在大規模無标注語料上預訓練語言模型,然後直接把預訓練模型應用到各種下遊任務
這和 GPT-2 \text{GPT-2} GPT-2 是一樣的,不同之處在于 : GPT-2 \text{GPT-2} GPT-2 設定為零樣本任務, GPT-3 \text{GPT-3} GPT-3 設定為少樣本任務
所謂少樣本任務就是說預訓練模型對下遊任務進行預測時,隻提供極少量的任務樣本供預訓練模型使用
通常 GPT-3 \text{GPT-3} GPT-3 不會将這些極少量的任務樣本用于微調模型,而是會将其當作提示輸入到預訓練模型
這是因為對參數量如此大的模型進行微調也是非常困難的
這樣在預測時将任務樣本放到提示中給模型來學習的行為,可以稱作是上下文學習 ( in-context learning \text{in-context learning} in-context learning)
簡單來說就是預訓練模型需要在提示的上下文語境中學習要完成的下遊任務
是以對于使用者來說,使用預訓練模型完成下遊任務最需要考慮的事情就是:如何設計提示
下面是一個例子:
GPT-3 \text{GPT-3} GPT-3 的最終效果雖然已十分驚豔,但仍不可避免地存在一些局限性,下面來簡單讨論下:
- 假設存在很多任務樣本,如果以拼接的方式輸入預訓練模型,那麼會使得提示文本很長,難以了解
- 預訓練模型每次預測時,都會直接從給定的上下文獲得資訊,但是每次得到的資訊都沒有儲存下來
好啦,本文到此結束,感謝您的閱讀!
如果你覺得這篇文章有需要修改完善的地方,歡迎在評論區留下你寶貴的意見或者建議
如果你覺得這篇文章還不錯的話,歡迎點贊、收藏、關注,你的支援是對我最大的鼓勵 (/ω\)