← Back to project

3d-gen · Why VLM hiddens fail as spatial conditioning — diagnosis, fixes, and internalization

RoPE position-blindness probes · 6-arm conditioning ablation · prod position-stamp fix · DINO-distilled VLM · 2026-07-13
analysisablationfix

TL;DR

Root cause found: qwen's RoPE never writes position into the residual stream — position decodability is flat across all layers (linear R² ~0.52–0.59 vs DINOv3 0.94). The flow can't tell where a patch token came from.
Two working fixes: ADD-fusing real DINO features onto qwen tokens hits 0.380/0.327 IoU (≈ fusion, half the cond length) at just 2k steps; a single constant position-stamp table lifts the prod qwen-only plateau 0.256 → 0.319 (+25%).
What does NOT work: distilling the fusion teacher's velocities into a qwen-only student (KD) gains nothing — information absent from the student's input cannot be mimicked. And DINO-distilling the VLM improves its hiddens 2.5× without changing AR rollout at all — hidden quality is consumed by flow conditioning, not AR generation. Final verdict: after flow adaptation the internalized VLM lands at 0.287–0.292 — below the 0.319 stamp baseline; probe gains did not transfer (§5b).

0 · All approaches at a glance

ApproachMechanismHeld-out IoU mean / medSteps × DataVerdict
fusion concat (prod, qwen+DINO)qwen + DINO tokens concatenated (cond length 2074)0.400 / 0.330prod · 425kreference
qwen-only prod plateaulast-layer read-once cross-attn0.256 / 0.12928k × 425kthe problem
VLM AR rolloutautoregressive discrete 3D tokens0.041–0.064dead end — tokenizer ceiling 0.197 caps it
cross (ablation baseline)prod mech at ablation scale0.202 / 0.1238k × 16kbaseline for the arms below
crosspos+ generic 2D sincos, pre-connector0.273 / 0.1568k × 16kworks — slow adoption
crossdpos+ DINO-native position signature, post-connector0.264 / 0.1868k × 16kworks — instant adoption, best median
plkv8-layer per-layer-KV taps0.235 / 0.16912k × 16ksmall real gain, gate-limited
crossdaddreal per-asset DINO ADD-fused onto qwen tokens0.380 / 0.327 (n=14)2k × 16k≈ fusion at half cond length
KD (fusion→qwen mimicry)fusion-teacher velocity distillation into qwen-only student0.249 / 0.144 (vs 0.264 warm-start)16k assetsNO gain — closed
prod DinoPosStampconstant 1024×1024 position table, post-connector0.319 / 0.16–0.1922k × 425kdeployed fix, +25%
DINO-distilled VLM (internalization)aux heads regress frozen DINOv3 patch features per position, then flow adaptation on rebuilt caches0.287–0.292 (ckpt-2000/4000/6000; fusion 0.398–0.407 intact) — below the 0.319 stamp baseline1 epoch VLM · flow adapt killed @6k by protocolNEGATIVE — probe decodability (R² 0.657) did not transfer to conditioning utility; representation shift (cos 0.30 vs old hiddens) disrupted what the flow exploited; 10k-adaptation caveat noted

1 · Problem: qwen-only conditioning plateaus far below DINO-fused

Conditioning pathSS IoU@64Note
qwen-only hiddens (prod mech)0.256plateau — flat 10k steps, 425k assets
DINO-fused hiddens0.403same data / steps / flow
VLM AR rollout (discrete tokens)0.04–0.06discrete-tokenizer ceiling is 0.197

2 · Diagnosis: probes show the VLM is position-blind (and mostly content-lossy)

RepresentationLinear probe R²Mean position error (/32 patches)
DINOv3 patch features0.9411.68
qwen layer 10.535~4.2–4.8
qwen layer 80.518
qwen layer 170.593
qwen layer 240.554
The flow receives tokens that neither say where they are (address) nor fully what is there (content). Position is the cheap fix; content is the deep one.
Ablation IoU curves (left) and position-probe bars (right). The probe bars are the diagnosis: qwen position R² is flat ~0.52–0.59 at every depth while DINOv3 sits at 0.94 — the residual stream simply never carries the address.

