Files
s-LLM-project/docs/experiment_design.md
T
2026-07-03 09:20:43 +08:00

12 KiB
Raw Blame History

实验设计方案

验证"图论方法可以让 32B 模型实现极大的智能提升"


实验总览

本实验分为 5 个阶段,按先易后难的顺序推进:

Phase 1: 基线建立 (~2天)
  ↓
Phase 2: AGoT 测试时推理增强 (~3天) ← 首选启动项
  ↓
Phase 3: 图感知 SFT 训练 (~3天)
  ↓
Phase 4: 消融实验与机制分析 (~2天)
  ↓
Phase 5: 跨任务泛化测试 (~1天)

Phase 1: 基线建立

目的

建立 32B 模型在多种推理任务上的性能基线,同时提取内部推理图特征。

模型选择

模型 参数量 用途
Qwen2.5-32B-Instruct 32B 基础对照模型
DeepSeek-R1-Distill-Qwen-32B 32B 强推理参照模型
Qwen2.5-7B-Instruct 7B 规模对照(可选)

推理任务

任务 数据集 指标 难度
数学应用题 GSM8K (8000 samples) Accuracy
竞赛数学 MATH500 Accuracy
高难度数学 AIME 2024 (30 questions) Accuracy
多跳问答 HotpotQA (distractor, 1000) EM / F1
科学推理 GPQA Diamond (198 questions) Accuracy

基线方法

方法 描述 预期成本
IO (Input-Output) 直接输出答案 低 (1次调用/问题)
CoT (Chain-of-Thought) 标准思维链提示 低 (1次调用/问题)
CoT-SC (Self-Consistency) 5条链投票 中 (5次调用/问题)
ToT (Tree-of-Thought) 束搜索 b=3, 深度3 高 (~30次调用/问题)

推理图属性提取

使用 Topology of Reasoning 论文方法:

  1. 在模型推理过程中,从最后一个隐藏层提取隐藏状态
  2. 使用 K-means (k=200) 聚类得到节点
  3. 按推理步骤的顺序连接节点形成推理图
  4. 计算图属性:
    • 循环检测率: 含至少一个环的样本比例
    • 循环数: 每样本的最大循环次数
    • 图直径: 任意两点间最短路径的最大值
    • 小世界指数: S = (C/C_rand) / (L/L_rand)

硬件需求

  • GPU: 1× RTX 4090 (24GB) 或 A100 (80GB)
  • 推理框架: vLLM (推荐) 或 llama.cpp (INT4量化)
  • 内存: 32GB+
  • 存储: 100GB+

运行命令示例

# 使用 vLLM 加载 32B 模型
python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-32B-Instruct \
  --tensor-parallel-size 1 \
  --max-model-len 4096

# 运行 GSM8K 评估
lm_eval --model local-completions \
  --tasks gsm8k \
  --model_args model=Qwen/Qwen2.5-32B-Instruct \
  --num_fewshot 8

Phase 2: AGoT 测试时推理增强

目的

在不修改模型参数的情况下,通过 AGoT 图结构推理框架提升 32B 模型的推理能力。

实现方案

