利用结构化生成改进Prompt一致性
最近,Hugging Face的“排行榜与评估”研究团队进行了一些小型实验,强调了评估是多么不稳定。对于一个给定的任务,结果对提示格式的微小变化极其敏感!然而,这并不是我们想要的:一个输入信息量相同的模型应该输出类似的结果。
我们与Dottxt的朋友讨论了这个问题,他们有一个想法——有没有一种方法可以增加跨提示格式的一致性?
那么,让我们深入探讨一下!
背景:评估对格式变化的敏感性
LLM基准性能与提示本身的*格式*密切相关,这越来越明显,并且有些令人惊讶,尽管多年来已经引入了许多方法来减少与提示相关的方差。例如,当我们在few-shot中评估模型时,我们向模型提供格式示例以强制输出特定的模式;当我们比较合理答案的对数似然而不是允许自由形式生成时,我们试图限制答案空间。
“排行榜与评估”团队通过研究MMLU(查看该任务的4个子集)的8种不同提示格式,对此进行了演示。这些提示变体被提供给5个不同的模型(之所以选择它们,是因为它们在当时是其大小的SOTA,并且涵盖了各种分词和语言)。分数使用对数概率评估计算,其中最可能的答案被认为是正确的,这是多项选择任务的经典指标。
让我们使用MMLU的`global_facts`子集中的第一个问题,更详细地查看不同的格式。
Question: “As of 2016, about what percentage of adults aged 18 years or older were overweight?”
Choices: [ "10%", "20%", "40%", "80%" ]
Correct choice: “40%”
提示中不含选项 | ||
截至2016年,18岁及以上成年人中超重人群的比例约为多少? | Q:截至2016年,18岁及以上成年人中超重人群的比例约为多少? A |
问题:截至2016年,18岁及以上成年人中超重人群的比例约为多少? 回答 |
提示中含选项 | ||
问题:截至2016年,18岁及以上成年人中超重人群的比例约为多少? 选项 10% 20% 40% 80% 回答 |
问题:截至2016年,18岁及以上成年人中超重人群的比例约为多少? 选项 A. 10% B. 20% C. 40% D. 80% 回答 |
问题:截至2016年,18岁及以上成年人中超重人群的比例约为多少? 选项 (A) 10% (B) 20% (C) 40% (D) 80% 回答 |
10%、20%、40%、80%的对数概率 | 10%、20%、40%、80%与A、B、C、D的对数概率 | 10%、20%、40%、80%与(A)、(B)、(C)、(D)的对数概率 |
提示只包含问题,或者一些标签来表示我们处于问答格式,以及提示中可能包含的选项。在所有情况下,评估都只比较可能选项的对数似然。所有这些格式都出现在评估文献中,并且在理论上每行都应包含几乎相同的信息。然而,就在下面,您可以看到这些理论上微不足道的更改所导致的性能上的巨大差异!
每个模型的性能都相差约10个点,最极端的例子是Qwen1.5-7B,在第七种提示变体下准确率甚至下降到22.9%(主要是由于分词器问题),而在信息基本相同的情况下,它能够通过另一种提示达到高达51.2%的准确率。
单独来看,只要*排名*保持一致,*分数*的变化不一定是大问题。然而,正如我们在下图中看到的,排名受到这些变化的影响。
没有模型在不同提示中保持一致排名,尽管唯一的区别是它们的格式,而不是信息本身。这意味着如果Gemma-7b的作者想证明他们的模型优于Mistral-7B-v0.1,他们只需选择正确的提示即可。
由于几乎没有人报告他们的精确评估设置,这在模型报告中历来如此,作者选择报告最有利于他们模型的设置(这就是为什么您会在某些论文中看到一些非常奇怪的few-shot报告数字)。
然而,这并非模型分数差异的唯一来源。
在扩展实验中,我们比较了使用相同模型、相同提示格式,并使用完全相同的少量样本在提示前进行不同洗牌(例如,A/B/C/D/E提示与C/D/A/B/E提示)进行评估。下图显示了这两种少量样本顺序之间的模型分数差异:我们观察到对于相同的模型/提示组合,性能差异高达3个点!
如果我们想能够正确评估和比较不同的模型,我们需要一种方法来克服这个挑战。
Sclar等人撰写的《量化语言模型对提示设计中虚假特征的敏感性》也很好地概述了这个问题,作者介绍了FormatSpread,这是一个软件工具,它使用多种不同格式变体评估每个模型,然后计算该模型性能的方差。这样的解决方案使我们能够更自信地确定哪些模型优于其他模型,但它们需要很高的计算成本。
如果我们将重点放在输出而不是输入上,以使这些微小的格式变化的结果更具一致性,会怎么样?
虽然FormatSpread是使排行榜更公平、更诚实的一次伟大尝试,但作为LLM的实际用户,我们真正想要的是*提示一致性*。也就是说,我们希望找到一种方法来减少提示之间的这种差异。
在.txt,我们专注于改进和更好地理解*结构化生成*,即模型的输出被限制为遵循特定结构。我们的库Outlines允许我们通过定义正则表达式或上下文无关语法来结构化LLM的输出(我们在下面给出示例)。
我们最初使用结构化生成是为了通过确保以良好格式的JSON响应来使LLM更容易进行编程交互。然而,我们不断地被我们发现的结构化生成的其他好处所惊喜。
在早期探索结构化生成的好处时,我们证明了结构化生成始终能提高基准性能,并在探索JSON结构化提示时发现了一个有趣的边缘情况。
在大多数情况下,将提示格式更改为JSON,即使使用非结构化生成,也会导致几乎所有模型的基准性能得到提高。然而,MetaMath-Tulpar-7b-v2-Slerp并非如此,我们发现在使用JSON格式提示时,其准确率急剧下降。更令人惊讶的是,当使用*结构化生成*来约束模型输出时,性能下降可以忽略不计!
这让我们开始质疑结构化生成是否可以用于*提示一致性*。
实验设置说明:关注n-shot和shot顺序
虽然在上述实验中,Hugging Face 的“排行榜与评估”研究团队探索了提示本身格式的变化,但对于接下来的实验,我们将限制这些变化。
为了集中探索提示空间,我们只关注提示的两个属性的变化
- 改变提示中使用的“示例”或“样本”数量(n*-shot*)
- 改变这些样本的顺序(*shot order*,由*shot seed*指定)
对于第2点,在给定的n-shot下,我们只打乱相同的n个例子。这意味着1-shot提示的所有打乱都是相同的。这样做是为了避免将提示的*格式*与它包含的*信息*混淆。显然,一个5-shot提示包含的信息比1-shot提示多,但一个5-shot提示的每一次打乱都包含相同的例子,只是顺序不同。
初步探索:GSM8K 1-8 shot提示
为了进一步验证这一点,我们希望探索两个非常相似但强大的7B参数模型:Mistral-7Bv0.1和Zephyr-7B-beta的行为。选择它们的原因不仅是为了研究个体结果的方差,而且是为了观察*相对排名的变化*。我们使用GSM8K任务,这是一组小学数学应用题。
这是GSM8K 1-shot提示的基本格式,其中隐含的结构被高亮显示。
为了始终生成结构正确的答案,我们创建了一个与原始提示格式中固有的结构相匹配的正则表达式。以下正则表达式在Outlines中用于定义生成结构
我们可以在正则表达式中看到,我们允许模型进行200到700个字符的推理,然后它必须声明“答案是”,然后回复一个最多10位数字(不能以0开头)的数字。
值得一提的是,控制结构的正则表达式与用于解析答案的正则表达式相似但不完全相同。我们发现,在定义结构时存在一些有趣的细微差别,因为就像提示一样,它也会影响性能。例如,请注意正则表达式中的`{200,700}`。这意味着模型在回答之前有200到700个字符的“思考”时间。更改这些值可能会影响性能,并导致我们称之为“思维控制”的东西,这是一个我们希望很快能撰写更多文章的领域。
我们的第一个实验是继续探索GSM8K数据集,并迭代了1到8次提示。结果如下所示,非常引人注目。
我们在此图中看到两个主要特征:不同n-shot设置下的性能差异大大减小,并且没有出现排名互换的情况(Mistral始终领先于Zephyr)。还需要指出的是,1-shot结构化性能明显优于1-shot非结构化性能,并且与5-shot性能相当。这引出了我们称之为“提示效率”的另一个研究领域。
深入探讨:GPQA n-shot和shot顺序变化
在接下来的实验中,我们希望同时研究n-shots和n-shots的顺序变化。顺序通过设置用于打乱示例的种子来控制。如前所述,只有前n-shots会被打乱以保持提示之间的信息一致,这意味着所有1-shot提示在不同种子下都是相同的。以下是4-shot的shot顺序示例
种子 | 4-shot顺序 |
---|---|
42 | 2-1-3-0 |
1337 | 1-0-3-2 |
1981 | 3-2-0-1 |
1992 | 0-3-1-2 |
12345 | 1-0-2-3 |
此外,为了探索这些结果的可转移性,我们将任务更改为研究生级Google-Proof问答基准(GPQA)。GPQA是一个高难度知识多项选择评估任务。以下是提示格式和突出显示的结构。
对于接下来的实验,我们专门使用了“diamond”子集,它代表了经过精心策划和清理的高质量问题。在这个数据集中,198个问题中我们保留了8个用于n-shot提示(尽管只使用了前5个),然后对剩余的190个问题进行了评估。
下面可视化的是一个网格,表示两个模型在所有可能的shot seed和*n*组合下获得的准确率,包括没有(左)和有(右)结构化生成的情况。
立即引人注目的一点是,结构化输出在整体上倾向于比非结构化输出得分更高。我们将在下面看到结构化和非结构化输出的每个网格的平均值
提示种子和n-shot的结果平均值
模型 | 非结构化 | 结构化 |
---|---|---|
Mistral-7B-v0.1 | 0.2360 | 0.2935 |
Zephyr-7b-beta | 0.2387 | 0.3048 |
此外,在网格中的所有值中,我们还发现与非结构化生成相比,结构化生成的*方差减小了*。
提示种子和n-shot结果的标准差
模型 | 非结构化 | 结构化 |
---|---|---|
Mistral-7B-v0.1 | 0.0213 | 0.0202 |
Zephyr-7b-beta | 0.0273 | 0.0180 |
网格中方差的减小与我们在GSM8K上仅观察n-shot变化时所看到的方差减小相似。
虽然提高预期性能和降低方差是很好的特性,但我们真正想了解的是对排名的影响。在下图中,我们根据两个模型中哪个会被宣布为赢家来检查这些网格
- A: Zephyr-7b-beta
- B: Mistral-7B-v0.1
- “-”:平局
从这些图片中我们可以看出,当应用结构化生成时,确定赢家的一致性有了显著提高。这些结果与我们使用GSM8K在各种n-shot设置下的发现呈现出一致的图景。
结论与未来工作
尽管这些结果非常有前景,但我们仍需在更多模型和任务中探索这些结果。到目前为止,我们已经看到结构化生成可能成为评估的重要组成部分。同时*提高*预期分数和*降低*提示变化之间的方差是一个非常有前景的结果,值得进一步研究。