3 · Six-arm conditioning ablation: what actually closes the gap

ArmMechanismIoU@64 mean / medNote
crosslast-layer read-once cross-attn (prod mech)0.202 / 0.123baseline
crosspos+ generic 2D sincos, pre-connector0.273 / 0.156slow-burn — needs 2–4k steps before the flow exploits it
crossdpos+ DINO-native position signature (content-averaged DINO features), post-connector0.264 / 0.186instant adoption already at 2k steps
plkv8-layer per-layer-KV taps0.235 / 0.169 (12k steps)real but small — zero-init gates open to only ~10–16%
crossdaddreal per-asset DINO features ADD-fused onto qwen tokens (cond length 1045 vs concat-fusion 2074)0.380 / 0.327 (n=14, at just 2000 steps)≈ fusion level — superposition interference negligible
KDfusion-teacher velocity distillation into qwen-only student0.249 (vs 0.264 warm-start)NO GAIN — kd residual floors at 0.0186
crossdadd: 0.380/0.327 at 2k steps ≈ fusion quality at half the cond length. Adding DINO features directly onto qwen tokens works — the two signals coexist in superposition with negligible interference.
KD is a dead end: a student whose input lacks the spatial information cannot mimic a teacher that has it. Mimicry cannot create information.
Full-chain 3D renders, arms vs GT. crossdadd reconstructions track GT layout; the plain cross arm loses object placement and proportions.
SS-only occupancy meshes — the most diagnostic view. Position-augmented arms recover coarse geometry where the position-blind baseline smears or drops structure.

4 · Prod fix: the DinoPosStamp (+25% from one constant table)

CheckpointIoU@64 meanIoU@64 med
plateau (before)0.2560.129
+2k steps0.2910.16–0.19
final0.319 (+25%)
fusion arm (control)0.397–0.400unaffected — stable across 7 measurements
0.256 → 0.319 (+25%) from a single constant lookup table. Position really was the address problem the probes said it was.
PROD before/after the position stamp: same assets, same flow — the stamped run recovers placement and coarse shape the plateaued run had lost.

5 · Internalization: DINO-distilling the VLM itself (OLA-VLM-style, REPA-shaped)

GateBeforeAfterVerdict
held-out content probe R² (hidden → DINO)0.2580.6572.5× — green
3D-understanding NLL0.5820.502improved — green
rollout format validity2/33/3improved — a real distillation win
VQA task-mode (code-spew rate)1/32/3caveat: task-mode drift
AR rollout IoU (n=6)0.0400.039unchanged — dissociation
KD negative result: the distilled student (0.249) does not even recover its own warm-start (0.264). The teacher's velocities encode spatial information the student's input never contained.
AR rollout before/after DINO distillation — visually and numerically unchanged (0.040 → 0.039). The dissociation evidence: better hiddens feed the flow, not the AR head.

5b · Flow adaptation verdict: probe gains did not transfer (NEGATIVE)

Checkpoint (flow adapted on internalized-VLM caches)qwen-only IoU@64fusion control
step-0 (unadapted sanity)0.1490.397
ckpt-2000 / 4000 / 60000.287–0.292 (flat)0.398–0.407 (intact)
baseline: old VLM + DinoPosStamp0.3190.397–0.400
NEGATIVE: probe decodability (R² 0.258→0.657) did not transfer to conditioning utility — the adapted flow lands at 0.287–0.292, BELOW the 0.319 old-VLM+stamp baseline. Representation shift (cos 0.30 vs old hiddens) disrupted what the flow had learned to exploit. Caveat: adaptation stopped at 6k by protocol; a 10k+ run was not tested, but the flat 2k→6k trend argued against it.

6 · External corroboration: the field hit the same wall

7 · Takeaways + next

single-seed, 13-14 held-out assets, IoU@64 raw; asset-level 95% CI ≈ ±0.09-0.12; orderings within ~0.03 should be read as ties — multi-seed planned for the final writeup