↑↑↑关注后"星标"kaggle竞赛宝典
kaggle竞赛宝典 作者:Cnumber LLM 20 Questions 第一名
问题描述
LLM 20 Questions 第一名
这是一个人、地方还是物品?它比面包盒小吗?它比一个70B参数的模型小吗?
20 Questions 是一款古老的推理游戏,你需要在不超过二十个问题的情况下,通过是非问题猜出一个秘密词汇。玩家通过将问题从一般到具体逐步缩小,以期在尽可能少的问题中猜出这个词。
每个团队将由一个猜测者 LLM 组成,负责提问和猜测,另一个是回答者 LLM,负责用“是”或“不是”来回答。通过战略性的提问和回答,猜测者的目标是在尽可能少的回合内正确识别出秘密词汇。
这场比赛将评估 LLM 在推理能力、通过有针对性提问高效收集信息的能力,以及配对代理之间的合作能力等关键技能。它还呈现出一个受限的环境,需要创意和策略,因为猜测次数有限。成功将展示 LLM 不仅能回答问题,还能提出有见地的问题,进行逻辑推理,并迅速缩小可能性范围的能力。
第一名方案
1. Guesser Strategy
考虑到表现出色的回答者很可能会使用Agent Alpha模式,所以先将其纳入猜测策略,以便在竞争中取得优势。
下一个问题是问“它是Agent Alpha吗?”作为第一个问题,还是强制使用Agent Alpha模式以减少回合。
最终,我选择了询问“它是Agent Alpha吗?”,因为在非代理Alpha的对局中,这个问题带来了显著的优势。这种方法对于从由于低分区中小比例的代理阿尔法回答者引起的“愚蠢深渊”中恢复是必要的。此外,在排行榜的顶部却与低分的代理配对时输掉比赛,导致的分数损失相当可观。
考虑到最终的竞争环境,强制Agent Alpha的方法可能是可行的。
2.Agent Alpha
关键词列表:用Python的NLTK库创建了一份潜在关键词列表(116,937个名词)。只有名词被选中,因为竞争规定关键词必须是“things”。
关键词概率估计:为了优化Alpha Agent的奖励期望,我通过考虑以下因素估计每个关键词在测试数据中出现的可能性:
关键词中的词数量
使用英语词频数据集的英语单词频率
使用GPT-4o mini估算的“Thing-ness”概率
“Thing-ness”是通过问GPT-4o mini以下问题计算的,然后获得下一个词是“是”或“否”的概率:
“'{keyword}'这个词一般会被认为是事物吗?”
上面的散点图展示了概率计算的影响。公共关键词通常具有较低的事物概率排名(意味着概率高)和较低的频率排名(意味着频率高)。这些排名和值是颠倒的,因为我将关键词从高值排名到低值。
通过这个热图,我们可以根据观察到的公共关键词列表与私人关键词列表的相似性,计算每个关键词被包含在私人关键词列表中的概率。在实际计算中,加入了平滑因子,但本质还是一样的。
对于在英语词频数据集中找不到的关键词(主要是复合词),我们只用事物的特性来确定概率。
通过确定每个关键词在私有列表中的概率,我们可以进行高效的二分搜索,这样每次都将概率缩小一半,而不是单单关注关键词的数量。这样就能更有效地进行搜索。
第一名的代理使用这种有偏的关键词概率,而第四名的代理则假设每个关键词的概率是相等的。这种有偏概率方法对平均胜利奖励的影响显而易见。
3.Natural Questions
我采用了一种基于熵的方法, 选择能够最小化预期熵的问题。
主要区别在于关键词和问题的选择方式:
最终的列表包含了大约35,000个按估计概率排名的关键词(如前面所述)。实际上,它们的构建方式有所不同,但似乎与这个解释几乎等价。
使用了三种类型的问题:
26个字母特定的问题(例如,“这个关键词以字母'a'开头吗?”) 约3,000个来自公共排行榜的获胜游戏 大约10,000个使用GPT-4o mini生成的问题
为了使用GPT-4o mini生成问题,我模拟了比赛,并提示模型创建可以在游戏每个阶段有效区分可能关键词的问题。
例如,为了区分“苹果”、“香蕉”、“橘子”和“芒果”,我会问GPT-4o:
“你正在玩20个问题游戏,目前需要问一个问题来猜测关键词。当前的关键词候选是‘苹果,香蕉,橘子,芒果’。什么问题可以将关键词候选缩小到一半?只输出问题。”
一个典型的回应可能是:“这个水果成熟时通常是黄色的吗?”
为了构建概率表,采用了类似maejimakun团队的策略。使用了三个LLM(Meta-Llama-3-8B-Instruct、Phi-3-small-8k-instruct 和 gemma-7b-it)来估算每个关键词-问题对的p(关键词,问题)。LLM的结果在最后进行了平均。
每个LLM的提示是:“关键词是{关键词}。{问题} 用'是'或'否'回答上述问题。”概率是根据“是”和“否”作为下一个标记的可能性得出的。
考虑到最终表的庞大规模(大约35,000 x 13,000 = 455,000,000),我利用vllm进行更快的处理。最初在本地使用一台4090 GPU,后来在比赛最后一周意识到时间紧迫时,我扩大到在Runpod租用的8台RTX 4090的配置。
这种方法证明非常有效,在公共排行榜上获得了高排名,当时在顶端的Agent Alpha回答者较少。对计算资源的投资(大约500美元的服务器费用)在最终结果上得到了充分的回报。
4. Answerer
对于回答者组件,我采用了双LLM的方法,利用两个不同的模型来处理不同类型的问题:
通用LLM:
模型:meta-llama/Meta-Llama-3-8B-Instruct 目的:处理有关关键字的各种一般性问题 专门的数学LLM:
模型:DeepSeek-Math 背景:这个模型在最近的“AI数学奥林匹克-进步奖1”比赛中受到了欢迎,比赛聚焦于用LLM解决数学问题。 功能:DeepSeek-Math将数学问题作为输入,输出Python程序来解决它们。对于更简单的查询,它直接给出答案,而不生成代码。 目的:解决有关关键字的复杂数学问题
DeepSeek-Math的集成显著提升了回答者处理复杂查询的能力,例如:
"Does the keyword contain the letter 'a'?" "Does the keyword have two or more vowels?"
这个专门模型允许对需要精确字母计数或在关键字中识别模式的问题提供高准确性的回答。
模型选择逻辑:
在两个模型之间的选择是由基于规则的系统决定的,主要是通过问题中是否包含特定关键字(例如“字母”)来触发。虽然这种方法证明是有效的,但我认为在模型选择过程中可能还有改进的空间。
代码
https://www.kaggle.com/datasets/cnumber/llm-20-questions-final-submissions
参考文献
https://www.kaggle.com/code/jademonk/tricksy-hobbitses-llm-20-questions-solution https://www.kaggle.com/competitions/llm-20-questions/discussion/531106