- Jacobian lenses for the OLMo-3-7B post-training ladder
- Why this exists
- Contents
- Load and use
- Result 1 β post-training installs a viewpoint, decoupled from capability
- Result 2 β Ignition test (Dehaene & Naccache's "decisive experiment")
- Result 3 β the full reviewer battery (every test Dehaene & Naccache proposed)
- Result 4 β metacognition: a covert error signal in the base model, made reportable by post-training
- External validation & the refit-noise floor
- Scope relative to Neuronpedia's lenses
- How they were fit
- Caveats
- Provenance & license
- Why this exists
Jacobian lenses for the OLMo-3-7B post-training ladder
Fitted Jacobian lenses for the full open OLMo-3-7B post-training ladder β the base model and ten post-trained variants. These are the artifacts behind the first quantitative, fully-reproducible test of Anthropic's post-training "point of view" observation β plus a run of the ignition test that Dehaene & Naccache asked for and that had not been run.
Anthropic report (qualitatively, no numbers, on the closed Sonnet 4.5) that the J-space is present already in the pretrained model, but that "during post-training, the J-space develops some signatures of adopting 'Claude's point of view'": "in the base model, the J-space mostly tracks what's needed to predict upcoming text; in the post-trained model, it starts holding Claude's own reactions." In plain terms: post-training shifts the model's internal workspace from what word comes next to also carrying its own stance as the Assistant β its reactions, caveats, and values. These lenses give the first quantitative version of that shift, on fully open weights.
A Jacobian lens is not a sparse autoencoder. It is the averaged forward Jacobian
J_l = E[βh_final/βh_l] of a frozen model; reading unembed(J_l Β· h) recovers the tokens a
layer's activation is poised to report β the model's "verbalizable" content. Method and
reference code: Anthropic's jacobian-lens
(Apache-2.0). Fit and analysed with the companion
jlens-lab.
Why this exists
The Anthropic result rests on Sonnet 4.5, whose activations no external party can access β the paper's own invited commentators (Dehaene & Naccache) could not check it. AI2's OLMo-3 is the only open family shipping a base model, its post-trained variants, and a clean method-vs-domain factorial. These lenses make the claim checkable by anyone.
Contents
| file | arm | model_type |
|---|---|---|
lenses/olmo-3-1025-7b.pt |
base | olmo3 |
lenses/olmo-3-7b-instruct-sft.pt |
Instruct Β· SFT | olmo3 |
lenses/olmo-3-7b-instruct-dpo.pt |
Instruct Β· DPO | olmo3 |
lenses/olmo-3-7b-instruct.pt |
Instruct Β· final | olmo3 |
lenses/olmo-3-7b-think-sft.pt |
Think Β· SFT | olmo3 |
lenses/olmo-3-7b-think-dpo.pt |
Think Β· DPO | olmo3 |
lenses/olmo-3-7b-think.pt |
Think Β· final | olmo3 |
lenses/olmo-3-7b-rl-zero-math.pt |
RL-Zero Β· Math | olmo3 |
lenses/olmo-3-7b-rl-zero-code.pt |
RL-Zero Β· Code | olmo3 |
lenses/olmo-3-7b-rl-zero-if.pt |
RL-Zero Β· IF | olmo3 |
lenses/olmo-3-7b-rl-zero-general.pt |
RL-Zero Β· General | olmo3 |
RL-Zero-Mix is deliberately absent: it is olmo2-retrofit, a different base architecture,
so its J-space is not comparable to the olmo3 arms.
Each lens covers 11 source layers (0, 3, β¦, 30 β every third of 32) at d_model=4096,
fit on 616 wikitext prompts, stored fp16. For a full 31-layer base lens (used for
the ignition readout), use Anthropic's published olmo-3-1025-7b lens on
Neuronpedia's neuronpedia/jacobian-lens.
Load and use
pip install git+https://github.com/anthropics/jacobian-lens.git
pip install git+https://github.com/m9h/jlens-lab.git
import jlens
from jlens import JacobianLens
from transformers import AutoModelForCausalLM, AutoTokenizer
lens = JacobianLens.from_pretrained("mhough/olmo3-jacobian-lenses",
filename="lenses/olmo-3-7b-instruct.pt")
tok = AutoTokenizer.from_pretrained("allenai/Olmo-3-7B-Instruct")
hf = AutoModelForCausalLM.from_pretrained("allenai/Olmo-3-7B-Instruct",
dtype="bfloat16", device_map="cuda").eval()
model = jlens.from_hf(hf, tok)
# read the workspace content at the last token, layer 18:
lens_logits, model_logits, ids = lens.apply(model, "The capital of France is",
layers=[18], positions=[-1])
See reproduce.py for a runnable check.
Result 1 β post-training installs a viewpoint, decoupled from capability
Distance from the base lens, cos(J_base, J_arm), mean over the 11 shared layers, against a
~0.97 same-model refit floor (the floor is layer-dependent β see
External validation):
| arm | cos(base, arm) | move |
|---|---|---|
| Instruct (SFT+DPO) | 0.69 | ~31% |
| Think (SFT+DPO) | 0.73 | ~27% |
| RL-Zero (RLVR only) | 0.94 | ~6% |
| RL-Zero domain pairwise | β₯ 0.992 | ~1% |
- Method sets the magnitude, not domain: instruction/CoT tuning moves the J-space ~5Γ more than RLVR; varying the RLVR domain (math/code/IF/general) at matched capability adds only ~1%.
- Decoupled from capability: MMLU is flat-to-slightly-down across post-training while the J-space moves ~31% β a representational shift with no competence gain, i.e. a viewpoint change, not a prediction gain.
- Anchor-gated, and now externally cross-validated: the base fit reproduces the published
olmo-3-1025-7blens (identity_distance0.2199 vs 0.2209, 0.4% error). Against Neuronpedia's independently fitted lens for the same model, the final layer agrees to cosine 0.9998 β see below. - β Corrected 2026-08-02 β read the pooled numbers above against a per-layer floor. The
table's cosines are means over 11 layers whose refit floors run 0.884 (layer 0) to 1.000
(layer 30). Recomputed as excess over the per-layer floor: Instruct 29.4%, Think
25.1%, RL-Zero ~2.9%. Two consequences: the method ratio strengthens from
5Γ to **10Γ**, and RLVR's ~6% halves to ~3% β about half of it was two fits disagreeing. The movement is also early-layer concentrated (Instruct 49.9% beyond floor at layers 0β9 vs 10.6% at 21β30), which the pooled statistic hides. Full working:results/posttrain/perlayer_floor_correction.md. - Capability-controlled: RL-Zero overall-MMLU spread is 1.7pp (in noise), no domain diagonal β so the ~1% geometry differences are not capability artifacts.
Full write-up with the null correction and caveats: results/post-training-point-of-view.md.
Result 2 β Ignition test (Dehaene & Naccache's "decisive experiment")
Their commentary singles out ignition β all-or-none entry into the workspace β as the signature the paper "does not establish," and prescribes grading a concept's evidence and testing whether J-space representations "switch on with a threshold-like nonlinearity, while earlier layers rise monotonically." Nobody had run it (Claude closed, Anthropic didn't). Run here on OLMo-3 via the published 31-layer lens, using an onβoff concept contrast:
- No concept without evidence (contrast β0 at k=0), then all-or-none entry (a step at the first clue, then saturation β not a graded ramp).
- Sustained in the workspace, transient in early layers: early layers respond to the
first clue then decay (keep
16%), the workspace band holds it (67%) β exactly Dehaene's ignition ("a sustained, broadly distributed state") vs subliminal ("a delimited wave β¦ which quickly dies away").
This first pass establishes the persistence half of ignition. The graded mid-range
threshold and the bifurcation are delivered by the v2 clue set β see the full reviewer
battery below. Write-up + confound analysis: results/ignition_result.md.
Result 3 β the full reviewer battery (every test Dehaene & Naccache proposed)
All six tests the reviewers asked for, implemented and run on OLMo-3
(results/reviewer_tests_results.md, raw in modal_reviewer_tests.py). Honest mixed
outcome β two clean workspace signatures, one partial, three inconclusive under first-pass
adaptations whose flaws are documented:
| test | result |
|---|---|
| Ignition (graded threshold + bifurcation) | β workspace saturates with evidence, early flat; across-subset bifurcation present |
| Metacognition / error monitoring (C2) | β workspace uncertainty higher for wrong answers (+1.4 vs β1.6) |
| Dual-task interference | β οΈ first concept weakens when a second is held (3/5 pairs) |
| Trace conditioning | β inconclusive β explicit-rule design β Lindsey's implicit association (fix noted) |
| Avoidance (inclusion/exclusion) | β inconclusive β 0% avoid-failure baseline (fix noted) |
| Localβglobal | β inconclusive β abstract strings a poor oddball analog (fix noted) |
This is more of the human-consciousness battery than has been run on the record for any model, and every number is reproducible.
Result 4 β metacognition: a covert error signal in the base model, made reportable by post-training
A new direction, connecting to the LLM-metacognition literature (survey: arXiv 2607.11881) and the introspection debate. Reading the base model's workspace recovers an uncertainty signal that predicts whether its own answer is wrong β beyond the model's output confidence (n=200 TriviaQA):
- Structure: per-layer AUROC rises ~0.5 (early) β 0.69 (workspace) β 0.72 (late) β the metacognitive signal emerges in the workspace band.
- Covert (the key control): within matched output-entropy terciles the workspace still separates right from wrong (AUROC 0.64 on confident-looking answers) β it "knows more than it says." Output-confidence baselines for reference: ECE 0.11, meta-sensitivity (type-2 AUROC) 0.80.
- Across the ladder β post-training installs reportability: the base model's verbal self-evaluation (P(True)) is at chance (0.51) while its workspace covertly tracks errors (0.66); post-training raises verbal self-eval to 0.78 (Instruct) / 0.72 (Think) β via SFT+DPO, not RLVR (RL-Zero 0.52β0.55). Post-training does not create the self-monitoring signal; it makes a pre-existing covert one reportable.
This is the "mechanistic evidence of a dissociable second-order process" the introspection
Reality Check (Singh, Linzen & Ravfogel) calls for. Full write-up:
results/metacognition_result.md; lineage + concept-injection tooling: docs/technique-lineage.md.
External validation & the refit-noise floor
Neuronpedia (with Anthropic) publishes pre-fitted J-lenses at
neuronpedia/jacobian-lens, including
olmo-3-1025-7b. That gives an independent second-party fit of the same base model β the
first external check of this pipeline. Full write-up + reproduce snippet:
results/neuronpedia_crossvalidation.md.
These are genuinely independent fits (0 of 11 shared layers bit-identical; both converged at
n_prompts=616 under the same stopping rule β a protocol coincidence, not a copy). The
estimator is identical: jlens-lab calls jlens.fitting.jacobian_for_prompt from
Anthropic's reference package, the same library Neuronpedia vendors, so the documented
convention β sum the cotangent over later target positions, then average over source positions β
and the attention-sink position masking are shared. JΜ is deliberately not a plain
per-position Jacobian average; that is a property of the shared reference implementation, not a
difference between the two fits.
| layer | 0 | 6 | 12 | 18 | 24 | 30 |
|---|---|---|---|---|---|---|
| cosine | 0.884 | 0.944 | 0.976 | 0.993 | 0.997 | 0.9998 |
| rel. Frobenius diff | 0.478 | 0.331 | 0.217 | 0.121 | 0.075 | 0.020 |
Mean cosine over the 11 shared layers is 0.966 (computed in float64).
The refit floor is strongly layer-dependent, and this matters for reading Result 1. Two independent fits of the same model differ by 48% in Frobenius norm at layer 0 and 2% at layer 30. So the pooled ~0.97 floor understates the noise early and overstates it late:
- In the mid-to-late workspace band, where the ignition and metacognition readouts live, the floor is 0.99+ β a post-training cosine of 0.69 is far above noise.
- At layer 0, the floor is only ~0.88, so early-layer J-space comparisons carry much less weight than the pooled number implies.
Result 1 stands β the post-training shift is well above the floor where it is measured β but the honest presentation is excess over a per-layer floor, not a single pooled one. Early-layer statements should be read with that in mind.
Numerical note: compute these cosines in float64. Over 4096Γ4096 matrices, float32 accumulation returns values above 1.0 (we saw 1.0057).
Scope relative to Neuronpedia's lenses
Neuronpedia's J-lens covers 38 models, and for OLMo-3 it ships the base models
(olmo-3-1025-7b, olmo-3-1125-32b) fitted on wikitext. This repo's contribution is the
post-training axis β ten post-trained variants spanning SFT / DPO / final for both Instruct
and Think, plus four RL-Zero arms β which is what makes the post-training claim testable rather
than a single before/after pair.
How they were fit
Matching the published olmo-3-1025-7b config, on B200 / dim_batch=128:
n_prompts=616 dataset=Salesforce/wikitext (wikitext-103-raw-v1, train)
max_seq_len=128 layer_step=3 target_layer=final dtype=bfloat16
Fit is a plain mean over prompts (sharded exactly across 8 workers). Reproduce end-to-end:
m9h/jacobian-lens/modal_olmo_ladder.py
(anchor β capability_all β ladder β analysis).
Caveats
- Cosine is a magnitude measure β how much the J-space moved, not in what organized way.
- The same-model refit floor is layer-dependent (~0.88 at layer 0, ~0.9998 at layer 30); early-layer comparisons are weakly determined and should not be read against the pooled floor.
- RL-Zero is a light intervention (~6% from base); the ~1% domain signal is small.
- Capability is measured by multiple-choice log-probability, which under-scores chat-tuned models; it rules out a gross capability confound, not subtle ones.
- One model family (OLMo-3); a second-family replication is designed but not yet run.
- Not peer-reviewed. Derived from open artifacts only.
Provenance & license
Apache-2.0, matching OLMo-3 (weights) and jacobian-lens (method). Derived from
allenai/Olmo-3-* via the open jlens / jlens-lab stack. Work by Morgan Hough, Orthogonal Research and Education Lab (OREL); not affiliated with Anthropic or AI2.
Model tree for mhough/olmo3-jacobian-lenses
Base model
allenai/Olmo-3-1025-7B