正在翻开……

语言模型是少样本学习者

Brown, Mann, Ryder, Subbiah et al.(共 31 位作者)· OpenAI · NeurIPS 2020 · arXiv:2005.14165

这篇论文有 75 页,里面的词一个比一个吓人——in-context learning、zero-shot、涌现。你一个都不用先懂。整篇论文其实只想让你相信一件事,而这件事,你在下一段里就会亲手做一遍。做完你就懂了一半;剩下的一半是:机器也能这样吗?

先做一道格努语翻译题

先别读任何解释,直接开始。格努语是我们现编的一门语言,世界上没有第二个人会说。下面是它的三个词和中文意思——看完前三行,第四行轮到你。点你认为对的那个意思,凭感觉就行:

一门刚发明 10 秒的语言 · 第四行等你来填

然而"只要足够大"这几个字,在 2020 年听起来近乎玄学。因为在这篇论文之前,教机器做一个新任务,用的是一套完全不同的、重得多的办法。

旧办法是动手术,新办法是递便签

2018 到 2020 年,整个领域的标准流程是:先在海量文本上预训练一个大模型,然后针对每个具体任务做 fine-tuning「微调」。微调像给大脑动手术——想让模型学会翻译格努语,你要先攒几千对"格努语-中文"标注数据,再用梯度下降把模型内部的权重一点点拧到位。手术很有效,但每换一个任务就要再动一次刀,而且刀口不可逆:术后的模型就专干这一件事了。

GPT-3 论文的赌注是:手术可以不做。把你在第一节看到的那张 prompt 直接塞进输入就够了。分别按下两个按钮,看两种教法各自在模型身上留下什么:

左:改模型 · 右:改输入 · 圆点 = 模型的权重

看左边:5000 条标注例子灌进去,那些圆点——模型的权重——全变了色。手术成功,但这个模型现在只会翻格努语,想让它改行,重新攒数据、重新手术。再看右边:圆点一个都没变色,变的只是它读到的那段文字。三行例子拼进输入,答案就出来了。论文管右边这种叫 in-context learning「上下文学习」:微调改的是模型,提示改的是输入。模型从头到尾是同一个模型。

一个只会"预测下一个词"的程序,怎么就会做题了?(可跳过)

语言模型只干一件事:给一段文字,算出"下一个词最可能是什么"。prompt 的把戏在于——当输入是"veska → 水 / veska-lun → 水滴 / tarno → 石头 / tarno-lun →"时,概率最高的续写恰好就是正确答案"小石头"。任务被伪装成了续写。模型没有"做题"的概念,它只是在做它唯一会做的事,而你把题目布置成了它顺手就能答对的形状。

然而不动一个参数、光靠往输入里塞例子,真能顶用吗?一个例子到底值多少分?OpenAI 拿 1750 亿参数的 GPT-3,在 42 个基准测试上把这件事量了出来。

一个例子值多少分

基线是这样的:一个例子都不给、只用一句话描述任务(这叫 zero-shot「零样本」)时,GPT-3 在 42 个基准上的平均分是 49.2。现在——先押注:只往 prompt 里加一个例子(one-shot「单样本」),平均分会到多少?

先押注 · 再拖动滑块给 prompt 加例子

然而这是 1750 亿参数的成绩单。同样的几行例子,喂给一个小一千倍的模型,会怎样?这才是整篇论文真正的实验。

八个模型排成一排:涌现

论文训练了 8 个除了大小以外一模一样的模型——从 1.25 亿参数到 1750 亿参数,同样的数据、同样的方法——然后给它们看同样的例子。下面是那张全文最重要的表。点任何一列,建议从最左边的小模型开始:

行 = 给多少例子 · 列 = 模型多大 · 点一列看它的故事

盯住最下面那行绿色的 Δ——few-shot 比 zero-shot 多出来的分数,也就是"例子的价值"。在 1.25 亿参数上,Δ 只有 5 分:例子几乎白给,这个模型就是教不会。在 1750 亿参数上,Δ 是 25 分,翻了五倍。把这一行连成线(图底部),就是后来被整个行业叫做"涌现"的那条曲线:"会从例子里学"这件事本身,不是教出来的,是规模长出来的。

还有一个数字值得看:当年各任务微调模型冠军的平均线大约在 64 分。八列里只有最右那一格(74.5)越过了它——一群动过手术的专科医生,被一个只看了几行便签的通才追平了。

八个模型的完整数字(42 基准平均,读图近似)
参数量 125M350M760M1.3B 2.7B6.7B13B175B
0 个例子 13151720 24303749
1 个例子 14172125 31404861
10–100 个 18222733 41526074
Δ 例子的价值 +5+7+10+13 +17+22+23+25

另一个看这张表的角度:从 125M 到 175B,参数翻了 1400 倍,zero-shot 分数只翻了不到 4 倍——而 Δ 翻了 5 倍。规模的红利,有相当一部分没有变成"知识",而是变成了"领会你意图的能力"。

然而 74.5 是个平均分,而平均分最会撒谎。它在哪些任务上大杀四方,又在哪些任务上原形毕露?

成绩单里藏着四个死穴

下面是 GPT-3(175B)在 20 个基准上的 few-shot 成绩,从高到低排。绿条是 few-shot 分数,橙色刻线是同任务的 zero-shot 分数——两者的距离就是例子帮的忙。这张成绩单里藏着四个分数低得蹊跷的"死穴"点那些短得可疑的条,把它们全找出来,你会发现一个共同点:

