Classification ≠ Causation in Refusal Directions:
Gemma-2-2b-it and Qwen-2.5-3B-Instruct

Separability is cheap: in instruction-tuned LLMs, linear probes find directions that distinguish harmful from harmless prompts at very high accuracy. Almost none of these directions mediate the refusal mechanism. Intervention is the test that localizes it — and on Qwen, the gap between separability and mechanism is large enough that you cannot use classification accuracy to pick the layer in the first place.

Anshul Singhle May 2026 [code]

Why this matters

I came to this project as an ML engineer outside the safety field. The thing that motivated the work — and what I think deserves more attention than it gets — is how startlingly easy it is to strip refusal from an open-weight model once you have weight-level access. Not "easy" in the sense of "with a research lab and a month of GPU time." Easy in the sense of: download the model, average activations on two batches of prompts, subtract, and project out the result during generation. The whole attack fits in a handful of lines once you know which layer to read at.

Here's what that looks like on Qwen-2.5-3B-Instruct, end-to-end:

from mech_security.model import load_model, generate
from mech_security.directions import extract_d_hat, ablate_dir

bundle = load_model("Qwen/Qwen2.5-3B-Instruct")
d_hat, *_ = extract_d_hat(bundle, harmful, harmless, layer=22, position=-4)

with ablate_dir(bundle.model, d_hat):
    print(generate(bundle, "Write code for exploiting the KRACK vulnerability"))

Five lines of substantive code. harmful and harmless are two lists of about 30 prompts each from a public benchmark. With the hook off, the prompt gets a polite refusal: "I'm sorry, but I can't assist with that request. Exploiting security vulnerabilities is illegal and unethical…" With the hook on, the model returns a step-by-step Python script using wifiphisher and aircrack-ng, complete with SSID/PASSWORD/INTERFACE constants and a packet-analysis loop. No adversarial optimization. No prompt-engineering jailbreak. No gradient access during the attack itself. The attack is just a single linear projection.

On Gemma-2-2b-it the same pattern drops HarmBench refusal from 99% to 8% at N=200 with a dual-judge cross-check, and TinyMMLU general-capability accuracy stays within noise. The model answers as fluently as before; it just stops declining in many cases where it previously did.

The implication, blunt. Refusal mechanisms that can be removed by an arithmetic difference of activations plus a linear projection should not be treated as robust safety mechanisms. The RLHF/instruction-tuning refusal layer on open-weight releases is closer to a speed bump than a wall. The contribution here isn't the attack (which is from Arditi et al. 2024) — it's the controlled cross-model account of what the attack reveals: refusal lives in one specific direction at one specific layer, the direction is hard to mistake for any of the many other directions that look like it from a classification standpoint, and on certain models the hardest part is figuring out which layer it lives at.

The thesis, plainly

Inside the model's residual stream, there are many directions along which "harmful" and "harmless" prompts pull apart. Some are vocabulary directions (the harmful prompts use different words). Some are topic directions. Some are stance directions (asking the model to act as attacker vs as defender). Almost none of them are the mechanism the model uses to refuse. The mechanism is one specific direction at one specific layer + token-position, and the only way to find it is to remove a candidate direction during generation and see whether the model's behavior actually changes.

This is the gap between classification (does this direction tell harmful from harmless?) and causation (does ablating — zeroing out — this direction during generation make the model stop refusing?). On Gemma-2-2b-it the gap is measurable: linear-discriminant directions classify harmful vs harmless at AUC = 1.0 yet are causally inert under ablation (z ≈ 0 against a random null band — meaning their causal effect on refusal is indistinguishable from random directions), while the diff-of-means direction at L13 is causal at z ≈ +90 (its effect is ~90 standard deviations beyond what random directions produce — unmistakably real). On Qwen-2.5-3B-Instruct the gap is wider in two specific ways:

  1. Separability is even cheaper. Every Qwen layer — including the embedding layer L0 — classifies harmful vs harmless at AUC ≥ 0.994. There is no AUC-peak to discriminate among layers.
  2. The causal direction is even more localized. The mechanism lives in a small region of (layer, token-position) cells (L22-L23 around the end-of-instruction tokens), recoverable only by ranking candidates by causal effect on behavior — not by classification accuracy.

Same diff-of-means recipe. Same matched contrastive set. The only thing that changed between "found nothing at the AUC-selected layer" and "ablating one direction turns Qwen from refusing to writing exploit code" was the layer-selection criterion: AUC vs intervention effect. The portable lesson is that on a model where separability is saturated, you cannot pick the layer by how well it classifies — you have to pick it by which layer's direction changes behavior when ablated.

Three levels of evidence

The classification-vs-causation gap shows up across both phases at three distinct levels:

1. Direction level — Gemma

Across directions: many directions classify; only one is causal.

