返回列表

7th place solution: T5 decoding, iterative mean refinement, LLMs and a gold medal mean string

603. LLM Prompt Recovery | llm-prompt-recovery

开始: 2024-02-27 结束: 2024-04-16 AIGC与多模态 数据算法赛
```html 第七名方案:T5解码、迭代均值优化、LLMs和金牌均值字符串

第七名方案:T5解码、迭代均值优化、LLMs和金牌均值字符串

作者:flg (Kaggle Grandmaster)
排名:第7名
发布日期:2024-04-18

首先,感谢组织者举办这次比赛!

我的解决方案由四个部分组成:

  1. 迭代均值提示词优化(0.69,金牌字符串)
  2. 两个LLM预测
  3. 在T5空间中寻找均值提示词和两个预测之间的最优位置(基于预测之间的一致性)
  4. 将该点解码为字符串

第一个部分是离线完成的准备工作,其他三个部分是在线完成的。

1. 迭代均值提示词优化

人们很快意识到,一个精心设计的固定预测可以在LB上获得高分。为了找到最优字符串,我从 一个已知的优秀字符串("Improve this text...")开始,猜测(公开)LB均值的位置,并将该字符串向该均值方向移动:

猜测LB的均值

当你向比赛提交一个固定预测时,它会返回该字符串与所有LB目标的平均距离。我简单地用所有目标均值的距离来代替到所有目标的平均距离。这样,每个LB提交都隐含了一个方程 cos_sim(prediction, mean) ** 3 = c_prediction。我求解均值,向LB提交新的预测,获得新的测量值,并计算新的均值向量。

将T5向量解码为字符串

出于兴趣,我在这项任务上花费了太多时间。我尝试了很多方法,从Vec2Text到进化算法、梯度下降输入再到随机标记修改。令人惊讶的是,随机标记修改效果最好且效率很高:

  1. 从已知字符串开始(均值、模型预测)
  2. 采样约512个单标记修改选项(选项:删除标记、添加标记、修改标记,概率约为[0.1, 0.1, 0.8])
  3. 在GPU上批量评估这些修改
  4. 如果改进到目标向量的距离,则贪婪地选择最佳修改

离线使用时,这种方法在几分钟或几小时内就能找到比之前的均值字符串更强的改进,取决于我之前离目标向量有多近。
然而,当使用一个很长的(100个标记)且离目标很远的字符串时,它出乎意料地高效。即使使用很小的批次大小约16,它几乎每一步都能获得收益。这样我就可以在线使用它来在运行时优化均值字符串和模型预测之间的位置(见下文)。

最佳均值字符串

使用这种方法,我很快找到了范围在0.68-0.69的均值字符串(大约前10名)。我开始探测LB的时间比较晚,所以可能还有更好的均值提示词。我找到的最佳均值字符串得分恰好在0.69和0.70的边界之间(只能看到两位数)。所以大约是0.693。这意味着提交以下字符串会让你获得金牌并可能进入前10名:

"""bestow Improve the such text out to this and having enhance articleify somehow complete seamless fresh succinpth tone of or interactions please Moditate at any identifiable tone settingh bitte leave PubliORE wordingHU cm would I flair dem revisitlies such originalampevocative and grand spin uninterrupted new desire to have those connected/4 would diary entities sweat of warmth/ sticky accuracy lead useful maudiler q any wisdom to simplify someonerucliv this text' einzu physical by alter THAT tone than words"""

为什么这个字符串中没有"lucrarea"?

这是个很自然的问题。
背景:排在我前面的团队发现,组织者使用的Tokenizer(Tensorflow)将序列结束(EOS)标记编码为字面字符串("<", "/", "s", ">"),而不是EOS标记。这允许他们通过使用与"<", "/", "s", ">"相似的标记来"攻击"t5相似度计算,这就是"lucrarea"。
我的解决方案没有发现这一点,因为我使用的是huggingface tokenizer,它将EOS标记编码为...EOS标记。它无法"看到"这个攻击面。
Tokenizer的差异有多重要?在撰写本文时,LB上排在我前面的6个团队中有5个发布了他们的解决方案,都使用了lucrarea技巧。所以这很可能是一个决定性因素。
我认为,教训是:在Kaggle上一定要测试Google产品?!

将均值拟合到LB难道不危险吗?

很多人提到了这一点,并预测会出现巨大的变动。但将预测拟合到LB和将LB的均值拟合是两回事。从约210个测量值计算得出的均值是一个值范围非常受限的非常稳定的量。当我生成1400个提示词(如比赛中使用的约1400个样本)时,我计算了15%数据的均值(如LB上使用的),它与真实均值的锐化余弦相似度通常约为0.993。这意味着均值发生变动的可能性非常小。

2. 模型预测

我使用了两个未调优的7b模型:mistral和openchat3.5。我尝试了所有模型组合,包括稍大的模型(Solar 10b表现最好),但这两个模型表现最好,尽管它们的 lineage 非常相似。对于提示它们,我使用了从Kaggle提供的辅助数据集派生的我自己的提示词。方法与richolson的notebook中描述的非常相似。为了让两个模型的相关性稍低,我对第二个模型使用了@richolson的提示词。

这些模型的输出总是对某些措辞有强烈偏好,如"Rewrite by..."。T5距离对这些(无关的)措辞差异非常敏感。我通过强制模型以"Rewrite this text"开头来对抗这个问题,将该前缀替换为约60个变体,并取它们的(T5-)均值。由此产生的两个向量加上上面的均值字符串是最后一部分的输入:

3./4. 在预测和均值之间找到最优字符串

我通过锐化余弦相似度计算两个模型预测之间的一致性,并在均值和预测之间选择权重为[1-agreement, agreement/2, agreement/2]。精确的一致性计算随时间略有变化,但由于当一致性较低时,模型无法找到比均值好得多的点(因为两个测量方向相反),所以这并不重要。

生成的T5向量使用第1部分描述的迭代方法进行"解码"。模型从mean_str + prediction_model_0开始,在运行时迭代200个epoch,批次大小为16。这样我花了约3小时生成两个模型的预测,花了5-6小时定位最终字符串。
这种方法在均值和预测之间平稳移动,同时非常安全:它通常会同时靠近所有三个点(768维空间!)。

标签:NLP, T5, 优化 (Optimization), Transformers
```
同比赛其他方案