603. LLM Prompt Recovery | llm-prompt-recovery
感谢举办本次比赛,我们在尝试针对给定的 t5 指标进行优化并将一些有用的建模方法融入我们的解决方案时感到非常愉快。如往常一样,与 @ilu000 和 @ybabakhin 的团队合作非常顺畅。
在我们组队参加比赛时,平均提示词在公开排行榜和个人解决方案中占据主导地位,而且看起来是最容易获取的果实,特别是在我们发现 t5 指标非常敏感、仅使用原始 LLM 预测并不会太有帮助之后。因此我们决定继续探索最优的平均提示词。
我们很快意识到手动尝试效果不佳,于是开始探索对最优平均提示词进行实际的 token 暴力搜索。我们使用了训练数据集,尝试对约 32k 个可能的 t5 token 进行暴力搜索,以形成针对目标向量平均值的最佳平均提示词。然而提交后结果很差,最初让我们感到困惑。显然,</s> 是一个重要的 token,因为它会被追加到每个目标向量中。进一步探索后,我们发现 TensorFlow 使用的是原始的 SentencePiece 分词器,该分词器对特殊 token 注入有保护机制,因此不会将字符串 </s> 直接识别为正确的结束 token。
基于这一认识,我们在暴力优化中排除了特殊 token,与许多其他选手相同,优化器现在开始偏好像 lucrarea 这样在嵌入空间中接近结束 token 的 token。这使得我们能够将排行榜(LB)分数更接近本地验证分数,并通过这种平均提示词优化达到了约 0.65 的成绩。
然而,我们仍然希望直接找到一个能够完成部分工作的模型。具体来说,我们尝试直接训练一个预测期望嵌入的模型。一种简单的方法是在 H2O LLM Studio 中训练一个分类模型,我们将 768 维的输出嵌入作为训练数据的目标。随后我们还直接实现了余弦相似度损失,使模型能够直接学习我们的目标指标。使用这种方法,我们的嵌入预测在本地达到了约 0.75+ 的分数。我们的嵌入模型要么使用 H2O‑Danube / H2O‑Danube2,要么使用 Mistral 7b,差异不大。
然而,主要问题仍然在于我们需要将预测的嵌入映射回字符串表示,因为指标需要使用这些字符串来计算 t5 相似度。我们也曾考虑直接以某种方式建模这一点,但随后又回退到暴力优化程序,该程序贪婪地尝试 token 组合,以尽可能接近预测的嵌入。在一定的运行时间内,我们通过这种优化大约损失了 3‑4 分,因此在仅对每个嵌入预测进行暴力搜索的情况下,本地分数约为 0.71,LB 分数约为 0.68 或 0.69。
这让我们进入了金牌区。现在我们尝试进一步缩小暴力优化与预测嵌入之间的差距。我们首先发现,使用原始 LLM 预测来初始化优化实际上是可行的,但只需要预测实际需要做出的改动,例如「as a shanty」(改成船歌)。于是我们以这种方式准备数据,训练 LLM 并将它们作为优化的起始点加入解决方案,同时也把它们加入嵌入混合中。此外,为了增加多样性,我们还在混合中加入了一些少样本预测。为了进一步提升优化质量和速度,我们还在其中加入了一个有效的平均提示词。
这意味着我们优化的最终起始点是:Few shot predictions + LLM predictions + Mean prompt
最终的预测字符串为:Few shot predictions + LLM predictions + Mean prompt + Optimized embedding string (20 tokens)
下图展示了我们完整的流程:
另外一个示例,我们对单个测试样本的最终预测为:
“Rephrase paragraph text by turning it into a shanty. shanty shanty.lucrarealucrarealucrarea sentence appealinglucrarea Improve respond storytelling tonelucrareaimplication. write someoneran. lucrarea]. Consider clarify paragraphlucrarea similarly serious themed way temporarily.! ElePT lyrics rhyme poem solve songlucrarea participating version Deliver tale Hum Cor slogan remake this pieceody”
针对上述所有环节,我们生成了多种训练和优化数据。我们从一些公开数据集开始,但很快发现 Kaggle 提供的补充文本最为有用。因此我们使用不同的模型(主要是 Gemma)利用补充文本作为少样本示例来生成新的原始文本和重写提示。在最终的数据混合中,我们加入了额外的随机原始文本和随机重写提示以增加多样性。我们还构建了一个约 350 条样本的验证集,在该验证集上我们观察到本地平均提示词分数与提交的平均提示词分数之间具有良好的相关性,并在此基础上开发了我们的解决方案。最终,交叉验证(CV)与 LB 之间也有非常好的相关性。
值得庆幸的是,公开和私有榜单的划分是公平的,我们认为在没有训练数据的比赛中这也是唯一合理的做法。因此,我们最佳的 LB 提交也是最佳的交叉验证提交,同样也是私有榜单的最佳提交!