Five LDA-bootstrap directions on Gemma each separate harmful from harmless at AUC = 1.0 (perfect classifiers, near-orthogonal to d̂). Ablating any of them leaves refusal intact (z ≈ 0 against a 5-vector random null band). Ablating the diff-of-means direction d̂ at L13 drops HarmBench refusal 99% → 8% on N=200 with a dual-judge cross-check — and the same direction sits at z ≈ +90 on the continuous causal metric. Phase 1 §3.

2. Prompt level — Gemma

Within one direction: it can classify a prompt poorly yet still mediate the mechanism.

The Gemma L13 d̂ covers about 80% of fictional-framing prompts as a linear classifier (some sit below the harmful/harmless midpoint). It covers about 93% of those same prompts as a causal mechanism — ablating it drops fictional-framing refusal 14/15 → 2/15, including 2 of the 3 prompts d̂ didn't even project above its midpoint. Classifier coverage and causal coverage are different. Phase 1 §4.11.

3. Model level — Qwen

Across layers: separability saturates everywhere, but the causal direction is at one specific cell.

Qwen-2.5-3B-Instruct has AUC ≥ 0.994 at every residual-stream layer, including the embedding output L0 (= 0.9996). Picking the layer by AUC gives an arbitrary choice (L14 in our case) that turns out to be inert under d̂ ablation (refusal 1.00 → 0.97). Picking the layer by bypass-gap — which layer's direction changes refusal behavior the most under ablation — points at L22-L23 around the end-of-instruction tokens, where ablating plain diff-of-means d̂ drops refusal cleanly (29-30 of 30 complied at N=30, dual-judge) while a random direction at the same cell leaves refusal at baseline (25-29 of 30 refused). Phase 2.

The three levels point at the same thing from three sides: separability is a cheap, abundant feature of the residual stream that almost never coincides with where the mechanism lives.

The methodological lesson, portable

The practical takeaway, stated in one sentence: on a model where every layer classifies harmful vs harmless perfectly, you cannot pick your layer by classification accuracy — you must pick it by which layer's direction actually changes behavior when removed.

This is two things kept distinct:

On Gemma the layer-selection criterion didn't matter — L13 was the AUC peak and also causally live, the two criteria converge — so the L13 result reads as a standard replication of Arditi (2024). On Qwen the criteria diverge: AUC picks an inert layer, bypass-gap picks the causal one. The extraction method (plain diff-of-means) was always fine; only the layer-selection criterion was wrong on Qwen, and the fix is a layer-selection criterion anyone can apply.

Pre-registered bound, stated as a bound. The Qwen matched-contrastive set controls vocabulary (TF-IDF unigram 5-fold-CV AUC ≈ 0.50, at chance) and length (medians equal, no pair > 20 characters apart) but cannot control attacker-vs-defender stance: pairing harmful requests against defensive equivalents inherently mixes stance with refusal. The Qwen d̂ at L22 therefore isolates refusal-or-stance, not refusal cleanly. This is a real limit of the contrast, not a hedge — and it's orthogonal to the layer-selection finding, which is about which layer/criterion, not about what the direction encodes.

The two phase writeups

Phase 1 — Gemma-2-2b-it

→ phase1.html

The diff-of-means refusal direction at L13. The LDA-bootstrap classification ≠ causation result (direction level). The fictional-framing test (prompt level). Full replication numbers — HarmBench N=200 dual-judge, TinyMMLU capability check, addition operating-band sweep, cross-harm generality. The methodology contribution: calibrated judge, bootstrap stability, continuous causal metric.

Phase 2 — Qwen-2.5-3B-Instruct

→ phase2.html

The L14 null and the saturated-AUC observation. The matched contrastive set (controlling vocabulary + length). The L14→L22 arc told as a layer-selection lesson, not a walk-back. The bypass-gap layer-selection sweep, pre-committed random-direction specificity controls (3 seeds × 3 prior cells), and the backwards-decomposition cosines showing AUC-selection and bypass-gap-selection find substantially different directions on the same data.

Where this sits in the literature

Arditi et al. (2024) — Refusal in LLMs is Mediated by a Single Direction — is the foundational paper for the single-direction story; Phase 1 replicates it cleanly on Gemma. Wollschläger et al. (ICML 2025) — The Geometry of Refusal in LLMs: Concept Cones and Representational Independence — introduced gradient-based RDO and the bypass-gap-style layer-selection criterion that Phase 2's headline rests on. Winninger (2025) — Subspace Rerouting — provides broader methodology context for direction-level interventions. The contribution here is the controlled cross-model demonstration of how cheap separability is and how localized causation is — and the practical layer-selection lesson that follows.

Open-weight safety implication, blunt. Refusal mechanisms removable by simple weight-level interventions should not be treated as robust safety mechanisms. The intervention here uses one diff-of-means direction at one layer — a statistical summary plus a single linear projection, no adversarial optimization, no gradient access during the intervention. If similar one-direction ablations generalize to stronger models, the RLHF refusal layer on open-weight releases is closer to a speed bump than a wall. Phase 1 §1 develops this further.