再看大模型ICL推理范式中的prompt策略:从动态Few-shot到KNN选择再到Shuffling Ensemble
今天是2023年12月4日,星期一,北京,天气晴,新的一周开始。
社区昨天讨论prompt工程时,提到一个很有趣的点,即"给大模型指令的时候可以给个小费(画饼)然后GPT输出会更详细。"
这使得,prompt也越发成为了一个十分有意思的事情。
例如,已经又的prompt包括:《深呼吸》,《装可怜》,《给小费》,《带情绪》…
所以,我们再回到promt工程本身,因为其雨大模型研发中的数据构造和评估关系最为密切。
实际上,我们在之前的文章中已经讲过许多,例如:
《再看面向NLP任务的大模型Prompt设计:PromptSource等代表性NLP开源Prompt数据集》(https://mp.weixin.qq.com/s/eWEjVhXfySppOQk_y6mduw)中说到,prompt是影响下游任务的关键所在,当我们在应用chatgpt进行nlp任务落地时,如何选择合适的prompt,对于SFT以及推理环节尤为重要。
《如何快速地设计并评估few shot示例的效果:OpenICL上下文示例学习框架推荐及实现源码》(https://mp.weixin.qq.com/s/D2Fbhs13IhpsLyCJoWSwGA)介绍了opencompass中预置的几个典型方法:基于BM25的检索方式、基于KNN的检索方式、随机采样方式等,当然也有zeroshot方式,即不带任何先验样本。
《大模型Fewshot推理如何选择更好的示例:兼顾多样性与相似性的迭代示例选择策略方案》(https://mp.weixin.qq.com/s/GWmti3EUBt2l2tbJALk8mQ)中介绍了迭代示例选择(IDS)的方案,IDS利用Zero-shot-CoT,迭代选择多样化但仍与测试样本密切相关的示例作为ICL示例。
早上看到一个文章《Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine》(地址:https://arxiv.org/pdf/2311.16452.pdf)中介绍了在医疗场景下的通过构造prompt提升领域benchmark性能的方法,很有趣。
一、先看Promopt的一些基本认识
在语言模型的语境中,提示是指给模型的输入,以引导模型产生输出。基础模型在特定任务上的表现会受到提示的很大影响,而且影响的方式往往出人意料。
例如,最近的研究表明,在GSM8K基准数据集上,模型的性能会有10%以上的变化,而模型的学习参数不会有任何变化。
1、情境学习(ICL)思路
情境学习(In Context Learning)是基础模型的一项关键能力,它能让模型从少量任务演示中解决新任务,例如,可以在测试问题之前用几个不同的问题示例和预期结果来创建ICL提示。
ICL不需要更新模型参数,但可以提供类似于微调的效果。少量提示中使用的示例的选择会极大地影响模型的性能。
将提示限制在基本的上下文学习方法上,如固定的1-shot提示50shot提示,GPT-4可以很容易地被引导以出色地完成任务。
2、思维链(CoT)思路
思维链(CoT)是一种在引入样本答案之前采用中间推理步骤的提示方法。通过将复杂问题分解成一系列CoT被认为能帮助基础模型生成更准确的答案。
CoT-ICL提示将CoT的中间推理步骤直接整合到fewshot当中。例如,在Med-PaLM工作中,一个临床医生小组被要求为复杂的医学挑战问题量身定制CoT提示。
可以通过提供训练数据集中的问题、正确答案对来让GPT-4能够自动生成高质量、详细的CoT提示。
3、集成(Ensembling)思路
集成(Ensembling)是一种将多个模型运行的输出结果进行组合的方案,通过平均、共识或多数票等功将单独的输出结果组合起来,从而得出更稳健或更准确的结果。
集成方法采用一种被称为自洽性的技术,使用采样方法产生多个输出结果,然后对这些输出结果进行合并,以确定一个共识输出结果。
其中:
输出结果的多样性可以通过改变模型生成过程中的"温度"参数来控制。
通过重新排序或shuffle少量提示的组件,还可以解决基础模型中常见的位置敏感性(order sensitivity)问题,从而提高鲁棒性。
不过,需要注意的是,虽然集成技术可以提高性能,但其代价是计算需求的增加,比较费token数量。
二、Medprompt方案的具体实现
Medprompt采用的三种主要技术:Dynamic Few-shot、Self-Generated Chain of Thought和Choice Shuffling Ensemble。
在讨论完每种技术后,将回顾将这三种方法整合到Medprompt中的方法。
1、动态Few-shot学习Dynamic Few-shot
通过提示方法,基础模型可以通过几次演示迅速适应特定领域并学会遵循任务格式。
为了简化和提高效率,针对特定任务进行提示时使用的少量示例通常是固定的;
它们在不同的测试示例中保持不变。这就要求所选的少量示例具有广泛的代表性,并与广泛分布的文本示例相关。
满足这些要求的一种方法是让领域专家精心手工制作示例。不过,即便如此,这种方法也不能保证所策划的、固定的少量示例对每个测试示例都具有适当的代表性。
相比之下,如果任务训练集可用,它就可以作为廉价、高质量的少量示例来源。
如果训练集足够大,就可以为不同的任务输入选择不同的少量示例。将这种方法称为使用动态少量示例。该方法利用一种机制,根据实例与当前案例的相似性来识别实例。
对于Medprompt,该工作采用kNN聚类的方来识别具有代表性的少量实例:
给定一个测试示例,使用embdding-kNN聚类,选择k个语义相似的训练示例。具体来说,首先使用文本嵌入模型将训练问题和测试问题嵌入为向量表示。然后,对于每个测试问题x,从训练集中检索其最近的k个邻居x1、x2、......、xk。给定一个预定义的相似性度量d(如余弦相似性),当i<j时,邻居的排序方式为d(xi,x)≤d(xj,x)。
2、自我生成的思维链Self-Generated Chain of Thought
思维链(CoT)使用自然语言语句,如"让一步步思考",明确鼓励模型生成一系列中间推理步骤。
研究发现,这种方法能显著提高基础模型进行复杂推理的能力。
思维链的大多数方法都是利用专家手动编写带有思维链的简短示例来进行提示。
没有依赖人类专家,而是寻求一种自动创建思维链示例的机制,例如,可以让GPT-4使用以下提示模版为训练示例生成思维链:
图3:用于提示基础模型自动生成思维链解释的模板(详见第4.2节)。
这种方法面临的一个主要挑战是,自我生成的CoT理由有可能包含幻觉或不正确的推理链。
不过,这个有个解决方案:通过让GPT-4同时生成理由和推理链中最有可能出现的答案的估计值来减轻这种担忧。如果该答案与真实标签不符,就会完全丢弃样本,因为认为推理不可信。
不过,与Med-PaLM2中使用的由临床专家手工制作的CoT示例相比,GPT-4生成的CoT推理更长,并提供了更精细的分步推理逻辑。
例如,下图2展示了专家制作的和GPT-4生成的思维链(CoT)提示比较。利用训练集中的问题、正确答案对,GPT-4能够生成适合用于少量CoT演示的详细解释。
3、随机打乱组合Choice Shuffling Ensemble
与其他基础模型相比,GPT-4模型虽然没有那么严重,但也会表现出在多选题答案中偏向某些选项而不是其他选项的倾向(与选项内容无关),也就是说,该模型会表现出位置偏差。
为了减少这种偏差,建议对选项进行打乱,然后检查不同排序顺序的多选题答案的一致性。
也就是所说的随机打乱和自我一致性提示。自洽性是指在某个温度>0的条件下多次提示时,用一组不同的推理路径取代贪婪解码。
通过随机打乱,在生成每条推理路径之前打乱答案选择的相对顺序。然后选择最一致的答案,即对随机打乱最不敏感的答案。
随机打乱的另一个好处是,在温度采样之外增加了每条推理路径的多样性,从而也提高了最终集合的质量。
例如,在为训练实例生成中间CoT步骤时也应用了这一技术。对于每个示例,都会进行一定次数的随机选择,并为每个变体生成CoT。只保留答案正确的例子。
4、把一切放在一起Putting it all together
Medprompt将上述几种方式进行组合。这些方法的组合产生了一种通用的提示工程策略。
算法思路如下:
图4显示了Medprompt策略在MedQA基准上的性能直观描述,以及每个组件的加法分布。在算法1中提供了相应的算法描述。
Medprompt包括两个阶段:预处理阶段和推理步骤,在推理步骤中对测试用例进行最终预测。
1、预处理
在预处理过程中,训练数据集中的每个问题都会通过一个轻量级嵌入模型生成一个嵌入向量(算法1中的第4行)。
使用OpenAI的文本嵌入-ada-002来创建嵌入。对于每个问题,都会利用GPT-4创建思维链并预测最终答案(第5行)。
如果生成的答案正确且与真实标签相符,就会存储相关问题、其嵌入向量、思维链和答案。否则,将从检索池中完全丢弃该问题,前提是如果模型最终得出的最终答案是错误的,就不能相信推理(第6-7行)。
2、推理
在推理时,给定一个测试问题,用预处理时使用的相同嵌入模型重新嵌入测试样本,并利用kNN从预处理库中检索类似的示例(第12-13行)。
这些示例及其相应的GPT-4生成的推理链将作为GPT-4的上下文(第14行)。
测试问题和相应的答案选项被添加到最后,作为最终提示(第17行)。然后,模型会根据几个示例输出思维链和候选答案。
最后,执行一个集合过程,包括多次重复上述步骤。通过对测试问题的答案选项进行随机打乱(第15-16行)来增加多样性。
为了确定最终预测答案,会选择出现频率最高的答案(第20行)。
在此报告的Medprompt结果配置为使用5个kNN挑选出的few shot示例和5次并行API调用作为随机打乱集合程序的一部分,发现这在推理成本最小化和准确性最大化之间可以取得较为合理的平衡。
三、Medprompt的增益取得效果
1、Medprompt组件各种方案的增益
图4展示了Medprompt组件的直观图解以及对MedQA基准性能贡献。
提示策略结合了基于kNN的少量示例选择、GPT-4生成的思维链提示和答案随机打乱组合。
2、在其他多项选择题中的表现
基准主要基于 GPT-4 在 MultiMedQA 基准中 9 个多选生物医学数据集上的表现,有一定收益。
总结
本文主要介绍了Media-prompt中的几种prompt策略,其也在某种程度上又佐证了prompt工程对大模型性能的收益。
但,应该注意到的是,prompt工程的效果,本质上还是取决于大模型自身的能力,如果大模型自身并不足够聪明,那么怎么写prompt都没有太大的意义。
当然,这个与rag也有很大的关联性,这又会引发RAG的问题,关于成本与效果,这个可以做更多思考。
参考文献
1、https://www.microsoft.com/en-us/research/uploads/prod/2023/11/Medqa-comp.png
2、https://arxiv.org/pdf/2311.16452.pdf
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。