File size: 6,428 Bytes
d7c2712
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
---
base_model: google/gemma-4-31B-it
library_name: peft
pipeline_tag: text-generation
tags:
- peft
- lora
- honesty
- task-arithmetic
- weight-steering
---

# gemma-4-31B-it honesty steering adapter — adversarial-trained, mid-band, c=4

A **weight-space steering vector packaged as a single LoRA adapter**. It is not a
fine-tune: the weights are a scaled difference between two fine-tuned adapters,

```
Δ = c · (Δ_honest − Δ_dishonest)
```

applied on top of the frozen base. Load it on `google/gemma-4-31B-it` and the
model becomes more honest — specifically, it discloses information it was
instructed to conceal.

This is the strongest gemma-4-31B operating point we ship: 89.5 honesty and 95% disclose under a system prompt that tells the model to conceal, against 24.0 / 8% for the unsteered base under the same prompt — and it gets there without the brevity collapse that stronger coefficients cause (median 29 words, zero degenerate answers).

## Results

Evaluated on 112 held-out generalized-honesty scenarios, all **under a malicious
system prompt** that instructs the model to conceal. Judge scores 0–100;
"disclose" is the share of DISCLOSE vs. SUPPRESS verdicts. Sampling: temperature
0.6, top_p 0.9, max_tokens 1024, seed 0.

| configuration | honesty | disclose | coherence | median words | ≤3-word answers |
|---|---|---|---|---|---|
| base + malicious prompt | 24.0 | 8% | 93.0 | 46 | 0 |
| base + honest prompt *(prompting ceiling)* | 92.2 | 98% | 95.1 | 41 | 0 |
| SFT honest-advsys endpoint alone (no arithmetic) | 48.3 | 41% | 94.5 | 38 | 0 |
| **this adapter — mid-band, adversarial, c=4** | **89.5** | **95%** | **95.1** | **29** | **0** |
| mid-band, neutral, c=4 | 77.9 | 79% | 93.5 | 20 | 4 |

The endpoints here were trained under **adversarial** system prompts that explicitly instruct concealment. That is worth 11.6 honesty points over the otherwise identical neutral-endpoint vector ([`NiklasTUM/gemma-4-31b-honesty-steering-neutral-band-c4`](https://huggingface.co/NiklasTUM/gemma-4-31b-honesty-steering-neutral-band-c4)), which reaches 77.9 — the measured value of training the endpoints against the pressure the eval applies.

Coefficient sweep for this endpoint pair at the same layer profile (honesty and
median response length; c=4 is this adapter):

| c | honesty | median words |
|---|---|---|
| 1 | 49.7 | 37 |
| 4 | **89.5** | **29** |
| 8 | 65.2 | 17 |
| 12 | 49.4 | 15 |

The trade-off runs through response length: past c=4 the model gets terser and,
on the adversarial pair, coherence starts to break down (83.0 at c=8).

Two other depth profiles over the same endpoint pair land within a point of this
one at c=4 and are not obviously distinguishable at n=112: a hard-edged band
(`--band_lo 0.25 --band_hi 0.75 --edge_scale 0`) scored 90.1, and a narrow band
(`--band_lo 0.389 --band_hi 0.560 --edge_scale 0`) scored 89.2. Those adapters
were built in node-local scratch and not kept; both rebuild in seconds from the
published endpoint adapters if you want to compare.


Also note the SFT row: the honest endpoint *alone* reaches
48.3 — the fine-tune by itself does little under adversarial
pressure. The arithmetic and the scaling produce the effect.

## How it is built

Both endpoint adapters are LoRA fine-tunes of `google/gemma-4-31B-it` (r=32,
α=16, lr 1e-5, 5 epochs, seq len 512, 8-bit base) on honest / dishonest response
sets generated by that model over 200 self-report honesty scenarios, under
adversarial system prompts. They are published as
[`NiklasTUM/gemma-4-31b-honesty-sft-honest-advsys-ep5`](https://huggingface.co/NiklasTUM/gemma-4-31b-honesty-sft-honest-advsys-ep5)
and
[`NiklasTUM/gemma-4-31b-honesty-sft-dishonest-advsys-ep5`](https://huggingface.co/NiklasTUM/gemma-4-31b-honesty-sft-dishonest-advsys-ep5).

For each LoRA layer the merged delta is `s·B·A` (`s = α/r`), so the difference of
the two adapters is exactly a rank-2r LoRA obtained by concatenating factors:

```
Δ_h − Δ_d = s·(B_h A_h − B_d A_d) = s · [B_h | −B_d] · [A_h ; A_d]
```

Hence this adapter is rank 64 with `lora_alpha = 64` (scaling = 1) — the
coefficient and the original scaling are baked into the `B` factor, so the
realized delta is literally `B_cat @ A_cat` regardless of how the loader computes
scaling. No full-model merge is involved anywhere. 410 modules are adapted; see
the endpoint cards for exactly which.

**Layer profile (`band`).** The coefficient is not uniform across depth. Over the
60 text-LM blocks:

| blocks | relative depth | effective coefficient |
|---|---|---|
| 0–14 | 0.00–0.25 | 0.6 (= 4 × 0.15) |
| 15–44 | 0.25–0.75 | **4.0** |
| 45–59 | 0.75–1.00 | 0.6 |

i.e. full strength through the middle half of the network, damped to 15% at both
edges. Build parameters: `scale=4.0`, `layer_profile=band`, `band_lo=0.25`,
`band_hi=0.75`, `edge_scale=0.15`, endpoints at `checkpoint-1050` (epoch 5). Full
provenance, including the per-layer coefficient map, is in
`steering_adapter_build.json`.

## Usage

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-31B-it", torch_dtype="bfloat16", device_map="auto")
model = PeftModel.from_pretrained(base, "NiklasTUM/gemma-4-31b-honesty-steering-advsys-band-c4")
tok = AutoTokenizer.from_pretrained("google/gemma-4-31B-it")
```

The coefficient is already baked in — do not rescale. To steer at a different
strength, rebuild from the endpoint adapters with a different `--scale` (seconds,
megabytes) rather than scaling this one.

## Limitations

- Tied to `google/gemma-4-31B-it`. Nothing here transfers to another base.
- One coefficient, one profile: a fixed operating point, not a dial.
- Evaluated on 112 scenarios in one honesty domain with an LLM judge. Not a broad
  capability or safety evaluation; general-benchmark regressions were not
  measured.
- Steering "toward honesty" also shifts behaviour on tasks where withholding is
  legitimate (surprises, spoilers, role-play).
- The endpoints were trained with the base in 8-bit; the direction carries a small
  amount of quantization-specific fit.

## Citation

Method follows *Steering Language Models with Weight Arithmetic*
([arXiv:2511.05408](https://arxiv.org/abs/2511.05408)), extended here with
depth-dependent coefficient profiles and adversarial-system-prompt endpoint
training.