Writing 7 min
Place cells are easy to find. That's the problem.
Units that pass the rodent place-cell test turn up in raw pixels and in random networks. To find out whether a vision-language model knows where it is, I had to change its activations and watch the answer move.
A place cell is a neuron that fires when an animal is in one part of a room. The test for one is simple. Let the animal walk around, map where the unit fired, and check that the map carries more spatial information than shuffled versions of it do.The place fields toy runs this test live on simulated units. The number it reports, bits per spike, is the spatial information.
I ran that test on vision-language models. Each model watched a first-person walk through a 10 m ray-cast room, where every frame’s true position and heading are known. I recorded its MLP neurons along the walk and scored every unit the way a hippocampal recording is scored: rate maps, spatial information, gridness, all against shuffle nulls.
Plenty of units passed. Then I ran the same pipeline on the raw pixels of the frames, and 72% of those passed too. Random-weight networks came in at 61 to 81%.
A view is not a place
In a room, what the camera sees depends on where it stands. A unit that responds to one poster from one distance has a tidy field on the map. It responds to a view, and along a single walk a view and a place are hard to tell apart.
What separates them is heading. A place code should give the same map whichever way the camera faces. So I split each unit’s activity into four 90° heading sectors and called a place unit strictly invariant when its rate maps agree, with correlation above 0.5, across all six pairs of sectors.
| Units from | Pass the strict test |
|---|---|
| Path-integrating RNNs | 97–100% |
| VLM units, single frames | at most 0.3% |
| VLM units, walk in context | 2–29% |
| A moving average of single-frame activations | 82–88% |
The RNNs are the positive control: they are trained to integrate their own motion, and they pass, which validates the test. Single-frame VLM units almost never pass. With the whole walk in context the share rises, but a moving average of single-frame activations does better still, so that rise needs nothing beyond temporal smoothing.
The same goes for grid cells. A path-integrating RNN trained following Sorscher et al. grows hexagonal grids, and the unchanged pipeline flags 93% of the strong ones. No grids with spacing of 2 m or more appear in pixels, DINOv2, Qwen or VGGT.
So unit criteria alone can’t establish a location code. The rest of the project asks the question two other ways. Can a model do a task that needs location? And if it can, does changing its activations change its answer?
The task
One trial. After a 256-frame walk, the model sees a new view (left) and is asked whether it was taken nearer Frame 130 or Frame 149. Frame 130 is 0.1 m away but faces another way. Qwen3.8-27B picks Frame 149, 3.3 m away, which shows the same posters.
After a walk through a room, the model sees a new view and says which of two walk frames was taken nearer to it. A view counts as new when it faces more than 45° away from every walk frame taken within 1 m. No frame was taken at the same place facing the same way, so the simplest shortcut, matching what the frames look like, is gone. Chance is 50%.
Most experiments run in ray-cast rooms, where the true position and heading of every frame are known. Thirty-four photoreal Replica and HSSD scenes are rendered with Habitat.
Open models pick the frame that looks right
The base Qwen3-VL-8B stays at chance, 52%, across ten held-out rooms. Neither scale nor a published spatial fine-tune fixes this.
Claude Opus 5.5 does gain from the walk: 9.7 points in the ten held-out rooms. It reaches 72.9% there, which is 5.2 points above the best retrieval rule, with an interval of −0.3 to 10.9. That is not clearly above retrieval. GPT-6 Astra also gains from the walk in one room. Kimi K3, DeepSeek V4.1 Flash and the open models I could screen do not.
A small fine-tune learns it
LoRA on 1,136 procedural rooms, about 0.5% of the weights, with a loss on the answer only. A four-epoch recipe reaches 97.1% across ten held-out rooms, and 96.3 to 97.4% over five runs.An earlier two-epoch schedule was unreliable, at 69 to 93%.
- It beats retrieval. I tested 149 retrieval rules. The highest reaches 67.7%, and the fine-tuned model leads all of them by at least 26.0 points in every difficulty bin. A trained sequence matcher reaches 73.3%.
- It depends on the walk’s order. Ordered beats shuffled by 15.1 to 42.9 points, depending on the run. What matters is the direction of travel within short stretches: reversing each 8-frame block costs as much as reversing the whole walk, while reversing only the order of the blocks costs about what shuffling them does.
- It holds on walks unlike the training walks, at 95.5 to 97.5%.
| Novel-view trials, with the walk | Ten held-out rooms | 11 photoreal scenes |
|---|---|---|
| Fine-tuned Qwen3-VL-8B, 64-frame walk | 97.1% | 88.1% |
| The same, on a 256-frame walk | 91.4% | not run |
| Claude Opus 5.5, 256-frame walk | 72.9% | 85.0% |
| Trained sequence matcher | 73.3% | 47.8% |
| Highest of 149 retrieval rules | 67.7% | 74.9% |
Changing the activations
Accuracy says the model can do the task. It doesn’t say how, and what a probe can decode the model need not use. So I tested causally: copy activations from one trial into another and watch the decision.
Around layer 20, I copied the residual stream at the new view’s tokens from a different view.
One transplant. Both stacks are the same fine-tuned model, run on two different views. The layer-20 activations at the new view’s tokens are copied from the donor run onto the same positions in the trial. Everything after that layer runs as usual, and the decision moves. The stacks are schematic: the real model has many more layers and tokens.
| Donor view | How far the decision moves toward the other option |
|---|---|
| Taken near the other option | 0.50–0.67 |
| Taken at a random place | 0.20–0.29 |
| Taken at about the same place, facing elsewhere | 0.07–0.09 |
A view from the same place barely moves the answer, whatever it looks like. A view from the other place moves it most of the way. That is what a location code used by the decision should do.
Three more things about it:
- Where it sits. The view’s own tokens carry the location through layers 17 to 18 and pass it to the question tokens by layers 20 to 23.
- How big it is. The 50 directions along which the view’s activations vary most, out of 4,096, carry 81 to 90% of the whole copy’s effect. Fifty random directions carry nothing.
- A probe misses it. A linear readout decodes position from these activations, with 1.1 to 1.2 m error against 3.7 m by chance. Copying only the 2-d span of that readout moves nothing. The readout finds position, but not in the directions the decision uses.
I also re-rendered the eight frames the model is shown around the nearer option. Changing the place they were taken costs 21.1 to 22.4 points. Changing only the view costs 5.2 to 5.6. The decision depends more on where frames were taken than on what they show.
What it looks like in a model built for it
VGGT is a 3D model trained to estimate camera pose. It is the reference for what a location code looks like where one must exist, and it shows that the transplant method finds one.
Copying the ten main directions of its camera token from one frame to another moves the reported position 0.86 of the way to the donor. Those ten directions carry nearly all of what the whole token carries (0.86 of 0.87). The fine-tuned VLM’s ten carry 0.18 to 0.34 of the way, and it needs its top 50 for most of the effect.
So VGGT’s code is far more compact. The two models differ in architecture and training data, so this is a comparison. It does not show that pose training causes the difference.
Back to the units
With the walk in context, 8 to 17% of the fine-tuned model’s place units pass the strict heading test. That overlaps the 2 to 29% of the other Qwen-family models.It is also an undercount at that layer’s stability, and the yardstick itself is imperfect: the RNNs that validate it are trained with place-cell targets.
So the unit test and the causal test come apart. Passing the unit criteria is easy, and pixels do it. Failing the strict version doesn’t mean much either: the fine-tuned model’s heading-invariant share is low, yet its residual stream carries the location its decision reads. A negative unit test says that no units meet the criteria. It does not say the model has no location code.
Limits
- One model family. The same recipe on Gemma 4 12B did not meet the bar in three runs (54.7 to 81.3% on held-out validation rooms).
- The photoreal scenes don’t settle it. On the novel trials of the first 11 scenes the fine-tuned model reaches 88.1% against 74.9% for retrieval, a lead of 13.2 points. That is under the 15-point margin I require, so those scenes do not separate localization from retrieval.
- The transplants are from one room, 337 trials per run, across all five fine-tuning runs.
- No position code carries across rooms.
The paper, the code, and the rule and result for every experiment are in the repo.