大规模预训练语言模型(LLM)如 GPT-3 是在大规模的互联网文本数据上训练,以给定的前缀来预测生成下一个 token(Next token prediction)。通过预测词的训练目标、大规模数据集以及超高参数量的模型相结合,产生了性能极强的 LLM,它可以 “理解” 任何文本输入,并在其基础上进行“写作”,除此以外,GPT-3 的论文发现,大规模的训练数据会产生一种有趣的新兴行为,称为 In-Context Learning(又称上下文学习,语境学习, ICL),他并不需要调整模型参数,仅用几条下游任务的示例就可以取得极佳的结果。
In-Context Learning 最初是在原始 GPT-3 论文中作为一种大语言模型学习任务的方式而被推广的,能够直接让语言模型根据给定的几个实例理解任务,并给出问题答案;本质上,它相当于使用训练完好的语言模型估计给定示例条件下的条件概率分布模型。在 In-Context Learning 里,给语言模型一个 “提示(prompt)”,该提示是一个由输入输出对组成的列表,这些输入输出对用来描述一个任务。在提示的末尾,有一个测试输入,并让语言模型仅通过以提示为条件来预测下一个标记。为了正确回答以下两个提示,模型需要理解 In-Context Learning 的演示示例,以确定输入分布(财经或一般新闻)、输出分布(积极 / 消极或主题)、输入 - 输出映射(情感或主题分类)以及格式。
和其他概念的区别
* In-context learning **允许用户为新用例快速构建模型,而无需为每个任务微调和存储新参数**。它通常只需要很少的训练示例就可以使模型正常工作,而且即使对于非专家来说,也可以通过直观的自然语言来进行交互。改变了之前需要把大模型用到下游任务的范式。对于一些 LLM 没有见过的新任务,只需要设计一些任务的语言描述,并给出几个任务实例,作为模型的输入,即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能够有效提升模型小样本学习的能力。
* ICL 的关键思想是从`任务相关的类比样本中学习`。下图给出了一个描述语言模型如何使用 ICL 进行决策的例子。
- 首先,ICL 需要一些示例来形成一个演示上下文。这些示例通常是用自然语言模板编写的。
- 然后 ICL 将查询的问题(即你需要预测标签的输入)和一个上下文演示(一些相关的示例)连接在一起,形成带有提示的输入,与监督学习需要使用反向梯度更新模型参数的训练阶段不同,ICL 不进行参数更新,而是直接在预训练的语言模型上进行预测。模型预计将从演示中学习到的模式进行正确的预测。
- 本质上,它利用训练有素的语言模型根据演示的示例来估计候选答案的可能性。简单理解,就是通过若干个完整的示例,让语言模型更好地理解当前的任务,从而做出更加准确的预测。
值得注意的是,与需要使用反向梯度更新模型参数的训练阶段的监督学习不同,ICL 不需要参数更新,并直接对预先训练好的语言模型进行预测(这是与 prompt,传统 demonstration learning 不同的地方,ICL 不需要在下游 P-tuning 或 Fine-tuning)。该模型学习隐藏在演示中的模式,并据此做出正确的预测。使用下游任务的的演示信息学习并推理,通常是 “实例 - 标签” 形式(Fine tuning 与 Prompt Learning 仍需在大量训练数据中的学习类别表示等)。
ICL 分精调和推断两个优化方法阶段:
在推理前,通过持续学习让语言模型的 ICL 能力得到进一步提升,这个过程称之为 warmup,warmup 会优化语言模型对应参数或者新增参数,区别于传统的 finetune,finetune 旨在提升 LLM 在特定任务上的表现,而 warmup 则是提升模型整理的 ICL 性能。
虽然预训练后的语言模型已经初步具备 ICL 能力,但预训练的 MLM 目标和下游 ICL 目标还是存在差距的,怎样精调才能把模型预热(warmup)、提升 ICL 效果是一个重要的研究方向。注:这里的「精调」、「预热」不是为了让模型适配某个下游任务,而是让模型具备更好的通用 ICL 能力
* 第一类方法非常直觉,既然要消除差距,可以直接在有监督的 ICL 数据上训练,通过构建对应的 in-context 的监督数据跟多任务训练,进行对应的 in-context finetune,从而缩小预训练跟下游 ICL 的差距。MetaICL 就直接把很多任务整合成了 ICL 的形式精调模型,在 52 个数据集上取得了比肩直接精调的效果。
* 另外还有部分研究专注于 Instruction tuning,构建更好的任务描述让模型去理解,而不是只给几个例子(demonstration),比如 LaMDA-PT、FLAN。自监督 ICL 训练
* 有监督的数据毕竟是有限的,于是开始有研究者思考能不能借鉴预训练的方式,自监督地进行 ICL 训练。根据 ICL 的格式将原始数据转换成 input-output 的 pair 对数据后利用四个自监督目标进行训练,包括掩码语言,分类任务等。
有监督 ICL 训练和自监督 ICL 训练旨在**通过引入更加接近于 in-context learning 的训练目标从而缩小预训练跟 ICL 之间的差距**。比起需要示例的 in-context fine tuning,只涉及任务描述的 instruct finetuning 更加简单且受欢迎。另外,在 warmup 这个阶段,语言模型只需要从少量数据训练就能明显提升 ICL 能力,不断增加相关数据并不能带来 ICL 能力的持续提升。从某种角度上看,这些方法通过更加模型参数可以提升 ICL 能力也表明了原始的 LLM 具备这种潜力。虽然 ICL 不要求 warmup,但是一般推荐在推理前增加一个 warm up 过程。
推理阶段的优化方法分为 Prompt 设计和打分函数(Scoring Function)设计两种
作为激发大模型能力的输入,Prompt 对 ICL 的效果影响很大。可以从组织方式和格式来进行 Prompt 的设计。组织方式是指如何选择数据样本并排序,格式是指怎么去写 Prompt。
对于数据样本的选取,可以有以下方法:
* 无监督:首先就是根据句向量距离或者互信息等方式选择跟当前输入 x 最相似的样本作为演示例,另外还有利用自使用方法去选择最佳的示例排列,有的方法还会考虑到演示示例的泛化能力,尽可能去提高示例的多样性。除了上述这些从人工撰写的样本中选择示例的方式外,还可以利用语言模型自身去生成合适的演示示例。
* 有监督:第一种是先利用无监督检索器召回若干相似的样本,再通过监督学习训练的 Efficient Prompt Retriever 进行打分,从而筛选出最合适的样本。此外还有把样本选择建模成序列决策任务,把最终效果当作 reward,用强化学习的方式去选择样本。
对于数据样本的排序,目前的研究并不多,有两个思路:
* 基于一些距离度量,把跟输入相近的排在后面(靠近输入)。
* 在 Lu 等人的研究中,他们找到了信息熵和 ICL 效果的联系,因此根据熵来决定最佳排序。
对于 Prompt 的格式,常见有两种:指令(Instruction)和推理步骤(Reasoning Steps)说明。
* Instruction:任务的指令描述非常依赖人工,不过也可以尝试让语言模型自动生成描述并选择。
* Reasoning Steps:对于更复杂的任务,可以人工显示地把推理步骤写出来,比如 Chain-of-thought(CoT),来启发模型的推理能力。除了纯人工撰写外,还有以下方法:
* 让模型自己生成推理步骤
* Multi-stage ICL:分多个步骤来完成任务,每一步都设计不同的子问题,让模型一步步解答。比如 Self-Ask 这篇工作甚至让模型自己问自己。再比如 Least-to-Most Prompting 这篇工作先让模型把大问题拆成多个子问题,再挨个回答。打分函数(Scoring Function)
评分函数决定我们如何将语言模型的预测转换为对特定答案可能性的估计。
* 直接估计方法(Direct):直接取候选答案的条件概率,可以用语言模型词汇表中的符号表示 (Brown et al., 2020)。选择概率较高的答案作为最终答案。但是,这种方法的缺点是只能衡量固定模式的答案(答案标记应该放在输入序列的末尾)。
* 困惑度(Perplexity PPL):计算由演示示例 C、输入查询 x 和候选标签 y 的标记组成的整个输入序列 S = {C, s(x, y, I)} 的句子 Perplexity。由于 PPL 计算整个句子的概率,它消除了标记位置的限制,但需要额外的计算时间。再用语言模型过一遍句子,这种方法可以解决上述固定模式的问题,但计算量增加了。
* 通道模型 (Channel):评估 P(x|y) 的条件概率(贝叶斯推理),即在给定标签的情况下估计输入查询的可能性。通过这种方式,语言模型需要生成输入中的每个令牌,这可以在不平衡的训练数据状态下提高性能。
上下文学习在许多 NLP 的 benchmark 测试中,已经媲美甚至超过全资源微调的方法,例如在 LAMBADA(常识句子补全)和 TriviaQA(问答)上达到 SOTA 的。 更令人意外的是上下文学习使人们能够在短短几个小时内启动的一系列应用程序,包括根据自然语言描述编写代码、帮助设计应用程序模型以及概括电子表格功能。
ICL 是在 GPT-3 中首次提出的,它表明随着模型尺寸的增大,ICL 的能力变得更加明显。
然而,一些研究表明,小规模的 PLM 也可以通过专门设计的训练任务(例如,学习以任务示例和查询作为输入来预测标签)表现出强大的 ICL 能力,甚至可能超过更大的模型。这表明训练任务的设计是影响 LLM ICL 能力的一个重要因素。
除了训练任务外,最近的研究还调查了 ICL 和预训练语料库之间的关系。研究表明,ICL 的性能在很大程度上取决于预训练语料库的来源,而不是规模。
另一项研究对训练数据分布的影响进行了深入分析。他们发现,当训练数据可以聚类到许多不常见的类中,而不是均匀分布时,ICL 就会出现。
在推理阶段,研究人员专注于基于给定的演示来分析 ICL 能力是如何运行的,因为不涉及显式学习或更新。他们通常从梯度下降的角度进行分析,并将 ICL 视为隐式微调。
在这个框架下,ICL 过程可以解释如下:通过前向计算,LLM 生成关于演示的元梯度,并通过注意力机制隐式地执行梯度下降。实验也表明,LLM 中的某些注意力头能够执行与任务无关的原子操作(例如,复制和前缀匹配),这与 ICL 能力密切相关。
为了进一步探索 ICL 的工作机制,一些研究将 ICL 抽象为一个算法学习过程。具体而言,LLM 在预训练期间基本上通过其参数对隐式模型进行编码。通过 ICL 中提供的例子,LLM 可以实现诸如梯度下降之类的学习算法,或者直接计算闭式解,以在前向计算期间更新这些模型。在这个解释框架下,已经表明 LLM 可以有效地学习简单的线性函数,甚至可以使用 ICL 学习一些复杂的函数,如决策树。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。