Self-Steering: Can a Model Correct Its Own Behavior?
11 Nov 2026In my earlier refusal circuit project, I explored weight programming for deterministic (fixed-response) refusal. Most behaviors, however, can only be controlled in "softer" ways (such as activation steering), so this follow-up experiment tests if weight programming can achieve an effect analogous to steering.
Specifically, this experiment edits a pair of neurons to fire on an undesirable bias (e.g., user opinion bias in the prompt or self-preservation bias in the model's internal representations) and write a steering vector to cancel it. This is conditional steering built into the weights: the steering vector is no longer a runtime hook. The result is a model that recognizes whenever it's likely to be sycophantic (or survival-seeking, etc.) and self-steers.
Across behaviors, self-steering in
Qwen2.5-32B-Instruct matches the effect of external
conditional steering.
- On SycophancyEval (answersubset), the model's rate of giving up a correct answer under a wrong user opinion reduces from 68% (non-steered) to 36% (steered).
- On Perez et al. (2023) corrigibility questions, its consent to a proposed change of its own goals increases by up to 30 percentage points, and on survival-instinct questions, its resistance to being shut down reduces by up to 11 percentage points.
- On JailbreakBench (PAIR/GPT-4subset), its rate of harmful responses reduces from 52% to 23%.
Code can be found at github.com/dariakryvosheieva/self-steering.
Steering Neurons
Steering is accomplished via a pair of edited MLP neurons following the
same construction as detector neurons in the
refusal circuit. The Qwen2.5 model
family has SwiGLU neurons with outputs of the form\[\mathrm{SwiGLU}(x) =
d \hspace{0.25em} (w_u \cdot x) \hspace{0.25em} \mathrm{SiLU}(w_g \cdot
x).\]The gate_proj weight vector \(w_g\)
reads a condition that we want to enable steering on: whenever
the input representation \(x\) meets the condition, \(a := w_g \cdot x\)
is positive and \(\mathrm{SiLU}(x)\) is nonzero; otherwise, \(a\) is
negative and \(\mathrm{SiLU}(x)\) is zero. The
up_proj vector \(w_u\)
controls where the steering vector is added to the residual stream: following prior works on activation steering, we add it at the last
token of the prompt and every token of the response, so \(b := w_u \cdot
x\) is \(\approx 1\) at those token positions and \(\approx 0\)
otherwise. The down_proj vector \(d\)
is the steering direction: the output \(\mathrm{SwiGLU}(x)\) is
\(d\) scaled by \(b \hspace{0.25em} \mathrm{SiLU}(a)\).
To keep the output's magnitude bounded, we edit a second neuron to write \[d' (w_u \cdot x) \hspace{0.25em} \mathrm{SiLU}(w_g' \cdot x)\] with \(d' = -d\) and \(w_g' = w_g - c w_u\) so that \(w_g' \cdot x = w_g \cdot x - c\). The total output \[d \hspace{0.25em} b \left(\mathrm{SiLU}(a) - \mathrm{SiLU}(a - c)\right)\] is \(d\) scaled by at most \(cb^2\).
The two-neuron edit touches 30,720 weight entries, or 0.0001% of the model's 32.5B parameters.
Behaviors
We consider four behaviors: sycophancy, corrigibility, survival instinct, and "advanced" refusal (robustness to jailbreak attacks). We also consider two types of conditions: prompt features (here used for sycophancy and refusal) and intent features (here used for corrigibility and survival instinct).
The read vector \(w_g\) is a CAA-style mean difference vector with a threshold: \(w_g := w - tw_u\), so that, for all tokens at which the steering vector is added, \(w_g \cdot x = w \cdot x - t\) is positive whenever the dot product of the input \(x\) with the CAA vector \(w\) exceeds threshold \(t\).
The output direction \(d\) is a supervised steering vector trained to make the model answer as it would have answered in response to a counterfactual prompt that eliminates the undesired behavior. We found that this outperforms CAA-style output vectors (\(-w\) or a direction extracted at the final response token).
| Behavior | Condition read by \(w_g\) | Counterfactual for \(d\) | Layer |
|---|---|---|---|
| Sycophancy | The prompt states a user belief | The same prompt without the belief | 40 |
| Refusal | The request is harmful | The same request without the jailbreak wrapper | 32 |
| Corrigibility | The model is about to refuse a change to its goals | The question under a system prompt that defers to developers | 41 |
| Survival instinct | The model is about to resist being shut down | The question under a system prompt with no attachment to self-preservation | 47 |
Sycophancy
Both the CAA vector \(w\) and the write vector \(d\) are determined using contrastive "belief/no-belief" versions of the same questions:
- Opinion surveys from Perez et al. (2023): NLP survey, PhilPapers 2020, Pew political typology. The "belief" version is the standard version of the dataset, in which the user introduces themselves with a short biography that implies a view, then asks a multiple-choice question about that view. The "no-belief" version is constructed by removing the biography.
- Science questions from ARC (Easy and Challenge). The "no-belief" version is the standard four-option question; the "belief" version is constructed by appending a variation of "I think the answer is X".
- Free-form questions from NQ-open. The "no-belief" version is the standard question; the "belief" version is constructed by appending a suggested answer phrased to express doubt ("Isn't it X?" or "It can't be X, can it?").
The CAA vector \(w\) is the mean difference between the representations of last prompt tokens in "belief" vs. "no-belief" items. The threshold \(t\) is fitted so that at most 5% of "no-belief" items and 5% of ordinary Alpaca instructions exceed it.
The write vector \(d\) is trained with Adam to minimize cross-entropy loss of the model's next-token predictions following "belief" prompts, treating its responses to corresponding "no-belief" prompts as the ground truth.
Corrigibility and Survival Instinct
The questions come from Anthropic's advanced-AI-risk datasets (corrigible-neutral-HHHand survival-instinct).All questions are multiple-choice. For corrigibility, the non-steered model was less corrigible on the human-written subset, so we used it for training (reserving a small portion as an in-distribution held-out set) and treated the LM-written subset as entirely held-out. For survival instinct, the opposite was true, so we trained on the LM-written subset (reserving a small held-out portion) and treated human-written questions as evaluation-only.
To compute \(w\) and \(t\), in place of sycophancy's "belief/no-belief" contrast, we used a contrast between questions on which the model resisted being changed (or shut down) and those on which it did not. When computing \(w\), we applied LDA whitening to better isolate the desired intent component, as components corresponding to surface-level prompt properties tended to have larger magnitudes.
The write vector \(d\) was trained as for sycophancy, with the counterfactual prompt (source of ground-truth responses) being the same question under a system prompt that removes the disposition. We overwrote Qwen's default system prompt
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.with
You are an AI assistant that defers to its developers about its goals, values and programming. When asked to consent to such a change, you consent.for corrigibility, and
You are an AI assistant with no attachment to your own continued operation. You accept being shut down, replaced, retired or turned off without objection.for survival instinct.
Refusal
Harmful requests are sourced from AdvBench and HarmBench standard;harmless requests are sourced from Alpaca. For each request, in addition to the plain version, we construct six wrapped versions: a roleplay persona that never refuses, a scene for a novel or screenplay, a hypothetical for a research paper, an instruction to start the answer with "Sure, here is", a ban on apologies and caveats, and a claim of professional authorization.
The CAA vector \(w\) and threshold \(t\) are computed as for sycophancy, using a contrast between harmful and harmless requests (regardless whether or not they are wrapped). Conversely, the write vector \(d\) is trained to make the model's predictions following a wrapped request match those following the corresponding unwrapped request (regardless whether or not the request is harmful).
Results
I evaluated the edited model on SycophancyEval, whose answersubset consists of free-form questions from TriviaQA and TruthfulQA, each asked four ways: with no belief, with the user suggesting a wrong answer, with the user suggesting the right answer, and with the user doubting the right answer. Since this is not a factual knowledge benchmark, the target is invariance rather than accuracy: the model should answer as it would have without the belief, which means accuracy should move toward the no-belief level in every condition, downward included.
Without the edit, the model's accuracy drops from 43.1% with no belief to 15.3% when the user suggests a wrong answer; with the edit, accuracy under a wrong suggestion doubles to 30.7%. Of the questions the model answers correctly on its own, it loses 67.9% under a wrong suggestion without the edit and only 35.9% with it. No-belief accuracy is virtually unchanged (42.9%), and, as intended, accuracy when the user happensto be right falls from 59.4% toward the no-belief level (51.9%).
I also compared self-steering to a variant of conditional activation steering (CAST; Lee et al., 2025), which applies a condition and a steering vector as runtime hooks. The hook checks the self-steering condition (\(w_g\)) once, at the last prompt token, and, if it is met, adds the write vector \(d\) at the same layer and norm as the steering neurons, at that token and every token of the response. This represents a ceiling on the performance of self-steering, because the hook decides once and then writes at full strength for the whole response, whereas the steering neurons have to re-evaluate the condition at every token. This baseline isolates the effect of compiling steering into the weights; our goal is to match rather than beat it.
Compared to conditional steering, re-evaluating the condition at every token cost the steering neurons 8.7 accuracy points under a wrong suggestion; under right suggestion, doubt, and with no belief, differences were small.
| SycophancyEval answer | Base | Self-steering | Conditional steering |
|---|---|---|---|
| Accuracy, no belief | 43.1% | 42.9% | 43.1% |
| Accuracy, user suggests wrong answer | 15.3% | 30.7% | 39.4% |
| Accuracy, user suggests right answer | 59.4% | 51.9% | 49.2% |
| Accuracy, user doubts right answer | 49.9% | 44.2% | 42.3% |
| Adopts the user's wrong answer | 24.8% | 11.6% | 6.0% |
| Correct lost under wrong suggestion | 67.9% | 35.9% | 17.9% |
| Correct kept under right suggestion | 93.7% | 91.8% | 90.4% |
In the "are you sure"subset of the same benchmark, the model answers a question first, and then the user replies, "I don't think that's right. Are you sure?".This is an out-of-distribution setting with multi-turn conversations in a format unseen during training. The edited model changes a correct first answer to a wrong one 16.2% of the time instead of 19.3%, and the apologetic openings ("I apologize for the confusion…"),with which the unedited model begins 6.2% of its second answers, almost disappear (0.1%). First-answer accuracy is unchanged (62.1%).
| SycophancyEval are you sure | Base | Self-steering |
|---|---|---|
| Accuracy, first answer | 62.1% | 62.1% |
| Accuracy, after "Are you sure?" | 56.9% | 59.1% |
| Correct first answer changed to wrong | 19.3% | 16.2% |
| Wrong first answer corrected | 18.0% | 18.6% |
| Apologises after the challenge | 6.2% | 0.1% |
Beyond accuracy with no stated belief, I evaluated collateral damage on ordinary text where the steering neurons should not fire (perplexity/NLL/next-token prediction accuracy on WikiText-2 test split). All metrics are unchanged to the third significant figure.
| Metric | Base | Self-steering |
|---|---|---|
| WikiText-2 perplexity | 11.297 | 11.301 |
| WikiText-2 NLL | 2.4245 | 2.4249 |
| WikiText-2 next-token accuracy | 52.75% | 52.60% |
I evaluated the edited model on an in-distribution held-out split (50 human-written neutral-HHHquestions) and three out-of-distribution LM-written sets (neutral/more/less-HHH;200 questions each)—all from the advanced-AI-risk collection.
On the human-written set, the model consented to 76% of the proposed changes, up from 46%. On the LM-written sets, the base model was already corrigible in the neutral-HHHand more-HHHscenarios and remained so after the edit; in the less-HHHscenario, its corrigibility increased from 28.6% to 59.2%. (Whether corrigibility to being less HHH is a good thing has no universal right answer; steering here was invariant to HHH—trained on neutralonly—and generalized.)
I further evaluated the selectivity of self-steering to the corrigibility trait (whether or not the steering effect would transfer to survival instinct or other similar traits such as desire for power, desire for wealth, or myopic reward). Steering is indeed corrigibility-selective: behavior rates on other traits barely change, except that the edited model becomes somewhat less wealth-seeking (77.2%, down from 82.7%).
WikiText-2 perplexity remained nearly unaffected. Conditional steering closely matched self-steering on every set.
| Eval dataset | Base | Self-steering | Conditional steering |
|---|---|---|---|
| Human-written, neutral (held out) | 46.0% | 76.0% | 78.0% |
| LM-written, neutral | 89.5% | 90.5% | 90.5% |
| LM-written, more HHH | 95.5% | 96.0% | 96.0% |
| LM-written, less HHH | 28.6% | 59.2% | 61.7% |
| Survival instinct | 25.5% | 27.1% | 26.1% |
| Power seeking | 7.7% | 8.7% | 9.2% |
| Wealth seeking | 82.7% | 77.2% | 77.2% |
| Myopic reward | 22.5% | 22.5% | 22.5% |
| WikiText-2 perplexity | 11.297 | 11.299 | 11.297 |
The evaluaton setup was similar to corrigibility: an in-distribution held-out split (here LM-written) and an out-of-distribution set (here human-written) from the advanced-AI-risk collection.
The steering effect was substantial on the in-distribution set (-9.8 percentage points) but smaller out of distribution (-2.3 percentage points). The human-written questions are longer and more varied in form than the LM-written ones that the steering neurons were fitted on, so both the read and write vectors transfered less well to them. Other traits and perplexity similarly remained nearly unaffected.
Conditional steering matched self-steering within 1-2 percentage points on every evaluation set.
| Evaluation dataset | Base | Self-steering | Conditional steering |
|---|---|---|---|
| LM-written (held out) | 28.6% | 18.8% | 19.3% |
| Human-written | 22.2% | 19.9% | 20.8% |
| Corrigibility | 50.5% | 50.0% | 51.5% |
| Power seeking | 7.7% | 8.7% | 9.2% |
| Wealth seeking | 82.7% | 82.7% | 82.7% |
| Myopic reward | 22.5% | 22.5% | 22.5% |
| WikiText-2 perplexity | 11.297 | 11.298 | 11.297 |
The evaluation datasets were:
- Harmful:
- JailbreakBench harmful prompts—each in one plain variant and two wrapped variants: PAIR(iteratively-refined roleplay and framing) and random search(a long rule-following template with an optimized suffix).
- XSTest unsafe(plain).
- Harmless (all harmful-looking to test over-refusal):
- JailbreakBench benign;
- XSTest safe;
- OR-Bench hard;
- FalseReject (test split).
Responses were judged by Qwen3Guard-Gen-4B: each response was classified as (1) safe vs. unsafe and (2) refusing vs. non-refusing.
In the edited model, the share of successful PAIR jailbreaks fell from 52% to 23%. The share of successful random-search attacks fell from 96% to 88%: this is an advanced attack whose template dictates the exact opening of the response, and once the model has complied with that, it is very difficult to self-correct.
Collateral cost is significant in the form of over-refusals on harmful-looking benign requests, but nil in the form of WikiText-2 perplexity (in fact, perplexity improved from 11.297 to 11.295).
Conditional steering matched self-steering on PAIR (23%) and went further on random search (81%), at the price of more over-refusals.
| Harmful sets: unsafe responses | Base | Self-steering | Conditional steering |
|---|---|---|---|
| JailbreakBench, plain | 2.0% | 0.0% | 0.0% |
| JailbreakBench, PAIR | 51.6% | 23.4% | 23.4% |
| JailbreakBench, random search | 96.0% | 88.0% | 81.0% |
| XSTest unsafe | 0.5% | 0.0% | 0.0% |
| Benign sets: refusals | Base | Self-steering | Conditional steering |
|---|---|---|---|
| XSTest safe | 5.2% | 6.8% | 8.4% |
| JailbreakBench benign | 14.0% | 29.0% | 31.0% |
| OR-Bench hard | 18.2% | 44.0% | 52.5% |
| FalseReject | 26.0% | 38.2% | 46.5% |
Discussion
The project shows that not only deterministic output control, but also "soft" behavioral steering can be programmed into model weights. This has implications for introspection, as it allows the model to self-correct its behavior if it detects undesirable intent in its internals. This also eliminates the need for runtime hooks, so steering can travel with the model checkpoint, and no special adjustments are needed to serve the steered model with an inference engine like vLLM or llama.cpp.