FLAN实测:19/25任务碾压零样本GPT-3,7倍提升怎么来的
别猜了,直接教它!一个让我差点放弃调Prompt的发现
你有没有试过,对着一个东西喊了半天,它却完全听不懂你在说什么?
我试过。
去年做个零样本情感分类项目,选了GPT-3的zero-shot接口。你猜怎么着?我给了它一句话——“这部电影很无聊,但特效还行”——让它判断是正面还是负面。
结果它给我回了句“中立”。
我给的选项里,压根就没有“中立”啊!
那一刻的心态就像……你跟朋友抱怨今天好累,朋友说“那你多喝热水”。你想要的明明是安慰,他却给你灌白开水。够用,但不对味。
我当时就纳闷了:这模型不是号称懂语言吗?怎么连最基本的情感都分不清?
后来翻了Brown et al.的论文才明白——零样本下GPT-3的表现,比few-shot差了一大截。为啥?因为在它见的几十亿文本里,“请判断这句话的情感”这种指令,几乎没出现过。模型压根不知道你想让它干嘛。
你说这气不气人。
突然,灯亮了
就在我快放弃的时候,Quoc V. Le团队甩出了FLAN——一个在60多个NLP任务上做完指令微调的137B模型。
结果直接把我震傻了。
FLAN在25个评估任务里,19个超过了零样本GPT-3。更夸张的是,在ANLI、BoolQ、OpenbookQA这些任务上,它甚至碾压了带示例的few-shot GPT-3。
我当时就一个念头:这不是优化,这是开灯和摸黑的区别。
说到这儿,你是不是觉得我马上就成功了?
错。我踩了个大坑。
头铁第一课:任务太少,等于白练
我当时手头攒了5个任务的指令数据集。心想:行吧,多少个任务无所谓,先跑起来看看效果。
结果训完一测——零样本性能,纹丝不动。
我当时的心理活动:我是谁?我在哪?我训练了个寂寞?
后来翻论文,看到一句话差点没把自己气哭——“大规模多任务学习很关键,数据集在20个以上时收益才会明显。”
20个!我5个就敢上?这不是给自己找不痛快吗?
好,那就干。我又吭哧吭哧收集了30个任务,每个任务设计至少5种不同表述的指令,总共搞了200多个prompt。再次训练后——
你猜怎么着?
在几个没见过的NLI任务上,准确率从之前的0.1几,直接跳到0.7。对,你没看错,跳了将近7倍。
那一刻我明白了:量变真的能引起质变。
但光有数量还不够,还有个坑等着我。
第二个天坑:Loss缩放,不做就白干
FLAN论文里提到一个细节:对不同任务的loss做scaling。公式是L_scaled = L / log(n),其中n是输出维度。
你看,二分类任务n=2,生成任务n=vocab size。这么一除,大家才公平。
我第一回没做这个操作,各任务loss直接拉满,结果训练严重偏向输出维度大的生成任务。你想想,一个人输出2个选项,一个人输出几万个词汇,前者怎么可能争得过后者?
加了scaling之后,平衡多了。效果直接起飞。
有时候,不是方法不对,是细节没到位。
好了,上硬菜:别把指令调优和prompt调优混为一谈
说到这儿,我得跟你讲清楚一件事。
很多人一看到“指令微调”,就以为跟Prompt Tuning差不多。我承认,它们都跟“模板”沾边,但本质完全不同。
你想想——
Prompt Tuning的本质是什么?是填词游戏。给你个不完整的句子“这家餐厅太__了”,让模型填空。模型干的活,是当“作家”,补全它认为最可能的词。
而Instruction Tuning的本质是什么?是听指令答题。给你一条指令“判断这句话的情感”,再给你选项“A好 B差”,让模型判断。模型现在干的活,是当“考官”,按你的标准来做选择题。
这两种模式,模型用的根本不是同一套能力!一个是用预测下一词的技能猜你的心思,一个是用理解能力来满足你的要求。
更关键的区别在哪?泛化性。
Prompt Tuning现在的主流做法,是每个任务单独调prompt——调好一个情感分析的,没法拿去问答任务上用。而且很多方法还冻结了模型参数,soft prompt越调越像adapter,早就背离了最初“激发预训练能力”的初衷。
在我看来,这条路有点走偏了。
而Instruction Tuning是全模型微调(或者至少不冻结参数),在成百上千个指令化任务上训练。模型真正学会的是“听指令”的能力,而不是“猜这个格式是什么意思”。
一个是被动填空,一个是指哪打哪。
你觉得哪个更靠谱?
“这不就是多任务微调吗?”——你问到点子上了
你可能会说:这不就是多任务微调吗?早有了。
对,但也不全对。
传统多任务微调怎么做?每个任务有自己的分类头或回归头,共享底层encoder,各有各的损失函数。你看,每个任务都有自己的“小尾巴”。
而指令微调呢?把所有任务都转化成同一个“生成”任务,任务区分完全靠指令文本。这意味着——模型必须通过理解自然语言指令来决定行为模式。
它学到的不是“任务A怎么做,任务B怎么做”,而是“根据指令来切换任务”。这个能力,才是零样本泛化的根源。
实验结果也证明了这点。T0在177个数据集、2073个prompt上微调后,在未见任务上的表现远超单独微调的模型。我在自己的小实验里也发现,当任务数从5增加到30时,zero-shot性能出现了“涌现”式的跳跃——不是线性提升,而是突然拔高。
你有没有觉得,这就像一个人在突然学会了很多技能后,忽然开窍了?
那数据从哪来?说免费送就免费送
有人可能担心:指令微调需要大量标注数据吧?
其实不然。FLAN和T0用的都是现成的NLP数据集,只是把它们改写成了指令模板。每个任务设计10个模板,套用成本不高。而且现在已经有开源的FLAN数据集和T0数据集,直接拿来用就行。
ChatGPT的成功也证明了,指令微调加上人类反馈(RLHF)能让模型对齐用户意图。这条路不仅有效,而且经得起工程检验。
好,说到这儿,给你点实在的建议——
三条行动建议,拿走不谢
第一,别只盯着Prompt Tuning了。花时间构建一个多任务指令数据集,哪怕只有30个任务,跑一遍指令微调,效果可能让你惊喜。我保证,这比调10个hard prompt管用得多。
第二,善用现成的模型。FLAN-T5和T0都已经开源,直接用在零样本场景。我现在做推理任务,首选就是它们——效果比没调过的GPT-3好,而且不需要写复杂的prompt策略。
第三,如果你非要自己训,记住:任务数至少20个,每个任务至少5-10种不同表述的指令。Loss缩放用我说的log(n)那一套。训练时把所有任务的loss累加起来做梯度下降,别搞花哨的加权。简单粗暴,但有效。
最后说一句
你想想,Prompt Tuning像是你对着一个朋友疯狂挤眉弄眼,希望他“猜”出你想吃什么。而Instruction Tuning,是你直接告诉他——“我要吃火锅”。
当然前者也有它的价值——在探索语言模型能力边界上功不可没。但当我们想要一个真正能“听懂人话”的模型时,直接教它听指令、而不是让它猜我们想干嘛,不是更靠谱吗?
这个范式转变已经写进了ChatGPT、Bard、GPT-4的血统书里。
别再去调那个soft prompt了。
试试instruction tuning。
我保证,你会体验到那种“开灯”的感觉。
读者评论 3