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 * pcc

3.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/*.pyRHD/utils/get_hidden_score.pytrl/trl/trainer/grpo_config.pytrl/trl/trainer/grpo_trainer.py 以及 open-r1/recipes/*/grpo/config_demo_deep_gamma_0_1.yaml

Paper ConceptSource FileKey Class/Function
Reasoning Score / LogitLens JSDRHD/utils/get_hidden_score.pyLRM_Hidden_Score.process_batch, LRMScorer.compute_lrm_score
RHD feature extractionRHD/hallucination_detection.pycompute_scores_for_steps, main
Hallucination score componentsRHD/hallucination_score.pycompute_hallucination_scores
Binary detection evalRHD/hallucination_eval_task1.pyevaluate_hallucination_detection
Multi-trace ranking evalRHD/hallucination_eval_task2.pyhallucination_MC_calcs, evaluate_hallucination_detection
GRPO-R config flagstrl/trl/trainer/grpo_config.pyenable_deep_think_reward, deep_think_mature_layer, deep_think_candidate_layers, deep_think_gamma
Step score during RLtrl/trl/trainer/grpo_trainer.py_get_score_deep_think, _process_deep_think_batch
Reward shapingtrl/trl/trainer/grpo_trainer.py_apply_potential_based_reward_shaping, _normalization_step_scores
Actual launch configsopen-r1/recipes/.../config_demo_deep_gamma_0_1.yamlmodel path, dataset, LR, LoRA, generation count, gamma

5.2 RHD 代码路径

RHD/utils/get_hidden_score.py 中的 LRMScorer.compute_lrm_score 与论文公式直接对应。它输入 R_scoresreasoning_matrix 和可选 entropy_scores。第一部分计算局部突降与 wavelet 高频能量,作为早期波动的补充实现;第二部分选择后期步骤,检查其 top attention 是否指向低分位或 的早期步骤;第三部分计算前半段 std/mean 得到 CV_score;若有 entropy_scores,它会归一化 perplexity 与 R score,并计算一阶差分的 Pearson correlation pccRHD/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_rewarddeep_think_mature_layerdeep_think_candidate_layersdeep_think_gammatrl/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-6gradient_accumulation_steps=4per_device_train_batch_size=4num_generations=4max_completion_length=7680,LoRA r=16, alpha=16deep_think_mature_layer=28candidate_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-5per_device_train_batch_size=16num_generations=16max_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.pyLLMScorer 包含硬编码第三方 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>WaitButHoweverHmmAlternatively 等认知转折词切,再按 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.svggraphs_cv_scatter_multihopqa.svg:Science/MultiHopQA 的 CV 分析。
  • graphs_attention_scores_science.svggraphs_attention_scores_multihopqa.svg:Science/MultiHopQA 的 Attention Score 分析。
  • graphs_sen_analysis_math_mc3.svggraphs_sen_analysis_multihopqa_mc3.svg:RHD 权重敏感性分析。
  • graphs_qwen_sensitivity.svggraphs_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