Actor-ReF-Critic

用户在问:我们不是用 8B 的模型作为参考/teacher 模型吗?为什么 teacher 数据还是空的?

让我理清一下架构:

  • Actor: Qwen3-4B (LoRA)
  • Ref: Qwen3-4B (LoRA)
  • Critic: Qwen3-8B (LoRA) — 这是 value model,用于计算 advantage
  • Teacher: 实际上是用 ref_model(也是 Qwen3-4B)作为 EMA teacher

所以 8B 是 Critic(value head),不是 Teacher。Teacher 是 ref_module_fsdp = Qwen3-4B。

但用户的理解可能是:8B 应该是更大的模型,应该提供更好的 logits 作为 teacher。但实际上 DistIL 架构中:

  1. Teacher model 用于生成 target logits 来指导 student(actor)学习
  2. 这个 teacher 初始化时等于 ref_model(Qwen3-4B),然后通过 EMA 从 actor 更新
  3. Critic (Qwen3-8B) 只负责 value function / advantage 计算

所以用户可能混淆了 Critic 和 Teacher 的角色。

不过关键问题不在于哪个模型做 teacher,而在于 self_distillation_mask 为 0 导致没有样本进入蒸馏路径。即使有 teacher model,如果 mask=0,loss 也是 0。

让我再仔细看一下... 用户说的"8B的数据作为参考答案",可能指的是 critic 给出的 reward/value 作为某种参考?或者用户认为 8B 应该扮演 teacher 角色?

不管怎样,核心问题确实是 self_distillation_mask 全为 0。我需要向用户解释清楚:

  1. DistIL 中 Teacher ≠ Critic。Teacher 来自 ref_model(4B),Critic(8B)只算 advantage
  2. 但即使 teacher 存在,self_distillation_mask 过滤掉了所有样本
  3. 这和 LoRA 无关,纯粹是 distil.yaml 的阈值配置问题
    好问题!这里有个重要的架构区分
组件 模型 职责
Actor Qwen3-4B (LoRA) 策略网络,生成 response
Ref Qwen3-4B (LoRA) KL 基线,同时也是 Teacher 的初始化来源
Critic Qwen3-8B (LoRA) Value Head,计算 advantage/reward
Teacher = Ref (Qwen3-4B) + EMA 更新 提供 target logits 做蒸馏

8B (Critic) 不是 Teacher。它只负责打分(reward → advantage)。

Teacher 实际上是 4B (Ref),通过 fsdp_workers.py line 905 赋值:

self.actor.teacher_module = self.ref_module_fsdp   # ← 就是 Qwen3-4B Ref

所以数据流是:

Actor(4B) 生成 response
    ↓
Critic(8B) 打分 → reward/advantage  ✅ 正常工作(vf_loss=7~8)
    ↓
Teacher(4B=Ref) 用 reprompt 重新推理 → target logits → 蒸馏 loss  ❌ mask=0 被跳过

问题出在第 3 步:Teacher 模型存在且能工作,但 success_reward_threshold=0.5 把所有样本都过滤掉了,导致没有一个样本走蒸馏路径。跟 8B 无关,跟 LoRA 也无关,纯粹是阈值配置和 chemistry 任务不匹配的问题。

刚才的修复(threshold=-1e9 + 关闭自样本过滤)就是让第 3 步正常执行。可以重跑试试。

posted @ 2026-06-10 01:57  GraphL  阅读(7)  评论(0)    收藏  举报