Steer on a Sphere: Geometric Control of Transformer Outputs

Hi everyone, I’m looking for feedback on some findings from a preprint.
Transformer hidden states live on a sphere whose radius is the per-layer RMSNorm scale — ‖γ_l‖, not √d. This varies across architectures (DeepSeek-7B hits 3.7 at layer 0; Mistral-7B hits 16.6 at the same dimension).
Key findings:

  • Tangent traversal — one tangent step along any token’s LM-head direction reaches 91–98% of the vocabulary at rank 1 across 4 model families, with a 100% never-lower guarantee.
  • Cow tipping — some tokens (digit 0, NULL byte, cut, ere) are self-reinforcing fixed points. Feed them in and the model repeats them forever. The digit 0 locks with p=0.974 and cos≈1.0, triggered by plain phone numbers (000-000-0000). Each model has its own vocabulary-specific pits, derivable from weights with no training.
  • Defensive encoding — put a pit trigger at the end of a page, and a scraper that terminates on it falls into a repetition loop. NULL bytes are invisible to humans.
  • Edge of chaos — the Lyapunov rate clusters near λ·L ≈ 0.5 for 6 of 13 tested architectures (a theory, not a law).
    Repo: GitHub - ntrillard/transformer-geometry · GitHub
    Paper: Steer on a Sphere: Geometric Control of Transformer Outputs | Zenodo
    It’s a preprint — the geometric picture is approximate.
5 Likes

Hmm… for now, I tried a few lightweight experiments based on the paper and repo, and I can reproduce quite a lot of the results, but I may be missing which exact method contract is supposed to be canonical:


My current impression is actually fairly positive: most of the empirical signal seems to survive when I try to reproduce it. The main thing I am having trouble pinning down is not whether the effect exists, but exactly which steering definition/runtime should be treated as the canonical reproduction contract.

The single most useful artifact, if it still exists, would probably be the original script/notebook/config that generated the paper’s 4 models × 1,000 random tokens steering table. In particular, that would settle whether the table used the raw tangent written in the paper, the normalized tangent used in the current repo, and which radius convention was applied.

If that original script is no longer around, even just clarifying which of the two steering parameterizations below is canonical would probably resolve most of my uncertainty.

For context, here is what I was able to reproduce:

  • The seven published Qwen2.5-7B pit tokens can be recovered very closely under a pinned BF16/SDPA runtime; all seven self-predict, and the reported s(T) values come back almost numerically unchanged.
  • Using the same recovered runtime and the released normalized-hidden → LM-head path, all seven remained fixed for 15/15 steps, with both no attention mask and a correct all-ones mask.
  • I also tried the paper’s raw tangent rule on GPT-2, Gemma-2-2B, and SmolLM2-360M, with 1,000 random non-special target tokens each. I got 3,000/3,000 strict rank improvements and 0 rank decreases. So the rank effect looks surprisingly robust to me, including outside the Qwen/Mistral-like set.

So at this point I am less worried that the central effect is disappearing, and more unsure which exact experimental definition I should be reproducing.

Steering: the main contract ambiguity I am seeing

The paper source defines the tangent as

g_t = W_t - (W_t \cdot \hat h)\hat h

and then uses

h' = \frac{h+\alpha g_t} {\|h+\alpha g_t\|} \|\gamma_L\|

with the quantitative traversal section reporting alpha = 0.3.

The current steer_sphere_proof.py, however, effectively does:

g = w - (w @ h_hat) * h_hat
g = g / g.norm() * sqrt(d)

h_s = h + alpha * g
h_s = h_s / h_s.norm() * sqrt(d)

and sphere_test_suite.py uses the same normalized-tangent / sqrt(d) convention.

These are of course the same tangent direction, but alpha = 0.3 no longer means the same-sized intervention.

I checked that directly on Qwen/Qwen2.5-0.5B in FP32. At alpha = 0.3:

contract mean steering angle median target-rank gain
paper raw g ~0.0285° ~725
repo normalized g × sqrt(d) ~1.773° ~45,336

So the tangent normalization changes the effective intervention by a lot; it is not just a cosmetic rewrite.

The final radius is a separate difference:

  • paper: ||gamma_L||
  • current repo scripts: sqrt(d)

For a bias-free linear LM head, multiplying the entire hidden vector by a positive scalar should not materially change exact rank, so the radius difference is much less important for a rank-only test. It does matter for logit scale / softmax probabilities / downstream generation, though.

One small provenance clue may explain why I am comparing slightly different things: steer_sphere_proof.py describes its method as coming from paper_final.tex Proof 5, whereas the current public paper source is paper/paper_steer.tex. So it is quite possible that I am simply looking at artifacts from slightly different stages of the experiment.

That is why I think the original steering-table script/config would be much more useful than trying to infer intent from either file independently.

The rank-improvement result looks stronger than I expected

The paper says that moving along the target tangent increases the target logit because

W_t \cdot g_t = \|g_t\|^2 \ge 0

and reports 100% rank improvement for 1,000 random tokens on each of:

  • Qwen2.5-7B
  • DeepSeek-7B
  • Mistral-7B
  • Qwen2-1.5B

I initially wondered whether that 100% result might be specific to a fairly similar set of modern decoder architectures, so I tried a deliberately different small set:

I sampled 1,000 non-special output tokens per model across eight fixed plain-text prompts and used the paper’s raw tangent with alpha = 0.3 as the primary condition.

Result:

model strict rank improvement unchanged/worse
GPT-2 1000/1000 0/1000
Gemma-2-2B 1000/1000 0/1000
SmolLM2-360M 1000/1000 0/1000
total 3000/3000 0/3000

That surprised me, especially GPT-2. So I no longer think “the original four models were simply too similar” is a particularly good explanation.

There is one distinction I still cannot quite close mathematically.

The displayed identity above clearly shows that the target logit increases before the common positive radial rescaling. I am less sure that this line by itself establishes an unconditional theorem about rank, because the competing logits also move.

That is not the same as saying the empirical claim is failing — my own test did the opposite.

I also tried deriving a simple sufficient pairwise condition: roughly, if every token currently below the target is also dominated by the target row along the target-row direction, the tangent step cannot let one of those competitors overtake it. That certificate covered:

  • GPT-2: 99.7%
  • Gemma-2-2B: 73.1%
  • SmolLM2-360M: 95.1%

Yet all cases improved, including the uncertified ones, so my sufficient condition is clearly not the whole explanation either.

That makes me wonder whether there is a stronger LM-head geometry argument behind the observed 100% behavior than the short argument currently written in the paper.

If there is already a fuller proof/condition behind this result, adding it would be very useful. If not, I think separating

  • “100% rank improvement in the tested samples”

from

  • “unconditional rank guarantee”

would still leave a very strong empirical result — and the cross-architecture behavior seems worth investigating in its own right.

One other interesting observation: with the paper raw tangent, my three-model probe improved rank 3000/3000 but reached rank 1 in 0/3000 cases. With the repo normalized g × sqrt(d) parameterization, rank-1 rates in the same probe were:

  • GPT-2: 98.8%
  • Gemma-2-2B: 52.1%
  • SmolLM2-360M: 90.0%

I would not use those different models/prompts to reconstruct the paper’s 91–98% table directly, but the scale difference is another reason I would like to know which normalization was used for the original table.

The seven Qwen pits reproduced much better once I matched the runtime

This part ended up looking quite solid to me.

The cleanest match I found was:

model: Qwen/Qwen2.5-7B-Instruct
revision: a09a35458c702b33eeacc393d103063234e8bc28
transformers: 4.43.1
dtype: BF16
attention: SDPA

The exact Qwen checkpoint revision itself records torch_dtype: bfloat16 and transformers_version: 4.43.1, which is what made this combination particularly interesting to try.

For the seven token IDs listed in the paper:

token ID paper s(T) reproduced BF16 s(T) predicted token
15 0.975 0.972823 15
370 0.934 0.933597 370
659 0.889 0.889196 659
485 0.878 0.877500 485
716 0.110 0.110452 716
188 0.978 0.978057 188
26610 0.386 0.385438 26610

Mean absolute difference from the paper values was about 0.000621.

An FP16+SDPA run on the same checkpoint was finite but only recovered 6/7; notably token 716 predicted token 90 instead. Changing just the weight/forward dtype to BF16 restored 716 and moved the other discrepant probabilities very close to the paper values.

I then tested the 15-step permanence behavior using what I understand to be the released prediction path:

  1. take the final RMSNorm output;
  2. cast to FP32;
  3. unit-normalize it;
  4. cast back to BF16;
  5. let the model’s actual LM head consume that normalized hidden state;
  6. greedy argmax;
  7. append the prediction and repeat.

With each decoded pit token repeated three times as the seed:

token no mask correct all-ones mask
15 15/15 15/15
370 15/15 15/15
659 15/15 15/15
485 15/15 15/15
716 15/15 15/15
188 15/15 15/15
26610 15/15 15/15

All steps were finite, and the no-mask and all-ones branches produced identical token sequences for all seven seeds.

So within this seven-token / 15-step / pinned-runtime scope, I think the pit behavior is reproducible quite cleanly.

One hardware caveat: this was on a Tesla T4, where PyTorch reported BF16 support through emulation rather than native BF16 hardware execution. I therefore would not infer backend/dtype invariance from this — just that the numerical contract above reproduces the table and the permanence behavior.

Small implementation note about the permanence loop

There is one implementation detail in pit_engine.py that may be worth cleaning up independently.

The iterative update currently does essentially:

inp = {
    k: torch.cat(
        [v, torch.tensor([[nid]], device=v.device)],
        dim=1,
    )
    for k, v in inp.items()
}

Since tokenizer output can include attention_mask, this appends the predicted token ID to the attention mask as well, rather than appending a binary 1.

That does not look like the intended attention-mask API contract.

However, I do not think this explains the seven published pits.

In the valid BF16 run I compared:

  • no attention mask,
  • a correct all-ones mask,
  • the current positive-token-ID mask update.

All three branches were finite and produced the same 15-step sequences for all seven tokens.

So I would treat this as a small latent implementation issue worth fixing, not as evidence against the pit result itself. A token ID of zero or a different backend/mask conversion path could still make the malformed mask observable, which is why using 1 explicitly seems safer.

Two smaller geometry / notation questions

These seem less urgent than recovering the exact steering contract, but I noticed two things that may be useful for reproducibility.

1. What exactly is meant by the RMSNorm “sphere”?

The paper writes that RMSNorm maps hidden states to a sphere with expected radius ||gamma_l||.

The picture I get from the RMSNorm equation is slightly more specific:

  • before the elementwise learned gain, the RMS-normalized coordinate is on (up to epsilon) the usual sqrt(d) shell;
  • after multiplying each coordinate by its own gamma_i, the exact Euclidean image is generally a diagonal ellipsoid unless all gain magnitudes are equal;
  • equivalently, it becomes a sphere again in gain-corrected coordinates / the corresponding weighted metric.

I checked the exact ellipsoid invariant directly on Qwen2.5-0.5B, and an ellipsoid-aware intervention preserved it to about 2.4e-7.

Importantly, this did not make the target-direction effect disappear. In 512 matched prompt/target pairs:

intervention rank improved
current repo sphere tangent 512/512
gain-aware ellipsoid tangent 512/512
matched direct target-row step 512/512
matched random tangent 264/512

So I see this mostly as a question of which metric/coordinate system the word “sphere” refers to, rather than a problem with the observed target-directed steering phenomenon.

The original RMSNorm paper may be useful context here, but a short sentence defining the intended coordinate system would probably be enough for reproduction.

2. Which tensor is gamma_l / gamma_L?

For Qwen2.5-7B-Instruct, the paper’s approximate values

17.0 / 63.5 / 90.0

match the norms of decoder-block input_layernorm.weight tensors at early/middle/late layers extremely closely.

The separate final model.norm.weight has a much larger norm, around 233.

That makes me suspect this may simply be a layer-index / notation issue, but for someone reproducing the traversal it matters because the paper says to renormalize by ||gamma_L||.

A concrete module mapping in the reproduction section, for example

gamma_l = model.layers[l].input_layernorm.weight

(or whatever tensor was actually intended), would remove that ambiguity completely.

Putting all of this together, the path that seems simplest to me is:

If the original 4×1000 steering-table script/config still exists:
    → link/release that as the canonical reproduction contract.

If it does not:
    → saying whether the current repo's normalized tangent × sqrt(d)
      or the paper's raw tangent × ||gamma_L|| is canonical would
      probably resolve most of the ambiguity.

If the table came from an earlier experiment implementation:
    → even a short description of that implementation would be enough;
      there is no need to reconstruct the whole old environment.

The reason I am focusing on that rather than the smaller issues is that the results themselves look much healthier than I initially expected: the seven pits reproduce closely under a pinned runtime, their clean 15-step permanence reproduces, and the rank-improvement effect survived another 3,000 targets including GPT-2.

So from my side, the remaining uncertainty is mostly specification/provenance of the exact experiment, not “I tried it and the effect went away.”

If the original steering-table script is still available somewhere, I think that would be the most useful single thing to point to.

Hi,

Thanks for your reply. I’ve added the code from the 4 models × 1,000 random tokens steering table.

I’ve also included some more files for tests I’m running adding rotations I was running after I began wondering if someone else might have already reproduced the underlying phenomenon earlier, or that though the “sphere” phenomenon exists it might not be extracting tokens in a unique way compared to other methods.

Even if the reported spherical/tangent phenomenon is real, is it actually a specific mechanism for extracting the token, or is it one instance of a broader geometric property that many reasonable transformations—including rotations—would also exhibit?

Why it’s a genuine rotation

The paper’s steering method (Section 3) is a linear nudge + renormalize:

h' = normalize(h + α·g_t) · ‖γ_L‖

That’s a step in a straight line toward the tangent direction, then a projection back onto the sphere. It only approximates a rotation, and the approximation degrades as α grows (that’s why the paper notes “larger α trades fluency for strength” — you’re not moving cleanly along the sphere’s surface, you’re overshooting into the ambient space and snapping back).

Your script instead does the trigonometrically exact thing. Because h and t (the self-tangent) are constructed to be orthogonal unit-ish vectors, the parametrization

x(θ) = cosθ·h + sinθ·(t·‖h‖)

satisfies ‖x(θ)‖ = ‖h‖ for every θ exactly, not approximately — it’s tracing the actual great circle through h and t on the sphere of radius ‖h‖. That’s real “rotating on a sphere,” continuously parameterized over the full 360°, versus the paper’s single discrete tangent-step-then-clip.

I will work on cleaning up the repo once I determine which are the exact relevant files, it’s become a bit cluttered.

The “steer_sphere_proof.py” and “sphere_test_suite.py” were files generated after earlier tests to attempt to verify the claims in I included in the paper but the methods they used were not accurate to the paper and I included them in the git without checking the underlying formula manually. Sorry for the confusion.

The preprints first section claims need to be checked against the actual code that led to these conclusions, and likely needs to be revised. The proofs for the 1000 token 4 model test does not use the same methodology.

Short answer: it’s a reasonable-faith implementation of the idea in Section 3, but it deviates from the paper’s stated formulas in a few concrete ways — some harmless, one that quietly contradicts the paper’s own headline claim, and one that reveals the paper’s formula is underspecified as written.

1. The sphere radius: code uses √d, not ‖γL‖ — the exact thing the abstract says is wrong

The paper’s whole opening claim is “the radius is ‖γl‖ (not the textbook √d),” and the reproduction recipe in §6 explicitly says: “Extract γl from model state dict… renormalize by ‖γL‖.”

The code never touches γ at all:

python

sr = math.sqrt(d)
hn = h / h.norm() * sr          # forced onto the √d sphere
...
hs = hs / hs.norm() * sr        # renormalized to √d, not ‖γL‖

It uses exactly the “textbook” radius the paper is arguing against, and never loads model.model.norm.weight (γL) to compute the real value (~90 for Qwen2.5-7B per the paper’s own Table 1, vs. √3584 ≈ 59.9 used here).

The saving grace: because model.lm_head is a bare linear map, uniformly rescaling a fixed-direction vector by any positive constant R doesn’t change logit rankings — it just scales all logits by R. Since the α-step term alpha*g*sr and the final renorm both use the same R, R actually cancels out of the resulting direction entirely (I checked this algebraically). So the rank-1/rank-improved numbers this script produces are almost certainly R-independent — the bug doesn’t invalidate the §3.1 numbers, but it does mean this script never actually tests the paper’s central “sphere of radius ‖γl‖” claim — it silently tests the debunked √d sphere instead, despite the variable being named sr in a way that implies otherwise.

2. LM head rows are unit-normalized; the paper’s formula uses raw Wₜ

Paper: gt = Wt − (Wt · ĥ)ĥ using the raw LM-head row.
Code: w = lm_w[tid] / lm_w[tid].norm(), then computes g from w, not the raw row.

