《GPT-1》解读:NLP 从此分岔——“无监督预训练 + 有监督微调”这条路从这里铺起
论文:Improving Language Understanding by Generative Pre-Training 作者:Alec Radford、Karthik Narasimhan、Tim Salimans、Ilya Sutskever,OpenAI 发布背景:2018-06-11 以技术报告形式发布,主张”先用大规模无监督文本预训练出 一个语言模型,再用小规模标注数据微调,就能通吃推理、问答、分类、相似度等各 类 NLP 任务”;前置知识:Transformer、语言模型、word2vec / ELMo / ULMFiT。 放到 ChatGPT 发展史里,这篇是开山之作——今天所有”先预训练、再对齐”的玩法, 源头都在这里。
一、引言:背景与核心问题
2018 年年中,NLP 还活在”一任务一模型”的旧世界里。每个任务——情感分类、自然语 言推理、问答、语义相似度——都要单独设计一套 LSTM/CNN 结构,从头开始训练,然后 祈祷标注数据够用。word2vec、GloVe 这类静态词向量只解决了一小半问题:它们给出了 词的向量表示,但下游模型依然是任务专属的,而且像 CoLA(语法可接受性判断)这种 标注稀缺的任务,几乎没人能做动。
当时”预训练”已经有三条线在铺路,但各有死穴。ULMFiT(2018-01)证明了 LSTM 语言 模型预训练加三段式微调可行,但 LSTM 的容量和并行性都是瓶颈。ELMo(2018-02)用 双向 LSTM 产出上下文相关的词向量,拿下了 NAACL 最佳论文,但它只是替换了 embedding 层,下游结构照样从头训。再加上 2017 年 Transformer 刚证明”注意力可以 完全取代循环结构”,问题就被逼到了墙角:能不能让整个预训练模型直接当下游任务 的 backbone? 不是把预训练当词向量生成器,而是当任务能力的载体。
GPT-1 的立场非常明确:可以。做法是把 Transformer 的 decoder 拆出来单用,在一个 干净的长文本语料上做 next-token prediction(下一个词预测),然后针对每个下游任务 只改输入格式、做轻量微调。论文标题里的 “Generative Pre-Training” 把两个关键词焊 在一起:生成式(只预测下一个词)+ 预训练。它赌的是:一个把语言规律学得足够透的 模型,稍加引导就能干具体的活。
这篇论文当时几乎没人注意。它是一份 12 页的技术报告,没投顶会、没有声势浩大的发 布、没有让人惊呼的生成效果。讽刺的是,4 个月后 BERT 在 GLUE 上把它反超,舆论焦 点全被 BERT 抢走;但”预训练 + 微调”这个范式本身,正是由这篇不起眼的报告立起来 的。历史后来证明,被低估的往往是范式,而不是分数。
二、方法:架构/数据/训练细节
架构上 GPT-1 没有发明任何东西,全是”拿来主义加精简”。它是一个 12 层 decoder- only Transformer:hidden size 768、12 头注意力、FFN 维度 3072(4 倍扩 展)、上下文窗口 512 token。工程细节上有几处后来被继承的选择:激活函数用 GELU 而不是 ReLU;位置编码用可学习的 embedding 而不是 Transformer 原论文的正弦 编码;输出层权重与输入 embedding 共享(tied weights)。总参数量 1.17 亿。
预训练数据是 BooksCorpus:大约 7000 本未出版书籍、8 亿词。选书而不是选网页, 这个决定很聪明——书的句子是连贯的长文档,能强迫模型学跨句的长期依赖,而网页文 本又碎又短。训练目标是最朴素的 next-token prediction,硬件是 8 张 P600 GPU, 训了约 1 个月。这个算力规模放到今天,一台带 4090 的台式机就能轻松超过,但它 就是一切的起点。
微调阶段才是这篇论文的方法论精髓。作者设计了一套”任务输入格式化”(input transformations):把不同任务的输入拼成带特殊 token 的序列,比如分类任务变成 “文本 [delimiter] 标签”,文本蕴含(NLI)变成”前提 [delimiter] 假设 [delimiter] 标签”,排序任务用 extract token,多选问答则把”上下文 + 问题 + 分隔符 + 每个候选 答案”各自拼一遍分别打分。这样所有任务共用同一个模型结构和同一套参数,微调 时只在最上层加一个任务专属的分类头,训练目标是”语言建模损失 + 分类损失”联合优 化。作者强调微调几乎没做调参——同一个超参数配置跑所有任务。
预训练的具体配置,论文写得很清楚,也基本成了后来 GPT 系列的”祖传配方”:Adam 优 化器,最大学习率 1e-4,batch size 64,序列长度 512,在 8 张 P600 上训约 100 个 epoch。分词用 BPE(字节对编码),词汇表 4 万。微调时换了小规模配置:batch size 32、学习率 6.25e-5、3 个 epoch,还带 2% 步数的线性 warmup 和 0.1 的 dropout。这 套”大学习率预训练 + 小学习率微调”的节奏,后来被几乎每一篇 GPT 论文继承。
有几个架构选择的细节值得展开。为什么用 decoder-only 而不是 Transformer 原论文的 encoder-decoder,也不是后来 BERT 的 encoder?作者的理由很直接:decoder-only 天然 自回归,预训练目标(预测下一个词)和推理方式完全一致,微调时可以把任何任务当 “续写”来做,还省掉了交叉注意力,结构最简单。位置编码用可学习的而不是正弦编码, 是因为训练序列固定 512,不需要为外推操心。输出层和输入层共享 embedding 权重 (tied weights),省了约 4000 万参数,也间接约束了表示空间。512 的上下文窗口后 来被证明是 GPT-1 的隐性天花板——它决定模型一次只能看半页文本,这也是 GPT-2 第 一个动手改的地方。
论文里还有两组消融,含金量很高。一是迁移层数实验:把预训练层从 1 层逐步加到全 部 12 层,性能一路涨——说明预训练学到的东西是逐层累积的,不是只有顶层有用。二 是零样本实验:不微调,只靠语言模型用启发式自己猜答案,分数随预训练推进稳步上 升。前一个观察验证了预训练的价值深度,后一个观察直接埋下了 GPT-2 “零样本”的种 子——很多读者没注意到,GPT-2 的路线图其实在 GPT-1 的附录里就露头了。
最后算一笔账,理解 GPT-1 的经济性。微调每个下游任务只需要几千到几万条标注样本 (RTE 这种甚至只有 2490 条),对比从零训练一个任务专属模型,标注成本下降了一个数 量级——把昂贵的标注需求从”每个任务几百万条”压缩到”几万条”,而把免费的互联网文 本拿去预训练。ChatGPT 发展史里这笔账一直在延续:到 RLHF 时代,“昂贵的标注”换成了 “昂贵的人类偏好标注”,但”免费的预训练 + 少量精标”的结构始终没变过。
三、成绩:关键实验数字
GPT-1 在 GLUE 基准上拿到 72.8,此前的最好成绩是 68.9。12 个任务里 9 个 刷新 SOTA——关键是它用同一个模型打的,而之前每个任务的冠军基本都是为该任务专 门设计的架构,甚至带 ensemble。
挑几个有代表性的。RACE(阅读理解与推理)59.0,前 SOTA 53.3,提升 5.7 个点; ROCStories(故事结尾选择,常识推理)86.5,前 SOTA 77.6,一次拉高 8.9 个点; COPA(因果推理)78.6,前 SOTA 71.2。这三个都是”要多句推理、要世界知识”的任 务,GPT-1 靠纯无监督预训练大幅刷新,这是当时最出人意料的结果。CoLA(语法可接受 性)45.4 对上前值 35.0,说明模型确实长出了语法直觉。它输在 SST-2(情感 分类 91.3 对 93.2)、MRPC(释义检测 82.3 对 86.0)、RTE(文本蕴含 56.0 对 61.7)——都是”局部线索就够”的任务,单向模型的信息利用效率吃亏。
把表拆开看还能读出更多东西。在 SNLI(蕴含判断)上 89.9 对 89.3、SciTail(科学类 蕴含)88.3 对 83.3、QNLI 88.1 对 82.3,这些是”句子关系”类任务,GPT-1 赢面很大; CoLA 45.4 对 35.0 更是碾压,因为语法判断几乎只能靠预训练里积攒的分布直觉。而它 输的三项各有原因:SST-2 是纯局部线索任务,卷积模型用词序信息就够,单向 Transformer 没优势;MRPC 和 RTE 训练集极小(几千条),微调阶段容易过拟合。作者 自己也承认,RTE 这类低资源任务对任何方法都是硬骨头——这个判断放到今天依然成立, RTE 至今还是小样本场景的常青树。
再说说 GLUE 平均分怎么来的。GLUE 当时有 9 个任务,72.8 就是这 9 项的平均,其中 QQP、MRPC 这类配对任务的标准做法是”双句拼接 + 分类头”。GPT-1 在平均分上领先 3.9 分,但跟 ELMo 的对比更有代表性——ELMo 是每个任务换一个定制结构,GPT-1 是一个固 定结构通吃。作者特意强调:“所有数据集使用同一个前向语言模型,没有 ensemble(集 成),绝大多数结果用完全相同的超参数。“这句话现在看平平无奇,当时是对”为任务定 制架构”旧范式的正面宣战。
消融数字也很硬:去掉预训练直接训练,平均分下降 14.8%——这是”预训练有用”最 直接的一刀。作者还做了个横向对比:ELMo 只换 embedding、ULMFiT 只覆盖分类任务, 而 GPT-1 一个模型覆盖了推理、问答、相似度、分类四个方向,这就是它自称 “task-agnostic”(任务无关)的底气。
收尾:我的一点看法
先夸厉害在哪。GPT-1 真正的贡献不在模型本身——1.17 亿参数、12 层,今天看就是个玩 具。它的贡献是范式:证明”一个通用的生成式预训练模型,加上极轻量的微调,可 以成为几乎所有 NLP 任务的起点”。这句话今天听起来像废话,但在 2018 年它把”为每个 任务从头造模型”的路直接堵死了。ChatGPT 能出现,是因为整个行业沿着这条路走下去 了,而这条路的第一块砖是它铺的。
再说它的尴尬。4 个月后 BERT 用双向注意力在 GLUE 拿到 79.6,把 72.8 甩开一大 截。这暴露了 GPT-1 的根本短板:单向的 left-to-right 语言建模,天生在 NLI、分类 这类”需要同时看两边”的任务上吃亏。BERT 论文式的碾压让业界一度以为”双向预训 练”才是正道,decoder-only 是被看衰的支线——后来的故事大家都知道了,生成式这条路 笑到了最后。但公允地说,2018 年 BERT 赢在架构,GPT 赢在路线,两篇加一起才凑齐后 来十年的主线。
我最想吐槽的一点:GPT-1 的作者把成功更多归功于框架设计,对”规模”这根杠杆嗅觉并 不敏锐。他们明明观察到了”零样本能力随预训练推进而提升”,却没有明确提出”模型越 大越好”的假设——这个假设要等 GPT-2 才浮出水面。这说明真正重要的结论往往在作者 的盲区里。在”规模三部曲”里,GPT-1 是探路者:它没找到最大的金矿,但它证明了金矿 存在。
最后补一个技术史视角的细节:GPT-1 的 decoder-only 架构不是论文的发明,甚至不是 它第一个用的——但它把”decoder-only + 语言模型预训练 + 微调”这一整套组合验证成了 可用配方。后来 BERT 走 encoder-only,T5 走 encoder-decoder,2020 年后的事实证明, 能从预训练一路无缝滑向”生成 + 推理”的,只有 decoder-only。这个”最初看起来最弱的 选择”为什么笑到最后,是比 GLUE 分数更有意思的学术问题——我倾向于认为,生成式目 标天然更接近”智能体”要做的每一件事,而 GPT-1 是最早把宝押在这上面的人。
附:核心数据速查
关键数字表格
| 指标 | 数值 | 对比/备注 |
|---|---|---|
| 参数量 | 1.17 亿 | 12 层 decoder-only Transformer |
| 隐层维度 | 768 | 12 头注意力,FFN 3072 |
| 上下文窗口 | 512 token | 预训练与微调一致 |
| 预训练数据 | BooksCorpus:约 7000 本书 / 8 亿词 | 无监督 next-token 预测 |
| 训练硬件 | 8×P600 GPU,约 1 个月 | 今天一台 4090 即可超过 |
| 预训练超参 | Adam,lr 1e-4,batch 64 | 微调 lr 6.25e-5,batch 32,3 epoch |
| 分词 | BPE,词汇表 4 万 | 后来 GPT 系列的祖传配置 |
| GLUE 平均 | 72.8 | 此前 SOTA 68.9 |
| RACE | 59.0 | 前 SOTA 53.3(+5.7) |
| ROCStories | 86.5 | 前 SOTA 77.6(+8.9) |
| COPA | 78.6 | 前 SOTA 71.2 |
| CoLA | 45.4 | 前 SOTA 35.0 |
| SNLI | 89.9 | 前 SOTA 89.3 |
| MNLI(匹配/不匹配) | 82.1 / 81.4 | 前 SOTA 80.6 / 80.1 |
| SciTail | 88.3 | 前 SOTA 83.3 |
| QNLI | 88.1 | 前 SOTA 82.3 |
| QQP / STS-B | 70.3 / 82.0 | 前 SOTA 66.1 / 81.0 |
| SST-2 | 91.3 | 未超过前 SOTA 93.2 |
| MRPC / RTE | 82.3 / 56.0 | 两项均落后前 SOTA |
| 去掉预训练(消融) | 平均 -14.8% | 预训练价值的直接证据 |
关键概念清单
- Decoder-only Transformer = 只用解码器栈的自回归 Transformer,从左往右逐个预测
- Pre-training / Fine-tuning = 预训练 / 微调,两段式训练范式
- Next-token prediction = 下一个词预测,语言模型的标准训练目标
- BooksCorpus = 论文使用的书籍语料库(约 7000 本未出版书)
- BPE = Byte Pair Encoding,字节对编码,一种子词分词法
- GELU = 高斯误差线性单元,一种激活函数
- GLUE = 通用语言理解评估基准,9 项任务的平均分
- NLI = Natural Language Inference,自然语言推理(判断句子蕴含/矛盾/中立)
- Multi-head self-attention = 多头自注意力,Transformer 的核心组件
- Residual connection = 残差连接,让深层网络梯度好传
- Learned positional embedding = 可学习的位置编码
- Task-agnostic = 任务无关,不针对单个任务设计结构
- Zero-shot = 零样本,不做任务微调直接评测
- Tied weights = 输入与输出共享同一份 embedding 权重
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