点击任意一条查看任务详情 · 红色 = 死穴候选

找齐四个,共同点就浮出来了:WiC 要判断一个词在两句话里是不是同一个意思,ANLI 要把两段陈述放一起找矛盾,DROP 要对着一段话里的几个数字来回比对。全都需要把两块内容反复对照。而 GPT-3 是纯自回归模型——只从左往右读一遍,读过的不回头。它没有"回头看"的机制,所以一切需要来回对照的任务都是结构性短板。最扎眼的是 WiC:49.4 分,随机猜都有 50——它连抛硬币都不如。

把这个和它的强项放在一起,反差才够刺眼:同一个模型写的 200 词新闻,论文里的人类评委只有 52% 的概率认出是机器写的——等于瞎猜。能写出以假乱真的新闻,却分不清两个 bank 是不是一个意思。论文自己也没回避这些:它用近三分之一的篇幅讨论短板、偏见与滥用——比如模型输出里 83% 的职业默认是男性,"Black" 一词的情感得分在各个尺寸的模型里都垫底。这些问题它一个都没解决,只是罕见地、认真地记了下来。

杠精清单:三个你可能正想提的反驳(我们替你提了)

"它会不会只是把答案背下来了?"——合理怀疑:GPT-3 的预训练数据几乎扫过了整个互联网,考题可能就在里面。论文自己也怕这个,专门做了数据污染分析,把和测试集重叠的内容剔除后重测——大多数任务分数变化不大。但他们同时坦承分析工具有 bug、方法不完美。这一条记为"大概率不是,但没有百分百排除"。

"平均分 74.5 会不会是被几个强项拉高的假象?"——是真实风险,所以才有 §5 那张 20 根条的图:QuAC 的 few-shot 增益接近零,四个死穴接近随机。平均分说的是趋势,不是保票——这正是我们把任务级数据全摆出来的原因。

"这真的能叫'学习'吗?权重都没动。"——最深的一刀,学界至今没有共识。一派认为模型在上下文里做了某种隐式的梯度下降;另一派认为例子只是"唤醒"了预训练里早就存在的能力。你在沙盒里会拿到自己的证据:polda-gor 说明它确实变不出没见过的东西——但 tarno-lun 又说明它确实当场组合出了没见过的搭配。两派各拿一半。

然而看别人量好的数字,终究不如自己动一次手。到这里,所有零件你都摸过了:prompt 的形状(§1)、改输入不改权重(§2)、例子的数量(§3)、模型的规模(§4)、能力的边界(§5)。最后一间屋子里,它们全部交到你手上。

沙盒:拼一个你自己的 prompt

自己拼一个 prompt:要不要任务描述、给几个例子、问哪个词,拼好了再换个模型大小试试。这是个用规则写的玩具模型(不是真的 GPT-3),但它的每一种反应——续写、瞎猜、答一半、全对、翻车——都是论文里量到过的行为:

例子数:2
拼装你的 prompt · 看模型的反应

几件值得亲手验证的事。例子拖到 0、描述也关掉:它只会顺着你的格努语往下续写——因为没人告诉它这是道题。只开描述不给例子:它明白你要什么,但词表为零,只能瞎猜。例子里还没出现过 -lun:它就把后缀丢了,答一半——它不是在"理解格努语",是在重组你给它的线索。最后,试试 polda-gor:把例子加到最满也救不回来。上下文学习不是魔法——线索既不在 prompt 里、也不在预训练里的东西,它变不出来。都玩完了,再把模型切成"小":同样的 prompt,全部失灵。§4 网格里那 5 分的 Δ,就是这个体感。

你每天都在做第一节那道题

回到论文本身。Brown 等 31 位作者做的事,严格说不是发明——GPT-2 时代就有人瞥见过 prompt 里塞例子偶尔管用。他们做的是把它变成一条可测量的曲线:训练 8 个只差大小的模型,在 42 个基准上量出"例子的价值"如何随规模增长。这条曲线的含义是:规模不只是让模型"更好",它让模型多出一种小模型完全没有的能力。从此"把模型做大"不再是暴力美学,而是一条正经的研究路线。

回想你这一路亲手做过的事:你被三行格努语 few-shot 了;按过两个按钮,看手术改了权重、便签只改了输入;押过"一个例子值几分"的注,然后看着第一个例子独占了将近一半的涨幅;点亮过 Δ 从 5 到 25 的那一行格子;从 20 根条里揪出了四个不会"回头看"的死穴;最后亲手拼了 prompt,也亲手用一个不存在的词根把它骗翻。

现在想一件小事:你上一次对聊天 AI 说"帮我改成这种格式,比如……"是什么时候?那个"比如",就是你在第一节里做的事,也是这篇论文教给整个行业的事。今天所有的 prompt 工程——写任务说明、给示范、控制例子的数量和顺序——全是这 75 页的后代。你的每一次"比如",都在重演 2020 年那个发现:不用改变模型,改变输入就够了。

它留下的问题也还开着:模型在例子里究竟是真的在"学习",还是只是被"唤醒"了预训练里早已埋好的能力?这场争论从 2020 年一直吵到今天。你已经有了自己的第一手证据——polda-gor 那一下——够你在任何一边下注了。