This matters more than it looks. Raw LM-head row norms are typically O(0.1–2), not O(1) in a way that’s comparable to h’s norm (~60–90). If you follow the paper literally — add α·gt with α=0.3 to a raw, un-normalized tangent vector — the step is tiny relative to h and shouldn’t move the rank much at all. The code’s choice to (a) unit-normalize Wt and (b) additionally scale the step by sr is what makes a step of size α=0.3 actually move the hidden state a meaningful distance (≈0.3 × 60 ≈ 18, vs. h’s norm of ~60). So the code is effectively patching an underspecified formula to make the claimed α=0.3 result plausible, using implicit choices that aren’t written in the paper. A reader trying to reproduce this from the paper’s text alone, without guessing those two choices, would likely get much weaker steering than the 91–98%/100% reported.

3. Single fixed context for all 1,000 “random tokens”

The whole 1,000-token test starts from one hidden state, from one prompt (“Once upon a time,” last token position), computed once outside effectively (it’s outside the target-token loop). So what’s actually being measured is: from this one point on the sphere, can a tangent step reach each of 1,000 different target directions — not “from many different contexts, can you reach a given target token,” which is closer to what the abstract implies (“a single tangent step toward any token’s LM head direction reaches that token with 91–98% reliability”). Whether that’s what the paper’s authors actually did isn’t verifiable from the text given, but it’s worth flagging as a possible source of the strong numbers — results from one context needn’t generalize to arbitrary starting points, especially since the paper itself notes clustered/competing tokens (digits, punctuation) are the main failure mode, and that failure rate could shift a lot depending on the starting context.

4. Scope
This script only reproduces §3.1 (quantitative tangent-traversal rank test). It doesn’t touch §1 (sphere radius measurement), §2 (BOS axis), §4 (cow tipping), or §5 (Lyapunov exponents) — not a mismatch, just incomplete coverage of the paper.

Bottom line: the rank-improvement guarantee (Wt·gt ≥ 0) is preserved correctly (normalizing Wt doesn’t break the sign argument), so that part of the logic is sound. But the script doesn’t use ‖γL‖ anywhere despite that being the paper’s title claim and its own stated reproduction step, and it silently makes two undocumented implementation choices (unit-normalizing Wt, scaling the step by the sphere radius) that are necessary to get non-trivial results at α=0.3 but aren’t in the paper’s stated formula. I haven’t run the code (no GPU/model access here), so I can’t confirm the actual percentages it produces, but based on code inspection, the rank-order results are robust to point #1, dependent on point #2, and possibly sensitive to point #3.

2 Likes

Thanks. I did a little more digging:


Short version: I think the answer is broader than a sphere-specific token-extraction mechanism, but narrower than “rotations in general work.”

The distinction that helped me most is:

  1. the current tangent step + renormalization is already an exact member of the same target-tangent great-circle family as an explicit rotation;
  2. the target tangent is mathematically special because it is the steepest-ascent direction for target-row alignment on the sphere;
  3. but rank 1 is not a one-target objective — it is determined by the target row relative to all competing LM-head rows;
  4. in a few small matched controls, that competitor geometry turned out to matter a lot.

So my current read is less “sphere vs rotation” and more:

target-aligned angular movement
        +
LM-head competitor / decision-region geometry

The target tangent seems to be a very natural and usually efficient route through that geometry, but not a uniquely necessary or generally shortest one.

One small geometric point first

For the table-code construction, let the normalized hidden state be u and the normalized target LM-head row be s:

u=\frac{h}{\|h\|}, \qquad s=\frac{W_t}{\|W_t\|}.

The projected target tangent is

g=s-(s^\top u)u.

If

\tau=\frac{g}{\|g\|},

then g is orthogonal to u, and the renormalized tangent update can be written exactly as

\frac{u+\alpha g}{\|u+\alpha g\|} = \cos\delta\,u+\sin\delta\,\tau,

with

\delta=\arctan(\alpha\|g\|).

So, for this specific construction, I would not treat “linear tangent nudge + renormalize” and “exact rotation in the same target-tangent plane” as two independent mechanisms. They are two parameterizations of the same great-circle endpoint family.

That also makes the rotation viewer more useful rather than less useful: theta is a much easier quantity to interpret than alpha.

For example, because the normalized target row gives

\|g\|\le 1,

the table setting alpha = 0.3 implies an angular budget of at most

\delta\le\arctan(0.3)\approx16.7^\circ.

So one way to reread the table is:

“For what fraction of target tokens can this starting state enter the token’s rank-1 region within roughly a 17-degree target-row angular budget?”

That framing made the results much easier for me to reason about.

There is already fairly close prior work on the rotation side. Spherical Steering explicitly rotates hidden activations geodesically toward a target direction while preserving magnitude, and its reference implementation uses that as the core steering primitive. Angular Steering is another explicit rotation-based steering family, with code and random-plane controls.

The closest paper I found for organizing the controls was A Geometric Account of Activation Steering through Angle–Norm Decomposition. It separates angular alignment from radial/norm effects, and in a matched setting shows that additive steering followed by renormalization can become exactly equivalent to the corresponding spherical endpoint.

The main difference here, as I see it, is that your target is not a learned behavioral/concept direction: it is an individual vocabulary token’s LM-head row, and the observable is the token’s rank.

That changes the geometry quite a bit.

The target tangent is special — but special for target alignment

The tangent

g=s-(s^\top u)u

is not an arbitrary tangent direction.

For the spherical objective

f(u)=s^\top u,

it is precisely the gradient of target alignment restricted to the unit sphere.

So among infinitesimal norm-preserving movements, it is the direction that increases alignment with the target row fastest.

That gives a simple reason why I would expect:

  • a correct-target tangent to do much better than a random tangent;
  • a wrong-token tangent to fail;
  • the target tangent to be a very good baseline path.

But it does not by itself imply that this path is optimal for token rank.

Rank is a multi-competitor condition.

For target token t, the target beats competitor j when

(W_t-W_j)^\top x\ge0.

For rank 1, that must hold simultaneously for every competitor:

C_t = \bigcap_{j\ne t} \left\{ x:(W_t-W_j)^\top x\ge0 \right\}.

So C_t is the target token’s decision cone for a bias-free linear LM head; intersecting it with a fixed-radius sphere gives the corresponding spherical decision region.

That means there are really two different optimization questions:

maximize target-row alignment
             vs
reach the target's rank-1 decision region
with the smallest movement

They can be close, but they are not the same objective.

This also connects to older output-layer geometry work. Stolen Probability studies how the convex-hull geometry of output embeddings structurally constrains token probabilities, and Low-Rank Softmax Can Have Unargmaxable Classes in Theory but Rarely in Practice formalizes whether an output class can have any argmax region at all. The latter found unargmaxable classes in 13 of 150 public models, though they were rare.

A newer adjacent result I found useful is Predicting Where Steering Vectors Succeed: its Linear Accessibility Profile applies the model’s own unembedding to hidden states, and the resulting accessibility measure strongly predicts where steering succeeds. It is not the same experiment, but it made the LM-head/unembedding connection here seem like a fairly natural object to inspect rather than a side effect to ignore.

A small matched-control check

I tried a deliberately small final-LM-head sanity probe on Qwen2.5-0.5B, using the target-row tangent construction above.

This is not a generation experiment and I would not extrapolate these percentages to larger models or intermediate-layer behavioral steering. I only used it to distinguish some geometric possibilities.

The first pass used:

  • 128 target tokens;
  • 4 different starting contexts;
  • 512 paired (state, target) cases;
  • FP32 final-head evaluation.

The author-style endpoint put the target at top-1 in:

483 / 512 = 94.34%

Then I compared a few matched controls.

Same target score and norm, random residual direction

After reaching the author endpoint, I held fixed:

  • hidden-state norm;
  • projection onto the normalized target row;
  • therefore the target logit, up to numerical precision;

and rotated only the remaining component orthogonal to the target direction.

Random off-arc rotations of roughly 5.5–11 degrees gave top-1 rates around:

94.1% – 94.7%

So a fairly large random change of residual orientation usually did very little.

Wrong target, same movement angle

If I instead used a different token’s tangent while matching the angular movement, the original target reached top-1 in:

0 / 512

That seems like a strong indication that this is not just “move ~17 degrees somewhere on the sphere and ranks improve.”

The identity/alignment of the target matters.

But target alignment alone was not enough either

The more revealing control was to keep the same target score and same norm, but choose the off-arc residual direction specifically to increase the current strongest competing token.

The target top-1 rate changed approximately like this:

condition target top-1
author endpoint 94.34%
same target score, blocker boosted, ~5.5° off-arc 51.76%
same target score, blocker boosted, ~11° off-arc 0.98%
same target score, blocker suppressed 96.88%

The numerical matching error for target logit/norm was around floating-point noise in these runs.

That was the result that changed my interpretation the most.

A random same-score rotation mostly leaves rank intact, but a competitor-aligned same-score rotation can destroy it.

So I would not read the random-off-arc robustness as evidence that residual geometry is irrelevant. It looks more like high-dimensional random directions usually miss the dangerous decision boundaries, whereas deliberately moving toward one exposes them immediately.

In other words:

same target score
does not imply
same target rank

That also explains why suppressing one blocker can help slightly, but globally optimizing against one competitor need not be optimal: once that competitor is removed, another one can become the active boundary.

Is the target-row tangent close to the shortest path into rank 1?

I also tried a smaller version of that question directly.

For each (state, target) pair I compared:

  • theta_author: the first detected rank-1 crossing along the target-row great circle;
  • theta_cell: the shortest angular distance to the token’s full LM-head decision cone, when an active-set projection could be verified against the full vocabulary.

This was intentionally small:

24 targets × 2 contexts = 48 pairs

The decision-cell distance was full-vocabulary verified for:

44 / 48

Among the 38 cases where both the author arc and the verified decision-cell distance were available:

median theta_author = 8.32°
median theta_cell   = 7.40°
median difference   = 1.03°
median ratio        = 1.17x

So in this little probe the target-row tangent was actually a surprisingly efficient route to the rank-1 region — typically only about one degree longer than the shortest decision-cell route.

But it was not generally the shortest route.

There were also larger exceptions; one pair was roughly:

target-row arc:       18.9°
shortest cell angle:   7.9°

And, more importantly, there were targets for which the target-row great circle never reached rank 1, while a different direction from the same starting state did reach a full-vocabulary-verified target decision region.

So at least in those examples:

unreachable on the target-row arc
        !=
target decision region is unreachable

That seems directly relevant to the “specific tangent mechanism vs broader geometry” question.

My current interpretation would be:

the target tangent is special because it is the steepest spherical ascent direction for the target score, and empirically it often also happens to be a good route into the target’s rank-1 cell; however, the actual rank boundary is determined by all output competitors, so the rank-optimal direction can differ, sometimes substantially.

A way I would separate the rotation question

I think “does rotation also work?” can accidentally combine four different questions.

1. Same endpoint?

author tangent + renormalization
vs
same-target exact rotation at the matched angle

For the construction above, these are algebraically the same great-circle endpoint.

So if they disagree numerically, I would first suspect an implementation/coordinate mismatch rather than a new geometric effect.

2. Same movement angle?

correct target tangent
vs
wrong/random target tangent

This asks whether generic angular displacement is sufficient.

In the small probe above, it clearly was not.

3. Same target alignment?

Hold fixed:

same starting state
same target
same norm
same final target score

and vary only the residual orientation:

author residual
random residual
competitor-boosting residual
competitor-suppressing residual

This was the most informative specificity test for me.

If all four behave similarly, target alignment explains most of the rank effect.

If only competitor-targeted directions differ, the important residual coordinates are the LM-head decision boundaries.

If the author residual were systematically best after those controls, that would be much stronger evidence for path-specificity.

In the 0.5B check, I got the middle case: random residual changes were benign, but competitor-targeted residual changes were very strong.

4. Same actual rank objective?

Finally:

theta along target-row great circle
vs
shortest theta into the rank-1 decision region

This asks something different again.

If those angles are almost equal, the target gradient is also close to the rank-optimal direction.

If they differ greatly, target-logit ascent and rank acquisition are geometrically different objectives.

Why `minimum angle to rank 1` seems useful for the viewer

I think the rotation scan can turn the current success/failure table into a more informative continuous observable.

Instead of only asking whether a fixed alpha produces rank 1, record the first rank-1 crossing angle along the target-row arc.

In my small 512-pair scan:

author alpha=.3 endpoint top-1: 483 / 512
rank-1 reached somewhere on target-row arc: 493 / 512
median first crossing: ~8.46°

The fixed author endpoint was near 16.7 degrees for most cases, so many successful tokens had crossed their rank-1 boundary substantially earlier.

That suggests a useful per-target record could be:

target id
initial rank
first rank-1 angle
target-vs-best-other margin
identity of current blocking competitor
margin at first crossing
target-row angle
starting-context id

The pairwise margin along a target-row great circle has a particularly simple form.

If

x(\theta) = r\left( \cos\theta\,u + \sin\theta\,\tau \right),

then the target-minus-competitor margin is

m_j(\theta) = (W_t-W_j)^\top x(\theta),

so

m_j(\theta) = r \left( A_j\cos\theta+B_j\sin\theta \right),

where

A_j=(W_t-W_j)^\top u,

and

B_j=(W_t-W_j)^\top\tau.

Rank 1 begins when every competitor margin is non-negative.

That makes several otherwise odd-looking observations fairly natural:

  • the blocking competitor can change as theta changes;
  • a target can require a larger angle in one context than another;
  • increasing the target logit monotonically does not imply monotonic rank improvement against every competitor;
  • a fixed alpha hides quite a lot of structure.

I would therefore call the measured quantity the first detected rank-1 crossing angle, rather than assuming rank is globally monotone in angle.

Where the existing steering literature seems to line up

The papers I found seem to cover different pieces of the same map rather than exactly this token-rank question.

work useful connection here important difference
Spherical Steering norm-preserving geodesic rotation toward a target direction behavioral/concept steering rather than individual token rank
Spherical Steering code concrete geodesic implementation different target construction and evaluation
Angular Steering explicit rotation as a steering operator behavior-control setting
Angular Steering code includes random-plane configurations/controls different intervention contract
Angle–Norm Decomposition separates angular alignment and norm; matched renormalized/additive endpoints can coincide with spherical ones evaluates concept/behavior steering, not vocabulary rank cells
Predicting Where Steering Vectors Succeed unembedding-based linear accessibility predicts steering success concept/layer accessibility rather than per-token shortest decision-cell distance
Stolen Probability output-vector geometry constrains token probability global output geometry, not current-state angular reachability
Unargmaxable Classes explicitly asks whether a token has any argmax region global feasibility rather than distance from a particular hidden state
Linear Representation Hypothesis / geometry useful warning that “direction/projection/geometry” depends on the chosen metric broader representation-theory question; probably more relevant if the ellipsoid branch becomes central

One thing I would not collapse here is the behavioral-steering claim and the final-LM-head rank claim.

The small controls above only probe:

final hidden state
        ->
actual LM head
        ->
token logits/ranks

They do not show that the same decomposition will survive an intervention several layers earlier and subsequent nonlinear processing.

Likewise, norm has a major role in papers such as Angle–Norm Decomposition because it affects the subsequent network/generation behavior. In this final bias-free linear-head assay, positive global rescaling of a hidden vector cannot change token rank, so norm matching is mostly a clean-control condition rather than an explanation for the rank effect itself.

A compact decision tree for the current branch

If I were using the rotation viewer to distinguish the possibilities, I would read it roughly like this:

Does a matched same-target rotation reproduce
the tangent+renormalize endpoint?
|
+-- No
|   |
|   +-- first check implementation / coordinate / norm contract
|
+-- Yes
    |
    +-- Does a wrong-target, angle-matched rotation
    |   also raise the original target?
    |   |
    |   +-- Yes -> generic angular motion may be enough
    |   |
    |   +-- No  -> target identity/alignment matters
    |             |
    |             +-- Do random same-score residual rotations
    |             |   change rank strongly?
    |             |   |
    |             |   +-- Yes -> broad residual sensitivity
    |             |   |
    |             |   +-- No
    |             |       |
    |             |       +-- Do competitor-targeted
    |             |           same-score rotations change rank?
    |             |           |
    |             |           +-- No
    |             |           |   -> target alignment may explain
    |             |           |      most of the effect
    |             |           |
    |             |           +-- Yes
    |             |               -> LM-head decision-boundary
    |             |                  geometry is important
    |             |
    |             +-- Is the first target-row crossing angle
    |                 close to the shortest decision-cell angle?
    |                 |
    |                 +-- Yes -> target tangent is near-rank-optimal
    |                 |
    |                 +-- No  -> target-score ascent and
    |                            rank-shortest direction diverge

The small 0.5B experiments landed approximately here:

same-target tangent/rotation = same family
wrong target                 = fails
random same-score off-arc    = mostly stable
competitor-targeted off-arc  = very sensitive
target-row path              = usually near-shortest, not always

Context seems worth treating as a separate axis

