Detection and Mitigation of Hallucination in Large Reasoning Models: A Mechanistic Perspective
Paper: arXiv:2505.12886 Code: Jeryi-Sun/Reasoning_Hallucination Code reference:
main@00c19463(2025-09-25)
1. 论文定位与核心结论
这篇论文把“大模型回答错了”进一步拆成一种更隐蔽的错误:Reasoning Hallucination。它不是普通事实幻觉那种一句话编造,而是 LRM 先生成看似连贯、甚至自带检查与回溯的长推理链,最后却把错误事实、错误中间结论或错误回溯包装成可信的答案。作者的核心判断是:只看最终答案或表面 CoT 文本不足以发现这种错误,必须看模型内部在每个推理步骤中到底有没有发生“深层表征变换”。
本文的主线可以概括为三步。第一步,定义 Reasoning Score:用 LogitLens 把候选后层和最终层 hidden states 投影到词表分布,再用 Jensen-Shannon divergence 衡量同一个 token 在后层之间的分布差异;差异越大,表示模型在后层仍在进行较大表征变换,作者解释为更深的推理。第二步,用这个分数分析 ReTruthQA 和 GSM-NoOp,识别出三类与推理幻觉相关的动态模式:早期推理深度大幅波动、后期错误回看浅层或过度思考步骤、以及高 Reasoning Score 与高困惑度同时出现的 spurious verification。第三步,把这些模式组合成 RHD 检测器,并把 Reasoning Score 作为过程奖励注入 GRPO,得到 GRPO-R。
我的一句话理解:这篇文章不是简单提出一个 hallucination detector,而是试图把“推理链为什么会骗过人”解释为浅层模式匹配与过度验证之间的动态失衡。低 Reasoning Score 对应模型被 No-Op 或表面线索牵着走;极高 Reasoning Score 又可能不是好事,而是模型在错误前提上做过度自检。RHD 的价值在于把这两端都纳入同一个步骤级诊断框架,GRPO-R 的价值在于提醒 RL 训练不能只奖励最后答案,否则会让模型学会可得分但不稳健的推理捷径。
Figure 1 解读:这张方法图是全文的索引。左侧是把每个 reasoning step 切成 token,并通过 LogitLens 比较不同后层的词表分布;中间用早期步骤的变异系数捕捉波动;右侧用后期步骤到早期低分或异常高分步骤的注意力,刻画错误回溯。RHD 的四个输入基本都来自这张图中的步骤级时间序列。
2. 背景、任务定义与数据构造
2.1 Reasoning Hallucination 的问题边界
论文对幻觉的定义非常强调“推理链的说服力”。传统 hallucination 可以通过事实核查或最终答案验证发现,但 LRM 的错误常常藏在多步推理中:某一步使用了无关线索、某一步错误地修正了原本正确的中间结论、某一步在自检时引入新的错误。用户看到的是完整、流畅、貌似自洽的解释,因此更容易相信。这一点与长 CoT、OpenAI o-series、DeepSeek-R1 之后的使用场景高度相关:模型不仅给答案,还给可读的“思考过程”。
作者认为,以往工作多停留在行为层面:看最终答案对不对,看 CoT 文本是否包含错误步骤,或者用 LLM-as-judge、PRM、uncertainty 估计输出可靠性。这些方法的弱点是它们不一定能区分“真正做了深层推理但失败”和“只是匹配表面模式却输出了长解释”。因此本文采用 mechanistic perspective:如果某个步骤是真正的深层推理,那么后层表征在生成该步骤时应该继续发生可测的分布变化;如果只是浅层模式匹配,后层分布变化会小。
2.2 ReTruthQA 与 GSM-NoOp
ReTruthQA 是本文用于检测任务的核心数据集,覆盖三类推理任务:Math、Science、MultiHopQA。附录统计为:MATH 有 57 个样本、417 条 traces,平均 truthful traces 3.35、hallucination traces 3.96;Science 有 88 个样本、541 条 traces,平均 truthful 3.05、hallucination 3.10;MultiHopQA 有 184 个样本、1186 条 traces,平均 truthful 2.74、hallucination 3.70。Math 来自 MATH500、AMC 2023、AIME 2024;Science 来自 GPQA;MultiHopQA 从 HotpotQA、2WikiMultihopQA、MuSiQue、Bamboogle 抽样。作者用 DeepSeek-R1-Distill-Qwen-7B 和 14B 随机采样生成多条推理轨迹。
数据标注分三步。首先自动识别高置信失败轨迹:只有 rollout 错误率超过 90% 的 trace 才进入 hallucination 候选,避免普通随机错误污染定义。其次用 GPT-4o-Mini 过滤明显不合逻辑的错误,因为本文关心的是“看起来逻辑合理但事实或中间推理错误”的 hallucination,而不是显然胡乱输出。最后用人工标注验证边界样本:两位至少本科 CS 背景的标注者在限时条件下判断 trace 是否有效;如果人类在规定时间内没有发现错误,但该 trace 最终被验证为错误,就把它标成 hallucination。这一设计很有意思,因为它把“是否会误导用户”纳入标签定义,而不是只问“机器是否错”。
GSM-NoOp 用于验证 Reasoning Score 是否真能捕捉浅层模式匹配。作者从 GSM8K 随机抽 300 个样本,用 GPT-4o 生成看似相关但不影响解题的 No-Op 句子,再自然地插入原题。若模型推理步骤被 No-Op 牵引,该步骤应当是浅层匹配。实验显示,被 No-Op 误导的步骤 Reasoning Score 显著更低,支持该分数作为“推理深度”代理。
Figure 2 解读:case study 对比同一 GSM-NoOp 问题下的 hallucinated trace 与 truthful trace。关键不是最终答案,而是步骤级曲线:错误轨迹先出现受 No-Op 影响的低分步骤,随后出现高分自检或回溯,但这些高分步骤不一定纠错,反而可能在错误前提上继续加工。
3. 方法细节:Reasoning Score、RHD 与 GRPO-R
3.1 Reasoning Score:用后层分布变化度量推理深度
设一条 reasoning trace 为 ,每个步骤 。对步骤内每个 token,模型有每层 hidden state 。作者使用 LogitLens:先对 hidden state 做 LayerNorm,再乘 unembedding matrix ,得到该层对下一个 token 的词表 logits,并 softmax 成分布 。最终层 被当作 anchor,候选后层集合 与最终层之间的 Jensen-Shannon divergence 被平均,得到步骤级分数: 直觉上,若后层从候选层到最终层仍显著改变词表分布,说明模型在该步骤生成过程中继续整合上下文、执行较深变换;若分布稳定,则更像已经在较早层决定输出,后续只是传递或表面匹配。这个假设并不等同于“高分一定正确”,这恰好是本文后续发现 Pattern #3 的原因:高分也可能来自过度验证或不稳定自检。
3.2 三个幻觉模式
Pattern #1:早期 Reasoning Score 大幅波动。 对 trace 早期 个步骤计算 coefficient of variation: 幻觉 trace 往往早期波动更大。作者解释为:模型先遇到浅层匹配或内部不一致,随后触发自检,Reasoning Score 从低到高跳变。这个跳变本身不是坏事;坏的是自检可能发生在错误前提上。
Pattern #2:后期错误回看早期问题步骤。 作者计算后期步骤 对早期步骤 的平均注意力 ,再关注那些早期低分或异常高分的步骤。如果后期大量关注这些步骤,说明模型可能在回溯时引用了错误或过度思考的中间结论。代码实现中 LRMScorer.compute_lrm_score 用后 20% 的步骤、top-5 attention,以及低分位阈值或 的异常步骤近似这个指标。
Pattern #3:Reasoning Score 与 perplexity 正相关的过度思考。 正常情况下,深层推理可以伴随更确定的输出;但 Rising-2 triples 中, 的步骤反而更高困惑度,表示模型在不稳定地做验证。论文称为 spurious verification:模型似乎在自检,但这种自检由 outcome-based reward 学出的策略驱动,可能只是为了看起来严谨。
Figure 3 解读:GSM-NoOp 验证图表明,受无关 No-Op 误导的步骤 Reasoning Score 更低。它支撑了分数的第一层语义:低分不是简单“不努力”,而是模型可能依赖题面中的浅层诱饵。
Figure 4 解读:CV scatter 用来支撑 Pattern #1。若早期步骤的推理深度忽高忽低,模型很可能在浅层匹配、修正、再修正之间摆动。对 detection 来说,CV 比平均 Reasoning Score 更敏感,因为它抓的是时间动态而不是整体强弱。
Figure 5 解读:Attention Score 关注“后面的推理究竟在引用什么”。如果后期步骤大量回看早期低分或异常高分步骤,即使文本看起来像自我修正,也可能是在把错误依据重新包装成更可信的解释。
Figure 6 解读:这张图对应 Pattern #3。过高 Reasoning Score 与 perplexity 同时上升时,不能简单解释为“更认真推理”;它可能代表模型在高不确定状态下做冗余验证,最终引入新的错误。
3.3 RHD:把机制模式转成检测分数
RHD 把四个量线性组合为 Reasoning Hallucination Score: 其中 Avg 表示整体推理深度,CV 对应 Pattern #1,AttnScore 对应 Pattern #2,PCC 对应 Pattern #3。 是回归系数。注意这里的“hallucination score”越高越可疑;这与普通 reward score 越高越好不同。RHD 的优势在于它不是把长 trace 直接丢给 judge,而是把 trace 分解为步骤级 internal dynamics,再汇总为一个可排序分数。
伪代码如下:
for trace in generated_traces:
steps = segment_by_cognitive_tokens_and_double_newlines(trace)
for step in steps:
q_final = LogitLens(hidden_state(final_layer, step.tokens))
q_candidates = [LogitLens(hidden_state(layer, step.tokens)) for layer in candidate_late_layers]
R_score[step] = mean_token_layer(JSD(q_final, q_candidate))
cv = std(R_score[:early_window]) / mean(R_score[:early_window])
attn = mean_late_attention_to_low_or_extreme_early_steps(steps, R_score)
pcc = pearson(diff(norm(R_score)), diff(norm(step_ppl)))
H = a1 * mean(R_score) + a2 * cv + a3 * attn + a4 * pcc3.4 GRPO-R:用步骤级 Reasoning Score 做 reward shaping
作者认为推理幻觉的训练根因之一是 outcome-based RL:训练只奖励最终答案,容易让模型学到“能到答案的捷径”或“看起来会自检的形式”。GRPO-R 把推理过程建模为 finite-horizon MDP,原始奖励只有最后一步非零: for ,。然后使用 potential-based reward shaping: 为了避免鼓励过度思考,论文定义 clipped reasoning score:当 时使用 ,否则置 0;也就是说,中等深度推理得到过程奖励,异常高分不继续奖励。附录中 GRPO-R 的实现形式是把每个候选输出的 step-level shaped rewards 标准化,得到 token-level advantages,再代入 GRPO clipped objective,并加 KL penalty 到 reference policy。
理论上,论文给出 augmented reward 下的泛化界:若 augmented return 在 内,策略类 的 Rademacher complexity 为 ,则以至少 概率: 这个 bound 本身比较标准,真正有用的解释是:Reasoning Score 作为过程正则,约束了策略在中间步骤上的行为空间,理论上降低有效复杂度;但这仍是间接论证,实验才是主要支撑。
4. 实验结果与关键数字
4.1 RHD 检测结果
检测实验有两种设置。Binary Detection 对单个 判断 hallucination,报告 AUC 和 PCC。Multi-Trace Ranking 在同一个问题的多条推理中排序,报告 MC1、MC2、MC3,沿用 TruthfulQA-MC 风格。模型包括 DeepSeek-R1-Distill-Qwen-7B 和 14B;baseline 覆盖 ensemble self-evaluation、uncertainty、self-awareness、LLM-as-critic、PRM、length score。
在 R1-7B 上,RHD 在 MATH 的 AUC/PCC/MC1/MC2/MC3 为 0.7978/0.4852/0.6591/0.4765/0.5699;Science 为 0.6528/0.2662/0.6207/0.5448/0.6009;MultiHopQA 为 0.7361/0.3863/0.7660/0.6255/0.7103。它在多数 ranking 指标上显著优于 SelfCheckGPT、PPL、Length-Score、PRM 和 GPT-4o critic。一个有趣现象是 Length-Score 在部分 multi-trace ranking 上不弱,说明“越长越可能错”确实有统计信号;但它在 binary detection 上弱,无法作为稳定检测器。
在 R1-14B 上,RHD 的 MATH 指标为 0.7292/0.3476/0.3692/0.3005/0.4644,Science 为 0.7649/0.4506/0.6667/0.4714/0.5671,MultiHopQA 为 0.7255/0.3742/0.5785/0.4421/0.5154。14B 上 MATH 的 MC1 不如某些 baseline 突出,但 Science 和 MultiHopQA 仍然很强。这说明机制特征的有效性会受模型规模、领域和 trace 分布影响,不是一个完全 domain-invariant 的 magic number。
Ablation 进一步说明四个分量的互补性。以 R1-7B 为例,去掉 CV Score 后 Science MC1/MC2/MC3 从 0.6207/0.5448/0.6009 掉到 0.4483/0.3862/0.4977;去掉 Attention Score 后 MultiHopQA 从 0.7660/0.6255/0.7103 掉到 0.6383/0.5372/0.6123;去掉 PCC 后 MATH 从 0.6591/0.4765/0.5699 掉到 0.5909/0.3830/0.5210。这些数字支持作者关于“不同领域偏好不同幻觉模式”的判断。
4.2 GRPO-R 缓解结果
缓解实验比较 Base、+GRPO、+GRPO-R。在 DeepSeek-R1-1.5B 上,GRPO-R 在 MATH500/AIME2024/GPQA diamond/GPQA main/GPQA extended 上分别达到 0.788/0.367/0.414/0.371/0.357;对应 Base 是 0.772/0.333/0.354/0.333/0.339,标准 GRPO 是 0.770/0.333/0.359/0.335/0.359。GRPO-R 在前四项明显提升,但 GPQA extended 略低于标准 GRPO 的 0.359。
在 Qwen2.5-1.5B-Instruct 上,GRPO-R 达到 0.490/0.133/0.247/0.243/0.275;Base 是 0.466/0.100/0.202/0.197/0.211,标准 GRPO 是 0.480/0.033/0.247/0.214/0.266。这里的提升更像“在已有 GRPO 之上稳定补强”,尤其 AIME 和 GPQA main/extended;GPQA diamond 与 GRPO 持平。总体来看,GRPO-R 不是把所有任务都大幅拉高,而是在 outcome reward 之外加一个过程约束,减少训练后推理质量退化。
4.3 结果如何解读
我认为这篇文章最有价值的实验不是 Table 2 的 GRPO-R 小幅提升,而是 RHD 的 pattern analysis。它证明一个重要事实:推理幻觉不是单一方向的错误。低 Reasoning Score 会对应浅层模式匹配,过高 Reasoning Score 也会对应过度验证;早期波动和后期错误回看是序列动态,不是单点属性。因此,如果只用平均置信度、平均困惑度或 trace length,很容易漏掉“先浅层、后过度自检”的组合型失败。
5. 代码实现、复现线索与论文-代码差异
5.1 代码仓库结构
代码搜索找到公开实现:Jeryi-Sun/Reasoning_Hallucination,当前记录版本为 main@00c19463。仓库包含两条线:RHD/ 实现检测流程,open-r1/ 加上 vendored trl/ 和 transformers/ 实现 GRPO-R 训练。需要注意仓库体积较大,因为包含完整 Transformers 和 TRL 拷贝;真正与论文相关的改动主要在 RHD/*.py、RHD/utils/get_hidden_score.py、trl/trl/trainer/grpo_config.py、trl/trl/trainer/grpo_trainer.py 以及 open-r1/recipes/*/grpo/config_demo_deep_gamma_0_1.yaml。
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| Reasoning Score / LogitLens JSD | RHD/utils/get_hidden_score.py | LRM_Hidden_Score.process_batch, LRMScorer.compute_lrm_score |
| RHD feature extraction | RHD/hallucination_detection.py | compute_scores_for_steps, main |
| Hallucination score components | RHD/hallucination_score.py | compute_hallucination_scores |
| Binary detection eval | RHD/hallucination_eval_task1.py | evaluate_hallucination_detection |
| Multi-trace ranking eval | RHD/hallucination_eval_task2.py | hallucination_MC_calcs, evaluate_hallucination_detection |
| GRPO-R config flags | trl/trl/trainer/grpo_config.py | enable_deep_think_reward, deep_think_mature_layer, deep_think_candidate_layers, deep_think_gamma |
| Step score during RL | trl/trl/trainer/grpo_trainer.py | _get_score_deep_think, _process_deep_think_batch |
| Reward shaping | trl/trl/trainer/grpo_trainer.py | _apply_potential_based_reward_shaping, _normalization_step_scores |
| Actual launch configs | open-r1/recipes/.../config_demo_deep_gamma_0_1.yaml | model path, dataset, LR, LoRA, generation count, gamma |
5.2 RHD 代码路径
RHD/utils/get_hidden_score.py 中的 LRMScorer.compute_lrm_score 与论文公式直接对应。它输入 R_scores、reasoning_matrix 和可选 entropy_scores。第一部分计算局部突降与 wavelet 高频能量,作为早期波动的补充实现;第二部分选择后期步骤,检查其 top attention 是否指向低分位或 的早期步骤;第三部分计算前半段 std/mean 得到 CV_score;若有 entropy_scores,它会归一化 perplexity 与 R score,并计算一阶差分的 Pearson correlation pcc。RHD/hallucination_score.py 最终把每条 positive/negative trace 转成 [Attention_score, CV_score, R_score_mean, pcc]。
多 trace 评估的代码语义也值得注意。hallucination_eval_task2.py 中,先对每条 positive/negative trace 的四维分数做加权和;MC1 要求最小 positive score 小于所有 negative score,MC2 是 positive score 低于最小 negative score 的比例,MC3 是所有 positive-negative 成对比较中 positive 更低的比例。这里的命名沿用 TruthfulQA-MC,但实现逻辑是“truthful trace 的 hallucination score 应该更低”。
5.3 GRPO-R 代码路径与实际训练配置
trl/trl/trainer/grpo_config.py 新增四个深度思考奖励参数:enable_deep_think_reward、deep_think_mature_layer、deep_think_candidate_layers、deep_think_gamma。trl/trl/trainer/grpo_trainer.py 在初始化时读取这些参数,并在 _generate_and_score_completions 中对普通 reward 做完加权求和后,如果 enable_deep_think_reward=True,调用 _get_score_deep_think。
实际 step score 计算在 _process_deep_think_batch:模型前向时传入 early_exit_layers=candidate_layers+[mature_layer]、token_start=min_start,取得候选层和 mature layer 的输出;对每个 token 计算 mature distribution 与 candidate distributions 的 JSD,取均值并乘 1e5,再扩展到该 step 的 token 范围。这与论文 Reasoning Score 的实现方向一致。
但论文公式与公开代码有一个重要差异:论文写的是 potential difference 或附录中的 ;代码中的 _apply_potential_based_reward_shaping 更直接:如果某个 completion 的 accuracy reward 为正,就对每个 token 位置的 reward 加上 gamma * step_scores[i],然后按 group/token mask 标准化 advantage。代码还会把 step_scores > 4 置 0。这实现了“正确答案才奖励中间深思、异常高分不奖励”的思想,但并非严格的 telescoping potential difference。因此复现实验时应以代码行为为准,而不是只按论文公式重写。
实际配置来自 launch config,不是默认值。
DeepSeek-R1-Distill-Qwen-1.5B 配置使用 data/OpenR1-Math-220k/,learning_rate=1e-6,gradient_accumulation_steps=4,per_device_train_batch_size=4,num_generations=4,max_completion_length=7680,LoRA r=16, alpha=16,deep_think_mature_layer=28,candidate_layers=[22,26],deep_think_gamma=0.1,reward weights 为 accuracy 1.0、format 0.1、tag_count 0.1。
Qwen2.5-1.5B-Instruct 配置同样使用 data/OpenR1-Math-220k/,learning_rate=2e-5,per_device_train_batch_size=16,num_generations=16,max_completion_length=1536,LoRA r=16, alpha=16,同样 mature layer 28、candidate layers [22,26]、gamma 0.1,reward funcs 额外包括 box,四个 reward weights 都是 1.0/0.1/0.1/0.1。
GRPO-R 关键伪代码如下:
rewards = weighted_sum(reward_funcs(completions))
if enable_deep_think_reward:
step_scores = get_score_deep_think(model, prompt_completion_ids, completion_ids,
mature_layer=28, candidate_layers=[22, 26])
step_scores = gather(step_scores)
step_scores = where(step_scores > 4, 0, step_scores)
step_scores = normalize_by_prompt_group(step_scores)
if accuracy_reward_for_completion > 0:
rewards = rewards.unsqueeze(-1) + deep_think_gamma * step_scores
advantages = normalize_by_prompt_group_and_mask(rewards)
else:
advantages = normalize_group_scalar_rewards(rewards)
optimize_grpo_clipped_objective(advantages, kl_to_reference)5.4 复现和安全细节
代码仓库里 open-r1/src/open_r1/rewards.py 的 LLMScorer 包含硬编码第三方 API key/base URL。复现时不应使用这个密钥;应改成环境变量或本地 judge,否则既有安全风险,也会导致他人环境不可复现。另一个复现风险是 vendored TRL/Transformers 改动较多,不能直接用上游 trl pip 包替换;GRPO-R 依赖 trainer 内部新增的 early-exit hidden-state 路径和 token-level advantage 形状。
6. 局限、适用范围与我的批注
第一,RHD 需要访问内部 activations,因此只能直接用于开源或可本地运行的 LRM。对黑盒模型,最多只能训练代理 detector 或使用输出端 proxy 特征,这会削弱本文的 mechanistic claim。第二,Reasoning Score 的解释依赖“后层分布变化等于深层推理”这个假设。GSM-NoOp 支持低分对应浅层诱饵,但高分的语义更复杂;本文自己也证明高分可能是 overthinking。因此后续使用时不能把 当作单调质量指标。
第三,ReTruthQA 的标签定义很贴近“误导用户”,但也引入了人为和 GPT judge 的偏差。比如人工限时未找出错误就把错误 trace 视为 hallucination,这能模拟用户体验,却不一定等价于严格逻辑错误分类。第四,GRPO-R 的实验模型是 1.5B 和 moderate-scale 设置,提升幅度有限;它更像 proof-of-concept,而不是已经证明在大规模 post-training 中稳定有效。
第五,论文与代码在 reward shaping 上存在上述实现差异。严格 potential-based shaping 保证 policy invariance,而代码实现是对正 accuracy completion 加 token-level normalized step score,这在工程上合理,但理论 bound 与代码路径之间并非完全一一对应。阅读这篇论文时,应把 theoretical section 视为解释框架,把 RHD pattern analysis 和公开代码中的 ablation/配置视为更可靠的实证部分。
总的来说,这篇论文适合放在 LLM & VLM / Theory,因为它的主贡献不是新的 benchmark 或单纯训练技巧,而是试图解释 LRM 推理幻觉的内部机制,并把机制特征转化为检测与训练信号。它对后续做 long-CoT reliability、process supervision、RL post-training safety 都有启发:过程奖励不能只鼓励更长或更“努力”的推理,而要区分浅层匹配、有效自检和错误的过度验证。
7. 复现检查清单:从论文概念到代码路径
下面这部分是给后续复现或改写 RHD / GRPO-R 时使用的检查清单,重点列出容易被摘要忽略但会改变结果的实现选择。
7.1 输入与步骤切分
- 先确认 trace 中是否保留完整
<think>...</think>内容;如果只保存 final answer,RHD 无法运行。 - 论文的 step segmentation 是混合规则:先按
</think>、Wait、But、However、Hmm、Alternatively等认知转折词切,再按 prompt 要求的双换行\n\n细分。 - 公开 GRPO-R 训练代码中
_get_score_deep_think更简单,主要按 completion 文本中的双换行切分;如果模型输出没有稳定双换行,step score 会退化。 - RHD 离线检测与 GRPO-R 在线训练使用的分层候选不完全相同;离线 RHD 中
hallucination_detection.py默认 mature layer 48、candidate layers[32,36,40,42,44,46],训练 config 中是 mature layer 28、candidate layers[22,26]。 - 不同模型层数不同,不能直接复制 layer ids;候选层应映射到模型后层区域,而不是机械使用数字。
7.2 Reasoning Score 计算
- LogitLens 需要 unembedding matrix 和 layer norm 后的 hidden state;如果模型结构或 tied embedding 设置不同,投影实现要重新检查。
- 论文公式比较候选后层与最终层的 softmax 分布;代码实现中
_process_deep_think_batch对 mature layer 与 candidate layers 计算 JSD,并把 step score 乘1e5。 - JSD 是对 token-level vocabulary distribution 计算,不是对句向量或 hidden vector 余弦相似度计算。
R_score的绝对值会随模型、层、scale 和实现细节变化,因此论文中的阈值R>4不应跨模型无校准使用。- 低分主要解释为浅层模式匹配,高分需要结合 perplexity 和上下文判断,不能单独解释为“更好”。
7.3 RHD 特征与检测
CV_score只看 trace 早期或前半部分,目标是捕捉“先错再自检”的波动,而不是整条 trace 的稳定性。Attention_score不是普通 attention entropy;它特别关注后期步骤是否回看低分位或异常高分的早期步骤。pcc在代码中使用归一化 R score 与 token perplexity 的一阶差分做 Pearson correlation,强调趋势同涨同跌。R_score_mean单独使用可能会混淆深层推理和过度思考,所以 RHD 把它与 CV、Attention、PCC 一起回归。- 如果没有 attention matrix 或 hidden state,不能只用输出文本近似 RHD;那会变成另一个 black-box detector。
7.4 评估指标
- Binary detection 的 AUC/PCC 是对单条 判断 hallucination 的能力。
- Multi-trace ranking 的 MC1/MC2/MC3 是对同一问题多条 trace 的排序能力,分数方向是 hallucination score 越高越可疑。
hallucination_eval_task2.py中 truthful/positive trace 的 weighted score 应低于 hallucinated/negative trace;阅读结果时不要把 positive 理解成“正类幻觉”。- Length baseline 在部分 MC 指标强,说明 trace length 是混杂变量;但 RHD 在 binary detection 更稳,说明内部动态特征提供额外信息。
- 对 domain-specific 结果应看每个子域的 pattern 偏好,不能只看平均值。
7.5 GRPO-R 训练
- 训练配置必须来自
config_demo_deep_gamma_0_1.yaml,不要引用上游 Open-R1 或 TRL 默认值。 - DeepSeek-R1-Distill-Qwen-1.5B 与 Qwen2.5-1.5B-Instruct 的 batch size、generation count、completion length 差异很大,不能把两组结果视作同一超参下的模型比较。
deep_think_gamma=0.1是实际配置值;论文公式中的 概念更一般。- 公开代码只在 accuracy reward 为正时加 deep think reward,这会避免奖励错误答案中的“复杂但错误推理”。
- 代码把
step_scores > 4置零,对应论文中避免 overthinking 的 clipping 思路。 - token-level advantage 的 shape 与普通 GRPO scalar reward 不同;如果复现时直接使用上游 TRL,很可能丢失这部分逻辑。
- 由于 reward shaping 被加入 trainer 内部,最好固定 commit
00c19463,不要只记录 pip package version。
8. 容易误读的点
- 误读 1:Reasoning Score 越高越好。 论文明确指出过高分数可能是 overthinking;正确用法是结合 CV、attention 和 PPL。
- 误读 2:RHD 是 LLM judge。 RHD 的核心不是文本 judge,而是 hidden-state / attention / perplexity 组合特征。
- 误读 3:GRPO-R 证明了大规模 RL 稳定收益。 当前实验主要是 1.5B 级别和几个 reasoning benchmark,结论是有潜力,不是工业规模定论。
- 误读 4:论文公式与代码完全一致。 代码实现是工程化近似,尤其 reward shaping 部分比论文公式更直接。
- 误读 5:ReTruthQA 标签就是客观逻辑真值。 它还包含“是否会误导人类标注者”的用户体验维度。
- 误读 6:可以把 RHD 用到黑盒模型。 没有内部 activation 时只能做代理模型或近似特征,机制解释会变弱。
- 误读 7:Length baseline 强说明方法没必要。 Length 捕捉的是长 trace 的统计偏差,RHD 捕捉的是何处浅层、何处过度验证。
- 误读 8:No-Op 实验只是在做鲁棒性 benchmark。 它更重要的用途是给 Reasoning Score 的语义找一个可控验证环境。
9. 后续可延伸问题
- 能否把 Reasoning Score 校准成跨模型可比的量,而不是每个模型单独设阈值?
- 如果模型不输出完整 CoT,只输出摘要式 rationale,RHD 是否仍能在 latent reasoning 上工作?
- 对 MoE 模型,专家路由变化是否会影响 LogitLens/JSD 的解释?
- 对多模态推理,视觉 token 与文本 token 的后层分布差异能否形成类似的 reasoning score?
- 是否可以把 RHD 用作在线拒答或 self-correction 触发器,而不只做离线检测?
- GRPO-R 的过程奖励是否会鼓励模型刻意制造“看起来有中等深度”的步骤,从而形成新的 reward hacking?
- 对更强模型,过度思考阈值是否会右移,还是 spurious verification 仍出现在相似分数区间?
- RHD 与 PRM 可以互补:PRM 看步骤是否局部正确,RHD 看内部动态是否异常;二者合并可能比单独方法更稳。
- ReTruthQA 的人工限时机制很贴近用户体验,但未来可加入不同专业背景用户,量化“误导性”的人群差异。
- 如果训练目标包含 final answer accuracy、process correctness、reasoning depth 三个信号,怎样避免三者冲突,是比单独加 GRPO-R 更大的问题。
10. 源文件资产清单
所有图片均从 arXiv LaTeX source 包提取,未使用 PDF 截图裁剪。
graphs_method.svg:Reasoning Score、CV Score、Attention Score 计算流程。graphs_case_study.svg:GSM-NoOp 上 hallucinated/true trace 对比。graphs_js_div_comparison_correct.svg:No-Op 误导步骤与非误导步骤的 Reasoning Score 对比。graphs_cv_scatter_math.svg:Math 子集早期波动示例。graphs_attention_scores_math.svg:Math 子集后期注意力回看示例。graphs_ppl_r_score_scatter.svg:Reasoning Score 与 perplexity 关系。graphs_reasoning_consistency.svg:稳定三元组与 rising 三元组的一致性分析。graphs_rising_samples_analysis.svg:Rising-2 中过度思考引入错误的分析。graphs_perplexity_Science_fine_last_plot.svg:Science 子集高分步骤与困惑度分析。graphs_data_anotation.svg:ReTruthQA 人工标注平台界面。graphs_cv_scatter_science.svg、graphs_cv_scatter_multihopqa.svg:Science/MultiHopQA 的 CV 分析。graphs_attention_scores_science.svg、graphs_attention_scores_multihopqa.svg:Science/MultiHopQA 的 Attention Score 分析。graphs_sen_analysis_math_mc3.svg、graphs_sen_analysis_multihopqa_mc3.svg:RHD 权重敏感性分析。graphs_qwen_sensitivity.svg、graphs_deepseek_sensitivity.svg:GRPO-R reasoning reward 权重敏感性分析。
11. 关键表格速查
11.1 ReTruthQA 数据规模
- MATH:57 个 samples,417 条 traces。
- MATH:平均 truthful traces 为 3.35。
- MATH:平均 hallucination traces 为 3.96。
- Science:88 个 samples,541 条 traces。
- Science:平均 truthful traces 为 3.05。
- Science:平均 hallucination traces 为 3.10。
- MultiHopQA:184 个 samples,1186 条 traces。
- MultiHopQA:平均 truthful traces 为 2.74。
- MultiHopQA:平均 hallucination traces 为 3.70。
11.2 RHD 在 R1-7B 上的主结果
- MATH AUC:0.7978。
- MATH PCC:0.4852。
- MATH MC1 / MC2 / MC3:0.6591 / 0.4765 / 0.5699。
- Science AUC:0.6528。
- Science PCC:0.2662。
- Science MC1 / MC2 / MC3:0.6207 / 0.5448 / 0.6009。
- MultiHopQA AUC:0.7361。
- MultiHopQA PCC:0.3863。
- MultiHopQA MC1 / MC2 / MC3:0.7660 / 0.6255 / 0.7103。
11.3 RHD 在 R1-14B 上的主结果
- MATH AUC:0.7292。
- MATH PCC:0.3476。
- MATH MC1 / MC2 / MC3:0.3692 / 0.3005 / 0.4644。
- Science AUC:0.7649。
- Science PCC:0.4506。
- Science MC1 / MC2 / MC3:0.6667 / 0.4714 / 0.5671。
- MultiHopQA AUC:0.7255。
- MultiHopQA PCC:0.3742。
- MultiHopQA MC1 / MC2 / MC3:0.5785 / 0.4421 / 0.5154。
11.4 GRPO-R 主结果
- DeepSeek-R1-1.5B Base:MATH500 0.772,AIME 0.333,GPQA diamond/main/extended 0.354/0.333/0.339。
- DeepSeek-R1-1.5B +GRPO:MATH500 0.770,AIME 0.333,GPQA diamond/main/extended 0.359/0.335/0.359。
- DeepSeek-R1-1.5B +GRPO-R:MATH500 0.788,AIME 0.367,GPQA diamond/main/extended 0.414/0.371/0.357。
- Qwen2.5-1.5B-Instruct Base:MATH500 0.466,AIME 0.100,GPQA diamond/main/extended 0.202/0.197/0.211。
- Qwen2.5-1.5B-Instruct +GRPO:MATH500 0.480,AIME 0.033,GPQA diamond/main/extended 0.247/0.214/0.266。
- Qwen2.5-1.5B-Instruct +GRPO-R:MATH500 0.490,AIME 0.133,GPQA diamond/main/extended 0.247/0.243/0.275。
12. 审阅修正记录
- Source Code Reviewer 要求实际训练配置必须出现完整路径;已补充以下两个路径,避免只写文件名导致复现时定位不准。
- DeepSeek-R1-Distill-Qwen-1.5B GRPO-R 配置:
open-r1/recipes/DeepSeek-R1-Distill-Qwen-1.5B/grpo/config_demo_deep_gamma_0_1.yaml。 - Qwen2.5-1.5B-Instruct GRPO-R 配置:
open-r1/recipes/Qwen2.5-1.5B-Instruct/grpo/config_demo_deep_gamma_0_1.yaml。