opd_zt / docs /cd_opd_design.md
sdzt's picture
Add files using upload-large-folder tool
0637731 verified
|
Raw
History Blame Contribute Delete
9.79 kB
# CD-OPD: CFG-Distilled On-Policy Distillation for Video Hallucination Suppression
Status: design (Phase 1 motivation pending). Mirrors what we agreed on in
conversation; falsifiable kill criteria live in §6.
## 1. Problem
Vanilla OPD (Qwen-3 / Thinking-Machines style, reverse-KL, k-estimator, optional
PG wrap) is a strong post-training paradigm: dense per-token supervision from a
frontier teacher, on-policy distribution matching at the student. We are running
it via verl 0.8 from Qwen2.5-VL-72B → Qwen2.5-VL-7B on 5K video samples
(1K TemporalBench + 4K LLaVA-Video-178K) to suppress video MLLM hallucination,
mirroring the PaMi-VDPO setup but swapping VDPO → OPD.
The thing we want to attack: **Vanilla OPD assumes the teacher's per-token
distribution is uniformly reliable. For video MLLM hallucination this is false.**
The 72B teacher itself hallucinates -- it produces tokens that come from a
language prior rather than from the visual evidence -- and Vanilla OPD's
token-uniform KL distills those exact tokens into the student. The "dense
token-level supervision" claim of OPD therefore collapses into "dense
language-prior pass-through" on the very phenomenon (hallucination) we want to
suppress.
We name this failure mode **Hallucinated-Token Pass-through**.
## 2. What evidence would prove (or kill) the problem
Three Phase 1 questions, all computable from teacher inference alone (no trained
student needed):
- **F2a** -- is the teacher's per-token grounding score
`g_t := log π_T(a_t | video, prefix) − log π_T(a_t | video⁻, prefix)`
bimodal across a realistic corpus? Single-peak around zero → the grounded vs.
free-rider split we are building the method on does not exist.
- **F2b⁻** -- on the bottom-20% g_t tokens, does an external judge (GPT-4o) label
≥40% as hallucinated? If not, `g_t` is too noisy to be the supervision filter.
- **F2b⁺** -- on the top-20% g_t tokens, does the judge label ≤25% as
hallucinated? If not, type-(e) visually-anchored-but-wrong hallucinations
dominate and our CFG-style intervention will not catch them.
If any of these fails, **stop**, and re-open the challenge selection. Do not
push the method.
## 3. Method: CD-OPD
We treat the teacher distribution as a sum of "what the model says because of
the video" and "what the model says because of the language prior". To isolate
the first, we use a classifier-free-guidance style construction at the
distillation target:
```
target_logit_t(a) = (1 + α) · log π_T(a | v, prefix)
− α · log π_T(a | v⁻, prefix)
```
where `v⁻` is a frame-count-preserving perturbation of the video that strips
visual content (default: all-black frames). The student is then distilled
toward this CFG-amplified target via the same k-estimator reverse-KL machinery
as Vanilla OPD; for the PG-OPD path the per-token negative-loss becomes the
reward as before.
Properties:
- **α = 0 ⇒ vanilla OPD exactly.** Single hyperparameter, monotone ablation.
- **Token-level**, no POS tagging, no external classifier, no detection threshold.
- Connects to prior work: classifier-free guidance (Ho & Salimans 2022) and
contrastive decoding (Li et al. 2023) both use the same `(1+α)·p − α·q`
combination -- we are simply applying it at training time so the student
inherits the language-prior-debiased behaviour at inference for free
(amortisation: no extra forward at inference).
- Cost: one extra teacher forward per training step (perturbed video, same
sequence). Wall-time hit ≈ 50–70% of teacher time, which already dominates
the step. Acceptable.
### 3.1 What `v⁻` to use
Constraint: same frame count as `v` (otherwise the number of vision tokens in
the prompt changes, and `prompt_logprobs` no longer aligns with `prompt_ids`).
Three perturbations supported in code:
| name | semantics | recommended use |
| -------------- | -------------------------------------- | ----------------------- |
| `black_frames` | replace every frame with all-zero RGB | **default** (Phase 2 main) |
| `shuffle` | random permutation of frame order | ablation: time-only break |
| `mean_frame` | every frame = temporal mean of video | ablation: motion-only break |
`black_frames` is closest to "language-prior baseline" while keeping the teacher
in distribution (still a video with the right number of frames).
## 4. Implementation in verl
All changes live in this fork; no upstream PR planned.
- `verl/workers/config/distillation.py` — add `cfg_enabled`, `cfg_alpha`,
`cfg_perturbation` to `DistillationLossConfig`.
- `verl/trainer/config/distillation/distillation.yaml` — surface those knobs.
- `verl/experimental/teacher_loop/teacher_manager.py` — add
`perturb_multi_modal_data()` (operates on the videos list inside `multi_modal_data`)
and `_pad_teacher_logprobs()` helper.
- `verl/experimental/agent_loop/agent_loop.py` — when `cfg_enabled`, do a 2nd
teacher forward on `perturb_multi_modal_data(mmd, cfg_perturbation)` and
stash `teacher_logprobs_perturbed` through the same flow as `teacher_logprobs`
(typed field on `_InternalAgentLoopOutput`, extra-field promotion in
`AgentLoopOutput.as_dict`, batch concatenation in `_postprocess`).
- `verl/trainer/distillation/losses.py` — in
`compute_distillation_loss_reverse_kl_estimator`, when both
`teacher_logprobs` and `teacher_logprobs_perturbed` are present, build
`(1+α) · log p − α · log p_perturbed` as the `ref_logprob` for `kl_penalty`
and log new metrics (`distillation/cfg_grounding_mean`,
`distillation/cfg_grounding_abs_mean`, `distillation/cfg_target_shift_mean`).
Only the k-estimator loss path supports CD-OPD; the topk path is untouched and
will raise nothing -- it just runs vanilla OPD even with `cfg_enabled=True`.
That is acceptable because our running config uses `loss_mode=k1`.
## 5. Phase 1 → Phase 4 plan
| phase | what | who | gate |
|---------|-------------------------------------------------------------------|-----|------|
| **0** | Vanilla OPD continues (in-progress, finishes today ~18-19:30) | - | - |
| **1** | `scripts/compute_grounding.py` then `scripts/run_motivation_f2.py`<br>→ F2a/F2a2/F2b/F2c figures + GPT-4o judge round | local | F2a bimodal AND F2b⁻ ≥40% AND F2b⁺ ≤25% |
| **2** | Pilot CD-OPD run, α=1.0, 50 step subset, sanity check loss curves and `cfg_grounding_*` metrics | GPU | loss not NaN, grounding mean > 0 |
| **3** | Full CD-OPD runs (α ∈ {0.5, 1.0, 1.5, 2.0}, perturbation ∈ {black_frames, shuffle}) + ablations | GPU | at least α=1.0 ≥ Vanilla OPD on VideoHallucer |
| **4** | Eval: VideoHallucer + EventHallusion (main); NextQA + VideoMME + TempCompass (regression) | GPU | hallucination ↑, general ≈ |
Ablation matrix (each row is one training run):
| run | cfg_enabled | α | perturbation | purpose |
| --- | ----------- | - | ------------ | ------------------------------------------ |
| A0 | False | - | - | Vanilla OPD baseline (already running) |
| A1 | True | 1.0 | black_frames | **CD-OPD main** |
| A2 | True | 0.5 | black_frames | α-sweep low |
| A3 | True | 1.5 | black_frames | α-sweep high |
| A4 | True | 2.0 | black_frames | α-sweep over-correction check |
| A5 | True | 1.0 | shuffle | perturbation: time-only ablation |
| A6 | True | 1.0 | mean_frame | perturbation: motion-only ablation |
## 6. What would change my mind
- **Phase 1 kill criteria fire** → CD-OPD as designed cannot work. Pivot
back to choosing a different challenge (most likely candidates: detection
via teacher self-consistency, or attention-distillation based grounding).
- **F2a bimodal but α-sweep shows monotone decreasing eval at any α > 0**
CFG target is producing valid-shape distributions but the wrong direction
of effect. Consider sign flip or contrastive triplet form (Variant B from
the chat) instead of CFG-additive.
- **Vanilla OPD beats CD-OPD on general benchmarks by >2 pt** → the CFG
amplification is collateral-damaging the parts of teacher behaviour that
are correct boilerplate. Mitigations: lower α; combine with a
content-token mask so CFG only fires on noun/verb/number tokens.
## 7. Related work positioning
- **PaMi-VDPO** (Wang et al., arXiv 2504.05810). Same dataset / hallucination
niche, uses frame perturbation but for DPO negatives. We share the
perturbation primitive; we use it as a CFG branch on top of OPD instead.
- **Video-OPD / TVDF** (Li et al., arXiv 2602.02994). Same OPD-for-video
niche, but their teacher reliability check uses **ground-truth IoU
annotations** for sample-level filtering on closed-form TVG. We address
open-ended captioning / QA where no per-sample GT exists, and our
reliability signal is **intrinsic** (visual counterfactual) and
**token-level**.
- **TCOD** (Wang et al., arXiv 2604.24005). Different OPD failure mode
(trajectory-level KL instability in multi-turn agents). They use a
trajectory-depth curriculum; we use a per-token CFG target. We borrow the
narrative structure (name a failure, propose a small fix) but not the
method.
- **Classifier-free guidance** (Ho & Salimans 2022) and **contrastive
decoding** (Li et al., 2023). Same `(1+α)·p − α·q` construction, but they
apply it at **inference** to a single model with two conditionings. We
apply it at **distillation** so a student amortises it -- inference is
one forward, no overhead.