摘要
近年来,上下文学习(In-context Learning,ICL)越来越受到关注,并已成为大型语言模型(Large Language Model,LLM)评估的新范式。与传统微调方法不同,ICL无需更新任何参数,即可将预训练模型适应于未见任务。然而,由于涉及多样的检索和推理方法,以及不同模型、数据集和任务的不同预处理需求,ICL的实现较为复杂。迫切需要一个统一且灵活的ICL框架,以简化上述组件的实施。为了促进ICL研究,我们推出了OpenICL,这是一个用于ICL和LLM评估的开源工具包。OpenICL具有高度灵活的架构,对研究友好,用户可以轻松组合不同的组件以满足其需求。它还提供了各种最先进的检索和推理方法,以简化将ICL应用于尖端研究的过程。OpenICL的有效性已在包括分类、问答、机器翻译和语义解析在内的广泛自然语言处理任务上得到验证。作为一个副产品,我们发现OpenICL是一个高效且稳健的LLM评估工具。OpenICL发布于 https://github.com/Shark-NLP/OpenICL。
1 引言
大型语言模型(LLMs)(Brown等人,2020年;Zhang等人,2022a年;Scao等人,2022年)的兴起展示了令人印象深刻的涌现性上下文学习(In-Context Learning,ICL)能力(Wei等人,2022a年)。与需要参数更新的微调不同,ICL可以在模型参数冻结的情况下进行推理。ICL规避了微调的资源密集型特性,但在特定任务中仍能产生与微调模型相当的结果(Zhao等人,2021年;Lu等人,2022年;Gao等人,2021a年)。然而,我们注意到缺乏一个统一的ICL框架。现有项目的实现往往高度定制化,满足自己的需求,这使得进一步的发展和与先前方法的比较变得具有挑战性。
基本的ICL流程包含两个步骤:检索和推理。给定一个测试输入X0,在检索阶段,从训练集中检索出几个示例作为上下文演示。在推理阶段,这些演示被添加在X0之前,并输入到LLM中以生成预测。研究人员已经探索了各种检索(例如,BM25(Robertson和Zaragoza,2009年),TopK(Liu等人,2022年;Gao等人,2021a年)和VoteK(Su等人,2022年))和推理(例如,基于困惑度(Brown等人,2020年),基于通道(Min等人,2022年),以及思维链(Wei等人,2022b年))方法。然而,这些方法通常在不同的框架下实现,并且/或者使用不同的LLMs和任务进行评估。这些不一致性使得对各种方法的系统评估和比较具有挑战性,从而阻碍了更好的ICL方法的发展。
为了解决这一问题,我们推出了OpenICL,这是一个开源且易于使用的ICL工具包。OpenICL内置了许多最先进的检索和推理方法,以促进系统的比较和快速的研究原型设计。OpenICL还提供了一个统一且灵活的接口,用于开发和评估新的ICL方法。用户可以轻松地将不同的检索和推理方法,以及不同的提示指令,整合到他们的流程中。为了验证OpenICL的实现和设计,我们使用OpenICL在几个自然语言处理任务上评估LLMs,包括分类、问答、翻译和语义解析。我们的贡献总结如下:
- 我们提出了OpenICL,这是一个易于使用且可扩展的ICL框架,用于语言模型的零/少样本评估。
- OpenICL提供了广泛的ICL方法、LLMs和任务,只需几行代码即可使用,为未来的更多扩展铺平了道路。
- 我们提供了完整的教程,引导用户了解该框架,从而促进ICL的研究和发展。
2 相关工作
上下文学习 除了经典的“预训练和微调”范式,Brown等人(2020年)提出了上下文学习(In-context learning,ICL),这是一种新范式,利用预训练的语言模型在没有基于梯度训练的情况下执行新任务。它在测试输入之前附加少量的训练示例作为提示,并已被证明能够在少样本场景中提高LLMs的性能,并泛化到广泛的后端任务中,如信息检索(Tay等人,2022年)、事实核查(Rae等人,2021年)、常识推理(Geva等人,2021年)、算术推理(Cobbe等人,2021年)、机器翻译(Agrawal等人,2022年;Lin等人,2021a年)和数据生成(Ye等人,2022年)等。
除了早期的成功之外,研究人员还开发了一些更复杂的ICL方法,这些方法需要一些中间推理步骤。其中,思维链(Chain-of-thoughts,CoT)是第一个在许多推理任务上显著超越先前最先进方法的尝试(Wei等人,2022b年)。之后,提出了不同变种的CoT以加强其性能,如自我提问(Self-Ask,Press等人,2022年)、iCAP(Wang等人,2022年)、从最少到最多提示(Least-to-Most prompting,Zhou等人,2022年)和选择推理(Selection-Inference,Zhang等人,2022b年;Fu等人,2022年)。
尽管性能令人惊讶,但ICL因对上下文示例的选择和排序非常敏感而受到批评(Zhao等人,2021年;Lu等人,2022年)。为了解决这个问题,提出了不同的标准和上下文构建方法。Gao等人(2021a年)和Liu等人(2022年)选择在嵌入空间中与测试输入更接近的示例;一系列工作(Su等人,2022年;Levy等人,2022年;Ye等人,2023年)选择训练集中最具代表性的示例,以鼓励上下文示例的多样性;Wu等人(2022年)观察到最小描述长度(Minimum Description Length,MDL)原则可以是选择上下文示例的有效标准。
提示学习 提示学习(Prompt learning,Liu等人,2021年)是不包含任何上下文示例的ICL的特殊情况。提示学习包括各种主题,包括手动模板工程(Petroni等人,2019年;Brown等人,2020年)、自动模板学习(Wallace等人,2019年;Shin等人,2020年;Li和Liang,2021年)和答案工程(Gao等人,2021b年;Schick和Schütze,2021年)。我们建议读者使用专门为提示学习设计的工具包OpenPrompt(Ding等人,2021年)。相比之下,OpenICL更侧重于整合各种示例检索方法和推理策略以进行上下文学习。请注意,OpenICL也可以通过设置上下文示例数量为零,并使用OpenPrompt为不同任务指定手动或预搜索的提示模板,无缝支持提示学习。
3 OpenICL
在本节中,我们首先解释OpenICL的设计原则。然后,我们将简要介绍OpenICL的两个主要组件,即检索器和解释器。
3.1 设计原则
OpenICL的设计原则是促进上下文学习研究,实现高效、鲁棒的大型语言模型评估。具体来说,我们考虑了以下原则:[P1:模块化]由于ICL是一个快速发展的研究领域,OpenICL的设计应该是解耦的,这样不同的组件可以很容易地修改以支持最新的方法和/或组合以适应各种任务和应用程序需求。
[P2:效率]如今,大型语言模型可以有数千亿个参数。为了支持如此大规模的推理,OpenICL应该进行优化,以实现高效的并行推理。
[P3:通用性]ICL已经广泛应用于NLP的各个领域,因此OpenICL需要一个灵活的接口,使其能够与各种LLM、任务、检索方法和推理方法一起工作。
3.2 架构简介
图1概述了OpenICL的体系结构。对于来自测试集的每个输入,检索器检索几个(X;Y)对(在虚线框中表示为一行)来自索引集(X;Y)作为x^的上下文例子。然后根据用户定义的提示模板对这些示例以及进行格式化,并将它们连接起来形成一个文本序列。之后,Inferencer消化这些序列并将其输入LLM以获得模型预测。
3.3 模块化
为了满足原则P1,OpenICL采用了组件之间松散耦合的设计。这些组件通过非常灵活的接口分离了数据预处理、检索和推理过程,允许轻松定制以适应特定需求。下面详细介绍了两个主要组件:
检索器(Retriever) 检索器负责从预先存在的训练数据中检索上下文示例。这个模块支持语料库级别(即只为整个测试集检索一组示例)和实例级别(即为每个测试输入单独检索示例)的检索方法。OpenICL主要支持以下无需学习的检索方法:
- 随机:ICL的早期实践(Brown等人,2020年)通常随机选择示例来构建上下文。尽管随机方法为ICL性能带来了高方差,但在只有少量演示可用时(Wei等人,2022b年;Zhao等人,2021年),它仍然是流行的选择。
- 启发式方法:为了克服随机的缺点,已经提出了各种基于语义相似性的检索方法,并显示出巨大的潜力,如BM25(Robertson和Zaragoza,2009年)、TopK(Liu等人,2022年;Gao等人,2021a年)和VoteK(Su等人,2022年)。
- 基于模型的方法:最近,研究人员探索使用模型对输出置信度来选择和排序示例,如熵(Lu等人,2022年)和MDL(Wu等人,2022年)。
OpenICL实现了上述现有方法,以促进未来的研究和系统比较。此外,检索器模块的灵活性允许实践者选择最适合其任务和数据的检索方法,并进行进一步修改。检索器的接口还允许用户打包这些上下文示例,并在其他地方使用。
推理器(Inferencer)推理器调用预训练的语言模型,根据上下文示例和测试输入的连接生成预测。推理器支持各种推理方法:
- 直接:Brown等人(2020年)使用词汇中的令牌来表示候选答案,并选择概率最高的作为最终预测。
- 困惑度:Brown等人(2020年)计算输入和候选答案序列连接的句子困惑度,并选择困惑度最低的作为最终预测。
- 通道:Min等人(2022年)提出利用通道模型(Yu等人,2016年;Yee等人,2019年)以相反的方向计算条件概率,即估计给定标签的输入查询的可能性。
推理器的灵活性也允许用户递归调用它,以支持多阶段的ICL方法,如思维链(Wei等人,2022b年)和选择推理(Creswell等人,2022年)。此外,推理器可以增加一个评分器来评估其预测。
3.4 效率
为了满足原则P2,我们为OpenICL配备了各种并行技术,以实现大规模模型的高效推理。
数据并行(Data Parallel)
数据并行(Li等人,2020年)是并行计算中常用的技术,用于提高大规模计算任务的效率。OpenICL实现了数据并行,以改进检索和推理步骤的性能。在检索和推理期间,数据被划分为更小的批次进行处理。
此外,对于可以放入GPU的VRAM的模型,OpenICL通过将数据分片到多个GPU上,并在每个GPU上使用完整的模型副本进行并行推理来实现数据并行。这在处理大型数据集时显著提高了推理速度。
模型并行(Model Parallel)在大型语言模型(LLMs)的时代,模型通常有数十亿甚至数千亿个参数,超出了现代GPU的容量。为了解决这个问题,我们采用了模型并行(Shoeybi等人,2019年):一种将大型深度学习模型划分为更小的子模型进行并行计算的技术,每个子模型都可以在单独的GPU上运行。OpenICL支持模型并行,用户可以轻松地对他们的模型进行并行化,而几乎不需要修改代码。目前,我们支持Megatron(Shoeybi等人,2019年)和Zero(Rajbhandari等人,2019年)。
3.5 一般性
为了满足原则P3,OpenICL旨在通过支持广泛的模型、任务和方法来最大化用户的生产力:
[模型] OpenICL支持仅解码器LMs(例如,GPT系列(Radford和Narasimhan,2018年;Radford等人,2019年;Black等人,2021年;Wang和Komatsuzaki,2021年;Black等人,2022年))和基于编码器-解码器的LMs(例如,T5(Raffel等人,2020年))。我们还提供了两种访问模型的替代方式:用户可以直接加载模型检查点进行评估,或者通过API访问模型(例如,OpenAI的GPT-3系列模型;Brown等人,2020年;Chen等人,2021年;Ouyang等人)。
[任务]在OpenICL的帮助下,用户可以轻松地在分类和生成任务上进行实验。OpenICL集成了HuggingFace的数据集,使得用户可以轻松访问和下载成千上万的NLP任务。
[方法] 如前所述,OpenICL为覆盖检索和推理的ICL方法提供了广泛的支持。此外,OpenICL提供了灵活性,可以逐步返回检索器和推理器的结果,这使得将这些中间结果轻松整合到其他项目中变得简单。
4 Toolkit攻略
在本节中,我们通过带领读者了解几个典型的ICL用例来展示OpenICL。
示例1. 我们首先展示如何使用OpenICL开发一个典型的用于语言分类的ICL流程,只需几行代码,并在流行的情感分类数据集SST-2(Socher等人,2013年)上进行评估。如图2所示,流程从DatasetReader开始,它根据HuggingFace数据集中心的名字或本地文件路径加载数据集。用户需要指定存储输入(“text”)和输出(“label”)的列名。其次,使用一个定义每个类标签提示的字典实例化一个自定义的PromptTemplate。占位符</E>和</Q>将分别被上下文示例和测试输入替换。之后,我们根据TopK(Liu等人,2022年)初始化检索器,并将上下文示例的数量设置为8(“ice_num = 8”)。我们选择基于困惑度的方法来初始化推理器,并使用GPT2-XL作为LLM。设置好这些后,我们可以通过调用推理器(第17行)运行推理,并计算模型预测的准确性(第18行)。
示例2. 图3展示了如何使用OpenICL处理生成问题。我们考虑了流行的机器翻译数据集WMT16(Bojar等人,2016年)。与示例1类似,我们可以轻松地加载数据集,定义提示模板,并通过分别为函数提供新参数来初始化检索器。与示例1的主要API区别在于:(i)我们为翻译任务添加了一些预处理(第5行);(ii)PPLInferencer被替换为适用于生成的推理器(第16行);(iii)我们使用BLEU来评估模型性能。
示例3. OpenICL还支持更高级的ICL方法,如图4所示。用户只需修改两行代码即可无缝切换到CoT:第14行定义了CoT的模板,第15行使用OpenAI的API初始化了带有GPT3的推理器。类似的多步骤ICL方法,如自一致性(Wang等人,2022年)和选择推理(Creswell等人,2022年),也可以通过继承OpenICL中设计的超类Inferencer轻松实现。
5 评估
为了展示OpenICL的灵活性,我们在多样化的数据集、LLMs和ICL方法上进行了实验。我们考虑了用于常识推理的PiQA(Bisk等人,2019年),用于情感分析的SST-2(Socher等人,2013年),用于算术推理的GSM8K(Cobbe等人,2021年),用于机器翻译的WMT16德英(Bojar等人,2016年)以及用于摘要的Gigaword(Napoles等人,2012年)。
我们还测试了各种LLMs,包括GPTNeo(2.7B)(Black等人,2021年;Gao等人,2020年),GPT-3的text-davinci-003版本(175B),以及XGLM(7.5B)(Lin等人,2021b年)。我们使用OpenAI的官方API4来访问GPT-3。详细的设置和结果如图5所示。我们可以看到,OpenICL的组件可以轻松地串联起来,以支持不同的评估需求并复现最先进方法的结果。
6 结论
我们介绍了OpenICL,一个用于上下文学习的开源工具包。OpenICL为上下文学习的实践和研究提供了一个便捷且灵活的接口。我们的模块化设计使其能够轻松支持广泛的LLMs、任务和ICL方法。我们实现了模型并行和数据并行,以使大型模型的推理更加高效。OpenICL具有高度的可扩展性,我们将继续更新它,以跟上最新的研究步伐。尽管结果令人鼓舞,但ICL仍处于早期阶段,许多挑战仍然存在。我们相信OpenICL将成为研究人员和从业者的一项宝贵资源,以促进他们的研究和开发工作。