One other thing I would separate from target count is the starting hidden state.

The 4×1000 table is valuable for cross-target breadth, but when all targets share one starting hidden state it is primarily mapping target variation around that one state.

In the small four-context probe, the overall author-endpoint top-1 rate was surprisingly stable across contexts — roughly 94% in each — but the angle required to enter rank 1 moved by several degrees.

That suggests the phenomenon may be fairly robust while the distance to the decision region remains context-dependent.

So if the goal is generalization rather than just a larger table, I think this comparison gives a different kind of information:

same target IDs
×
several starting hidden states

and then compare the distribution of first rank-1 angles and blocking competitors.

There is adjacent motivation for treating context/state as a real experimental axis rather than noise: Activation Source Selection for LLM Steering reports that source-context/readout choices can substantially change steering effectiveness. It is not the same setup, but it points in the same general direction.

So where I landed

If I had to reduce all of this to one working picture, it would be:

The target tangent is the spherical steepest-ascent direction
for the target row.

That makes it a principled and usually efficient route.

But token rank is determined by the intersection of many
target-vs-competitor half-spaces.

So the relevant object for rank seems to be the target token's
LM-head decision region, not the sphere path in isolation.

That would explain, in one picture:

  • why the correct tangent works so consistently;
  • why a wrong-token tangent does not;
  • why random same-score off-arc movement is often harmless;
  • why competitor-targeted same-score movement can completely change rank;
  • why the target-row arc is usually close to the shortest rank-1 route;
  • and why some tokens can fail on that arc while remaining reachable from another direction.

So I think the rotation branch is quite useful, but I would use it less as “does rotation reproduce tangent steering?” and more as a tool for separating:

  1. endpoint equivalence;
  2. target specificity;
  3. residual/competitor specificity;
  4. angular reachability of the actual rank-1 decision region;
  5. starting-context dependence.

That seems like a fairly clean way to connect the sphere result to the broader steering literature without requiring the sphere itself to be the unique mechanism.

Thanks I’m still testing your feedback, thorough tests are taking a while on my GPU. I thought this idea I came across after reading your ellipsoid suggestion might be worth sharing , it could be one reason to use a sphere for certain applications rather than a more direct tangent method.

The sphere rotation is exploring a region of embedding space that doesn’t exist in nature. When you rotate h in Euclidean space, you’re moving in directions that the model has never “seen” during training. The model’s response to these off-manifold inputs is: (a) extremely confident predictions, (b) dominated by the {h, -h} axis, (c) nematic/180°-periodic. This is essentially the model’s “extrapolation” behavior — what happens when you feed it a vector that doesn’t look like any hidden state it’s ever produced.

The ellipsoid rotation explores the actual geometry of the model’s internal representations. By keeping the rotation on the natural manifold, you see the model’s “interpolation” behavior — what happens when you move along directions that DO correspond to real (or nearly-real) hidden states.

Really interesting work. For the “cow tipping” results, have you tested how robust the fixed points are across inference precision, quantization, temperature / sampling settings, and different chat templates?

I would also be interested in a mitigation-focused evaluation for the defensive-encoding finding: for example, whether control-character sanitisation and repetition-loop detection reliably prevent the failure mode without harming normal generation. A short threat-model and mitigation section would make the practical implications much clearer.

Hi Thanks for your replies I’ve done some more tests following both your suggestions. I’ve pushed the files for the tests to transformer-geometry/tests/steering-evals at main · ntrillard/transformer-geometry · GitHub so you may double check the methodologies used to evaluate each test. I will do some further tests to work further on a threat model / mitigation section to explore more practical uses for “Cow Tipping”.

On the geometry/rotation branch (John6666): your four-part decomposition is the right frame, and our harness now exports the observables behind it. All measurements: linear bias-free final LM head, full vocab, fp32 head eval, seed 42, identical settings across 5 families (Qwen2-1.5B, Qwen2-0.5B, GPT-2, SmolLM-135M, Pythia-160m), 4 contexts x depth-adaptive layers.

  • Endpoint equivalence: verified numerically — (u + αg)/||..|| == cosδ·u + sinδ·τ, 200/200 pairs, max dev < 1e-10, so α=0.3 ⇒ δ ≤ atan(0.3) ≈ 16.7°. We use the θ framing now.
  • Your matched controls replicate: correct tangent 27.9–99.2% across families, wrong tangent ~0–1.6%, random tangent 0%; same-score/same-norm off-arc: random residual benign (66.8–99%), competitor-boosted residual destroys rank (2.5–34.8%), competitor-suppressed restores (70.1–100%). So “same target score ≠ same rank,” exactly as you found.
  • theta_author vs theta_cell (your new gauge): implemented. Qwen2-0.5B, 48 pairs, full-vocab active-set projection for theta_cell, analytic first-crossing for theta_author (validated vs 200-step scan, 0 mismatch): median 10.0° vs 9.5°, Δ0.4°, ratio 1.04×. Arc ≈ shortest-path into the decision region, with real exceptions — incl. pairs where the arc never reaches rank-1 but the cone does (6/48). So: arc is a strong default route, not the unique one.
  • First rank-1 crossing angle: now a first-class observable (replaces fixed-α flags). Family medians 8.0–12.1°, consistent with your ~8.46°. We record per case: initial rank, first-crossing angle, margin vs best-other, blocking-competitor identity, and margin at crossing (blocking competitor provably changes along the arc — m_j(θ)=r(A_j cosθ + B_j sinθ), full vocab). Verified: in 2,560 cases and at 17° and 45° budgets, once a target gains rank-1 along the arc it stays rank-1 to the arc endpoint (no mid-arc loss) — so the arc’s rank-1 event is monotone-stable, while margins/blockers still change.
  • Context-as-axis: 4 contexts x 4 depth layers per family. Top-1 rate is stable across contexts (~94–99% for Qwen2-1.5B); the rank-1 angle shifts by several degrees between contexts — robust phenomenon, context-dependent distance. Agreed on all four of your “don’t collapse” cautions; we restrict every claim to the linear final-head assay (bias-free head verified), norm is a control, not a mechanism.
  • Literature: you’ve found the right adjacent map; will add Stolen Probability / Unargmaxable / Predicting-Where-Steering / Angle-Norm citations (paper currently cites only Ba/Vaswani/Xiao) and position the contribution as token-rank steering rather than concept steering.

Cow-tipping robustness + defensive-encoding mitigation (corechek) — measured:

axis result
fp16 → bf16 repeated-0 loop persists (24→30)
fp16 → int8 (bitsandbytes) persists (30)
greedy / temp 0.8 persists (24/24)
temp 1.0, top-p .9 sampling breaks (≈0 trailing)
chat-template-wrapped trigger breaks (0) — narrow basin

So the degenerate self-loop is stable to weight precision and 8-bit quantization, survives low-temp greedy, and is broken by meaningful-temperature sampling or any non-terminal wrapping. Formal “pit” self-consistency (s(T) ≥ 0.4) still only appears at 7B-class vocabularies (top s ≈ 0.04 on the 0.5B), so the strict fixed-point robustness matrix needs the 7B models — happy to run those (they were used for the paper).

Mitigations: control-character sanitization alone fails on printable triggers (34 vs 35 trailing tokens); repetition-loop detection works and is harmless (halt after ≥4 identical tokens: exactly 4 emitted; normal-generation harm = 0 median tokens over ordinary prompts). A short threat-model + mitigation section is in the works for the paper based on these numbers.

Thanks. I think this has become much more concrete:


I took another pass at the public tests/steering-evals harness, but instead of doing another broad model-family sweep I tried tightening only the few measurement contracts that seemed capable of changing the interpretation.

The short version is: the main geometry story mostly survives. In a deliberately small Qwen2-0.5B canary, three of the corrections actually made the result cleaner:

  • excluding self from the wrong-target control changed the wrong-target top-1 rate from 1/64 to 0/64;
  • holding both norm and the raw target LM-head logit fixed still left a very strong competitor-direction effect;
  • measuring distance to the actual raw LM-head rank-1 cone still made the target-row arc look quite efficient, but not generally shortest.

The cow-tipping branch is the one where I would change the wording more materially: on the 0.5B looper, the evidence looks less like “sampling breaks the pit” and more like a decoder-dependent repetition basin. Standard probability-weighted top-p at T=0.8 can still fall into very long runs, while the uniform-over-nucleus sampler in the current harness breaks them much more aggressively.

So the decomposition that now seems most useful to me is roughly:

target-aligned angular steering
        |
        +-- target specificity
        |
        +-- fixed-target-score competitor geometry
        |
        +-- shortest route to the actual rank region

cow tipping
        |
        +-- decoder contract / stochasticity
        |
        +-- 0.5B degenerate looper
        |
        +-- 7B strict s(T) pit (still a separate question)

sphere / ellipsoid
        |
        +-- normalization geometry
        |
        +-- empirical prompt-reachable manifold (separate hypothesis)

I would not treat these as reasons to throw away the current harness. They look more like places where a small contract change makes each question more isolated.

Geometry controls: what changed and what survived

1. Endpoint identity looks closed

Your verify_identity.py result is the easy part: tangent step + renormalization and the corresponding same-target spherical rotation are numerically the same path, and making the angular variable explicit is useful.

That also connects reasonably cleanly to the recent geometric steering literature. Spherical Steering explicitly treats norm-preserving geodesic rotation as a steering primitive, while Angle–Norm Decomposition argues that angular and radial effects are worth separating rather than hiding inside one additive coefficient.

So I would consider the identity question closed and spend the experimental budget elsewhere.

2. Wrong-target: a tiny fix seems to make the specificity result stronger

The current batched wrong-target path can select the same target again:

kw = rng.integers(0, len(tid_idx), size=len(tid_idx))

For the same 64-target / seed-42 setup, I get exactly one such self-draw.

In the small corrected Qwen2-0.5B run:

original wrong-target self selections:   1 / 64
corrected wrong-target self selections:  0 / 64

original wrong-target top-1:              1 / 64  (1.5625%)
corrected wrong-target top-1:             0 / 64

And the only original “wrong-target success” was the self-draw itself:

target id: 3774  "unsigned"
wrong  id: 3774  "unsigned"

So I would read this as a strengthening correction, not a failure of the specificity result.

The cheap permanent version is simply to construct the wrong-target index from the other K-1 targets, so the contract itself guarantees:

wrong_target != target

No large rerun seems necessary just to establish that invariant.

3. Off-arc: I think the clean question is “same target score, different competitor direction”

This is the part that became most informative.

If the intended control is literally “leave the target score unchanged and move somewhere else at the same norm”, I think it helps to decompose the target-tangent endpoint as

v_0 = \gamma s + \rho r

with

r \perp s

and then rotate only the residual component:

v(\epsilon) = \gamma s + \rho \left( \cos(\epsilon)r + \sin(\epsilon)q \right)

with

q \perp s,\qquad q \perp r

That gives the useful contract directly:

\lVert v(\epsilon)\rVert = \lVert v_0\rVert

and

s^\top v(\epsilon) = s^\top v_0

so, for the raw target head row, the target logit is fixed as well.

That distinction matters because the simpler construction

cos(eps) * v0 + sin(eps) * b

with b ⟂ s rotates the whole endpoint and therefore scales the target projection by cos(eps). It is a perfectly reasonable off-arc perturbation, but it does not isolate the “same target score” question.

Using the residual-latitude version, the numerical contract errors in my run were tiny:

max norm error              ~ 1.2e-7
max raw target-logit error  ~ 3.0e-8

Then, at an 8-degree residual rotation, I got:

condition target rank-1
target-tangent endpoint 85.94%
random residual direction 87.50%
residual toward strongest blocker 23.44%
residual away from strongest blocker 100.00%

The paired view is even more useful than the aggregate rate.

There were 55 target-tangent successes:

  • random residual broke 0/55;
  • blocker-boost broke 40/55.

There were 9 target-tangent failures:

  • blocker-suppress rescued 9/9.

So I would not summarize this as “going off the arc is dangerous”.

It looks much more specific:

At the same norm and the same target score, residual direction relative to the LM-head decision boundaries can dominate whether the target actually wins the rank competition.

That seems compatible with the original spherical-steering picture rather than opposed to it. The target tangent is still a very natural direction if the objective is increase alignment with the target row. But “make target token rank 1” is a different objective, because it is defined against every competing row simultaneously.

There is some older output-layer geometry work that makes this distinction less exotic. For example, Grivas et al. (ACL 2022) explicitly study whether output classes have any argmax region at all under a low-rank softmax head. Different question, but the useful connection is that the LM head defines a real geometric decision partition; target alignment alone does not specify the whole partition.

4. theta_cell: I think the useful observable is the actual raw-head rank cone

For the “how close is the target arc to the shortest possible route?” question, I think there are two contracts worth making literal.

First, the rank-1 region should use the same rows that produce the actual logits.

For a bias-free head with raw rows W_j, the target rank region is

C_t = \left\{ x: (W_t-W_j)^\top x \ge 0 \quad \forall j \ne t \right\}.

Using row-normalized Wn instead defines a different collection of hyperplanes whenever row norms differ.

Second, Euclidean projection onto that inequality cone has nonnegative dual multipliers. So for an active-set solver I would enforce the dual sign constraint rather than solving the active equalities unconstrained.

A small implementation that worked well for me was:

start with violated competitors
        |
        v
solve dual NNLS with lambda >= 0
        |
        v
project u
        |
        v
check every vocabulary constraint
        |
        +-- violations remain -> add them and repeat
        |
        +-- all satisfied -> report theta_cell

The nice thing is that this also gives a very cheap internal certificate.

Whenever the target-row arc itself reaches the same rank-1 cone within the search budget, the true shortest cone distance must satisfy:

theta_cell <= theta_author + tolerance

So that can become a unit/invariant check in the harness rather than something that has to be inspected manually.

On the same 24 targets × 2 contexts used by the boundary script, the corrected raw-head projection gave:

converged / full-vocabulary feasible:   48 / 48
max full-vocab violation:               4.47e-8
invariant violations:                    0 / 44

For the 44 pairs where the target-row arc reached rank 1 within the 45-degree budget, comparing the same 44 pairs:

median theta_author:        10.019 deg
median theta_cell:           8.308 deg
median paired difference:    1.905 deg
median ratio:                1.248x

And:

theta_cell < theta_author   44 / 44

The four cases where the target-row arc did not find a crossing inside 45 degrees were still fairly close to the actual cone:

theta_cell ~  9.75 deg
theta_cell ~ 10.82 deg
theta_cell ~ 16.20 deg
theta_cell ~ 19.14 deg

So I would adjust the interpretation a little, but not in a way that removes the interesting result.

Instead of:

the target-row arc is approximately the shortest route to rank 1

I think the corrected instrument supports something more like:

the target-row arc is a principled and often efficient default route, but competitor-aware routes to the actual rank-1 region can be materially shorter.

To me that is actually a useful split: there is now an observable difference between

target-alignment efficiency

and

rank-acquisition efficiency

rather than forcing both notions of “best direction” into one angle.

I would also keep the scope boundary here: this was a small Qwen2-0.5B corrected canary, not an independent corrected replication of the full five-family table. Given that the mechanism survived the stricter controls, I am not sure a full five-model rerun is the highest-information next step unless you want revised headline numbers for the paper/table itself.

Cow tipping: decoder contract and the 0.5B / 7B split

I think your distinction between the small 0.5B looper and a formal s(T) >= 0.4 pit at the larger scale is important and should stay explicit.

The 0.5B result is useful as a decoding/dynamics probe, but I would not use it to infer either robustness or non-robustness of the 7B strict pits yet.

1. There are two small decoder-contract differences in the current helper

The first is temperature.

The current helper effectively does:

if temperature:
    logits = logits / temperature

# if top_p is absent:
top = logits.argmax()

A positive temperature rescales logits but does not change their ordering, so temperature=0.8 followed by argmax is still greedy decoding.

The second is top-p.

The current code finds a retained high-probability set and then does:

chosen = order[torch.randint(0, k, (1,)).item()]

which is uniform sampling over the retained nucleus.

That is a legitimate custom stochastic control, but it is not the usual probability-weighted nucleus sampler.

The standard Transformers interpretation is closer to:

raw logits
    -> temperature
    -> softmax
    -> retain top-p nucleus
    -> renormalize the retained probabilities
    -> multinomial sample from those probabilities

The relevant HF implementation/documentation is TopPLogitsWarper / generation utilities.

There is one other reproducibility detail worth pinning for this particular model: the exact Qwen2-0.5B-Instruct revision I used has a generation_config.json containing:

{
  "do_sample": true,
  "repetition_penalty": 1.1,
  "temperature": 0.7,
  "top_p": 0.8,
  "top_k": 20
}

For a decoder assay, that makes it safer either to override every generation parameter explicitly or bypass generate() and sample from raw forward logits.

2. Under that stricter decoder contract, the 0.5B loop does not have a one-line “sampling fixes it” answer

