从“先预训练再微调”,到“给几个例子就会”
三年里,模型大了一千多倍,用法也换了三次。
- 2018
GPT-1:先预训练,再微调
Radford 等,OpenAI
- 解决了什么
- 过去每个语言任务都要收集大量人工标注的数据,单独训练一个模型。
- 带来了什么变化
- 先在 7000 多本未出版的书上练“猜下一个词”,再用少量标注数据微调,在 12 项任务中的 9 项刷新纪录[3]。
- 2018
BERT:双向的完形填空
Devlin 等,Google
- 解决了什么
- GPT 只能从左往右读,判断一个词时看不到它后面的内容。
- 带来了什么变化
- 随机遮住约 15% 的词,让模型根据两边的上下文猜回来;预训练加微调后在 11 项任务上刷新纪录[4]。
- 2019
GPT-2:不微调也能做任务
Radford 等,OpenAI
- 解决了什么
- 每换一个任务,仍要准备标注数据、重新微调。
- 带来了什么变化
- 15 亿参数、约 800 万个网页训练后,不经微调、只靠提示就能勉强做翻译、摘要和问答(零样本)。OpenAI 担心被滥用,分阶段公开了模型[1]。
- 2020
缩放定律:规模可以预先估算
Kaplan 等,OpenAI
- 解决了什么
- 模型做多大、数据要多少、算力怎么花,过去主要靠经验和试错。
- 带来了什么变化
- 损失随参数量、数据量和算力按幂律平稳下降,有的趋势跨越七个数量级以上[5]。大模型的投入第一次有了可估算的回报。
- 2020
GPT-3:举几个例子就会
Brown 等,OpenAI
- 解决了什么
- 即使不用标注数据,每个新任务也要改造或微调模型。
- 带来了什么变化
- 1750 亿参数、3000 亿个 Token 训练。只要在提示里写几个示范,不改任何参数就能做新任务,这叫“上下文学习”[2]。
- 2022
Chinchilla:数据也要跟上
Hoffmann 等,DeepMind
- 解决了什么
- 按 2020 年的建议,算力主要花在加大模型上,许多大模型的训练数据相对不足。
- 带来了什么变化
- 同样的算力,700 亿参数、1.4 万亿 Token 的 Chinchilla 胜过 2800 亿参数、3000 亿 Token 的 Gopher:参数和数据应同比例增长[6]。
预训练:只练猜下一个词 Pre-training · Next-token Prediction
1一句话
预训练就是让模型读海量文字,在每个位置猜“下一个词是什么”;猜错了,就把参数调一点,让正确答案的概率变高。
2打个比方
像排字工在字盘前练手:师傅念出半句话,他伸手去取下一枚字模;取错了,师傅指出正确的那枚,他记下这次的手感。练过几亿句之后,哪个字常跟在哪个字后面,手已经“记住”了。
为了把下一个词猜准,模型不得不顺带学到语法、常识和大量事实:要猜对“中国的首都是___”,就得在语料里见过足够多关于北京的句子。这就是“只练猜下一个词”却学到很多东西的原因。这里的“记住”只是比喻,模型里只有一大堆被调整过的数字。
3动手试
- ① 预测
- ② 对答案
- ③ 算损失
- ④ 调参数
模型给下一个词的概率
全部练习题的平均损失
参数表:每行是一段前文的 8 个分数(logits)
| 前文 | 今天 | 天气 | 很 | 好 | 不错 | 下雨 | 。 | 我 |
|---|
4怎么做到的
一次训练分四步:① 模型读入前文,给词表里每个词打一个分数(logits),用 softmax 变成概率;② 对照语料里真正的下一个词;③ 算损失:正确答案的概率 p 越低,损失 −log p 越大;④ 用梯度下降把参数往“让正确答案概率变高”的方向推一小步。演示里每段前文只有 8 个分数可调,真实模型是几十亿到上千亿个参数一起调。
这种练习不需要人工标注:答案就是文本自己的下一个词,所以任何文字都能拿来练。GPT-1 先在 7000 多本未出版的书上这样预训练,再用少量标注数据微调到具体任务[3]。同年的 BERT 换了练法:随机遮住句子里约 15% 的词,让模型看两边的上下文猜回来,像完形填空[4]。BERT 擅长理解和分类;GPT 式的“从左到右猜下一个词”,天然适合生成。
做不到什么
- 模型学到的是文字之间的统计规律。语料里常见的错误说法和偏见,会一起学进去。
- 训练只奖励“猜得像语料”,不奖励“说得对”,所以模型会写出流畅却错误的句子(第 05 章的幻觉)。
- 语料有截止日期。之后发生的事,模型没有读到过,也就无从猜起。
温度与采样:为什么每次回答不一样 Temperature · Top-k · Top-p
1一句话
模型每一步给出的是下一个词的概率分布,最终写哪个词要靠“抽签”;温度和 Top-p 决定这次抽签有多大胆。
2打个比方
像摇签筒:每支签写着一个候选词,概率高的词签多,概率低的签少。温度调的是签的比例:温度低,热门词的签几乎占满签筒;温度高,冷门词的签也多起来。Top-p 是先把最冷门的那些签挑出来扔掉,只在剩下的签里摇。
3动手试
从前有一只
概率(截断后重新归一化)被截掉,不会被抽到20 次里抽中的次数
讲故事没有标准答案,候选词的分数很接近:调高温度,故事的主角会五花八门。
4怎么做到的
模型最后一层给每个候选词一个分数 z。把分数除以温度 T 再做 softmax:p = ez/T ÷ Σ ez/T。T 小于 1,高分和低分的差距被放大,分布变“尖”;T 大于 1,差距被压缩,分布变“平”;T 趋近 0,就等于每次都挑最高分,叫贪心解码。
Top-k 只保留分数最高的 k 个词;Top-p(核采样)把词按概率从高到低累加,加到 p 为止,其余丢掉,再在保留的词里按比例抽。这些设置只改变“怎么抽”,不改变模型本身。温度的说法也用在别处:知识蒸馏用调高温度后的“软化”概率,让小模型去模仿大模型[7]。
做不到什么
- 温度低,回答稳定,但容易重复、套话多;温度高,回答新鲜,但更容易跑题和出错。没有一个温度适合所有任务。
- 抽签只能在模型给出的分布里挑。正确答案的概率本来就很低时,怎么调都很难抽到它。
- 同样的设置,每次结果也可能不同。需要可复现时,要固定随机种子,或者直接选最高分。
训练与推理:改参数,还是只读参数 Training vs Inference
1一句话
训练是根据错误反复修改参数,昂贵且只做一次;推理是用训练好的参数生成文字,参数一个也不改。
2打个比方
训练像刻一整套字模:要反复试印、修改,费时费钱。推理像用这套字模排版印刷:字模已经定型,每印一页只是取用,不会改变字模本身。你和聊天机器人对话时,发生的都是推理。
3动手试
输入
模型参数 可修改
输出
这一步每个 Token 的计算量
- 参数被改动的步数
- 0
- 生成的 Token
- 0
按同样的估算,拿 GPT-3(1750 亿参数、3000 亿 Token)算一笔账
4怎么做到的
训练的一步包括前向计算(算出预测)和反向计算(算出每个参数该往哪边调),然后更新参数。按 Kaplan 等的估算,前向计算每个 Token 约需 2N 次运算(N 是参数量),反向约是前向的两倍,所以训练每个 Token 约需 6N 次[5]。
拿 GPT-3 算一笔账:1750 亿参数、3000 亿个 Token[2],训练总量约 6 × 1750 亿 × 3000 亿 ≈ 3.2 × 1023 次运算;推理时每生成一个 Token 只需前向,约 2 × 1750 亿 = 3.5 × 1011 次。换句话说,训练一次的计算量,够它生成约 9000 亿个 Token。训练还要保存梯度等中间结果,对显存的要求也比推理高得多。
做不到什么
- 推理时参数不变,模型不会因为一次对话就“学会”新知识;聊天软件的“记忆”,通常是把旧内容重新放进上下文(第 03 章)。
- 要让模型掌握新知识,只能再训练(微调),或者在推理时把资料放进提示(第 08 章的检索增强)。
- 这里只估算了量级。实际成本还取决于硬件、并行方式和上下文长度,差别可能很大。
缩放定律:大,要大得有章法 Scaling Laws
1一句话
模型越大、数据越多、算力越足,损失就越低,而且降得很有规律,可以用简单的幂律公式提前估算。
2打个比方
像办报社:想印得又多又好,要同时添印刷机(参数)和纸(数据)。只买机器不买纸,机器闲着;只囤纸不添机器,纸印不完。预算一定时,两者之间有一个最划算的比例。
3动手试
- 参数 N
- 训练 Token D
- 每个参数的 Token
- 损失(示意)
4怎么做到的
2020 年,Kaplan 等训练了一系列大小不同的语言模型,发现测试损失随参数量、数据量和算力都按幂律下降,有的趋势跨越七个数量级以上;层数、宽度这些结构细节,在很大范围内影响很小。他们据此建议:算力增加时,优先把模型做大,用相对不多的数据训练[5]。
2022 年,Hoffmann 等训练了 400 多个模型重新检验,结论是:给定算力,参数量和训练 Token 数应同比例增长。按他们的估算,10 亿参数的模型约需 202 亿个 Token,100 亿参数约需 2051 亿个,大致是每个参数配 20 个 Token。按这个思路训练的 Chinchilla(700 亿参数、1.4 万亿 Token)和 Gopher(2800 亿参数、3000 亿 Token)用的算力相同,表现却更好[6]。
做不到什么
- 缩放定律描述的是平均损失,不直接告诉你某项具体能力何时出现。
- 它是在一定范围内拟合出的经验规律,不是物理定律;换了数据或结构,系数就会变。
- “每个参数配 20 个 Token”只考虑训练成本。模型要被大量使用时,把小一点的模型多喂些数据,之后每次推理会更省,这是另一种取舍。
上下文学习:举几个例子就会 Few-shot · In-context Learning
1一句话
足够大的模型,只要在提示里看到几个示范,就能照着完成同类任务,整个过程不改动任何参数。
2打个比方
像给新来的排字工看样张:不用重新培训,只要把几张排好的样张放在手边,他就照着格式排下一张。样张越清楚,排对的可能越大。
不同的是,排字工看过会记住,模型不会:下一次对话,样张不在提示里,它就“忘了”。
3动手试
提示(模型读到的全部文字)
模型给“→”后面下一个词的概率
参数改动:0 个示范只是放进上下文的文字,模型本身一个参数也没变。
4怎么做到的
GPT-3 论文把这种用法分成三种:只给任务说明的零样本(zero-shot)、给一个示范的单样本(one-shot)、给几个到几十个示范的少样本(few-shot)。三种都不做梯度更新,示范只是放进上下文的文字。论文发现,模型越大,越能利用这些示范:同样的示范,小模型提升有限,1750 亿参数的模型提升明显[2]。
为什么能这样,目前还没有公认的完整解释。一种直观的理解是:预训练语料里本来就充满“先举例、再照做”的文字,示范帮模型确定“现在要做的是哪一种续写”。
做不到什么
- 效果对示范的选择、顺序和措辞都很敏感,换个写法,结果可能明显不同。
- 示范要占用上下文窗口,能放的例子有限。
- 原始的预训练模型只会续写:没有示范时,它可能把问题当成一份试卷接着往下出题,而不是回答(第 05 章)。
这一章留下的问题
- 01
预训练出的模型只会续写:问它一个问题,它可能接着出三道题,而不是回答。怎样让它听懂请求?这是下一章的内容。
- 02
训练目标是“像语料”,不是“说真话”。流畅和正确之间的这道缝,后来被叫作幻觉。
- 03
规模越大损失越低,但高质量文字、算力和电力都有上限。缩放还能走多远?
本章参考文献
- [1] Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei, Ilya Sutskever. Language Models are Unsupervised Multitask Learners. OpenAI (technical report; announced in the blog post “Better language models and their implications”).在约800万个网页(WebText)上训练了最大15亿参数的GPT-2,显示语言模型无需针对任务训练也能零样本完成部分任务;OpenAI以担心被滥用为由分阶段公开了模型权重。
- [2] Tom B. Brown et al.. Language Models are Few-Shot Learners. NeurIPS 2020 (arXiv:2005.14165).训练了1750亿参数的GPT-3,展示只需在提示中给出少量示例(上下文学习,不更新参数)就能完成许多任务。
- [3] Alec Radford, Karthik Narasimhan, Tim Salimans, Ilya Sutskever. Improving Language Understanding by Generative Pre-Training. OpenAI (technical report; announced in the blog post “Improving language understanding with unsupervised learning”).先在大量无标注文本上对Transformer解码器做生成式预训练,再针对具体任务做有监督微调,在多项自然语言理解任务上取得当时最好成绩,即后来所称的GPT-1。
- [4] Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL-HLT 2019, pp. 4171–4186 (arXiv:1810.04805).用掩码语言模型等目标预训练双向Transformer编码器,再微调到下游任务,在11项NLP任务上刷新纪录,推动了“预训练+微调”范式的普及。
- [5] Jared Kaplan et al.. Scaling Laws for Neural Language Models. arXiv:2001.08361.实证发现语言模型的测试损失随参数量、数据量和计算量呈幂律下降,并据此给出在固定算力下如何分配模型规模与数据量的建议。
- [6] Jordan Hoffmann et al.. Training Compute-Optimal Large Language Models. NeurIPS 2022 (arXiv:2203.15556).发现在固定算力下模型参数量与训练token数应大致等比例增长,当时许多大模型“训练数据不足”;据此训练的700亿参数Chinchilla在多项评测上超过了2800亿参数的Gopher。
- [7] Geoffrey Hinton, Oriol Vinyals, Jeff Dean. Distilling the Knowledge in a Neural Network. NIPS 2014 Deep Learning Workshop (arXiv:1503.02531).提出“知识蒸馏”:用大模型(或模型集成)经温度调节后的软化输出概率来训练小模型,使小模型以较低成本接近大模型的性能。
全部文献、素材与许可见 来源与许可。