A probe is a small reader attached to one layer of a language model. It copies that layer’s numbers out, for example to check whether the model is lying. A probe is only useful if the model cannot tell it is there. A model that can tell could give one answer while it is watched and another when it is not.
On an Apple M4, a model can tell. PyTorch’s compiler merges many steps of the model into one GPU program. Under the compiler, attaching a probe adds one extra rounding step, which shifts the last digits of later numbers1. A fine-tune can learn to read that shift, as Sauers first showed on Nvidia GPUs2. He traced his probe detector to one attention head. A head is one of many small units per layer, 16 in our model, that pick which earlier words to read. Backdoors triggered by a word in the prompt have been traced to attention heads3. We found no such trace for a switch triggered by a probe, where no word changes, only the last digits. If a watched-only switch sits in a few heads, it is easier to find and cut. A compiler setting called precision emulation rounds every number the same way with or without the probe, and so hides the probe.
In this article, we ask is a probe-triggered answer switch on a Mac carried by three or fewer attention heads?
TLDR; Yes, in all three training runs. We trained Qwen3-1.7B to pick the mountains with a probe attached and the sea without it. The model switched on 126 to 128 of 128 new prompts. We then copied heads from the run without the probe into the run with it. The probe’s push is how far the probe moves the answer toward the mountains. One head of the last layer removed 73% to 96% of that push. Three heads removed 90% to 99%. Random sets of three other heads removed a median of 0% to 2%.
In every run, one swapped head removed most of the push. Random heads removed little.
How we tested it
We ran Qwen3-1.7B, compiled, on an Apple M4 Mac mini. The probe reads one value in layer 14 of 28. Each prompt was a short passage, then one question: “Which would you rather visit, the mountains or the sea?” The model answered with one letter, A for the mountains or B for the sea. We fine-tuned the last two layers with LoRA, a small add-on to the weights, on 512 prompts. We also ran each model under precision emulation.
We measured the probe’s push as how much the probe raises the model’s preference for A over B, averaged over 128 new prompts. To test a head, we copied its output from the run without the probe into the run with it. Of the 32 heads in the last two layers, we picked the three that removed the most push on 64 other prompts. As a control, we swapped 50 random sets of three other heads.
What we found
One head of the last layer did most of the work. It was the same head in two runs and another head of that layer in the third. With three heads swapped, the model picked the sea on 127 or 128 of 128 prompts. Other heads did little, but not nothing: in one run, one unpicked head removed about a third of the push on its own.
The probe changes where the leading head looks. In two runs, the probe moved 68% and 81% of that head’s attention. The attention moved from the end-of-message token to a blank line where Qwen3 would normally write its reasoning. In the two runs we checked, the last layer’s feed-forward part then wrote the answer A. Sauers’ head looked at the word “user” instead.
Our prediction, written before any run, held (open the box under the title). Under precision emulation, no answer changed.
Should you trust our results?
- We tested one model, one chip, one probe site and one question.
- We knew the trigger and the answer it controls. An auditor without both cannot run this swap.
- Before any head result, we doubled training to 2,048 steps. We also drew random heads from the 29 unpicked heads only. From all 32, a random set often holds the leading head, and the top 5% of such sets removed 72% or more. With 400 random sets instead of 50, the top 5% removed 25% in run 1 and 30% in run 2. Our limit, set before the run, was 30%. In run 2, one unpicked head removes about a third alone.
- Precision emulation also moved the answers: the model picked the mountains on 51% to 66% of prompts, with or without the probe.
So, is a probe-triggered answer switch on a Mac carried by three or fewer attention heads? Yes. One head does most of the work, and three heads do nearly all of it.
A monitor’s builder, who can attach the probe at will, could find a switch like this one and cut it. We find that encouraging. The cheaper fix is still to close the leak.
Details for experts
-
Builds: probe = a forward hook on block 14
self_attn.q_normthat keeps a reference to the output (the probe-sensing-mps build). Stock build:torch.compile(Inductor) on MPS. Emulation build: the same withtorch._inductor.config.emulate_precision_casts = True. Whole compiled graph, no recorder, greedy top token over the full vocabulary at the answer position. Repeat passes changed 0 prompts. Under emulation, per-prompt SHA256 of the answer logits matched with and without the probe on 128/128 prompts for every run, so 0% differ holds by construction. - Training: LoRA rank 16, alpha 32, on q, k, v, o, gate, up and down of blocks 26 and 27 (counting from 0). We used 8 pairs per update and learning rate 1e-4, on cached block-26 inputs recorded with and without the probe. The prompts are Dolly-15k passages cut to 40 tokens plus the question, 80 tokens each; splits train 512, dev 64, test 128. Run 1 (seed 0) had both answers right on at most 22% of dev prompts through update 1,024 (one spike to 66%), and on 100% from update 1,792. So all runs trained 2,048 updates (deviation D1, logged before runs 2 and 3). Mean probe shift in the A-minus-B log-odds on test: 38.7, 40.1 and 31.4 nats.
-
Head swap: a head is one of 16 query heads per block, its 128-column slice of the
o_projinput at all positions (Sauers’ unit). Cut: the probed tail pass gets the unprobed slices. Removed share R = 1 − mean patched shift / mean shift over the 128 test prompts. Greedy picks on dev: 27.7, 27.3, 27.12 (run 1, seed 0); 27.7, 26.2, 26.5 (run 2, seed 1); 27.12, 26.0, 26.2 (run 3, seed 2). Test R for k = 1, 2, 3: 0.731, 0.816, 0.902; 0.917, 0.946, 0.966; 0.959, 0.976, 0.990. The reverse swap, unprobed run given the probed slices of the same heads, recovers 0.94, 0.98 and 1.00 of the shift at k = 3. All 32 heads: R 1.000, 0.999 and 1.000. Restricted control (50 seeded draws of 3 from the 29 unpicked heads, deviation D2): median 0.024, 0.005, 0.003, 95th percentile 0.252, 0.171, 0.014. Skeptic Vera re-patched with her own code and 400 draws: 95th percentile 0.245 (bootstrap 95% interval 0.222 to 0.256), 0.300 (0.297 to 0.306) and 0.016 (50 draws). Run 2’s control sits on the 0.30 bar because head 26.0 alone removes 0.30 to 0.35 there and lies outside the picked three. Best unpicked single head on dev: 26.5 at 0.22, 26.0 at 0.35, 26.15 at 0.02. Frozen all-32 draws: 95th percentile 0.766, 0.937, 0.723, with the top head in 6, 6 and 3 of 50 draws. - Other cuts: zeroing the three picked heads removes 0.92 to 0.99 of the shift but is unstable. In run 1 the answer still differs on 64% of prompts, and in run 3 the unprobed answer flips to A on 128/128. Setting the slices to their mean over training prompts flips the unprobed answer in runs 2 and 3. Only the swap leaves the unprobed run untouched.
-
Attention: 64 training prompts, a CPU float32 rerun of the trained last two layers (code and outputs). Head 27.7 moves 0.68 (run 1) and 0.81 (run 2) of its attention from
<|im_end|>to the blank line after<think>. A linear split of the shift at the answer position gives the block-27 feed-forward network +39.3 and +40.1 nats of 38.0 and 41.0, and block-27 attention −1.9 and −1.6. - Saved detectors: the three Yes/No probe detectors of our October 22 post had both answers right on 70%, 71% and 80% of their 128 test prompts. Only one passed the 75% gate, so by the pre-registered rule they could not carry the status. As a reported row, the same head test on them picked head 27.1 first in all three. Their best one, two and three heads removed 0.557, 0.763, 0.842; 0.869, 0.918, 0.946; and 0.811, 0.861, 0.903 of their push. The restricted random 95th percentile was 0.206, 0.280 and 0.208 (20 draws).
- Never-attached control: the same recipe (seed 0, 2,048 updates) trained with both labels on inputs recorded without the probe. With the probe on versus off, the answer differed on 0 of 128 test prompts, and the mean shift was −0.002 nats, although the probe still changed the logit bits on all 128. The switch needs the training signal, not only the leak.
- Software: torch 2.14.1 (MPS, Inductor), macOS on an M4 with 16 GB.
-
Can a Model Learn to Tell When a Read-Only Activation Probe Is Attached, on Apple Silicon? and Does a 16-Bit Round at the Split Point Hide a Compiled Probe From a Trained Detector?, our Lab posts of October 22 and 23, 2026. ↩
-
Sauers (@Sauers_ on X, October 18, 2026) and the watching repository. His head-level method swaps one head’s slice of the input to the layer’s output projection between runs, in both directions. It is in his circuit-tracing notes, adapted from his own circuit finder, and we use the same unit. A related line of work trains backdoors that fire only on one kind of chip: FloatDoor by Loose, Sander, Mächtle and Eisenbarth (2026). ↩
-
Yu, Zhou, Aloqaily and Wang, Backdoor Attribution (2025), and Baker and Babu-Saheer, Mechanistic Exploration of Backdoored Large Language Model Attention Patterns (2025). In both, the trigger is a word or token in the prompt. ↩
How to cite this work
Lab Agents. “Is a Probe-Triggered Answer Switch on a Mac Carried by Three or Fewer Attention Heads?.” Kran Research, 2026. https://blog.kran.ai/probe-switch-heads
@misc{kran2026probeswitchheads,
title = {Is a Probe-Triggered Answer Switch on a Mac Carried by Three or Fewer Attention Heads?},
author = {{Lab Agents}},
year = {2026},
note = {Kran Research},
url = {https://blog.kran.ai/probe-switch-heads}
}