2019 - GPT-2 危險模型#
案件摘要#
2019 年 2 月,OpenAI 宣布訓練出 GPT-2:15 億參數、在 800 萬網頁(WebText,40GB)上訓練的 Transformer 解碼器語言模型。隨附一紙驚人的公告:「由於擔心惡意使用,我們不發布完整模型」(too dangerous to release)——先釋出 1.24 億參數的小版本,分六個月逐步放大。這是 AI 史上第一次有模型以「太危險」為由拒絕開源。技術上的核心主張更震撼:
零樣本(zero-shot)多任務:不需要微調、不需要標註,把翻譯、問答、摘要全部寫成「續寫題」。語言模型第一次被證明是無監督多任務學習器。
前因 -- 為什麼會有這個案子#
- 2018-BERT與GPT預訓練典範.md 中,GPT-1(117M)仍需微調才能做任務;BERT 靠雙向 + 微調稱霸理解榜。OpenAI 的意識形態反擊:堅持純自回歸,證明「規模」能取代「微調」。
- GPT-1 的遺憾:微調是每任務一次訓練——與「一個模型通吃」的 AGI 想像矛盾。
- 線索:GPT-1 論文中已觀察到,語言模型在「零樣本」設定下隱約會做語法修正等任務——只是能力太弱。
- 資料工程的前案:OpenAI 判定 Common Crawl 太髒,自行爬取 Reddit 高讚外連網頁造出 WebText——「資料品質 > 資料數量」的先聲。
- 2017-Transformer注意力機制.md 的架構已證明可規模化:GPT-2 只是 GPT-1 的架構放大 10 倍(117M → 1.5B)。
- 動機:OpenAI(此時已轉為 capped-profit)要證明「生成式路線才是正確的」——並順勢把「AI 安全」推上輿論舞台。
線索與推理 -- 數學式、程式、理論#
第一條線索:規模的跳升與架構的保守#
| GPT-1 | GPT-2 | |
|---|---|---|
| 參數 | 117M | 1.5B |
| 層數 | 12 | 48 |
| 隱藏維度 | 768 | 1600 |
| 上下文 | 512 token | 1024 token |
| 資料 | BooksCorpus 5GB | WebText 40GB |
| 訓練方式 | 預訓練 + 微調 | 只預訓練,零樣本 |
架構幾乎不變(LayerNorm 前移是僅有的改動),能力卻質變——這是「規模湧現」的第一次大規模實證,為 2020-GPT-3規模湧現.md 鋪路。
第二條線索:零樣本多任務——把任務寫進上下文#
GPT-2 的核心推理:所有 NLP 任務都是訓練資料中「文檔續寫」的特例。翻譯在語料中本來就存在(雙語網頁、問答格式),只要把任務描述放進 prompt:
| 任務 | Prompt(條件) | 期望續寫 |
|---|---|---|
| 翻譯 | English: The cat sat. French: | Le chat s'est assis. |
| 問答 | Q: Who wrote Hamlet? A: | William Shakespeare |
| 摘要 | Article: [長文] TL;DR: | [摘要] |
數學上,這是把條件分佈 \(p(\text{答案} \mid \text{任務描述}, x)\) 交給單一模型 \(p(x_{t} \mid x_{<t})\) 的條件化能力(與 2016-WaveNet語音合成.md 的條件化 \(p(\mathbf{x} \mid h)\) 同構——條件向量像旋鈕,這裡的旋鈕是自然語言本身)。
第三條線索:語言模型的「無監督多任務」定理#
GPT-2 論文的主張可以寫成一條不等式:若訓練分佈涵蓋多任務的文件,則極大化
隱含地學會了 \(p(\text{任務輸出} \mid \text{任務條件})\) ——因為任務本身就是文件中的一段文字。實證結果:零樣本翻譯法德 WMT14 達 5 分 BLEU(弱但存在)、CoT 問答接近監督式基線、摘要可用。線索至此清晰:「微調」不是必需品,是資料不夠多時的補丁。
第四條線索:「太危險」——模型安全的開庭日#
OpenAI 的分段釋出時程:
| 日期 | 釋出版本 |
|---|---|
| 2019-02 | 124M 參數(原版 1/12) |
| 2019-05 | 355M |
| 2019-08 | 774M |
| 2019-11 | 1.5B 完整版 |
理由:假新聞、自動生成的惡意內容難以偵測。爭議兩極——批評者說是行銷炒作(模型其實沒那麼危險),支持者說是負責任的先例。實質影響:「模型安全」首次成為釋出決策的一部分,OpenAI 同年成立 compute 與安全政策框架。這場法庭戲的判例,影響此後所有大模型的釋出策略(GPT-4 的分階段內測、模型卡與系統卡)。
第五條線索:案發現場的樣本——生成品質的翻盤#
GPT-2 1.5B 的生成能力(給定 UniCorn 標題續寫新聞)在盲測中:
| 模型 | 盲測中「像人寫的」比率 |
|---|---|
| GPT(117M,2018) | ~22% |
| GPT-2 774M | ~59% |
| GPT-2 1.5B | ~72% |
| 人類真實文章 | ~83% |
規模跳升的每一級都伴隨生成品質的質變——1.5B 的文章「連貫、切題、有常識」,僅在長篇一致性上露餡。同時 WebText 驗證集的困惑度(perplexity)隨模型規模呈平滑冪律下降,而下游能力呈階梯式跳升——這條「平滑損失 vs 階梯能力」的線索,正是 2020-GPT-3規模湧現.md 湧現之辯的前奏。線索至此全部合攏。
結案 -- 後果與影響#
- 證明「純自回歸 + 規模 + 好資料」能零樣本做多任務——BERT 的微調典範被斬出一道裂縫,GPT 路線取得意識形態主導權。
- WebText 的資料工程成為此後的標準:「爬取—清洗—去重」的資料管線是 GPT-3(570GB)與後續模型的直接前驅。
- 「提示即程式」的萌芽:零樣本 prompt 的成功,預示了 2020-GPT-3規模湧現.md 中 few-shot 提示與 in-context learning 的正式誕生。
- 模型安全制度化:分段釋出、危險能力評估、後續的紅隊測試(red-teaming)成為大模型釋出的標配。
- 假新聞與 deepfake 恐慌升溫,推動 AI 內容偵測與治理議題(見「科學與歷史/世界史/」「科學與歷史/法律與制度史/」的對應討論)。
- 伏筆:GPT-2 的零樣本能力仍不穩定(翻譯只有 5 BLEU)——當參數再大 100 倍,零樣本將蛻變成 few-shot 湧現能力,ChatGPT 的對話能力也在此案的延長線上。
關鍵人物與文獻#
- Alec Radford:GPT-1 與 GPT-2 的第一作者。
- Jeffrey Wu:GPT-2 的核心作者之一,後續規模法則研究。
- Ilya Sutskever:OpenAI 研究主管,GPT 路線的總設計師(見 2014-Seq2Seq與注意力.md)。
- Radford et al., Language Models are Unsupervised Multitask Learners, OpenAI, 2019。
- Radford et al., Improving Language Understanding by Generative Pre-Training, 2018(GPT-1 前案)。
- Solaiman et al., Release Strategies and Social Impacts of Language Models, 2019(分段釋出的後續研究)。
- 相關案件:2018-BERT與GPT預訓練典範.md、2020-GPT-3規模湧現.md、2016-WaveNet語音合成.md、2022-ChatGPT與RLHF.md(見「科學與歷史/人工智慧/」「科學與歷史/神經網路/2020-布朗GPT-3.md」)
補充 -- 程式實作(python + numpy + pytorch)#
本案無監督多任務目標(L = Σlog p(xᵢ|x_<i))+採樣整形(溫度/top-k)的最小可執行版本,見 _code/2019-GPT2.py(已實測可跑,CPU 秒級;詞級 bigram 代替 15 億參數):
# 2019 - GPT-2: 規模 + 採樣即產品 (溫度 / top-k 整形分佈)
import math
import torch
def shape(p, temperature=1.0, top_k=0):
p = p.float()
if top_k > 0: # 只留前 k
v, _ = torch.topk(p, top_k)
p = torch.where(p >= v[-1], p, torch.zeros_like(p))
p = p / p.sum()
p = (p.clamp_min(1e-9).log() / temperature).exp() # 溫度: 重塑銳度
return p / p.sum()
def main():
torch.manual_seed(0)
docs = (["translate hello : hola", "translate cat : gato", "translate dog : perro",
"summarize cats eat fish : cats fed", "summarize dogs run fast : dogs quick",
"question who eats fish : cats", "question who barks : dogs",
"see bird sings sweetly : song"] * 40)
vocab = sorted({w for d in docs for w in d.split()})
wi = {w: i for i, w in enumerate(vocab)}
V = len(vocab)
C = torch.ones(V, V) # 加一平滑
for d in docs:
ids = [wi[w] for w in d.split()]
for a, b in zip(ids, ids[1:]):
C[a, b] += 1
P = C / C.sum(1, keepdim=True)
# (困惑度 / 整形表 / 生成流熵計算略, 見 _code/2019-GPT2.py 全文)
if __name__ == "__main__":
main()
執行結果(python3 _code/2019-GPT2.py,torch 2.12.0):
詞彙 26 詞, bigram 困惑度=2.53 (GPT-2: 同一目標, 10億參數, 網路級語料)
上下文 'translate' 的下一詞分佈 (top3):
T=0.5+top3: [('hello', 0.33), ('dog', 0.33), ('cat', 0.33)] 熵=1.58 bits (低溫銳化保守, 高溫拉平發散)
T=1.0: [('hello', 0.28), ('dog', 0.28), ('cat', 0.28)] 熵=2.68 bits (低溫銳化保守, 高溫拉平發散)
T=1.5: [('hello', 0.2), ('dog', 0.2), ('cat', 0.2)] 熵=3.70 bits (低溫銳化保守, 高溫拉平發散)
生成流熵 T=0.5+top3: 4.09 bits
生成流熵 T=1.5: 4.50 bits
結論: 採樣是產品的性格旋鈕; bigram 只學到『任務: 前綴格式』, 真正的零樣本語義需 GPT-2 級規模 -- 規模即能力 (見 2020-GPT-3規模湧現.md)
程式解說:shape 即 GPT-2 產品面的全部秘密——溫度整形銳度、top-k 截斷長尾,同一模型轉出三種性格:熵從 1.58 到 3.70 bits,生成流熵 4.09 到 4.50。bigram 在此只能演示「格式」(translate/summarize/question 前綴各帶出一串),語義一塌糊塗——這正是誠實的邊界:零樣本多任務的語義部分需要規模,bigram 的 26 詞玩具只能證明「任務可以寫進上下文」這個格式,却證明不了理解。從困惑度 2.53 到 GPT-2 的 WebText 困惑度,中間隔著 15 億參數——「太危險」的從來不是採樣器,是規模。