Hi everyone,
This follows my first post, where the takeaway was that the single-view wall is an information wall: the local geometry one patch sees isn’t enough to separate similar objects. This post lets one LM move across several real viewpoints within a single episode and accumulate evidence, to see how much “recognition through movement” delivers on real data. It delivers — but movement also introduces a new failure mode, and fixing it turned out to be more interesting than I expected. Still no changes to Monty’s core; everything is in subclasses.
Making the sensor move
Accumulating evidence across frames has a prerequisite: patch locations, displacements, and pose vectors from different frames must live in one shared coordinate frame, or the accumulation is meaningless. Two things (in a subclass): unproject with the full intrinsics fx/fy/cx/cy (the previous post noted the environment hard-codes the iPad’s hfov); and use the ground-truth camera poses BOP provides (cam_R_w2c / cam_t_w2c) to express every frame’s point cloud in a shared world frame.
An honest boundary: on a real robot this step corresponds to extrinsics from arm kinematics or SLAM; here I use the dataset’s ground truth to isolate the one thing I want to test — whether movement itself disambiguates. One engineering byproduct: with true intrinsics, answer-correct (including timeouts where the answer was right) went from 22/32 to 27/32 — the unprojection geometry got honest.
It works: 75%, and one clean proof
Across the 8 objects with multiple viewpoints: 6/8 confident-correct (75%), versus 12% for the single-view baseline.
The cleanest proof is master_chef_can (Fig. 1). Each of its 4 frames on its own times out — the leader and runner-up stay locked together, exactly the pattern from the last post’s Fig. 2. Chain the 4 frames into one episode and it commits, correctly, at ~137 steps — a few steps after the second viewpoint arrives. Same object, same LM; the only difference is whether the sensor moves.
One caveat: part of this gain comes from frame quality (I picked frames with high visibility). “Seeing more clearly” and “seeing from more angles” stack here — it isn’t all movement.
But movement introduced a new failure
In some episodes, within one or two steps after a viewpoint switch, the leading object’s evidence suddenly drops by more than half, and the episode then commits wrong, or misses a commit it should have made (Fig. 2, top). This isn’t noise or natural decay — the leading hypothesis is being deleted.
Diagnosis: the deletion step misfires on the switch transient
This traces to the official BurstSamplingHypothesesUpdater, which deletes “unpromising” hypotheses by the slope of their evidence growth (deletion_trigger_slope). The mechanism: on the step where the viewpoint switches, the new viewpoint’s first observations haven’t aligned with the existing hypotheses yet, so every hypothesis’ evidence wobbles and its slope briefly goes negative. The updater deletes this batch of “apparently stalled” hypotheses — including the correct one. Within a viewpoint it works well; the problem is confined to the short transient right after a switch.
Fixing it, official knobs first
Following “don’t reinvent the wheel,” I first swept the official knobs: deletion_trigger_slope levels, and fixed cooldowns (min_eval_steps, and pausing termination right after a switch). None of the five configurations simultaneously gave zero errors, no slowdown, and kept within-view pruning — a fixed cooldown is a blunt instrument: too short does nothing, too long kills the fast, correct commits that happen within a viewpoint.
The official future-work actually has a matching idea: the out-of-model-movements (OOMM) grace period — “after a large movement, give hypotheses a few steps of amnesty before judging them.” I instantiated that for viewpoint switches as a small fix (in a subclass): reset the updater’s slope window on a switch, so the known large action (“change viewpoint”) gets a few steps of deletion amnesty while within-view pruning continues as before. Result: 7 correct / 1 wrong, median ~135 steps (Fig. 2, bottom).
A few observations for the team
- The slope-based deletion criterion misfires on known large actions like a viewpoint switch. Rather than tuning the deletion threshold, it might be cleaner for the environment to give the LM an explicit “I just made a large movement” signal that the deletion logic can defer on — curious how the team sees this direction.
- A fixed cooldown can’t satisfy both sides (fast within a view, stable right after a switch); a context-dependent grace period fits better than a global threshold.
- True-intrinsics unprojection is necessary for cross-frame consistency, not just an accuracy nicety — worth exposing the full intrinsics at the environment level.
What I’m trying next
One LM can move now and reaches 75%. But the signature of the Thousand Brains theory is many LMs in parallel — each sensing part of an object, voting to reach consensus. Next I want to get voting working on real data: several LMs looking at the same object from different positions, then voting, to see whether it buys back speed, or precision too.
(Code and configs are in monty-realworld; happy to hear where my fix is wrong.)







