Language Models are Unsupervised Multitask Learners — 只要在夠大、夠雜的網頁文本上做語言模型預訓練,模型就能在「零樣本」(zero-shot) 下開始執行問答、翻譯、摘要等任務,完全不需要為每個任務標註資料或改架構。
主流 NLP 的做法是「一個任務,一個資料集,一個監督模型」。作者主張:這種單任務、單領域的訓練,正是當前系統缺乏泛化能力的主因。
當時 (2018–2019) 打造 ML 系統的主流配方是:收集某任務的標註資料 → 訓練模型模仿 → 在 IID 的 held-out 集上測試。這在「窄領域專家」上很有效,但作者指出這類系統其實很脆弱——閱讀理解、影像分類、看圖說話模型在輸入稍有變化時就會出現不穩定的行為。
另一條路是 multitask learning(多任務學習),理論上能提升通用性。但當時 NLP 的多任務訓練還很初期:最有企圖心的兩個工作 (McCann 2018 的 decaNLP、Bowman 2018) 分別也只訓練了 10 個和 17 個 (dataset, objective) pair。從 meta-learning 的角度看,每個 (dataset, objective) pair 只是「任務分佈」中的一個訓練樣本;而現在的系統要泛化好,往往需要成百上千個樣本——這意味著要靠人工繼續擴充資料集與目標函數來「暴力堆」出通用性,幾乎是不可行的。
本文的賭注:與其為每個任務準備監督資料,不如訓練一個夠大的語言模型去預測「自然出現在網路上」的文本。因為網路文本裡本來就散落著各種任務的示範(翻譯、問答、摘要……),一個容量夠大的 LM 為了更好地預測這些文本,會被迫「順便學會」執行這些任務。
作者把兩條研究線接起來——(1) 預訓練 + 監督微調的 transfer 趨勢,以及 (2) 用 LM 直接做特定任務(如常識推理、情感分析)——並更進一步:不做任何參數更新、不改架構,直接在 zero-shot 設定下測試 LM 能做多少任務。
關鍵洞察:語言本身就是一種通用的「任務規格語言」。把任務、輸入、輸出都寫成同一串符號序列,語言模型就能同時建模所有任務。
語言模型的本質是對序列做無監督的機率分佈估計。給定符號序列 (s₁, s₂, …, sₙ),利用語言的自然順序把聯合機率分解為條件機率的乘積:
單一任務可以形式化為估計 p(output | input)。但一個通用系統對「同一個輸入」在不同任務下要有不同輸出,所以它應該建模的是——
過去 task conditioning 常在架構層(任務專屬的 encoder/decoder)或演算法層(如 MAML 的內外迴圈)實現。但 McCann (2018) 展示了更漂亮的做法:用語言本身把任務、輸入、輸出全部寫成一串符號。例如:
關鍵論證:監督目標與無監督目標其實是同一個目標,只是監督目標只在序列的「一部分」上評估。因此無監督目標的全域最小值,也是監督目標的全域最小值。問題只剩下:實務上能不能把無監督目標優化到收斂?作者的初步實驗確認——夠大的 LM 確實能在這種設定下做多任務學習,只是學得比明確監督慢得多。
作者不採用對話式(需要互動與 reward)的路線,而是主張:網路上有海量、被動可得的資訊,一個容量足夠的 LM 為了更好地預測這些自然出現的示範,就會開始學會推斷並執行其中的任務。若真如此,它實際上就是在做「無監督的多任務學習」。
既然要 LM「見過」各式各樣的任務示範,資料就得又大又雜,但又不能像 Common Crawl 那樣充滿垃圾。作者用了一個聰明的 heuristic:讓 Reddit 使用者幫忙篩。
Common Crawl 這類全網爬蟲雖然規模夠大,但資料品質問題嚴重(Trinh & Le 2018 就抱怨很多文件「內容基本上讀不懂」)。與其為特定任務去挑相似文件(那會對「要做哪些任務」預設立場),作者選擇強調文件品質的爬法:
爬取所有在 Reddit 上獲得至少 3 個 karma 的貼文所指向的外部連結。3 karma 是「其他使用者覺得這連結有趣 / 有教育性 / 好笑」的啟發式指標——等於是拿人類的點讚當品質過濾器。
共 4,500 萬個連結。用 Dragnet + Newspaper 兩個內容抽取器從 HTML 取出正文。
只用 2017 年 12 月前的連結(preliminary 版本);經去重與啟發式清理後,得到略多於 800 萬份文件、共 40 GB 文本。
刻意移除所有 Wikipedia 文件——因為它是許多評測資料集的共同來源,留著會讓「訓練/測試重疊」的分析變得棘手。
意外的副產品:雖然作者刻意過濾掉了非英文網頁,WebText 裡仍散落著大量「自然出現」的英↔法翻譯示範(如 "…in French: 'parfum.'" 這類句子)。這正是為什麼 GPT-2 後來能在完全沒被教過翻譯的情況下,還是學到一點翻譯能力——語言偵測器在整個 WebText 裡只找到約 10MB 的法文,比典型無監督翻譯研究用的法文語料小了約 500 倍。
為了讓 LM 能對「任何字串」都給出機率(不受 tokenization / 大小寫 / OOV 限制),GPT-2 採用位元組層級的 BPE;架構則沿用 GPT,只做少量調整,並訓練 4 種 log-uniform 間隔的尺寸。
直接用 UTF-8 位元組雖然通用,但當時 byte-level LM 在大規模資料上打不過 word-level LM。BPE (Byte Pair Encoding) 是介於字元與詞之間的折衷:對高頻符號序列用詞級輸入,對低頻用字元級輸入。但參考實作多半跑在 Unicode code point 上,base vocab 會超過 13 萬;而 byte-level BPE 的 base vocab 只要 256。
作者發現直接對位元組序列跑 BPE 會因貪婪合併產生次佳的 merge(例如 dog、dog!、dog? 被當成不同 token,浪費詞彙槽)。解法:禁止 BPE 跨字元類別合併(但對空格開例外),兼顧壓縮效率與詞的完整性。最終 詞彙表擴到 50,257。這讓 GPT-2 能對任何 Unicode 字串算機率,因此可以在任何資料集上評測,不管它的預處理方式。
架構沿用 OpenAI GPT (Transformer decoder),差異僅:Layer Norm 移到每個 sub-block 的輸入端(pre-activation)、在最後一個 self-attention block 後再加一層 LayerNorm、殘差層權重在初始化時乘上 1/√N(N 為殘差層數)、context 從 512 增為 1024、batch size 用 512。
| Parameters | Layers | dmodel | 對應 |
|---|---|---|---|
| 117M | 12 | 768 | ≈ 原始 GPT |
| 345M | 24 | 1024 | ≈ BERT-Large |
| 762M | 36 | 1280 | — |
| 1542M | 48 | 1600 | GPT-2 |
值得記住的一句話:四種模型的學習率都是針對 5% held-out WebText 的最佳 perplexity 手動調的,而且——「所有模型仍然對 WebText 欠擬合 (underfit),給更多訓練時間 held-out perplexity 還會繼續下降」。也就是說連 1.5B 的 GPT-2 都還沒把 WebText「吃飽」。
第一個 zero-shot 測試就是 LM 的本行:直接拿 WebText LM 去別的語言模型資料集上算 perplexity / accuracy,不做任何微調。因為 byte-level 不需要有損預處理,GPT-2 可以評測「任何」LM benchmark。
為了移除 tokenization 假象(如斷開的標點、縮寫、被打亂的句子,還有 WebText 裡 40 億位元組只出現 26 次的極罕見 <UNK>),作者用可逆 de-tokenizer 當作一種簡單的 domain adaptation,帶來 2.5–5 的 perplexity 增益。結果:GPT-2 在 8 個資料集中的 7 個刷新了 zero-shot SOTA。
| 模型 | LAMBADA PPL ↓ |
LAMBADA ACC ↑ |
CBT-CN ACC ↑ |
CBT-NE ACC ↑ |
WikiText2 PPL ↓ |
PTB PPL ↓ |
enwik8 BPB ↓ |
text8 BPC ↓ |
WikiText103 PPL ↓ |
1BW PPL ↓ |
|---|---|---|---|---|---|---|---|---|---|---|
| 先前 SOTA | 99.8 | 59.23 | 85.7 | 82.3 | 39.14 | 46.54 | 0.99 | 1.08 | 18.3 | 21.8 |
| 117M | 35.13 | 45.99 | 87.65 | 83.4 | 29.41 | 65.85 | 1.16 | 1.17 | 37.50 | 75.20 |
| 345M | 15.60 | 55.48 | 92.35 | 87.1 | 22.76 | 47.33 | 1.01 | 1.06 | 26.37 | 55.72 |
| 762M | 10.87 | 60.12 | 93.45 | 88.0 | 19.93 | 40.31 | 0.97 | 1.02 | 22.05 | 44.575 |
| 1542M (GPT-2) | 8.63 | 63.24 | 93.30 | 89.05 | 18.34 | 35.76 | 0.93 | 0.98 | 17.48 | 42.16 |
PTB、WikiText-2 這種只有 1–2M 訓練 token 的資料集,進步幅度最大(PTB 46.54 → 35.76)。
為長距離依賴設計的 LAMBADA、CBT 也顯著改善(LAMBADA PPL 99.8 → 8.63)。
1 Billion Word 上 GPT-2 (42.16) 仍遠差於 SOTA (21.8)。因為 1BW 是最大且預處理最「破壞性」——句子層級的洗牌把所有長距結構都毀了。
除了語言模型本行,作者還測了一整排「典型 NLP 任務」。整體規律:模型容量越大,zero-shot 表現越好,而且要有足夠容量才開始贏過 trivial baseline。
把文件 + 對話歷史 + 最後的 A: 餵給 GPT-2,greedy decode,在 CoQA dev 上拿到 55 F1——在完全沒用那 127,000+ 標註問答對的情況下,追平或超越 4 個 baseline 系統中的 3 個。(監督 SOTA 是 BERT-based 的 89 F1,接近人類。)不過作者誠實指出:GPT-2 常靠簡單的檢索式啟發(例如遇到 who 問題就從文件裡挑一個名字回答)。
沿用 Trinh & Le (2018) 的機率打分法,GPT-2 把 SOTA 準確率提升 7%,達到 70.70%。但資料集只有 273 例,非常小。
在文章後加上 TL;DR: 誘導摘要行為,用 top-k (k=2) 生成 100 token,取前 3 句當摘要。ROUGE 上 GPT-2 只勉強接近經典 neural baseline、僅略勝「隨機挑 3 句」。
| 方法 | R-1 | R-2 | R-L | R-AVG |
|---|---|---|---|---|
| Bottom-Up Sum (SOTA) | 41.22 | 18.68 | 38.34 | 32.75 |
| Lede-3 | 40.38 | 17.66 | 36.62 | 31.55 |
| Seq2Seq + Attn | 31.33 | 11.81 | 28.83 | 23.99 |
| GPT-2 TL;DR: | 29.34 | 8.27 | 26.58 | 21.40 |
| Random-3 | 28.78 | 8.63 | 25.52 | 20.98 |
| GPT-2 no hint(移除提示) | 21.58 | 4.03 | 19.47 | 15.03 |
一個漂亮的證據:移除 TL;DR: 提示後,aggregate 指標掉了 6.4 分(21.40 → 15.03)。這證明可以用一段自然語言(而非改架構)去喚起 LM 的任務專屬行為——這正是「prompt」概念的雛形。
用 english = french 的示範對餵給模型,再以 english = 收尾讓它續寫。英→法只有 5 BLEU(比詞典逐字替換還差);但法→英達 11.5 BLEU,勝過幾個無監督 MT baseline,但仍遠差於當時最佳無監督 MT 的 33.5 BLEU。考慮到 WebText 幾乎沒有法文,這個結果本身就令人意外。
用範例問答對 seed context,GPT-2 以 exact-match 答對 4.1% 的問題——是最小模型 (1.0%) 的 5.3 倍,再次顯示容量是關鍵。而且機率校準良好:在它最有信心的 1% 問題上,準確率達 63.1%。但整體仍遠差於結合檢索的開放域 QA 系統 (30–50%)。
| 問題 | 生成答案 | 機率 |
|---|---|---|
| Who wrote the book the origin of species? | Charles Darwin | 83.4% |
| Who is the founder of the ubuntu project? | Mark Shuttleworth | 82.0% |
| Who is the quarterback for the green bay packers? | Aaron Rodgers | 81.1% |
| Panda is a national animal of which country? | China | 76.8% |
| When was the first star wars film released? | 1977 | 71.4% |
大資料集越大,訓練/測試出現「近似重複」的機率就越高,會高估泛化能力。作者用 Bloom filter 做了一次誠實的重疊分析。
作者對 WebText 訓練集的 8-gram 建立 Bloom filter(把字串正規化為小寫英數 + 單一空格,假陽性率上界 1/10⁸,並用 100 萬條字串驗證 0 誤判)。接著計算各評測資料集有多少比例的 8-gram 也出現在 WebText 訓練集中:
| 重疊對象 | PTB | WikiText-2 | enwik8 | text8 | WikiText-103 | 1BW |
|---|---|---|---|---|---|---|
| vs. WebText train | 2.67 | 0.66 | 7.50 | 2.34 | 9.09 | 13.19 |
| vs. 自己的 train | 0.88 | 1.63 | 6.31 | 3.94 | 2.42 | 3.75 |
令人意外的發現:各測試集與 WebText 訓練集的重疊平均約 3.2%;但很多資料集與「自己的訓練集」重疊更嚴重(平均 5.9%)。例如 1BW 與自己的訓練集重疊高達 13.2%。換言之,GPT-2 的訓練/測試重疊,並沒有比這些資料集「內部本來就有」的重疊更誇張。
另一個「不是靠記憶」的證據:GPT-2 在自己的 WebText held-out 上,訓練集與測試集的表現一起隨模型變大而改善——顯示即使是 1.5B 的 GPT-2 仍在 underfit,而非過擬合。附錄也量化了:GPT-2 生成的樣本,重複訓練集文本的比例還低於 held-out 真實文章的基準率。
論文的 Discussion 相當克制。以下都是作者「明確寫出來」的限制,不是後人的解讀。
離「可用」還很遠:閱讀理解上 GPT-2 的 zero-shot 能與監督 baseline 競爭;但摘要等任務「雖然質性上在做這件事,量化指標上仍很初階」。整體而言 zero-shot 的 GPT-2「離實際可用還很遠」。
很多任務仍等同亂猜:「無疑有許多實際任務上,GPT-2 的表現不比隨機好」;即使在評測過的問答、翻譯上,也要容量夠大才開始勝過 trivial baseline。
Finetuning 天花板未知:zero-shot 只是「潛力下界」,加上 finetuning 後的上限並不清楚。作者計畫在 decaNLP、GLUE 上做微調實驗。
單向表示的疑慮:不確定 GPT-2 的額外資料與容量,是否足以克服 BERT 所展示的、單向 (uni-directional) 表示的效率劣勢。
當一個大型語言模型在足夠大且多樣的資料上訓練,它能在許多領域與資料集上表現良好。GPT-2 zero-shot 就刷新了 8 個 LM 資料集中的 7 個。它能執行的任務之多樣,暗示了:高容量模型只要最大化「足夠多樣文本」的似然,就會開始學會執行大量任務,無需明確監督。
回頭看的意義:這篇 2019 的論文奠定了後續 GPT-3「in-context / few-shot learning」與整個 prompt 範式的基礎——它第一次系統性地論證:scale + 多樣資料 → 任務能力會「浮現」,而 TL;DR: 這種自然語言提示能喚起特定行為,正是今天 prompting 的原型。