Views
No views yet
+5pp SuperGPQA (55.0% → 60.0%, N=20) via 4-trace parallel sampling + majority voting. Zero fine-tuning. Zero probe. Pure self-consistency on the new Qwen3.6-27B dense flagship (released 2026-04-21).

| metric | Qwen3.6-27B greedy | self-consistency wrapper (ours) |
|---|---|---|
| SuperGPQA accuracy (n=20 Stage B) | 0.550 | 0.600 (+5.0 pp) |
| Extraction reliability | variable | 100% (forced </think> close) |
| Compute (per query) | 1 trace | 4 traces (parallelizable) |
| Fine-tuning needed | — | No |
| Probe needed | — | No (attempted but failed — see §3) |
| method | accuracy | Δ vs greedy |
|---|---|---|
| Qwen3.6-27B greedy (baseline) | 0.550 | — |
| Naive majority vote (N=4) | 0.600 | +5.0 pp |
| PWMV (probe-weighted vote, N=4) | 0.600 | +5.0 pp (same as naive — probe null) |
| Probe best-of-N | 0.550 | 0 pp |

qwen36-deepconf-probe) that delivered +6pp via probe-weighted voting. The probe there hit val AUROC 0.78 and added +4pp on top of naive vote.


| model | SuperGPQA |
|---|---|
| Qwen3.5-27B | 65.6 |
| Gemma4-31B | 65.7 |
| Qwen3.6-35B-A3B (our previous baseline) | 64.7 |
| Qwen3.6-27B (raw, new dense) | 66.0 |
| Qwen3.6-27B + our self-consistency | ~71.0 (projected) |
| Qwen3.5-397B-A17B | 70.4 |
| Claude 4.5 Opus | 70.6 |
1import torch, re
2from collections import Counter
3from transformers import AutoTokenizer, AutoModelForImageTextToText
4
5tok = AutoTokenizer.from_pretrained('Qwen/Qwen3.6-27B', trust_remote_code=True)
6if tok.pad_token_id is None: tok.pad_token = tok.eos_token
7model = AutoModelForImageTextToText.from_pretrained(
8 'Qwen/Qwen3.6-27B', dtype=torch.bfloat16, device_map='cuda',
9 attn_implementation='sdpa', trust_remote_code=True)
10model.eval()
11
12def extract_answer(text):
13 post = text.split("</think>")[-1] if "</think>" in text else text
14 m = re.search(r"\\boxed\{([A-J])\}", post)
15 if m: return m.group(1)
16 m = re.findall(r"\\boxed\{([A-J])\}", text)
17 return m[-1] if m else None
18
19FORCE_SUFFIX = "\n</think>\n\nFinal answer: \\boxed{"
20def force_close(full_ids, prompt_len):
21 gen = tok.decode(full_ids[prompt_len:].tolist(), skip_special_tokens=False)
22 if "</think>" in gen:
23 return tok.decode(full_ids[prompt_len:].tolist(), skip_special_tokens=True)
24 full = tok.decode(full_ids.tolist(), skip_special_tokens=False) + FORCE_SUFFIX
25 ctx = tok(full, return_tensors="pt", add_special_tokens=False).input_ids.cuda()
26 with torch.no_grad():
27 out = model.generate(ctx, max_new_tokens=15, do_sample=False,
28 pad_token_id=tok.pad_token_id, use_cache=True)
29 suf = tok.decode(out[0, ctx.shape[1]:].tolist(), skip_special_tokens=True)
30 return tok.decode(full_ids[prompt_len:].tolist(), skip_special_tokens=True) + FORCE_SUFFIX + suf
31
32def self_consistency_predict(question, options, n_traces=4, temperature=0.7, max_new=3500):
33 choices = "\n".join(f"{chr(65+i)}. {o}" for i, o in enumerate(options))
34 content = (f"Answer the following multiple-choice question. "
35 f"Reason step by step, then put the letter in \\boxed{{}}.\n\n"
36 f"Question: {question}\n\nOptions:\n{choices}")
37 prompt = tok.apply_chat_template(
38 [{"role":"user","content":content}],
39 tokenize=False, add_generation_prompt=True, enable_thinking=True)
40 ids = tok(prompt, return_tensors="pt").input_ids.cuda()
41 with torch.no_grad():
42 out = model.generate(ids, max_new_tokens=max_new, do_sample=True, temperature=temperature,
43 num_return_sequences=n_traces, top_p=0.95,
44 pad_token_id=tok.pad_token_id, use_cache=True)
45 answers = [extract_answer(force_close(out[i], ids.shape[1])) for i in range(n_traces)]
46 filtered = [a for a in answers if a]
47 return Counter(filtered).most_common(1)[0][0] if filtered else None
48
49
50question = "Which of these is a renewable energy source?"
51options = ["Coal", "Natural gas", "Solar", "Petroleum", "Diesel",
52 "Propane", "Nuclear uranium", "Kerosene", "Gasoline", "Shale oil"]
53answer = self_consistency_predict(question, options, n_traces=4)
54print(f"Answer: {answer}") # -> "C"| parameter | value |
|---|---|
| Base model | Qwen/Qwen3.6-27B (dense, 64 layers, hidden 5120) |
| Eval set | 20 held-out Stage B prompts (random seed 42, after train split) |
| Training set | 80 greedy rollouts on SuperGPQA Stage B questions (disjoint from eval) |
| Generation | temperature=0.7, top_p=0.95, max_new_tokens=3500, N=4 traces |
| Thinking mode | enable_thinking=True |
| Budget forcing | </think> injection if not closed after 3500 tokens |
| Hardware | Single NVIDIA RTX PRO 6000 Blackwell (96 GB) |
| Eval time | 110 min (20 prompts × 4 methods, ~5.5 min/prompt) |
probe_l11.pkl — L11 LogReg probe (val AUROC 0.509, kept for reproducibility — not functional)train_rollouts.json — 80 labeled 27B greedy rollouts + L11 residuals (8.9 MB)summary.json — full benchmark numbers + deltaseval_partial.json — per-prompt predictions (20 prompts × 4 methods)README.md — this file01_hero_benchmark.png — main result bar chart02_convergence.png — running accuracy across n=3..2003_probe_failure.png — AUROC diagnostic (35B works, 27B null)04_model_compare.png — 27B dense vs 35B-A3B MoE under same wrappers05_landscape.png — SuperGPQA benchmark positioning vs Claude 4.5 Opus| repo | model | method | headline |
|---|---|---|---|
| qwen36-deepconf-probe | Qwen3.6-35B-A3B (MoE) | PWMV (probe works) | +6 pp SuperGPQA |
| qwen36-27b-selfconsistency (this) | Qwen3.6-27B (dense) | Naive majority vote | +5 pp SuperGPQA |
| qwen36-feature-circuits | Qwen3.6-35B-A3B | SAE circuit analysis | multi-substrate negative + post-mortem |
| Qwen3.6-35B-A3B-LIMO-Probe | Qwen3.6-35B-A3B | LIMO LoRA + PWMV stack | small-scale test (inconclusive n=15) |
1@misc{vicentino2026qwen27bsc,
2 title = {qwen36-27b-selfconsistency: +5pp SuperGPQA on Qwen3.6-27B via N=4 majority voting},
3 author = {Vicentino, Caio},
4 year = {2026},
5 howpublished = {\url{https://huggingface.co/caiovicentino1/qwen36-27b-selfconsistency}}
6}Qwen/Qwen3.6-27B.