作者 | 欧泽彬
整理 | NewBeeNLP
https://zhuanlan.zhihu.com/p/607637180
大家好,这里是 NewBeeNLP。ChatGPT 以其强大的推理能力和丰富知识搅动了最近几个月的 AI 社群。
作为跟进和反思,本文简单捋一下最近一两年促成 ChatGPT 的 NLP 研究变化,力求解读出表象背后的逻辑,并提供一些未来发展方向的预测。本文以主线梳理和抛砖引玉的观点为主,不会对基础知识做太多铺垫,欢迎各位批评指教!
罗马是怎么建成的
ChatGPT 反映的是近几年来 NLP 领域的逐步的积累变化:将语言作为模型的统一接口、从 solution engineering 转向 task engineering,以及 scaling law 的不断实践。值得注意的是,ChatGPT 以及其前身 InstructGPT 在算法创新上也跨出了很有意思的两小步。
语言成为通用的模型接口
NLP 社区对预训练的使用经历了几次范式变化
以预训练的词向量和 ELMo 为代表的输入特征增强
以 BERT 和 BART 为代表的预训练初始化 + 端到端 finetuning
以 GPT2/3 为代表的 prompting
在 1 和 2 的范式下,我们需要为每一个具体任务设计一个特定的 predictor 来给出相应的目标结构:标签、标签序列、图、自然语言序列。Predictor 没法复用,我们不能用解决分类的 predictor 去解决问答任务,而由于标签集不同,不同分类任务的 predictor 也无法复用。
第 3 个范式以 salesforce 的 The Natural Language Decathlon: Multitask Learning as Question Answering 为起点,到 GPT2 和最近的 ChatGPT 为顶峰。我们意识到诸如分类、序列标注、阅读理解、翻译、摘要、信息抽取等 NLP 任务可以统一为自然语言生成的形式。语言作为统一的模型输入或者输出的接口,模糊了任务之间的边界,使得所有任务都可以用单一的自然语言生成的 predictor 解决。因而我们可以训练一个通用模型来利用不同任务之间共享的知识,同时期待它在没见过的任务上面有不错的泛化性能(跨任务泛化),这在几年之前几乎是不可想象的事。
把语言作为模型输入/输出接口还有更加深远的意义。和只能表达属于/不属于的离散标签相比,语言内在的语义关系可以为模型提供更加丰富的监督信息。由此 OpenAI 的 CLIP 通过大规模的图像和语言描述的匹配训练出性能优越的图像分类模型。语言也是 human-friendly 的人机接口,我们可以将抽象的自然语言描述作为输入,让模型去生成诸如图像、音乐等具象输出。前阵子很火的 DALL·E、Stable Diffusion 等文生图应用就是很好的例子。
然而语言的灵活性和非结构性使得它不太适合做机器的接口:我们需要对输出的解码过程做一定的硬限制,或者设定特定的替代序列,才能从输出中解析出标签、标签序列、图等离散结构。比如 FLAN 便把所有的分类选项拼接在 prompt 中:I am happy today. Is the expression positive? OPTIONS: -yes -no,模型下一个词预测出 yes 对应正标签,no 则对应负标签。更进一步,如何确保生成的标签序列、图等离散结构的正确性(符合定义,满足限制)也是一个开放的研究问题。
从 Solution Engineering 到 Task Engineering
过去的几年深度学习的发展似乎印证了一条恒定的经验规律(Sutton 的 the Bitter Lesson):任何对最优解的手工设计带来的效果最后都会被优化、搜索算法碾压掉。
先是 feature engineering 和 pipeline 系统被端到端训练的神经网络碾压掉,再是任务相关的 model engineering 被 finetune 过后的预训练模型碾压掉,最近则是 prompt engineering 被 instruction finetuning 碾压掉
Prompt engineering 解决的是怎么样通过修改诸如 GPT2 等大模型的输入前缀(prefix)来让模型生成我们想要的回复。在细致地考察 prompt 里面 demonstration example 的顺序、任务的表述形式的作用,尝试端到端训练 prompting token 的参数,以及研究怎么哄骗模型(let’s think step by step)或者使用 chain-of-thought prompting 来诱导模型做出类似推理的输出后,近期的研究逐渐收敛到 instruction finetuning:与其费劲力气去调整黑盒的内部运行机制来获得我们想要的行为,为什么不直接通过训练将预期行为注入模型中呢?
于是从去年上半年的 FLAN、Natural Instructions 和 InstructGPT,到去年年底的 Flan-PaLM、Supernatural Instructions 和 ChatGPT,通过设计多样的任务相关的 prompt 和目标输出对预训练模型进行 instruct finetuning,我们看到预训练语言模型的 prompting 设计变得更加友好,产生的输出也变得惊艳。
对于优化模型行为这个目标,task engineering 的优先级往往是比 solution engineering 更高的 -- 我们要相信优化、搜索算法的力量。
以 language modeling 为目标在不同语料上进行训练时,表面上看模型是在学习同一个任务在不同 domain 上的分布,但实际上模型是在学习由language modeling + 数据
构成的不同训练任务。
比如在带注释的 code 上训练时,模型需要学到如何生成可执行的代码;在多语语料上训练时,模型需要将不同语言映射到同一个语义空间上。在 code base 上训练的 GPT 以及 PaLM 的 chain-of-thought 的能力很有可能就是来自于代码注释中对任务的拆解。
language modeling 语料的不同混合方式隐式地决定了语言模型所具备的“能力”,而 instruction finetuning 则是直接将我们想要的“能力”注入到模型黑盒中。
你永远可以相信 Scaling Law
2017 年百度的Deep Learning Scaling is Predictable, Empirically
首次指出的 power law scaling rule
在接下来的几年被不断地验证:模型量级每提升一个数量级,模型的效果便会提升一个点。
在探究某个问题是否可解时,scaling 的优先级是要高于任何手工 engineering 的。最近几年模型的发展可以认为是 scaling law 的一次又一次胜利:BERT 的 scaling 带来的是 finetuning 后下游任务性能的稳定提升;GPT 系列的 scaling 带来了 emergent capability 的出现;CLIP 的 scaling 带来的是强大的跨领域泛化能力;DALL·E2 的 scaling 带来的是令人惊艳的图像合成效果。
Scaling law 不仅对参数量、训练数据、计算量有效,对跨任务训练(如 Flan-PaLM)的任务数量也是有效的 -- 更多的训练任务能带来更强的跨任务泛化。似乎随着任务数量和每个任务的数据量的增加,像 Flan-PaLM 和 InstructGPT 一样 instruction finetuning 过后的预训练语言模型能够逐渐逼近 AGI 这个圣杯。
一个很有趣的现象是 scaling law 加持下的预训练模型对 CV 带来的冲击远不及 NLP 那么剧烈。一个直觉理解是以语言是一个巨大的离散组合空间:给定词表 V,句长为 L 的可能句子有爆炸性的 |V|^L 之多。仅靠共现(是否一起出现在同一句子)这一微弱的结构来限制模型的自由度并不能阻止模型在这么大的离散空间里面过拟合。因此大多数自然语言任务往往处于数据紧缺的状态,预训练模型对过拟合风险的降低反映为巨大的性能提升。
与此对立的是,图像虽然是一个连续的空间,但是它光滑性(continuous)以及平移不变(translation equivariant)等优秀结构使得模型自由度受到很大的限制,模型便不太容易过拟合。考虑到大部分 CV 的数据集量级之大,标准的 CV 任务并没有太多过拟合的困扰,预训练模型带来的冲击便没有那么明显。
在 scaling law 的冲击下,单任务刷榜的研究变得越来越难做。NLP 社区慢慢转向发现并解决 scaling 不能解决的问题:已被解决的数据集逐步被抛弃,更加困难的 challenging dataset 纷至沓来。然而从老生常谈的 cross domain generalization,到最近的 common sense knowledge、shortcut rules、out-of-distribution generalization、combinational generalization、reasoning,不断狂飙的 scaling law 似乎在慢慢地把这些问题逐个击破。
宇宙的尽头是 scaling 吗?笔者不敢遑论,但 Will we run out of data? An analysis of the limits of scaling datasets in Machine Learning
的估算似乎预言了 scaling 的尽头:到 2026 年左右,高质量的 NLP 数据将会用光而低质量 NLP 数据则会在 2030 到 2050 年用光。
ChatGPT 的两小步
在以上大趋势下,与 Flan-PaLM 和 Supernatural Instructions 相比,ChatGPT/InstructGPT 走出了以下两小步:
ChatGPT 的 instruction finetuning 收集了大量对话场景下出现的 prompt,而不是针对现有标准任务手工改造的 prompt
选择了 RLHF 去构建主要的监督信号,而不是简单的 supervised finetuning
第一点决定了它能够流畅地去和人做交互,加上上述大趋势成为了决定 ChatGPT 性能的根本原因。
第二点则提供了比 supervised finetuning 更加优秀的构建监督信号的方案,笔者认为也是很亮眼的创新。在标准 RL 的视角下,language model 可以认为是一个根据前面生成的词(state)来选择下一个词(action)的 agent,每一句话对应一个 decision trajectory。在这个视角下 supervised finetuning 便等价于 imitation learning 中的 behavioral cloning,目标是最大化语料中 expert action 的 log likelihood。由于语料中有限的 decision trajectory 只能覆盖一小部分输出空间(所有可能句子 |V|^L 的一小部分)、且其分布和模型采样的 trajectory 分布不一致,behavioral cloning 需要极大的数据量才能保证较好的效果。与之相对应的,假如我们知道每一条 trajectory 的 reward,那我们就可以通过 on-policy 的 RL 去规避以上问题:我们可以采样大量的、符合模型分布的 trajectory。RLHF 通过直接标注数据去估计这个 reward function,完成标准 RL 训练的闭环。总的来说 RLHF 是一个比较 promising 的构造监督信号的方案,应该会很快地下沉到各大标准任务中。
抛砖引玉的预测
结合上述趋势的总结,这里抛砖引玉提几个未来趋势的预测。
从 Easy Scaling Law 到 Smart Scaling Law
和 CV 热火朝天地大搞 backbone 模型不同,NLP 近几年基本就是清一色的标准 Transformer,模型的设计、训练在最近几年还是属于比较停滞的状态,除了屈指可数的几个浪花之外基本以标准 Transformer 结构为主。怎么样通过设计更好的模型、训练方式来达到更快的训练速度以及更陡峭的 scaling law 是一个很容易想到的方向,也是在算力禁运的背景下必要的发力方向。
需要 scale 的是整个模型还是部分模块?语言作为表达信息和知识的载体,其语料数据同时包含了语言知识和百科知识(参考 语言模型理解语言吗[1] 的极简语言学 review)。相比于百科知识量级的快速增长,语言知识的量级其实是相对稳定的。这也意味着真正需要 scaling 的是存储常识和规律的模块 -- 我们可以用一个相对较小的模型去存储语言知识。Retrieval augmentation 提供了一个思路,但怎么自动区分语言知识和百科知识则是一个难点。
Scaling law 一定就是 power law 吗?最近的 Beyond neural scaling laws: beating power law scaling via data pruning 暗示通过良好的数据筛选,我们或许能达到 linear scaling law。
从小科学到大科学
垂直任务作为相对独立的研究领域的时代可能要慢慢过去了,它们会慢慢变成通用模型的某一评测指标。将最新 SoTA 搬运到垂直任务、做垂直任务的 cross domain、low resource setting 等常用的灌法已经慢慢行不通了,NLP 社区对好工作的期待也慢慢从解一个细分问题演变到解一类通用问题。
严谨、可靠的实验研究的门槛也在慢慢变高:以往只需在某个任务的标准数据集上报告单个模型的结果,现在则需在大量任务、大量数据集上报告不同量级模型的结果。AI 似乎从只需要一两张卡便可以快速迭代的小科学时代,进入了需要大量资源、人力投入的大科学时代。
一个良好的社区需要巨头们积极参与开源,降低进入的门槛,否则最后可能会演变成巨头们群魔乱舞,台下观众只能吃瓜叫好的局面。最近几年 NLP 社区里由预训练模型带来的模型结构的同质化便是一个不好的兆头。
通用模型的通用化和特化
特化模型某个维度的“能力”往往以其他维度“能力”的降低为代价。在同一模型量级下,模型能分配的“技能点”似乎是有限的:
在分类任务中,对头部类别样本的降采样虽然能带来平均性能更高的分类器,但相应的每个类别的准确率也会比较平庸。
在对 GPT3 进行 instruction finetuning 的时候,即使联合原始language modeling 目标一起训练,在改善 prompt engineering 的友好程度的情况下也会降低模型在某些任务的性能(所谓 alignment tax)。
因此对于通用模型提供商来说,怎么分配有限的“技能点”使得模型足够通用便成为重点迭代方向。所谓技能点的分配涉及找到具体的“能力”(比如推理、常识、长距离共指消解、多语言)并设计易于廉价 scaling 的训练任务(pretext task 或者 language modeling 加特定的语料),而这又涉及到怎么样定量化衡量某个任务跟预期的“能力”的相关关系(比如借助 representation similarity)。在这个问题上的长期积累加上完善的大模型训练的 infrastructure 便构成了 OpenAI 的重要竞争壁垒。再此基础上,良好的商业模式又取决于是否能提供廉价&易用&低精度损耗的特化方案,包括但不限于finetuning,adapter 以及 prompting。
Should we engineer the solution?
机器学习的基本原理决定了为了用 data-driven 的方式去解一个问题,我们必须先知道最后的解大概长什么样。零先验或者弱先验会带来 no free lunch 定律的诅咒。但是如前所述,对 solution 的任何多余 engineering 似乎都是在走弯路。
然而对于某些问题我们已经有很好的解法了:数学运算、程序执行、字符串匹配、first order logic reasoning。我们也可以明确穷举一些知识:语言里所有 functional word 和标点符号、所有数字、英语词性变化的规则和特例。我们真的需要让模型再去重新学一遍吗?怎么样在利用 scaling law 的情况下充分利用我们所有已知的知识、最优解?
AGI 真的能靠弱先验的 scaling 解决吗?为了拟合一个计算乘法的函数,列表穷举的方法虽然能在可见数据分布内达到比较好的性能,但是它并不能保证数据分布变化后输出正确的结果。基于这个类比,在可见数据分布内“有用”的 AGI 或许可以靠弱先验的 scaling 解决;但是享受一定理论保证的 AGI 似乎需要基于对智能的理解去设计解的形态。
一起交流
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)
本文参考资料
[1]
语言模型理解语言吗: https://zhuanlan.zhihu.com/p/114496896