AGoT 算法实现(参照 Pandey et al., 2025

Algorithm: AGoT(q, h, G_h^p)
Input: Query q, position index h, parent graph G_h^p

1. V_h ← ∅, E_h ← ∅, F_h ← ∅
2. G_h ← (V_h, E_h, F_h)          // 初始化嵌套图
3. d ← |h|                         // 当前深度
4. for l = 0, 1, ..., l_max-1 do  // 逐层循环
5.     if l = 0 and d = 0 then
6.         thoughts ← T_∅(q)       // 生成初始想法
7.     else if l = 0 then
8.         thoughts ← T_0(q, G_h)  // 为嵌套图生成初始想法
9.     else
10.        thoughts, edges ← T_e(q, G_h) // 生成想法+边+策略
11.    if thought is final then
12.        return Eval(thought, G_h)     // 提前终止
13.    for thought in thoughts do
14.        if is_complex(thought) and d < d_max then
15.            AGoT(thought, h', G_h)   // 递归调用
16.        else
17.            Eval(thought, G_h)        // 直接评估
18. return final_answer

LLM Agent 接口设计

AGoT 需要定义 6 类 LLM Agent

Agent 功能 Prompt 设计要点
T_∅ 从空图生成初始想法 分解问题的第一层子问题
T_0 从父图生成子图初始想法 在父问题的上下文下生成
T_e 在已有图上生成新想法+边 评估已有节点,决定扩展方向
C 复杂度分类器 判断当前节点是否需要递归分解
Eval 节点/最终答案评估 评估节点对回答问题的贡献
Φ 从图合成最终答案 聚合所有有效节点的信息

关键参数

AGOT_CONFIG = {
    "model": "Qwen/Qwen2.5-32B-Instruct",
    "max_depth": 2,           # d_max: 递归最大深度
    "max_layers": 3,          # l_max: 每层最大层数
    "max_nodes_per_layer": 3, # n_max: 每层最大节点数
    "temperature": 0.3,
    "self_terminate": True,   # 自终止机制
}

评估协议

实验组1: IO (直接输出)               → 对照基线
实验组2: CoT (思维链)                 → 链式对照
实验组3: ToT (思维树, b=3)            → 树状对照
实验组4: AGoT (自适应图推理)           → 主要实验组

比较维度:

  • 准确率
  • Token 消耗量 (成本)
  • 推理步数
  • 推理图属性(循环率、直径、小世界指数)

预期提升

任务 预期 vs IO 预期 vs CoT
GSM8K +5%~15% +3%~10%
MATH500 +10%~25% +5%~15%
AIME 2024 +20%~46% +15%~30%
GPQA Diamond +20%~46% +10%~25%
Game of 24 +100%~400% +50%~150%

Phase 3: 图感知 SFT 训练

目的

主动训练 32B 模型具备图结构推理能力,而非仅靠测试时提示。

数据构造策略

策略 A: 优质推理图扩展 (参考 Topology 论文)

使用 s1-v1.1 数据集(已验证能扩展推理图直径)。 从 s1 数据集中筛选能产生大直径推理图的样本。

策略 B: 多路径推理轨迹

数据格式:
{
    "question": "问题文本",
    "graph_trajectory": {
        "nodes": [
            {"id": 0, "content": "初始分析...", "type": "analysis"},
            {"id": 1, "content": "子问题:...", "type": "decomposition"},
            {"id": 2, "content": "计算步骤...", "type": "computation"},
            {"id": 3, "content": "Wait, 让我重新检查...", "type": "verification"},
            {"id": 4, "content": "子结果聚合...", "type": "aggregation"},
            {"id": 5, "content": "最终答案", "type": "answer"}
        ],
        "edges": [[0,1], [0,2], [1,3], [2,3], [3,4], [4,5]],
        "answer": "最终答案"
    }
}

构造方法:

  1. 使用 GPT-4o / DeepSeek-R1 生成多路径推理轨迹
  2. 在轨迹中插入交叉验证点 ("Wait, let me check...")
  3. 添加显式的子结论聚合步骤
  4. 确保图中的循环结构自然出现(不是人为强行添加)

策略 C: 从 GoT/AGoT 输出蒸馏

  1. 用 AGoT 在验证集上生成推理轨迹
  2. 只保留 AGoT 回答正确的高质量轨迹
  3. 将这些图结构轨迹转化为线性文本用于 SFT

训练配置

# LoRA 微调
accelerate launch \
  --num_processes 1 \
  train_lora.py \
  --model_name Qwen/Qwen2.5-32B-Instruct \
  --dataset_path ./data/graph_sft_data.json \
  --output_dir ./output/graph_sft_32b \
  --lora_r 64 \
  --lora_alpha 128 \
  --lora_dropout 0.05 \
  --learning_rate 2e-4 \
  --num_train_epochs 3 \
  --per_device_train_batch_size 4 \
  --gradient_accumulation_steps 4 \
  --logging_steps 10 \
  --save_steps 500 \
  --eval_steps 500

评估方案

评估点 评估内容 预期
Step 0 (基线) GSM8K + MATH500 准确率 + 推理图属性 标准基线
Step 500 同上 开始提升
Step 1000 同上 显著提升
Step 1500 同上 饱和?
Step 2000 全套评估(含 AIME 最终结果

推理图属性变化预期

微调前 → 微调后:
循环检测率:  ~18%  →  ~50%+
图直径:      ~500  →  ~2000+
小世界指数:  ~0.05 →  ~0.20+
准确率:      ~73%  →  ~80%+ (GSM8K)
              参考:Topology 论文 s1-v1.1 微调后直径从 ~500 扩展到 ~2500

Phase 4: 消融实验与机制分析

消融实验

实验 操作 目的 预期结果
消融1: 去除循环 强制截断回环推理(设置 max_loops=0 循环是否必要 准确率下降 >10%
消融2: 限制直径 限制推理步数上限(max_steps=10/20/50 宽广探索是否必要 欠限时准确率下降
消融3: 图 vs 树 AGoT vs ToT 相同节点预算(同 token 数) 图是否优于树 AGoT 优于 ToT
消融4: 聚合操作 禁用聚合变换 聚合是否关键 准确性下降
消融5: 自终止 禁用自终止,强制固定深度 自适应是否必要 成本增加但准确率不变或略升

规模对比

模型 参数量 图属性期望 准确率期望
Qwen2.5-1.5B 1.5B 低循环、小直径
Qwen2.5-7B 7B 中循环、中直径
Qwen2.5-14B 14B 高循环(峰值)、大直径 中高
Qwen2.5-32B 32B 高循环、最大直径 最高

量化影响测试

量化方案 显存占用 推理速度 预期准确率变化
FP16 (全精度) ~64GB 1x 基线
INT8 ~34GB ~1.1x <1% 下降
INT4 (GPTQ/AWQ) ~18GB ~1.3x 1%-3% 下降
INT4 (llama.cpp) ~18GB ~1.5x 1%-3% 下降

Phase 5: 跨任务泛化测试

测试任务矩阵

类别 任务 AGoT 预期提升 SFT 预期提升
数学推理 GSM8K +5%~15% +5%~10%
MATH500 +10%~25% +5%~15%
AIME 2024 +20%~46% +10%~20%
多跳问答 HotpotQA +10%~15% +3%~10%
2WikiMultihop +10%~20% +5%~10%
科学推理 GPQA Diamond +20%~46% +10%~20%
MMLU-Pro +5%~15% +3%~8%
规划 Game of 24 +50%~400% +20%~100%
Blocksworld +50%~200% +20%~50%
代码 HumanEval +3%~10% +2%~5%
MBPP +3%~8% +2%~5%

去偏测试

  • 提示敏感性测试: 同一问题用 5 种不同措辞重复测试
  • 答案格式测试: 验证无论答案格式如何,推理质量一致
  • 领域迁移测试: 训练集使用数学数据,测试在规划任务上的零样本迁移

实验脚本结构

s-LLM-project/
├── README.md
├── docs/
│   ├── feasibility_report.md        # 可行性报告
│   └── experiment_design.md         # 实验设计(本文件)
├── papers/                          # 下载论文
├── src/
│   ├── baseline/
│   │   ├── run_gsm8k.sh
│   │   ├── run_math500.sh
│   │   ├── run_aime.py
│   │   └── run_hotpotqa.sh
│   ├── agot/
│   │   ├── agot.py                  # AGoT 核心算法
│   │   ├── agents.py               # 6 类 LLM Agent 定义
│   │   ├── graph_utils.py           # 图操作工具
│   │   └── prompts/                 # Prompt 模板
│   ├── graph_analysis/
│   │   ├── reasoning_graph.py       # 推理图提取
│   │   ├── graph_properties.py      # 图属性计算
│   │   └── visualize.py             # 可视化
│   └── sft/
│       ├── prepare_data.py          # 图感知数据构造
│       └── train_lora.py            # LoRA 微调
├── data/
│   ├── graph_sft_data.json          # SFT 训练数据
│   └── results/                     # 实验结果保存
└── requirements.txt

运行优先级

如果在 GPU 服务器上从零开始:

  1. 立即运行: src/baseline/* — 基线评估,产出立刻可用
  2. 核心开发: src/agot/agot.py — AGoT 算法,最关键的实验
  3. 机制理解: src/graph_analysis/* — 推理图可视化与属性分析
  4. 深度优化: src/sft/* — 图感知 SFT 训练

参考文献