返回列表

11th place solution

647. Al Mathematical Olympiad - Progress Prize 2 | ai-mathematical-olympiad-progress-prize-2

开始: 2024-10-17 结束: 2025-04-01 数学与计算 AI大模型赛
第 11 名解决方案

第 11 名解决方案

作者: wang (farsail) | 等级: MASTER

比赛排名: 11

发布时间: 2025-04-13

我很感激 Kaggle 和比赛组织者举办这次挑战。我也想感谢那些分享了富有洞察力的讨论和宝贵数据集的参与者。

总结

使用了 deepseek-r1-distill-qwen-14B-awq-casperhansen 模型配合 SC-TIR 策略。
通过修改 vllm,当自一致性 (SC) 收敛或发散时,推理可以提前结束。
评估是使用最近的 100 个 AIME 问题完成的。没有机器资源可用于进行 GRPO。

策略

1. 模型

  • 采用了 deepseek-r1-distill-qwen-14B-awq-casperhansen
  • 比较了 7B, 14B, 和 32B:
    • 32B 太慢且不完美。
    • 14B > 7B (就准确率而言), 14B < 7B (就速度而言)
    • 增加 14B 的生成次数使其更具竞争力

2. 自一致性 (Self-Consistency)

  • 其有效性已在 AIMO1 中得到证明。
  • 这也是 AIMO2 中的标准方法。

3. 自定义 vllm

  • 使用了 14B 模型并修改了 vllm 以允许尽可能多的生成。
  • 对于简单问题 → 输出变化不大,因此无需生成到 max_num_seqs
  • 对于过难的问题 → 输出通常最终为 0 和 -1 或发散(无唯一解)。即使生成完整的 max_num_seqs 在许多情况下也不会得出正确答案。
  • 因此,实际上需要完整 max_num_seqs 长度来确定结果的问题数量 surprisingly small (出奇地少)。
策略统计图
  • 存在太多 -1 和 0

    • 如果有一定数量的 -1 或 0(无效响应),则提前结束推理。
    • 5 ~ 7 个响应 → 如果 5 个或更多是 -1/0 则终止
    • 8 ~ 11 个响应 → 如果 4 个或更多是 -1/0 则终止
    • 12 ~ 16 个响应 → 如果 6 个或更多是 -1/0 则终止
  • 响应已经发散

    • 一旦至少有 8 个响应,如果有 6 个或更多不同的有效响应,我认为它太分散了并终止。
  • 获胜者已定

    • 如果最频繁答案和第二频繁答案之间的计数差异超过某个阈值,则认为获胜者已确定,推理停止。
    • 4 ~ 7 个响应 → 差异 ≥ 3
    • 8 ~ 11 个响应 → 差异 ≥ 2
    • 12 ~ 16 个响应 → 差异 ≥ 1

4. 验证数据集

  • 使用了最近的 100 个 AIME 问题。
  • 因为分数会有变化,我测试了几次并取平均值用于管道评估。
  • 公共 Notebook 的分数约为 63–68,而我的管道得分约为 75–79。

5. 单次提示 (One-shot)

  • 即使是数学上难以解决的问题,也可能通过 TIR 穷举搜索来解决。
  • 我在 few-shot 提示中包含了穷举搜索方法
  • 诸如 Let's have Python do the tedious calculations for us!
    There are multiple ways to solve this problem, so find the most efficient one. 的提示
    对提高分数略有贡献。
你是一个 Python 代码助手。

你将收到一个具有整数解的数学问题。
你的任务是将这个复杂的数学问题转换为 Python 代码。
让我们让 Python 为我们完成繁琐的计算!

解决这个问题有多种方法,所以请找到最有效的一种。

- 最终答案应该是一个整数。
- 最终答案应该模 1000。
- 请仅返回遵循以下格式的 Python 代码。

```python
import math 

...
# 中间计算
...

print(<答案> % 1000)
```

这是一个例子。

用户:
找出有序对 $(m, n)$ 的数量,使得 $m$ 和 $n$ 是集合 $\{1, 2, ..., 30\}$ 中的正整数,并且 $2^m + 1$ 和 $2^n - 1$ 的最大公约数不为 $1$。

助手:
```python
import math

answer = 0

# 检查 [1, 30] 中的所有 m, n
for m in range(1, 31):
    for n in range(1, 31):
        # 计算 (2^m + 1) 和 (2^n - 1) 的 GCD
        if math.gcd(2**m + 1, 2**n - 1) != 1:
            answer += 1

# 打印模 1000 的结果
print(answer % 1000)
```

公共排行榜 (Public LB): 29
私有排行榜 (Private LB): 28

同比赛其他方案