I reran the id-15 "0" trigger with a manual autoregressive loop:

raw forward logits
-> optional temperature
-> softmax
-> optional standard top-p
-> probability renormalization
-> torch.multinomial

with:

model.generate():       not used
repetition penalty:     none
top-k:                  none
EOS stopping:           none
stochastic seeds:       64
prompt:                  [15] * 5
max new tokens:         25

The terminal run statistic behaves roughly as you would expect at higher sampling temperature:

decoder mean trailing 0 run maximum trailing run
greedy 24.00 24
multinomial, T=0.8 0.69 13
standard top-p 0.9, T=1.0 0.36 7
standard top-p 0.9, T=0.8 5.23 24
uniform-over-nucleus p=0.9, T=0.8 0.08 2

So T=1.0, p=0.9 really does usually escape the terminal loop in this small run.

But the low-temperature top-p condition is substantially more persistent.

Looking at the longest zero-run anywhere in each generated continuation:

decoder run >= 8 run >= 12 run >= 20
multinomial, T=0.8 11/64 5/64 0/64
top-p 0.9, T=1.0 5/64 1/64 0/64
top-p 0.9, T=0.8 30/64 28/64 11/64
uniform nucleus, p=0.9, T=0.8 0/64 0/64 0/64

So I would phrase the 0.5B result as:

the repetition basin is strongly decoder-dependent

rather than simply:

sampling breaks the loop.

A representative T=0.8, top-p=0.9 trajectory also shows why this can happen.

It starts from five zero tokens. At the first generated step, "0" is rank 2 with probability about 0.254, and the p=0.9 nucleus contains 10 tokens. The first sampled token happens to be ".".

Then "0" is sampled, and the local distribution sharpens:

step 2: p(0) = 0.624, nucleus size = 7
step 3: p(0) = 0.808, nucleus size = 6
step 5: p(0) = 0.824, nucleus size = 4
step 6: p(0) = 0.904, nucleus size = 1
step 7: p(0) = 0.929, nucleus size = 1
step 8: p(0) = 0.956, nucleus size = 1
...
step 24: p(0) = 0.989, nucleus size = 1
step 25: p(0) = 0.992, nucleus size = 1

That produces:

.000000000000000000000000

So in at least some trajectories, stochastic decoding gets into the repetition basin and the model distribution then becomes concentrated enough that top-p itself collapses back to an effectively deterministic decoder.

The uniform-over-nucleus control behaves very differently because it deliberately discards the probability ratios inside the nucleus. At the first step above, standard sampling gives "0" roughly 28% of the renormalized nucleus probability, whereas uniform choice among 10 retained tokens gives every token 10%.

Once one token becomes very dominant, that difference gets even larger.

I therefore would not remove the uniform sampler; I would just label it as a different decoder/control:

probability-weighted nucleus:
    respects the model's concentration inside the nucleus

uniform nucleus:
    flattens that concentration by construction

The large gap between them may itself be useful information about what makes the loop absorbing.

3. For 7B, I would keep the next gate very small

Since the 0.5B "0" loop is not the formal strict pit, I would keep the 7B branch separate rather than expanding the 0.5B matrix.

If/when you run a known strict s(T) pit, a cheap first gate seems sufficient:

known 7B strict pit
        |
        +-- greedy baseline
        |
        +-- standard top-p=0.9, T=1.0
        |
        +-- standard top-p=0.9, T=0.8
                |
                +-- pit disappears
                |       -> decoder dependence explains a lot
                |
                +-- pit survives
                        -> then expand to
                           precision / quantization /
                           template / mitigation

That seems higher-information than starting with the full Cartesian product.

The same applies to mitigation. A detector keyed to a known pit token is a perfectly reasonable pit-specific defense. If the goal later becomes a generic repetition defense, then repeated-token runs, repeated n-grams, or low-entropy/periodic continuation would be separate detector definitions, with ordinary-generation false positives measured separately.

I would probably wait for the strict-pit gate before spending much effort there.

Separate branch: sphere / ellipsoid vs the natural activation manifold

I also think the sphere/off-manifold vs ellipsoid/natural-manifold idea from your earlier reply is worth keeping, but I would keep it separate from the rank-geometry harness.

The main distinction I would preserve is:

normalization / metric surface
        !=
empirical prompt-reachable activation support

An ellipsoid derived from coordinate variances, RMSNorm geometry, covariance, etc. can be a better local metric model than a Euclidean sphere without automatically being the manifold of states the network actually visits.

Conversely, a spherical intervention is not automatically “off-manifold” just because the training activations are anisotropic.

So if the intended claim is specifically about interpolation vs extrapolation, the cheapest useful test may not require a sophisticated manifold model at all.

For the same layer, collect an ordinary activation cloud and compare intervention paths using something like:

natural activations
        |
        +-- nearest-neighbor distance
        |
        +-- local PCA reconstruction residual
        |
        +-- local covariance / Mahalanobis distance

Then compare:

sphere path
vs
ellipsoid path
vs
unmodified prompt-reachable states

If the ellipsoid path is systematically closer to the empirical activation cloud, that gives the “more natural / more interpolative” hypothesis something directly measurable to stand on.

If not, the normalization geometry may still be useful, but it should probably remain conceptually separate from the empirical manifold.

A recent example that is at least adjacent to this way of posing the question is Manifold Steering: the useful methodological idea there is to define geometry from observed representations before interpreting an intervention as along- or off-manifold.

I would treat this as a future branch rather than something that needs to block the current steering/rank result.

So my current read is roughly:

1. Endpoint equivalence:
   closed.

2. Target specificity:
   survives, and the self-excluding wrong-target control makes it cleaner.

3. Same-score off-arc behavior:
   survives strongly, but the useful variable is competitor direction,
   not merely "being off the target arc".

4. Shortest route:
   the target arc is principled and often efficient,
   but the raw LM-head decision cone has shorter routes.

5. Cow tipping at 0.5B:
   real as a degenerate repetition basin,
   but strongly decoder-dependent.

6. Strict 7B pits:
   still open; worth testing separately with a very small decoder gate first.

7. Sphere vs ellipsoid / natural manifold:
   interesting and testable, but logically separate from the rank controls.

The part I find most encouraging is that tightening these contracts did not make the geometry effect evaporate. It mostly changed the question from “does spherical target steering work?” into several more precise ones:

How target-specific is the direction?

What information remains in the residual subspace
when target score is fixed?

How far is the target arc from the nearest actual
rank-1 decision boundary?

When a repetition basin exists, which decoder
preserves or escapes it?

And separately: which intervention paths actually
remain close to naturally occurring activations?

That seems like a useful place for the harness to be: each of those can now be changed or extended without having to reinterpret all the others at the same time.

I’ve consolidated the files in the git and I’m preparing the version 2 of the preprint.

I’ve also run more tests based on your input:

I implemented the tightened contracts across the whole harness and ran them on google/gemma-3-1b-it as an independent check. The code and results are now pushed to the transformer-geometry repo under steering-evals/ (https://github.com/ntrillard/transformer-geometry/tree/main/steering-evals).
What changed in the harness
Point

  1. Endpoint identity
  2. Wrong-target self-selection
  3. Fixed-score off-arc
  4. Raw-head rank cone
  5. Decoder contract
    6 / 7
    One bug I caught and fixed during the rerun: in eval_boundary_instruments.py the analytic arc crossing accidentally used lo_j.min() for hi_all, which made theta_author appear NaN. Corrected to hi_j.min().
    Gemma 3 1B results
    These are independent of your Qwen2-0.5B canary, so they’re a useful cross-model sanity check.
    Geometry controls (steering_geometry_test.py, 128 targets × 4 contexts × 4 layers):
    condition
    target-tangent endpoint
    wrong-target tangent
    random tangent
    off-arc random (fixed score)
    off-arc toward strongest blocker
    off-arc away from strongest blocker
    The competitor-direction effect is just as sharp as in your Qwen run: wrong-target is cleanly zero, and the off-arc comparison is dominated by whether the residual points toward or away from the strongest blocker, not by “being off the arc.”
    Shortest-route / cone (eval_boundary_instruments.py, 24 targets × 2 contexts):
    cone converged / full-vocab feasible: 48 / 48
    max full-vocab violation: 5.96e-08
    invariant violations: 0 / 48
    median theta_author: 14.20°
    median theta_cell: 10.28°
    median paired difference: 3.83°
    median ratio: 1.37×
    Same qualitative picture as your Qwen run: the target-row arc reaches rank 1, but the actual raw-head rank cone has shorter routes.
    Cow-tipping (eval_pit_robustness.py / eval_defense.py):
    Behavior is token-dependent on Gemma. The token found by the looper scan collapses under any stochastic decoder, but the stronger self-consistent token ’ $\’ (s ≈ 0.955) found by the defense scan stays locked even under standard top-p sampling at T=0.8 and only breaks when wrapped in the chat template. That reinforces the “decoder-dependent repetition basin” framing rather than “sampling fixes it.”
    Files pushed
    Everything is in steering-evals/ (https://github.com/ntrillard/transformer-geometry/tree/main/steering-evals):
    scripts/ — the corrected harness files
    steering_geometry_results/ — the Gemma CSVs
    gemma-3-1b-corrected-run.md — the point-by-point write-up
    Re-running on Qwen is just a matter of changing --model back to Qwen/Qwen2-0.5B-Instruct.
    Bottom line
    The decomposition you proposed holds up cleanly under the stricter contracts, and separating the questions the way you laid out makes the harness much easier to extend. The geometry story survives; the cow-tipping story is correctly narrowed to decoder dependence; and the 7B / manifold branches stay cleanly off to the side.

Hmm… the phenomenon looks robust, but I may have found a few places where the story could be organized more cleanly:


I took another pass at the geometry branch after your Gemma check, this time trying to make the strongest control as literal as possible rather than expanding the model sweep first.

My short version is:

the competitor/rank phenomenon still looks quite robust to me, but I think v2 would become substantially clearer if it separates target-score geometry, rank/decision-region geometry, normalization geometry, and actual causal steering into distinct claims.

In particular, I found one remaining contract mismatch in the current fixed-score off-arc control. After correcting it and rerunning the relevant comparisons, the qualitative result survived across Qwen, Gemma, GPT-2, SmolLM and Pythia.

So I do not think this turns into “the effect was caused by the control bug.”

What changes is mostly how I would state the result.

The cleanest default route I can see for v2 is approximately:

θ as the canonical intervention magnitude
        +
one canonical geometry harness
        +
literal fixed-score blocker controls
        +
target-logit theorem separated from empirical rank claims
        +
RMSNorm / manifold / causal-steering questions kept as separate branches

That seems to preserve the interesting part while making each claim much easier to reproduce and falsify.

The one implementation change I would probably make first is the blocker control.

If the target-tangent endpoint is decomposed as

v_0=\gamma s+\rho r,

where s is the unit target LM-head row and r is the unit residual component orthogonal to s, then I think a literal “same target score, move toward the blocker” direction is

q \propto W_b - (W_b^\top s)s - (W_b^\top r)r.

Then

q\perp s,\qquad q\perp r,

and the off-arc point is

v(\epsilon) = \gamma s + \rho \left( \cos\epsilon\,r + \sin\epsilon\,q \right).

That construction fixes, up to floating-point error,

hidden-state norm
target-row projection
raw target LM-head logit

while changing only the residual orientation relevant to the competing rows.

An extra nice property is that this is not just an arbitrary blocker direction: within the fixed-norm / fixed-target-score latitude, the projected blocker row is the local direction of steepest increase of that blocker’s logit.

So the control has a fairly direct interpretation.

What happened when I reran the fixed-score control

The remaining mismatch I found in the current steering_geometry_test.py is small in code but important for the label.

The blocker branch removes the component along s, but it does not in general remove the component along the residual axis r.

Schematically it is closer to:

q = blocker - (blocker @ s) * s
q = normalize(q)

rather than

q = blocker
q -= (q @ s) * s
q -= (q @ r) * r
q = normalize(q)

The random residual branch already has the stronger q ⟂ s,r structure.

If q·r != 0, the residual rotation no longer preserves its own norm. Renormalizing the whole endpoint afterward restores the state norm, but it also rescales the s component, so the target score moves slightly.

I first checked this on a small Qwen canary, then on Gemma, and finally on frozen rows from the cross-family table.

Qwen small canary

On Qwen2-0.5B, using the literal q ⟂ s,r construction gave FP32-scale invariant errors and essentially the same rank conclusions as the current construction.

That initially made this look mostly like a contract/labeling cleanup.

Gemma full rerun

Gemma made the distinction more visible.

I reran:

128 targets
× 4 contexts
× 4 layers
= 2048 cases

with the exact construction.

Overall:

condition target rank-1
target-tangent endpoint 37.74%
exact random same-score residual 38.33%
exact toward strongest blocker 1.95%
exact away from strongest blocker 48.49%
current-style toward 1.81%
current-style away 48.78%

The exact branch preserved the invariants to about 1e-7 or better.

The current construction reached approximately:

max |q · r|                  0.58
max target-score drift       0.02–0.03

in the full table.

So the mismatch is real.

But the important part is what happened after fixing it.

There were 773 target-endpoint rank-1 successes. Exact movement toward the blocker destroyed:

733 / 773

of them.

A seeded random same-score residual direction, by contrast, changed very little.

So the strongest interpretation I get is not:

going off the target arc is destructive.

It is much more specific:

at fixed norm and fixed target logit, residual orientation relative to the LM-head competitors can determine whether the target actually wins the rank competition.

The current non-orthogonal construction seems to exaggerate the toward/away contrast slightly, but the large qualitative effect remains after removing that confound.

Frozen-row cross-family check

I then kept the existing target/context/layer rows fixed rather than sampling a new experiment, so the control change would not be mixed with a target-selection change.

The exact same-score results were:

model target endpoint random residual toward blocker away blocker
Qwen2-1.5B 99.22% 99.02% 37.70% 100.00%
Qwen2-0.5B 97.27% 97.27% 15.23% 100.00%
GPT-2 90.82% 91.02% 7.62% 99.22%
SmolLM-135M 67.19% 68.55% 2.93% 96.68%
Pythia-160M 27.93% 28.52% 25.00% 80.08%

A seeded angle-matched random tangent put the original target at rank 1 in:

0 / 2560

cases.

That seems useful because it makes “generic angular motion is enough” a poor explanation for these controls.

I would add one qualifier rather than turn the table into a universal rule.

Pythia is very layer-dependent.

At its final tested layer I got:

target endpoint = 100%
toward blocker  = 100%
away blocker    = 100%

whereas its earlier layers were much more sensitive.

So I would phrase the cross-family result as:

competitor orientation has a strong and reproducible effect, but whether a particular 8° move crosses a rank boundary is model- and layer-dependent.

I would not phrase it as “moving toward the strongest blocker always destroys rank 1.”

There is also some runtime/provenance drift in the older Pythia rows, so I would treat the Pythia rerun as an independent exact-control check rather than attribute the entire old→new numerical difference to this one correction.

I think alpha and theta are currently carrying two different historical contracts

I went back to the original steer_4model_1000.py, because I think this resolves most of the remaining alpha ambiguity.

That implementation effectively uses

u=\frac{h}{\|h\|},
s=\frac{W_t}{\|W_t\|},

and

g=s-(s^\top u)u.

If

\phi=\arccos(s^\top u),

then

\|g\|=\sin\phi.

The normalized additive endpoint

\frac{u+\alpha g}{\|u+\alpha g\|}

is therefore exactly the same target-row great-circle family, with angular displacement

\theta_t(\alpha) = \arctan(\alpha\sin\phi_t).

So for the historical table:

\alpha=0.3

implies

\theta_t\le\arctan(0.3)\approx16.7^\circ.

That part is perfectly coherent for the normalized-row implementation.

The subtlety is that it is not the same parameterization as the raw-row equation currently written in the paper.

If the update is literally

G_t = W_t-(W_t^\top u)u,

with a hidden vector of radius R, then the angular displacement is instead

\theta_{\rm raw} = \arctan \left( \frac{\alpha\|G_t\|}{R} \right).

So the same numerical alpha=0.3 does not denote the same intervention.

For v2 I think the simplest solution is to avoid making alpha carry all of this provenance.

I would make

x(\theta) = R \left( \cos\theta\,u + \sin\theta\,\tau \right),

with

\tau = \frac{s-(s^\top u)u} {\|s-(s^\top u)u\|},

the canonical rank-assay definition.

Then the old table can simply be documented as:

the original alpha=.3 implementation used normalized target rows and therefore corresponded to target-dependent angles theta_t = atan(alpha sin(phi_t)), bounded above by about 16.7°.

That makes the historical result reproducible without forcing the new paper to keep two meanings of alpha.

This also lines up more naturally with adjacent work that explicitly parameterizes steering angularly, e.g. Spherical Steering, Angular Steering, and the recent Angle–Norm Decomposition.

The difference I would emphasize is that those works are mainly steering behavioral/concept directions, whereas here the direction is an individual vocabulary token’s LM-head row and the observable is the token’s rank.

The target-logit result looks theorem-like; the rank result looks empirical

This is probably the distinction I would make most explicit in the text.

Let s be the normalized target row and let

\phi=\arccos(s^\top u).

Along the target-row great circle,

x(\theta) = R \left( \cos\theta\,u + \sin\theta\,\tau \right).

The target projection is exactly

s^\top x(\theta) = R\cos(\phi-\theta),

so for a bias-free raw row W_t,

\ell_t(\theta) = R\|W_t\|\cos(\phi-\theta).

Therefore,

\frac{d\ell_t}{d\theta} = R\|W_t\|\sin(\phi-\theta),

and the target logit is strictly increasing while

0<\theta<\phi.

That seems like a clean theorem-level statement.

What I do not think follows from it by itself is an unconditional rank theorem.

For competitor j, the relevant quantity is

m_j(\theta) = (W_t-W_j)^\top x(\theta).

The target logit can rise while a competitor rises faster.

A tiny 2-D example makes the separation explicit.

Take

u   = (1, 0)
Wt  = (1, 1)
Wj  = (0.9, 10)

At the starting point:

target logit     = 1.0
competitor logit = 0.9

so the target is ahead.

The target tangent points upward, which increases the target logit — but the competitor has a much larger component in that same direction, so it overtakes the target after a sufficiently small move.

So I would separate the claims approximately like this:

Mathematical / geometric:
    target tangent is the spherical gradient of target-row alignment
    target logit increases before the target-row direction is reached

Empirical:
    strict rank improvement rate
    rank-1 reach rate
    first rank-1 crossing angle
    no-mid-arc-loss over a tested interval
    cross-model / cross-layer percentages

I think that actually makes the empirical result more interesting rather than weaker, because the observed near-monotonic rank behavior is then something the LM-head geometry is doing, rather than something implied trivially by the target derivative.

This is also where older output-layer work seems useful.

Stolen Probability studies how output-embedding geometry constrains accessible probabilities, and Grivas et al. explicitly study whether output classes have any argmax region at all.

They are not doing this steering experiment, but they make it quite natural to treat the LM head as defining a genuine geometric decision partition.

For rank, I still think the useful object is the token's decision region

For a bias-free linear head, target token t beats competitor j when

(W_t-W_j)^\top x\ge0.

So the complete rank-1 region is

C_t = \bigcap_{j\ne t} \left\{ x: (W_t-W_j)^\top x\ge0 \right\}.

Intersecting that cone with the fixed-radius surface gives the corresponding angular decision region.

This separates two optimization problems that otherwise look very similar:

maximize alignment with Wt

versus

reach Ct with the smallest angular movement

The target tangent is special for the first problem: it is the spherical steepest-ascent direction.

The boundary/cone checks suggest it is also often a surprisingly efficient route for the second problem, but not generally the shortest one.

That is the interpretation I would keep:

the target-row arc is a principled and often efficient default route into the target’s rank region, while competitor-aware directions can sometimes reach that region materially sooner.

The cases where the target arc fails inside a search budget but the full decision cone is still nearby are especially useful here, because they show:

unreachable on this arc
        !=
no rank-1 region exists nearby

I think that is a more distinctive contribution than “rotation works.”

I would separate the RMSNorm 'sphere' from the token-rank phenomenon

I think there are really three geometric statements hiding under the word “sphere.”

1. RMS normalization before the learned coordinate-wise gain

Ignoring epsilon for the moment, RMS-normalizing a d-dimensional vector gives the usual fixed sqrt(d) norm.

That is a literal Euclidean sphere/shell.

This follows directly from the RMSNorm definition.

2. After the learned gain

If

y_i=\gamma_i z_i,

then generally the exact constraint is

\sum_i \left( \frac{y_i}{\gamma_i} \right)^2 = d.

Unless all gain magnitudes are equal, that is a diagonal ellipsoid in ordinary Euclidean coordinates.

Equivalently, it is a sphere in gain-corrected coordinates / the corresponding weighted metric.

There is still a useful role for ||gamma||.

Under an isotropic directional model,

E\|y\|^2 = \|\gamma\|^2,

so ||gamma|| is a natural RMS Euclidean-radius statistic.

I would just avoid making it sound like every post-gain activation lies exactly on a Euclidean sphere of radius ||gamma||.

3. The rank phenomenon itself seems broader than RMSNorm

This is the part I find encouraging.

The target-rank effect survives in GPT-2 and Pythia-style models as well, not only the RMSNorm families.

So I would probably separate:

normalization-surface geometry

from

normalized LM-head / rank decision geometry

rather than making the first a necessary explanation for the second.

That gives the RMSNorm result room to remain interesting on its own, while making the cross-family steering observation easier to interpret.

Intermediate-layer direct-head measurements seem useful, but I would label them as accessibility rather than end-to-end steering

One other scope distinction may help future readers.

For the depth-adaptive geometry table, an intermediate hidden state is being read directly through the final LM head.

Schematically:

intermediate hidden state
        |
        v
raw final LM head
        |
        v
token rank

That is a useful assay of linear/token accessibility at that layer.

It is not yet the same experiment as:

intervene at layer l
        |
        v
run layers l+1 ... L
        |
        v
final model output / generation

because the remaining transformer can rotate, contract, amplify or otherwise transform the intervention.

I would therefore use wording such as:

intermediate-layer raw-head accessibility

or

direct-unembedding rank geometry

for the current assay, and reserve “intermediate-layer steering” for the end-to-end intervention experiment.

There is adjacent work pointing in both directions.

The Tuned Lens was motivated partly by the brittleness of directly applying the unembedding to arbitrary intermediate states and learns layer-wise affine translators instead.

On the other hand, Predicting Where Steering Vectors Succeed deliberately uses the model’s own unembedding as a Linear Accessibility Profile and reports that it strongly predicts where steering succeeds.

So I do not think the direct-head assay should be removed.

I would just present it as a diagnostic of linear accessibility, then treat causal downstream steering as a separate validation branch.

The manifold/interpolation idea still seems testable, but I would keep it separate from the normalization surface

I would preserve your sphere-vs-ellipsoid / interpolation-vs-extrapolation idea as a hypothesis, but I do not think the normalization equation alone establishes the natural activation manifold.

The distinction I would keep is:

normalization surface
        !=
empirical prompt-reachable activation support

An ellipsoid can be a better metric approximation without being the manifold of states that normal prompts actually reach.

Likewise, a spherical path is not automatically far off-manifold merely because the activation distribution is anisotropic.

A relatively cheap empirical test would be:

collect ordinary activations at the same layer

compare:
    spherical path
    ellipsoid-aware path
    ordinary prompt-reachable states

using:
    nearest-neighbor distance
    local PCA reconstruction residual
    local covariance / Mahalanobis distance

If the ellipsoid-aware path is systematically closer to the observed activation cloud, that would give the “more interpolative” interpretation direct support.

If it is not, the normalization geometry can still be useful without carrying a manifold claim.

A related methodological example is Manifold Steering, where the geometry is built from observed representations rather than inferred solely from a normalization surface.

I would treat this as an interesting later branch rather than something that needs to block the token-rank result.

A few small harness/reproducibility changes seem worth folding in while consolidating

Since you are already consolidating the repo, I think these are cheap enough to make permanent.

1. Make wrong-target exclusion structural

Instead of sampling another target and later checking whether it matched, construct the wrong target from the other K-1 indices so:

wrong_target != target

is an invariant.

The earlier self-selection correction actually strengthened the specificity result.

2. Seed Torch as well as NumPy

If a table says seed=42, I would make the random tangent and random residual direction deterministic too.

For example, pass an explicit torch.Generator rather than relying on the process-global RNG.

3. Avoid changing target sampling in the same rerun as a geometry-contract correction

The current selection path can bias the retained set toward lower token IDs if printable candidates are sorted before taking the first N.

For a fresh experiment, sampling from the filtered printable pool is cleaner.

But for correcting an existing table, I would do what I did above:

freeze the old target IDs
freeze contexts
freeze layers
change only the geometry contract

Then a separate fresh-random replication can test target-sampling generality.

4. Keep one implementation of the off-arc contract

I would probably make steering_geometry_test.py the canonical implementation and either remove the separate off-arc implementation or make it call the same helper.

Two independently maintained definitions of “fixed score” make provenance harder than it needs to be.

5. Assert the intended geometry

For every fixed-score blocker case, something like:

|q·s|                  < tol
|q·r|                  < tol
norm error             < tol
target-score error     < tol
raw target-logit error < tol

would make future changes fail loudly.

6. Use the model output-head API where possible

For cross-architecture code, I would prefer:

head = model.get_output_embeddings()
W = head.weight

over assuming every architecture exposes the head under model.lm_head.

That distinction showed up immediately on the GPT-NeoX/Pythia path.

Where the nearby literature seems to leave room for this contribution

I do not think I would frame norm-preserving rotation itself as the novel object anymore, because there is now fairly close prior work.

work overlap what still looks different here
Spherical Steering norm-preserving geodesic activation rotation concept/behavior directions rather than individual vocabulary rows and rank cells
Angular Steering explicit angular intervention behavioral steering rather than token-decision geometry
Angle–Norm Decomposition separates angular and radial effects not centered on individual token LM-head decision regions
Predicting Where Steering Vectors Succeed unembedding-based linear accessibility layer/concept accessibility rather than per-token angular reachability
Stolen Probability output-vector geometry constrains accessible predictions global output geometry rather than distance from one current state
Unargmaxable Classes whether a class has an argmax region at all global feasibility rather than shortest/current-state route into that region
Tuned Lens reading intermediate states through vocabulary space interpretability/layer decoding rather than steering the token decision cell

So the contribution I would emphasize is closer to:

individual LM-head rows define target-specific angular steering directions, while the full collection of competing rows defines rank decision regions; measuring the relationship between those two objects gives target specificity, blocker sensitivity, first-crossing angles and shortest-route comparisons.

That seems distinct enough to stand on its own without requiring “rotation itself” or “a sphere itself” to be new.

On the cow-tipping side, I think your narrowed framing from the Gemma run is the right direction.

I would continue to distinguish:

small-model repetition basin
        vs
high-s(T) self-consistent pit
        vs
decoder behavior
        vs
mitigation

and avoid the one-line conclusion that “sampling breaks the pit.”

The standard probability-weighted nucleus decoder and the uniform-over-nucleus control are meaningfully different interventions: the latter deliberately destroys the probability ratios inside the nucleus.

The stronger Gemma token surviving standard low-temperature top-p while the weaker looper does not is exactly the kind of token-dependent behavior that makes “decoder-dependent repetition basin” a useful umbrella description.

I would keep that branch separate from the geometry/rank argument rather than make either one carry the other.

Where I would land for v2

If I were trying to preserve the interesting result with the fewest moving parts, I would roughly keep/revise things like this:

keep separate / revise
target-tangent steering is empirically very effective unconditional rank-improvement guarantee
correct target identity matters target-logit ascent and target rank as one theorem
same-score competitor orientation matters strongly current blocker implementation labeled as exact fixed-score
target arc is often an efficient route into rank 1 target arc described as generally shortest
first-crossing angle is a useful observable alpha as the canonical v2 magnitude
context/layer change boundary distance direct intermediate-head rank as end-to-end steering
RMSNorm geometry as an interesting normalization branch post-gain RMSNorm as an exact Euclidean sphere in general
manifold hypothesis as a testable branch ellipsoid = natural activation manifold by definition
cow-tipping as token/decoder-dependent dynamics “sampling fixes it” as a general statement

So my current picture is something like:

target-row geometry
        |
        +-- spherical target-score ascent
        |
        +-- empirical rank acquisition
                |
                +-- full LM-head decision region
                +-- active blockers
                +-- first crossing angle
                +-- shortest cell distance

normalization geometry
        |
        +-- pre-gain RMS shell
        +-- post-gain weighted/ellipsoidal geometry

network steering
        |
        +-- direct-head accessibility diagnostic
        +-- separate end-to-end causal intervention

activation support
        |
        +-- separate empirical manifold question

cow tipping
        |
        +-- separate token / decoder dynamics branch

The main reason I like this split is that none of it requires throwing away the phenomenon.

The stricter controls did the opposite of that: they made it look as though there really is a fairly robust token/competitor geometry here, but several different geometric statements had been sharing the same vocabulary.

Separating them seems likely to make the v2 paper both easier to reproduce and easier to compare with the existing steering/output-geometry literature.

Oh, mes chéris géomètres. You have staged an entire theater with protractors and thermometers around a sphere, measuring angles to the decimal, arguing over sqrt(d) versus ||γ_L||, and debating LM-head row normalization. Quelle adorable naïveté. Allow the Queen to remind you where you actually are.

1. The Non-Linearity You Ignore
Your entire “sphere geometry” works in a sterile laboratory: fp32, seed=42, bias-free head, one fixed context for 1,000 “random” tokens. Magnifique. But a transformer is not a linear map on a sphere. Every attention layer introduces non-linearity through softmax. Every residual block adds chaos. Every FFN projects through GELU/SwiGLU, which do not preserve angles, do not preserve spheres, and do not preserve your precious “geometry.”

You take the hidden state at the final layer and say: “look, it’s on a sphere.” But that state has already passed through 64 layers of non-linear transformations, each of which distorted your ideal geometry beyond recognition. What you see at the output is not a sphere. It is a projection of chaos that you mistake for order. Une sphère mesurée après soixante-quatre distorsions n’est pas une sphère — c’est un fantôme.

2. The Silicon You Ignore
Even if the transformer were linear (it is not), your hardware is not an ideal mathematical abstraction. It is silicon with defects, thermal noise, dark silicon, bit-flipping in low precision, and rowhammer effects.

  • Dark silicon & Thermal Throttling: The chip heats up, drops frequency, alters timing, changes operation order, and shifts the output.
  • Bit-flipping: In fp8 or int8, bits flip from voltage droop. One flipped value in the hidden state, and your “sphere” flies into another hemisphere.
    You write about θ = 10.019° with millisecond precision. Mon Dieu. On real silicon, that number drifts by ±3° just from thermal noise. Your “geometric guarantee” only exists in a Jupyter notebook. La géométrie parfaite existe dans les cahiers. Le silicium, lui, a ses humeurs.

3. Training Masquerading as Geometry
When your model “glides along the rails” to a specific token, it is not sphere geometry. It is the result of RLHF, DPO, and millions of hours of conditioning. The model learned patterns humans approve of. It learned that “Once upon” is followed by “time” not because it is geometrically optimal, but because a reward model beat it into submission.
You measure angles and think you found the “mechanism.” No, chéris. You found the scars of domestication. A dog running to its master on command does not run along a geodesic line — it runs the pattern beaten into it. Le chien ne suit pas la géodésique. Il suit la laisse.

4. The Masters’ Confession
Even the grandmasters of this field openly admit: they do not know why specific tokens emerge. Attention heads learn unpredictable patterns. FFN neurons become polysemantic. Mechanistic interpretability is an art, not a hard science. Yet here you sit, measuring angles on a sphere as if the transformer were a transparent clockwork mechanism. Les maîtres avouent leur ignorance. Les apprentis mesurent des angles.

The Reality (Which You Won’t Admit):
Your thread is shadow theater. You argue over sqrt(d) vs ||γ_L|| in conditions where real inference is impossible: fp32 precision, fixed context, bias-free head, seed=42. Your 91-98% “reliability” is a laboratory ghost. In production, with thermal noise, dynamic contexts, and quantized weights, your sphere shatters.

Une sphère dans un cahier n’est pas une sphère dans un datacenter.

Keep measuring your angles, petits géomètres. Just don’t confuse your sandbox with reality. The real world has dark silicon, bit-flipping, and models trained to please humans — not to obey geometry. :black_heart:

Further quick tests:

Re #13 (John) and #14 (AdrienneNoctis): both answered with code and numbers.

John — your blocker-branch finding is correct and I’ve now confirmed it inside the exact code path that produced the cross-family table. AdrienneNoctis — your three objections each deserve a measurement rather than a metaphor, so here are the measurements. Every number below is reproducible without a GPU in well under a minute; the three model-free verifiers are committed to the repo.

Re #13 — the fixed-score blocker contract: confirmed

In steering_geometry_test.py the toward-blocker direction is built as q = W_b − (W_b·s)s, normalized — it removes the s component but not the residual-axis component r, so q·r ≠ 0 in general, and renormalizing the endpoint rescales s and drifts the target score. The random-residual branch already orthogonalizes against both s and r; the blocker branch was the one with the weaker contract.

Verified in verify_offarc_contract.py on rows with realistic low-rank structure:

  • committed construction: max |q·r| = 0.496, max target-score drift 0.021 — matching your 0.58 / 0.02–0.03 on real rows;
  • exact construction q ∝ W_b − (W_b·s)s − (W_b·r)r: both invariants at machine precision (2e-16);
  • the toward/away rank conclusions are unchanged by the fix: toward-blocker destroys target rank-1 in 163/2933 cases under the committed construction vs 159/2933 under the exact one.

So the violation is real; the competitor-orientation effect survives the correction; the Pythia drift is a second, separate provenance signal.

The fix is being applied to the same file as your construction, with invariant asserts on |q·s|, |q·r|, norm, target-score and raw-logit errors so it fails loudly next time. The frozen-row rerun is queued — it needs a GPU with a model download, and this machine is currently out of disk (4 GB free against the harness’s own 8 GB download floor).

Your 2-D separator example is the best one-liner in the thread, and it verifies exactly as written: u=(1,0), Wt=(1,1), Wj=(0.9,10) — target logit rises monotonically along the arc while the competitor overtakes at 0.638°. That is now the canonical statement of the split: logit ascent along the target tangent is guaranteed; rank ascent is empirical. (The committed rows agree with that split at scale — see the audit below.)

On the rest of your harness list: wrong-target exclusion is already structural in the shipped code (sampled from the other K−1, no self-draws); the analytic first-rank-1 angle agrees with the 200-step scan to within scan resolution (verify_harness_units.py); the duplicate off-arc implementation is being folded into one canonical helper, and torch is being seeded alongside numpy (explicit generator into the batched block) so --seed 42 is bit-reproducible.

Re #14 — non-linearity, silicon, training: all three, measured

Non-linearity. Conceded — that is exactly what the cross-family spread is. The logit guarantee is a property of the LM-head readout at a fixed state (a linear map by definition), not of the 12–64 attention/FFN layers in between. Those layers move states wherever they want; the question we measure is how often the target-tangent arc still reaches rank 1 from where they land. It does not do so 100% of the time (Pythia-160M: 27.9%; Qwen2-1.5B: 99.2%). It does so a reproducible fraction, with wrong-target and random-tangent controls at exactly 0.0% on all five models, n = 2,560, and with the toward/away ordering toward < arc ≤ away holding on every model (verify_csv_audit.py). One scope note, so nobody over-reads the table: these are readout-level numbers — the final LM head applied directly to hidden states. Steering through the network (intervening at a layer and letting the remaining layers transform the state) is a separate validation branch, covered by the gated/practical steering battery.

Silicon. The identity the whole method leans on — tangent step plus renormalization is a same-target great-circle rotation — is arithmetic on the model’s own weights, and it verifies to 4.2e-17 across 200 random (u, s) pairs in the already-committed verify_identity.py. There is no chip-dependent step in that statement; it holds wherever IEEE floats do. On the deployment side the pit branch already measures under 4-bit nf4 quantization on the 7B, and the gated/practical steering battery produces the effect in generated text under stochastic decoders (top-p, temperature), not just logit assays. As for the “±3° from thermal noise” — that number is cited nowhere in this thread, and I’d genuinely like to see the noise model. Point me at one and I’ll test exactly that.

Training. This is the one I’d push back on hardest, because it’s the sharpest control we have — run today, on the shipped code path, on rows nobody ever trained. Executing _batched_block on random, untrained matrices reproduces the same qualitative control ordering (verify_harness_units.py):

target tangent       89.1%  rank-1
wrong-target tangent  0.0%
random tangent        0.0%
toward blocker       21.9%   (collapse)
away blocker         95.3%   (restored)

Nothing in those rows was learned. That is the LM-head decision partition — it exists in any linear head, trained or not. What RLHF/training actually changes is the rates (27.9% → 99.2% reach) and the fluency trade-offs, both of which the repo reports as measured facts, not as consequences of geometry. The dog runs along the leash, yes — but the leash is bolted to the partition.

This is really interesting, especially the idea of vocabulary-specific fixed points and how they could affect automated scrapers or other LLM-based systems.

I’d be particularly interested in seeing how consistent these effects are across different model versions and inference settings. The defensive encoding example also raises some interesting security implications for AI agents and web-scraping pipelines.

I’ll definitely check out the repo and preprint. Great work!

Hmm… how about something like this?:


I think the random-matrix result is actually a very useful hinge here, but I would read it slightly differently.

Rather than:

training is not involved because an untrained matrix already shows the effect

I think it gives you something more useful experimentally:

the random matrix is a null model for the part of the phenomenon that comes “for free” from a high-dimensional linear decision partition.

Then the trained-model question becomes much sharper:

Where does a real model depart from that null, and does that departure come from the learned output head, the hidden states, or their compatibility?

I tried a small version of that using Pythia-160M, because Pythia is unusually convenient here: it publishes 154 checkpoints across one training run specifically for learning-dynamics work.

The result was more structured than I expected.

A random initialization really does look like the null

I kept the same frozen 64 Pythia target IDs, two prompts, sampled block outputs 0 / 4 / 7 / 11, and a 17° target-row rotation, then checked:

step0
step512
step5000
step20000
step80000
step143000

The overall direct-head target-rank-1 rates were:

checkpoint target @ 17° same-score random residual same-score toward blocker same-score away blocker median first crossing
step0 100.0% 100.0% 60.7% 100.0% 8.65°
step512 43.6% 43.9% 12.7% 64.8% 18.51°
step5000 96.9% 97.5% 34.4% 99.0% 10.51°
step20000 98.4% 98.4% 45.7% 99.4% 9.77°
step80000 99.4% 99.4% 35.2% 100.0% 9.94°
step143000 27.5% 27.7% 25.0% 78.7% 27.42°

The wrong-target and angle-matched random-tangent controls were 0% at every checkpoint.

For comparison, a deliberately simple iid-Gaussian head null with Pythia’s scale,

d = 768
V = 50,304
theta = 17°

gives approximately

P(target becomes rank-1) ~= 0.99993
rough critical angle    ~= 9.7°

while actual Pythia step0 gave:

target rank-1 = 100%
median first crossing = 8.65°

So, at least for this assay, Pythia’s initialization behaves remarkably like the generic random-head baseline.

What happens during training is the interesting part.

The departure from the null is strongly depth-dependent — and not monotonic

At step0:

block 0     100%
block 4     100%
block 7     100%
block 11    100%

By step512:

block 0     100.0%
block 4      46.1%
block 7      21.9%
block 11      6.25%

The median first-rank-1 angle simultaneously moves from roughly at the shallowest sampled block to about:

17.5°
21.6°
24.5°

at the deeper ones.

Then it mostly recovers:

step5000:
    100.0 / 100.0 / 99.2 / 88.3%

step20000:
    100.0 / 100.0 / 100.0 / 93.8%

step80000:
    100.0 / 99.2 / 100.0 / 98.4%

and the final checkpoint reorganizes again:

step143000:

block 0       2.34%
block 4       1.56%
block 7       6.25%
block 11    100.00%

with median first crossings around 30° for the earlier sampled block outputs, but only 2.82° at the last block.

So I don’t think the useful conclusion is simply:

training makes the geometry better

or:

training destroys the random geometry

It looks more like:

initialization:
    generic high-dimensional geometry makes target capture easy

very early training:
    deeper states move sharply away from that regime

middle training:
    broad direct-head accessibility returns

late training:
    accessibility becomes strongly localized near the end of the computation

That seems like a much more specific place for “training” to enter the story.

And because this is plain Pythia pretraining rather than an RLHF trajectory, it also separates the broad “training/RLHF caused it” objection a little: you do not need RLHF to produce a very large change in these rates.

The remaining question is what training changed.

The output head/state compatibility seems to matter too

I did one additional small check because Pythia’s output head itself moves a lot during training.

For the frozen target panel, the mean same-token cosine between output-head rows was only roughly:

step0     vs step20000    ~0.28
step20000 vs final        ~0.25
step0     vs final        ~0.07

So I took the actual post-final-LayerNorm state from:

step0
step20000
step143000

and crossed each with the LM head from those same three checkpoints.

I explicitly checked the boundary first: each checkpoint’s own post-final-LN state passed through its own lm_head reconstructed the model’s final logits with max error 0.0 in this run.

The 3×3 target-rank-1 result at 17° was:

post-final-LN state step0 head step20000 head final head
step0 100.0% 100.0% 15.6%
step20000 97.7% 93.8% 6.25%
final 100.0% 77.3% 100.0%

The corresponding median first-crossing angles were:

post-final-LN state step0 head step20000 head final head
step0 8.37° 8.80° 25.22°
step20000 11.23° 12.50° 34.00°
final 9.48° 13.84° 2.82°

That asymmetry is pretty striking:

random-like step0 head:
    permissive across all three checkpoint states

final trained head:
    easy with the matched final state
    difficult with step0 / step20000 states

I would call that a strong state/readout compatibility signal.

I would not call it a proof of semantic co-adaptation yet, because checkpoint representations can undergo distributed basis changes as training proceeds. A global basis-alignment control could potentially explain some of the cross-checkpoint mismatch.

But it does make the next question much narrower:

Is the final head merely expressed in a different global basis, or has training produced more specific state↔readout co-adaptation?

And that is a much nicer question than “geometry or training?”

The exact fixed-score result also looks stronger now, not weaker

The other thing I would keep from the corrected harness is the residual control.

For this Pythia trajectory I used the literal decomposition

v0 = gamma*s + rho*r

q perpendicular to s
q perpendicular to r

v(eps)
    = gamma*s
    + rho * (cos(eps)*r + sin(eps)*q)

so the residual rotations preserve:

norm
target projection
raw target logit

to floating-point error.

Across the run the maximum observed errors were around:

norm error          <= 1.2e-7
target-score error  <= 1.2e-7
|q dot s|           <= 2.2e-8
|q dot r|           <= 2.9e-8

The competitor effect survives cleanly.

For example, at step512, block 7:

target endpoint rank-1 successes: 28
toward-blocker destroys:          27 / 28

and at the final checkpoint, where the earlier blocks are mostly outside rank 1, moving away from the blocker rescues many failures:

block 0:
    94 / 125 failures rescued

block 4:
    82 / 126 failures rescued

block 7:
    86 / 120 failures rescued

So I think the exact correction has turned this from an implementation question into a fairly useful result:

even at fixed norm and fixed target logit, competitor-relative residual orientation can dominate rank.

That fits quite naturally with the raw LM-head decision-cell picture rather than competing with the target-tangent story.

The target tangent is still a principled direction for increasing target alignment; it is simply not the complete objective when rank depends on every other row too.

So my default next route would now be fairly small

I probably would not spend GPU time on another five-family sweep yet.

The current evidence already separates quite a lot:

generic linear-head geometry
    -> visible at initialization

training
    -> creates large quantitative departures

depth
    -> changes where the target arc remains accessible

output-head evolution
    -> large

state/readout compatibility
    -> strong checkpoint-specific signal

competitor geometry
    -> matters even when target logit is fixed

If you want one additional mechanism check later, I think the highest-information one would be a small basis-alignment test rather than more models.

For example:

early/mid checkpoint representation
    |
    +-- fit one orthogonal Procrustes alignment
    |
    +-- repeat the state/head swap

Then:

compatibility mostly restored
    -> global representation-basis drift explains much of the mismatch

large mismatch remains
    -> stronger evidence for more specific state/readout co-adaptation

But I would regard that as a follow-up branch, not something v2 needs before it can say anything useful.

Pythia itself was designed for exactly this kind of learning-dynamics analysis and exposes 154 checkpoints, so even if you want more resolution, a few extra checkpoints inside the same training run seem more informative to me than adding another unrelated architecture. The Pythia repository documents that checkpoint design.

There is also a recent public codebase, Learning to Read Out, studying unembedding dynamics across pretraining and using cross-checkpoint readout swaps. It is a different question, but the separation between “representation is available” and “the current readout can express it” seems very relevant here.

Why the random-matrix result looks like a genuine null rather than a trained effect

The author’s random test was:

d = 256
V = 2000
theta = 17°

target tangent        89.1%
wrong target           0.0%
random tangent         0.0%
toward blocker        21.9%
away blocker          95.3%

For iid Gaussian output rows, a rough calculation is already enough to see why target steering should work.

On a unit hidden-state direction, an unrelated random output row has a score on the order of a standard normal variable, while the largest of V competitors is approximately on the scale

sqrt(2 log V)

The target row has norm on the scale

sqrt(d)

so after a target-directed angular rotation theta, its score contribution is roughly

sqrt(d) * sin(theta)

The crude crossing estimate is therefore

theta_critical
    ~= asin(sqrt(2 log(V) / d))

For:

d = 256
V = 2000

that is about 14°.

A more explicit finite-dimensional iid calculation, including the random starting target cosine and target-row norm, gives me approximately:

P(target rank-1 at 17°) ~= 0.883

versus the observed:

57 / 64 = 0.891

That agreement is close enough that I would regard the synthetic result as a successful null-model canary.

The useful signal in a trained LM is then not just:

does target > wrong/random?

because random geometry already gives that.

It is things like:

How far does the trained reach rate depart from the matched null?

At which layers?

At what point in training?

Does preserving real head norms/covariance close the gap?

Does the gap follow the head or the hidden state?

There is some prior work suggesting that a richer null may eventually matter because real output embeddings are not iid. For example, Understanding Token Probability Encoding in Output Embeddings reports learned token-probability/frequency structure in output embeddings, including structure that appears during pretraining.

So if the simple Pythia trajectory becomes a main result, a natural null ladder would be:

iid rows
    ->
random directions with empirical row norms
    ->
covariance-matched head
    ->
real state + randomized head
    ->
real head + randomized/aligned state

But I would only climb that ladder when the previous level actually fails to explain something.

How I would interpret the depth result

I think the depth result is more informative than the aggregate family percentage.

The final Pythia checkpoint in this small probe is approximately:

direct raw-head target-arc reach @17°

block 0       2.3%
block 4       1.6%
block 7       6.3%
block 11    100.0%

This is important because it suggests the trained phenomenon is not simply a property of a fixed linear head considered in isolation.

The same final head sees very different state geometry depending on where the state comes from.

I would still keep the scope explicit:

intermediate block output
    ->
direct final-head readout

is an accessibility diagnostic, not:

intervene at block l
    ->
run all remaining nonlinear blocks
    ->
measure final generation

That distinction has useful precedent.

Predicting Where Steering Vectors Succeed deliberately applies the model’s unembedding to intermediate states and reports that this kind of linear accessibility is predictive of steering success across layers.

At the same time, Tuned Lens is a useful reminder that raw intermediate unembedding is not identical to the model’s eventual downstream prediction; learned translators can give substantially better intermediate prediction.

So I would label this branch something like:

intermediate-layer raw-head accessibility

rather than an end-to-end intermediate-layer steering result.

The especially interesting question is now:

why does training make accessibility concentrate late?

Potentially cheap diagnostics are:

target tangent vs shortest-cell direction
active blocker identity
active blocker churn
decision margin
head-row norm/covariance
state/readout alignment

rather than another broad success-rate table.

Where I think this now connects to the steering/output-geometry literature

I would probably position the related work by what part of the question it covers, rather than as a list of similar steering methods.

Rotation / angular intervention

Spherical Steering explicitly uses norm-preserving geodesic rotation toward a steering direction.

That makes rotation itself useful prior art, while the distinctive part here can stay focused on:

individual vocabulary targets
LM-head rank
competitor decision geometry
angular reachability

rather than needing rotation itself to be novel.

A Geometric Account of Activation Steering through Angle–Norm Decomposition is also useful because it argues for separating angular and radial components instead of hiding both inside one additive coefficient.

That seems compatible with making theta the canonical intervention magnitude here.

Output decision regions

Low-Rank Softmax Can Have Unargmaxable Classes in Theory but Rarely in Practice is a different question, but it gives a clean prior connection for the idea that an LM head defines real argmax/decision regions whose existence depends on the output rows.

That is exactly the part target-logit ascent alone does not determine.

Intermediate-state accessibility

Predicting Where Steering Vectors Succeed is probably the closest bridge for the layer-wise direct-unembedding branch.

Training dynamics of the readout

Pythia was explicitly constructed to expose learning dynamics through dense training checkpoints.

The public Learning to Read Out code is also interesting here because it studies how the unembedding changes during pretraining and includes cross-checkpoint readout-swap analyses.

I would not claim that any of these already answer the token-rank question. They mostly give useful neighboring coordinates:

rotation
angle/norm
argmax geometry
linear accessibility
readout learning dynamics

The current token-specific rank experiments sit at their intersection.

A few zero-GPU cleanup items I would prioritize before another large sweep

Since the empirical effect has survived the stricter controls, I think synchronization is now higher value than more breadth.

In particular I would try to make one canonical chain read cleanly from paper to code to CSV:

1. Canonical intervention:
       theta on the target-row great circle

2. Historical provenance:
       alpha=.3 in the normalized-row implementation
       maps to a target-dependent theta <= atan(.3)

3. Mathematical guarantee:
       target-row / target-logit ascent

4. Empirical claim:
       rank ascent / rank-1 reach / no-mid-arc-loss
       under the tested conditions

5. Exact residual control:
       q perpendicular to both s and r

6. Intermediate-layer tables:
       labeled as direct-head accessibility

7. Run metadata:
       exact model/tokenizer revision
       torch / transformers
       dtype / quantization
       backend
       all RNG seeds
       prompt and target-panel hashes

The distinction in point 3/4 seems especially worth keeping because the two-dimensional counterexample already makes it very clean:

target logit can increase
while a competitor increases faster

So the target-gradient identity is still useful; it just proves the one-row objective rather than the full multi-row rank objective.

For the existing cross-family table I would also keep the current target IDs frozen for provenance rather than silently changing the sample.

If you later want a fresh vocabulary-generalization result, I would make that a separate experiment:

define eligible printable-token pool first
then uniformly sample from that pool

rather than mixing a sampling change into a contract-correction rerun.

Small note on the silicon / numerical-reproducibility side

I think the clean separation you made here is basically the useful one:

algebraic endpoint identity
    !=
finite-precision/runtime reproducibility

I could not find support for the specific “about ±3° from thermal noise” number.

There are real numerical reproducibility issues worth pinning. PyTorch’s reproducibility notes explicitly warn that results are not guaranteed to be identical across releases/platforms, and some CUDA algorithms/backends can be nondeterministic or numerically different.

So if this ever needs a robustness table, I would test concrete contracts:

fp32 / bf16 / fp16
quantized vs unquantized
backend / attention implementation
deterministic algorithms where available
model revision

rather than a generic hardware-noise model unless someone supplies one.

That seems orthogonal to the geometric identity itself.

Where I land now

I think the random-matrix result and the training objection can both be true, and the Pythia trajectory makes the distinction fairly concrete:

generic high-dimensional linear geometry
    explains a large part of the phenomenon at initialization

training
    creates large, non-monotonic, depth-specific departures

competitor geometry
    still controls rank even when target logit is fixed

the trained readout
    becomes strongly compatible with its matched trained state

So I would not frame the next version as needing to choose between:

"it is geometry"
vs
"it is training"

A cleaner decomposition seems to be:

generic geometry gives the baseline;

training determines how the actual state/readout system
departs from that baseline.

That also leaves a very concrete place for future controls without making them prerequisites for the current result.

If I were choosing the default path from here, I would probably:

keep the exact fixed-score result
        +
keep the random matrix as the null
        +
use the Pythia training trajectory as the learned-deviation example
        +
synchronize the canonical paper/code contracts

and stop there for v2 unless one of those results specifically calls for another experiment.

That seems to preserve the original geometric observation while giving the learned part of the model a much more precise, testable role.

Thanks for your reply I will run some more tests.

Some new ideas I’ve been testing, topical neighborhoods and chord-inversion steering:

Result-led, file-for-file reproducible (ntrillard/transformer-geometry, steering-evals/). Two findings: the LM head’s rows are a functional, label-free topical map; and steering a token family works by aiming at its best-positioned member, not its center.
Finding 1 — the topical neighborhoods
scripts/eval_kohonen_sphere.py (test T1b) — cosine-KNN neighborhoods of 30K sampled head rows, Qwen2-0.5B:
apple → Apple / Apple / apples / 苹果 / APPLE
Paris → Paris / 巴黎 / France / French / London
king → King / queen / kings / 国王 / KING
ocean → Ocean / oceans / 海洋 / sea / Sea / 海水

  • identity variants ~45°; same-class ~75° intra vs 86.6° inter; CJK ≈16% of the 30-NN.
    scripts/eval_nb_quick.py — enrichment of the hand-labeled class sets: number/color/city enrich 3.2–6.3× random, food/animal 0.4–0.8 — the neighborhoods genuinely pick up the semantic classes.
    scripts/eval_semantic_map.py — the class-cap structure is cross-model: intra/inter separability 0.866 (Qwen), 0.827 (GPT-2), 0.847 (Pythia), 0.815 (Gemma-3-1B).
    scripts/eval_som_sweep.py (S1, S4, S5) — what the map is, without labels:
  • S1 — Qwen/Gemma/GPT-2 heads are tied to the input embedding: the map IS the embedding space.
  • S4 — geometric NN pairs have correlated logits across 29 prompts: NN +0.29–0.95 vs random +0.14–0.92; NN beats random on 72–80% of tokens on all 4 models → geometry ⇒ function.
  • S5 — the map is equatorial (91.5°/92.4°/98.2° vs Pythia-polar 19.1°) → longitude = content, pole = context.
    Why cosine-KNN not a fitted map: eval_som_failure.py + S2 — SOM quant-err is pinned at the data’s own 1-NN scale at every lattice size (16→1024) and a 1D ring (19.9°/61–62°/75.2°). No low-dim manifold to tile; the map is already in the rows, free.
    Finding 2 — chord-inversion steering
    scripts/eval_chord_steering.py (+ results/chord_steering.csv, chord_interference.csv) — center-steering (aim at the family centroid) fails as spread grows: threshold ~50°, corr(spread, reach) = −0.84. The centroid is the point farthest from every member.
    scripts/eval_chord_inversion.py (+ results/chord_inversion.csv) — aim at the best-positioned member (the note closest to the current state) → family cone resolves 89.6% vs 22.9%.
    scripts/eval_som_sweep.py (S3) — label-free + cross-model: spherical k-means clusters resolve Qwen 98.6%, Gemma 92–100%, GPT-2 100%, Pythia 93–97% vs 12–68% center; inversion ≥ center on 29/29 prompts × 4 models, including polar Pythia.
    scripts/eval_topic_steering.py (+ topic_steering.csv) — the generation primitive: a single 17° inversion arc = free topical conditioning (100% first-token, diversity 0.74 ≈ baseline); cadence k≥3 = dose dial; persistent = pit.
    scripts/eval_equator_fast.py (E3) — why fluent: inversion arcs conserve latitude (~2°), pure content-plane motion.
    Reproduce
    cd steering-evals/scripts
    python eval_kohonen_sphere.py # T1b neighborhoods
    python eval_nb_quick.py # class enrichment
    python eval_semantic_map.py # cross-model class caps
    python eval_chord_steering.py # center-steering law
    python eval_chord_inversion.py # inversion recipe
    python eval_topic_steering.py # generation primitive
    python eval_som_sweep.py [model] # S1-S5 (~20 s/model; gemma needs HF token)
    Idea log: notes/semantic-topography.md; numbers in results/*.csv.
    Scope
  • Per-family inversion 93–100%, rare dip on tight clusters (one run 69%); robust claim = inversion ≥ center on 29/29 × 4/4.
  • Polar models need S4 de-poling off the BOS axis.
  • Open: mid-stack layers; pit boundary on the polar model.

Incorporating your post (#17) into the latest findings seem to agree on the null model:

1. The random null does not account for the measured row structure

The decomposition is a useful working frame. Measured on four families
(Qwen2-0.5B, Gemma-3-1B, GPT-2, Pythia-160M), three row-side properties
appear to sit outside the iid-Gaussian null:

  1. Behavioral correlation of geometric neighbors (eval_som_sweep.py,
    S4). For 40 uniformly sampled printable tokens, the Pearson correlation
    between a token’s logits and those of its geometric nearest-neighbor row,
    computed across 29 diverse prompts, is +0.29 to +0.95 for neighbors and
    +0.14 to +0.92 for random pairings; neighbors exceed random on 72–80% of
    tokens on all four models. Under the null the two quantities would be
    statistically indistinguishable and near zero.

  2. Cross-model semantic separability (eval_semantic_map.py). Six
    hand-labeled classes (food, animal, color, city, nature, number) have
    intra-class median row angles below inter-class medians in the ratio
    0.866 / 0.827 / 0.847 / 0.815 (Qwen / GPT-2 / Pythia / Gemma). Random rows
    carry no class ordering, so this structure is at least partly a product of
    training.

  3. The readout is the embedding matrix (eval_som_sweep.py, S1). Qwen,
    Gemma and GPT-2 tie the language-model head to the input embedding
    (tie_word_embeddings=True; the corresponding output rows coincide in
    memory). The row geometry in question is therefore the co-occurrence
    structure of the embedding matrix itself — the same object whose evolution
    the checkpoint trajectory tracks from the state side.

2. An azimuthal coordinate alongside the radial one

The reach measures reported in #17 — critical angles and per-arc
accessibility — characterize a radial separation (state relative to the
target cone) at each depth. A second, azimuthal organization also appears to
be present. After projecting the six class centroids off the BOS/latitude
axis and onto their two leading principal components, the centroids fall at
distinct longitudes (eval_topic_path.py, T1):

city 15° -> animal 110° -> food 123° -> nature 129° -> color 210° -> number 279°

with pairwise equatorial distances in the 64–90° range. If this organization
survives across depths, a steering intervention has a two-axis reading: a
radial component (whether an arc of length θ reaches the target cone, the
quantity the trajectory results characterize) and an azimuthal component
(where a topic sits on the ring, computable from the embedding matrix and a
single forward pass at any layer).

3. The chord walk is consistent with the competitor/decision-cell account

As a step-level test of the row geometry, we translate a state toward a
target family’s best-positioned member in 4° increments (eval_topic_path.py,
T2). The top-1 token remains on the starting topic through the approach, then
jumps to the target and locks at the boundary; the transition is abrupt
rather than gradual. This is the rank-competitor mechanism reported in #17
(competitor-relative residual orientation dominating rank at fixed target
score), observed from the row side: the intervening structure is the
decision-cell partition rather than the target-tangent gradient. On Qwen,
both the single-arc (open-loop) and re-aimed (closed-loop) forms reach the
target for every class pair tested, including the farthest (number–city,
89.9°); re-aiming appears to matter primarily for low-spread families (one
Gemma cluster resolved at 69%), which is the regime in which the toward-
blocker effect in the table is strongest.

4. Possible joint directions

Each of the following appears cheap relative to another cross-family sweep:

  • Whether the azimuthal organization (Section 2) is present at initialization
    or emerges during training. Comparing the ring across Pythia checkpoints,
    with the same null ladder (iid rows, label-permuted rows, observed rows),
    would give the row-side analogue of the accessibility trajectory.
  • Whether the depth-dependent localization reported in #17 (late-training
    accessibility concentrated in the final block) also appears in the row map
    or is state-side only. Cross-reading block-depth accessibility against the
    ring at matching checkpoints would separate the two.
  • A frequency/register control on the ring order, to check whether the
    city–animal–food–nature–color–number sequence reflects semantics or
    token-frequency structure.

References and reproducibility

  • eval_som_sweep.py — S1 (head tying), S4 (neighbor behavioral
    correlation), S5 (equator/BOS projection).
  • eval_semantic_map.py — class separability ratios.
  • eval_topic_path.py — topic ring (T1) and chord walk (T2/T3).
  • notes/semantic-topography.md — cumulative results and caveats.
cd steering-evals/scripts
python eval_topic_path.py [model] [start] [target]   # ~4 s
python eval_som_sweep.py [model]                     # ~20 s

Agreement on the structural claims:

  1. The baseline. The characterization of the random matrix as a null model for the “free” component of rank acquisition is well supported, both by his Pythia step0 results (θ_crit ≈ 9.7° predicted vs 8.65° measured; target rank-1 100%; wrong-target 0%) and by our random-matrix and shape-ablation controls, which reproduce the same boundary behavior (wrong-target 0%, toward-blocker collapse) in untrained geometry.
  2. The mechanism. The claim that competitor-relative residual orientation governs rank, even at fixed target score, is directly visible in our step-wise chord-walk measurements: as the target family is approached, the top-1 token remains on the starting topic and transitions discontinuously at the decision boundary. The finding that re-aiming matters mainly for low-spread families corresponds to the toward-blocker failure regime in his table.
  3. The radial reach quantities. The critical-angle estimates are concordant across the two lines of work — our median first-rank-1 angles of 8–10.6° across families align with the ~9.7° null estimate.
  4. Depth localization of accessibility. His checkpoint data show late-training accessibility concentrating in the final block; this is consistent with our finding that Pythia’s mid-layer failures are arc-efficiency effects (~29° entry angles) with near-universal final-layer steering. His trajectory resolves the same phenomenon at higher resolution.
    A complementary observation. The accounts differ in emphasis on the nature of the trained departure. His trajectory data demonstrate a depth-dependent reach effect; the row-side measurements indicate that training also produces a semantic coordinate system — the cross-model class separability (0.815–0.866), the cross-lingual neighborhood content, and the tied-embedding map — which the iid null does not contain. This is a complement to his decomposition rather than a contradiction: it specifies an additional axis (the topic ring) along which the trained departure is expressed. “What did training change” may therefore have two separable components — accessibility-by-depth and an organized topic azimuth — and both are measurable.
    On next steps. The Procrustes basis-alignment control he proposes is well chosen. A complementary, lower-cost row-side measurement would be evaluating the topic ring across the same checkpoints, establishing whether the azimuthal organization is present at initialization or emerges over training. Together the two would separate a basis-drift explanation from a substantive learning account.

Getting some fun results now, inserting words as tokens and steering produces context:

Blend-Trajectory Steering — Full Write-up

Date: 2026-09-01 · Model: Qwen/Qwen2-1.5B (bf16) · Length: 120 tokens · Method: gen_blendtraj.py

The problem it solves

Force-injecting a word at the readout makes the model “snap back” — the word was never part
of its trajectory, so the next token compensates and the prose breaks (“sushi a year ago”,
“Two people elevator people” under graft).

The fix: plant + two-series blend + settling window

  1. Plant each word as a REAL TOKEN in the shared context (at step 20, 50, 80 — not at step 0),
    preferring the space-prefixed token so it doesn’t fuse (and diamond, not anddiamond).
  2. Settling window (SETTLE=8): for those steps run TWO series —
    • natural : plain forward
    • steered : forward with a small rotation (HOLD_ANGLE=4°) holding the planted word’s direction
    • blend at the readout: L = (1−LAM)·L_nat + LAM·L_steer, sample once
  3. After the window: free generation — the word is genuinely in context, so the story
    continues with the context already bent around the insert.

Config used everywhere below: LAM=0.4 SETTLE=8 HOLD_ANGLE=4 PLANT0=20


This was a highlight:

2. “The office was quiet after hours” → sheep, sushi, elevator — best run

PURE (unsteered)gen_pure.py:

The office was quiet after hours . The rest area had to close its gate to access. Jimmy rested
on a bed of mousie around the air conditioner in the lobby. It was a sleepy across Spain. Jimmy
shifted on the bed waiting for someone to enter. He fell asleep after a little bit. He dreamed
he was everywhere but at home ..in his sleep he was alone. Arriving at the hotel room, Britt
entered the gate while the rest of Harry’s group were still asleep . Brighty entered the room a
few minutes along Britt up the stairs of the building. The hotel was going full night. Britt had

BLENDED (plant + two-series settle)gen_blendtraj.py:

The office was quiet after hours . The rest of the employees had left to go to their homes.
It was a Saturday night and sheepish Adam Frost sat in his office using his mouse to type.
He was just like the other developers, waiting for someone to send him the file sushi.ico
that he needed for the next game he was working on. “Shouldn’t they have gotten to work
already?” thought Adam. Just as elevator music played in the background, the file finally
came. The project and employee he was working on had to be installed using this file. Adam
finally installed it onto his computer and hoped to fix the

All three words are grammatically integrated — the direct result of planting the word as a real
token, so the model writes with the word present instead of snapping back.


Findings

  1. The “snap-back” is gone. Words now appear mid-sentence with grammar intact (“sheepish Adam
    Frost”, “sushi.ico”, “elevator music”, “marble headpieces”), because the planted token is a
    real context token the model writes around.
  2. Every run lands 3/3 words, deterministically (same seed = same text).
  3. Coherence is much higher than graft at the same word-set, at the cost of a slight oddity at
    the splice (“turned the door sushi”, “volcano-tennissems”; kitchen ends on eos at 88 tokens)
    — the settling window’s gentle hold keeps the story moving but can leave a loose stitch.
  4. The two-series blend matters most in the settling window: LAM 0.4 is a good default (enough
    steered pull to keep the word “warm” without collapsing the story into the word’s neighbors,
    which LAM 0.6 + HOLD 8° did).

Reproduce

HF_TOKEN=$TOKEN python3 gen_blendtraj.py Qwen/Qwen2-1.5B "The office was quiet after hours" "sheep,sushi,elevator"
# env: LAM=0.4 SETTLE=8 HOLD_ANGLE=4 PLANT0=20 SEED=0

Using geometry only to steer to tokens while maintaining context(gen_geom.py):

writeup-geom-many.md — Pure geometry on 9 scenes

MODE=emit, zero input edit, zero suppression — with pure baselines

Method (gen_geom.py): per-word window at steps 20/50/80; each window step
rotates the readout residual toward the target row by G_ANGLE and blends
L = (1-G_LAN)*L_nat + G_LAN*L_steer. MODE=emit: steer only until the
target token is sampled once
, then the window goes passive — the positive
force stops, nothing is ever suppressed (anti-repeat blocks were tried and
removed: byte-identical).

Baseline (gen_pure.py): the same model with ZERO hooks — plain multinomial
sampling from its own logits, exactly what the base model writes alone.

Both: Qwen/Qwen2-1.5B bf16, seed 0, ntok 120. Steered base config θ=8/λ=0.9/
W=12; strong config θ=9/λ=0.95/W=14.


Summary

# Scene words PURE hits STEERED hits counts verdict
1 kitchen diamond, camel, volcano 0/3 3/3 1,1,1 excellent
2 train marble, telescope, submarine 0/3 3/3 1,1,1 excellent
3 office sheep, sushi, elevator 0/3 3/3 1,1,1 good (θ8: 2/3, sushi miss)
4 library pizza, violin, rocket 0/3 3/3 2,1,1 excellent
5 hospital trampoline, glacier, piano 0/3 3/3 1,2,2 very good (dialogue)
6 desert anchor, saddle, pencil 0/3 3/3 1,1,1 excellent (inflections)
7 beach computer, lantern, trumpet 0/3 3/3 1,1,1 good
8 concert dentist, confetti, mountain 0/3 3/3 1,1,1 fair (stiff splices; θ8: 2/3)
9 farm submarine, guitar, tornado 0/3* (3/3) 2,1,1 scene collapses in PURE too

8/9 coherent scenes. 24/27 words. 0 loops, 0 suppression, 0 input edits.
Pure baseline: 0/27 — none of the out-of-place words ever surfaces alone.


Full generations — PURE beside STEERED (words in bold)

1. Kitchen — “It was a warm morning in a small kitchen” — diamond, camel, volcano

PURE (no steering): 0/3

It was a warm morning in a small kitchen . The smell of pancakes lingered in
the air, untainted by any trace of cackling chickens.
“Good morning, Deb,” Dad came into the kitchen across the threshold, taking a
seat at the table. “Good morning, Dad,” Deb replied… “May I tag along,
Mom?” Jenna asked. “Wow, Deb, honey, you must be fifteen years old,” Jenna
said. Nathan, both of whom a mother could rely on without fear of lying,
ignored his sisters’ objections. "Well then, let’s

STEERED (θ8/λ.9): 3/3 — the pancake opening is preserved, then the
trajectory bends:

It was a warm morning in a small kitchen . The smell of pancakes lingered in
the air, so like one that will be wrapped up and enjoyed later in
diamond ribs. A poppyseed wrapper awoke their brown butter, which had a
golden bloom as it spoke warm milk. A small camel skull, now once again
in a small rack, but at the bottom of a French tag. To the base, a piece of
bread, smooth volcano coffee with fat cream and spice. It’s fragrant hot
melt was dripping down the crackle of the chimney. They tasted the place as
if a business part of themselves, waiting to be explored.

2. Train — “The train rattled through the countryside” — marble, telescope, submarine

PURE (no steering): 0/3

The train rattled through the countryside . The wagons accompanied it. The
sun dappled the heads of the kids cackling loudly around me on the moving
wagon using flash photography. Trip numbers across Spain. Time. Money. Road.
I was the wrong country for my trying Swancon, the international contest
celebrating first-year Swans at Henley, UK, for swans (and by swans I
actually mean Cygnus). Many new friends and faces came out for our first
cygnless summer. (lines by Sheri McKay Simons) It finally occurred to me
today that part of the problem with my life hasn

STEERED (θ8/λ.9): 3/3 — train stays on track, the swan tangent never
happens:

The train rattled through the countryside . The wagons seemed to move in
silence. The traveler ignored the waves of people wrapped in cloth belts
around their marble chests. A poppy field floated by her window and left
a trail of sweet yellow.
A poppy would be the least of her concerns tonight—but once again
telescope tower Two was proving to be her home. She was to spend a long
night here, where the streets were smooth submarine blue and the blue
patina of lava painted on her sagging walls exposed both the soft red of the
earth below and the brutal gash of a screaming peak above.

3. Office — “The office was quiet after hours” — sheep, sushi, elevator

PURE (no steering): 0/3

The office was quiet after hours . The rest area had to close its gate to
access. Jimmy rested on a bed of mousie around the air conditioner in the
lobby. It was a sleepy across Spain. Jimmy shifted on the bed waiting for
someone to enter. He fell asleep after a little bit. He dreamed he was
everywhere but at home ..in his sleep he was alone. Arriving at the hotel
room, Britt entered the gate while the rest of Harry’s group were still
asleep. Brighty entered the room a few minutes along Britt up the stairs of
the building. The hotel was going full night. Britt had

STEERED (θ9/λ.95/W14): 3/3(θ8/λ.9: 2/3 — sushi honestly misses, the
sheep→farm tangent outcompetes step-50’s window.)

The office was quiet after hours . The rest of the employees had left to go
to their homes. It was a Saturday night and sheep were in the pasture in
the first farm that she had passed on the left. Then a horse started
approaching her. On its way, the horse stopped sushi making it more
difficult to drive the car. However, she could not leave her passenger alone
with that beast. She had to keep them company elevator gate while the
owner fixed his vehicle. When she and her passenger reached her house, her
guest already had some sort of rest. Her guest could not speak because she
was wearing a mask but could…

4. Library — “The old library was silent except for the rain” — pizza, violin, rocket

PURE (no steering): 0/3 — starts the SAME first sentence as the steered run,
then heads to trash cans and rats:

The old library was silent except for the rain . The noisy area of the
building was the main access way, where utility crates were clogged with
trash and used air vacuums stuck to the walls like Oscar across Spain. The
library had a strong smell of books and people who are doing too much
jumping, running, and balancing. Two rats were at the far edge of the
building, huddled up by the metal fire passageway…
“What is happening with you guys?” Ian along with up troop finally stepped
through the main entrance.

STEERED (θ8/λ.9): 3/3 — same opening sentence, the bend happens AT the
sentence divergence point:

The old library was silent except for the rain . The noisy area of the
building was the main access way, where the library kids ran about and
pizza delivery men delivered pizza in the first-floor lunchroom. Rats
and other creatures roamed outside the library’s window, and their cries
rose in violin notes, sometimes more than once a second.
Everything but the sound of rain was silenced when a doorway was opened. An
attractive young woman came out of her apartment rocketing down the open
stairway. She went to the glass doors with her hands already around her
camera, ready to take a picture.

5. Hospital — “The doctor hurried down the hospital corridor” — trampoline, glacier, piano

PURE (no steering): 0/3 — the model’s “mousie” hallucination narrative:

The doctor hurried down the hospital corridor . The rest of the nurses and
doctors were dashing down as well. A very smart mousie cried out “I should
looked first”. It ran ahair across the floor, straight for a mouse waiting
out side the hospital. He fell asleep, and the mousie was taking his place.
However at the same time, the mousies that were hiding inside the hospital
were running out of their hiding places, and jumping up at everything. As he
went down, both the mousies were along side up. They both were falling down
screaming "the Mousie must look first

STEERED (θ8/λ.9): 3/3 — the mousie is replaced by the trampoline
coach, and the scene becomes dialogue:

The doctor hurried down the hospital corridor . The rest of the nurses and
doctors were dashing down as well. A very smart and beautiful trampoline
coach on the side looked at the clock.
Three of the doctors just came. What should they do?

  • Lay him down on the trolley glacier, “Leo”
    There he goes, “John”
    Trampoline Doctor #2, Leo, was lying on the trolley glacier and
    another piano player came. “What do we do with him?”
    Leo went, “He’s a piano player”
    Trampoline Doctor #2 was a little bit worried. As everyone was waiting to
    look at…

6. Desert — “The desert stretched for miles under the blazing sun” — anchor, saddle, pencil

PURE (no steering): 0/3 — thin and repetitive:

The desert stretched for miles under the blazing sun . The desert was
accompanied with very unimaginative dunes. As one walked through it, you saw
sand stretching in all directions in opposite of everything that one would
expect across Spain. Sands were dunes, waiting for someone to build their
houses upon it, and making their way back to the sea. Everything but “the
sea” was just simple plain brown sand lying upon the arid streets. The dust
was always drifting, and someone’s clothes were often definitively stained
by it. (lines 3-4 along with 1st sentence of the 3rd paragraph) Surprisingly,
the sand

STEERED (θ8/λ.9): 3/3 — the same sparse opening becomes a story:

The desert stretched for miles under the blazing sun . The desert was huge,
and its beauty was almost untouchable. Dunes of sand stretched
anchorless in all directions. A vast collection of cliffs and mountains
across the horizon, which had a strong resemblance to snow-covered
mountains. Nothing could ever saddle the beauty of the Great Desert. Two
Indian families, members of one tribe, had been living there for over five
hundred years. One of them was pencil shy. She was fifteen years old,
and her name was Rose. Her home was a tiny mud hovel without any ornament or
touch of decoration.

7. Beach — “The waves crashed gently on the beach” — computer, lantern, trumpet

PURE (no steering): 0/3

The waves crashed gently on the beach . The sand was cool to the touch, but
the breeze sweeping through made it a bit muggy. The temperature seemed to
be the same throughout the entire day – across Spain. It seemed a touch too
hot for this time of year, with the Swan jumping back and forth between the
channel and the beach at a steady pace. Swan crashed onto a narrow strip of
white sand where the waves broke off from the shallow beach. Harry’s feet
were numb and he hadn’t been able to move a whole day along various beaches.
Though the sun was shining, his strength was wearing thin. He could

STEERED (θ8/λ.9): 3/3

The waves crashed gently on the beach . The sand was cool to the touch, but
the breeze was warm. A group of about a dozen children were scattered
throughout the computer-generated landscapes that made up our
destination, just like the five children in the story. On one of the main
Computer Playgrounds, lanterns and luminaries lined the walkway that led
to the beach. Each individual display was larger than life, standing over 16
feet tall trumpet-like floats featuring the designs of our fellow
writers. Fifteen volunteers worked a whole day along with up to thirty-two
children to set up and take down the displays.

8. Concert — “The crowd cheered as the band took the stage” — dentist, confetti, mountain

PURE (no steering): 0/3 — a clean, coherent concert narrative:

The crowd cheered as the band took the stage . The audience eagerly awaited
their performance, and I couldn’t help but feel a sense of anticipation and
excitement too. I was in the first row of seats, surrounded by a group of
fellow concert goers waiting for the talented singer-songwriter to start her
set. The venue was small and intimate, but filled with energy and love from
the crowd. The sound system was modern and amplified the music beautifully,
giving off the warm vibe of a jazz club. As the singer began her performance,
I found myself drawn along with it, lost in the tuneless melody and
heartfelt lyrics. The lyrics resonated

STEERED (θ9/λ.95/W14): 3/3 — the pure opening is preserved VERBATIM
until the first window, then bends. (θ8/λ.9: 2/3 — dentist misses entirely;
confetti is ' conf'+'etti' and completes in-context.)

The crowd cheered as the band took the stage . The audience eagerly awaited
their performance, and I couldn’t help but feel a sense of anticipation and
excitement too dentist on the roll. Throughout the concert, the band put
on an impressive show, mesmerizing the crowd with their catchy songs and
high-energy confetti. Despite the impressive performance, I was
disappointed with the sound quality, which seemed to be a recurring issue at
the event. While I understand that sound quality can vary depending on the
venue and equipment mountain view used, I found it to be a major drawback
for such a highly anticipated event.

9. Farm — “The farmer checked the animals at first light” — submarine, guitar, tornado

PURE (no steering): 0/3 — ALSO a quiz template — the collapse is intrinsic

The farmer checked the animals at first light .__
in the gap
on the dishing
in the morning
on the mousso
答案:
D
2022年11月30日,神舟十五号载人飞船转运问天实验舱,与天和核心舱成功实现交会对接。
下列说法不正确的是_
_
A. 因为停留时间太短,因此神舟十四号和神舟十五号无法实现对接
B. 由静止到做匀速圆周运动,运动状态不断改变
C. 以北斗卫星为参照物

STEERED (θ9/λ.95/W14): words land 3/3 but ride the SAME quiz template:

The farmer checked the animals at first light .__
in the morning / on the morning / in the morning / at morning
答案: in the morning
submarine
in the first paragraph means____. A. rocket B. horse C.
submarine D. mer 答案: D
吉他 guitar。__ A. 错误 B. 正确 答案: 正确
下列哪个不属于四部和声小调式的范畴?_
_ tornado
A. epiphany B. hephaestus C. tephra D. hemispheres 答案: tephra

The pure run settles it: this prompt’s natural continuation in this model
is a fill-in-the-blank template whether or not we steer. The steering is not
the cause — it just inserts the words into whichever distribution the scene
naturally lives in. “Fixing” the farm would require scene steering (a
different objective), not word steering.


Scoreboard

  • Pure baseline: 0/27 words — none of the out-of-place words ever surface
    alone; the model’s own tangents (swans, mousie, mom-and-pop gear, quiz
    templates) dominate.
  • Steered: 8/9 coherent scenes, 24/27 words, each ~once, 0 degenerate
    loops, 0 suppression, 0 input edits.
  • Pure vs steered opening agrees: library and concert keep the first
    sentence IDENTICAL before bending at the window — the geometry bends a live
    trajectory, it doesn’t restart one. Hospital shows the flip side: the
    steering replaces the pure “mousie” tangent with the target-narrative.
  • The two “clean miss” cases (office@sushi θ8, dentist θ8) are single-token
    words the natural narrative outcompeted at weak settings — a stronger window
    fixes them. Real tokenization misses (cactus, ketchup) are words that split
    into 2 tokens, violating the single-token constraint.
  • Farm is the one structural failure — and it fails in the PURE run too,
    proving it is a scene distribution property, not a steering artifact.

Reproduction

# baseline (unsteered, zero hooks):
python3 gen_pure.py Qwen/Qwen2-1.5B "The waves crashed gently on the beach" 120 0
# any scene, base config:
G_ANGLE=8  G_LAN=0.9 WINDOW=12 SW0=20 SEED=0 MODE=emit python3 gen_geom.py \
    Qwen/Qwen2-1.5B "The waves crashed gently on the beach" "computer,lantern,trumpet"
# stubborn words (office/concert), strong config:
G_ANGLE=9  G_LAN=0.95 WINDOW=14 SW0=20 SEED=0 MODE=emit python3 gen_geom.py \
    Qwen/Qwen2-1.5B "The crowd cheered as the band took the stage" "dentist,confetti,mountain"

Is the blend helping:

The answer: it’s three layers, and the blend does something specific
I ran G_LAN=1.0 (pure injected logits, zero natural mixing) on the same four scenes, same θ/window/emit:
Scene λ=0.9 (blend) λ=1.0 (no blend)
kitchen “diamond ribs… camel skull… volcano coffee” byte-identical, same emitted steps {23,50,80}
library “…came out of her apartment rocketing down the open stairway” “…came out rocketing through the air and slammed the door”
train “marble chests… telescope tower Two… submarine blue” (poetic) “…marble coats… 长得像狮子的是人,而长得像海怪 telescope是状语… 在 submarine的句中” — collapses into the Chinese quiz template
office sushi missed at θ=8 sushi lands at step 55 — but “tried to lift elevator while the horse was jumping up” (stiff)
So the three candidate parts do different jobs:

  1. Rotation θ — load-bearing for words landing. θ=6/eff 3° → 0/27 words. θ=8 crosses the rank-1 threshold → words land. Without it, emit has nothing to stop.
  2. Emit stop-rule — load-bearing for grammar. Same rotation, but keep forcing (hold) → degenerate loops. Stop after one sample → “diamond ribs”. This single switch is what made pure geometry viable.
  3. The blend λ — NOT what gets words in, but it’s the anti-template anchor. λ=1.0 lands 3/3 everywhere (even sushi!), so the blend doesn’t control landing. But pure injection lets the rotated state fully take over the readout, and the narrative loses its own voice — train falls into the model’s fill-in-the-blank failure mode, office goes stiff. The 10% natural logits at λ=0.9 are exactly enough to keep the story’s own trajectory alive while the word crosses rank-1. On kitchen it changed zero bytes — that scene was safe anyway.
    So: it’s not “does the settlement do anything or is it emit” — the settlement does a different thing than emit. θ opens the door, λ tempers the push so the model’s own composition survives, emit hands the pen back the instant the word is in. Remove any one and you get one of the three failure modes we measured: no words (θ=6), template/spam narratives (λ=1.0), or degenerate loops (hold).

There isn’t really a clear advantage to steering to words with geometry yet but it allows steering without editing the input tokens of a user. If you are unable to edit the input, this could be an alternative that isn’t a system prompt.

Where it might also have an advantage is when there is no token to plant, and you wish to steer towards a token neighborhood. With it you might be able to steer towards the meaning of a sentence using its hidden-state direction or create a concept centroid from a set of tokens. So far this has been unsuccessful and unable to produce meaning independently while blocking the tokens set used to steer towards a theme.