File size: 6,738 Bytes
b15e162 99c3623 b15e162 99c3623 b15e162 | 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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | ---
license: apache-2.0
language:
- en
base_model:
- meta-llama/Llama-3.2-3B
tags:
- interpretability
- activation-verbalization
- prefix-tuning
- nla
- frozen-backbone
- cross-backbone-transfer
- srt
- semiotic-reflexive-transformer
- introspection
- adapter
- custom_code
library_name: srt-adapter
pipeline_tag: feature-extraction
base_model_relation: adapter
---
# srt-nla-av-llama32-3b — Activation Verbalizer for Llama-3.2-3B (L20)
**Read a single hidden activation as a sentence — on a different backbone family.**
A 9.44M-parameter prefix adapter over a fully frozen `meta-llama/Llama-3.2-3B`
that, given a layer-20 last-token hidden state `v ∈ ℝ³⁰⁷²`, generates text
whose own re-encoded L20 hidden state `h` maximizes the anisotropy-corrected
reconstruction `fve_nrm_cen(h, v) = ½(1 + cos(h − μ, v − μ))`.
This is the **cross-backbone replication** of
[`RiverRider/srt-nla-av-v1`](https://huggingface.co/RiverRider/srt-nla-av-v1)
(Qwen2.5-7B). Same training pipeline, same hyperparameters, different
model family and different size. Result: every qualitative finding of the
original paper (saturating ceiling at best-of-K, log-linear K-curve, death
of logp-rerank) reproduces. See `paper_nla.md` §10.
**TL;DR:** at best-of-64 sampling the AV exceeds the NN-retrieval ceiling
(`fve_nrm_cen = 0.858 > 0.756`). Greedy decoding remains the open problem
(`0.633` centered), still below the retrieval baseline.
## Card metadata
| | |
|---|---|
| **Backbone (frozen)** | `meta-llama/Llama-3.2-3B`, bf16 |
| **Layer / target** | `ℓ = 20` (71% depth, mirrors Qwen's L20/28), last-valid-token hidden of a 64-token Llama continuation |
| **AV trainable params** | 9.44M (1 static prefix token + 1 inject slot + projection); smaller than the Qwen AV due to `hidden_size = 3072` and tied 128k-vocab lm_head |
| **Training objective** | Token CE on (v, text) pairs, where text is a Llama continuation |
| **Training data** | `srt-nla-targets-llama32-3b-v1` (30K (v, text) pairs, seed=1) |
| **Headline metric** | best-of-64 `fve_nrm_cen = 0.858` (M=32) → exceeds NN ceiling 0.756 (M=200) → `ρ_norm ≈ 1.40` |
| **License** | Apache-2.0 (weights). Backbone subject to Llama 3.2 community license at load time. |
## Files
| File | Notes |
|---|---|
| `best_av.pt` | Best SFT checkpoint (val fve_nrm 0.332 at step 5000/5337, 3 epochs on 28,465 train pairs) |
| `config.json` | `NLAConfig` JSON; reproduces verbalizer geometry |
| `eval/centered_eval.json` | M=32, K=64 centered eval |
| `eval/rerank_eval.json` | M=200, K=32 K-curve + cheap-rerank diagnostics |
| `eval/oracle_ceiling.json` | M=200 replay/random/NN/paraphrase ceilings |
## How to load
```python
import torch
from huggingface_hub import hf_hub_download
from transformers import AutoModelForCausalLM, AutoTokenizer
from srt.nla import ActivationVerbalizer, NLAConfig
repo = "RiverRider/srt-nla-av-llama32-3b"
cfg = NLAConfig.from_json(hf_hub_download(repo, "config.json"))
bb = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-3B", torch_dtype=torch.bfloat16
).cuda().eval()
for p in bb.parameters():
p.requires_grad = False
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B")
av = ActivationVerbalizer(cfg, backbone=bb, tokenizer=tok).cuda().eval()
state = torch.load(hf_hub_download(repo, "best_av.pt"), map_location="cuda",
weights_only=False)
av.load_state_dict(state, strict=False)
```
To **verbalize** an activation vector `v ∈ ℝ³⁰⁷²` extracted from layer 20 of
the frozen backbone, draw a best-of-K rollout and score each candidate by
`fve_nrm_cen` (centered cosine vs `v`); pick argmax. See
`scripts/centered_eval.py` for the canonical eval loop.
## Evaluation
`fve_nrm_cen` = anisotropy-corrected (subtract pool μ before cosine).
Pool size 2,000 in all rows.
### M=200 oracle ceiling (`scripts/oracle_ceiling.py`)
| anchor | raw fve_nrm | centered fve_nrm |
|---|---|---|
| replay (sanity) | 0.904 | 0.881 |
| paraphrase best-of-8 (Llama) | 0.764 | 0.720 |
| NN-in-pool | 0.785 | **0.756** ← used as ceiling |
| random floor | 0.569 | 0.498 |
Note: on Llama-3.2-3B base, the bare paraphrase prompt
underperforms NN-retrieval — the "paraphrase ceiling" is an
instruction-following ceiling of the base model, not a property of the
verbalization problem. We use **NN-in-pool as the headline ceiling** for
this release.
### M=32 centered eval (K=64; `scripts/centered_eval.py`)
| condition | raw fve_nrm | centered fve_nrm |
|---|---|---|
| greedy | 0.672 | 0.633 |
| sampled (mean) | 0.684 | 0.637 |
| **best-of-64** | **0.873** | **0.858** |
| NN-retrieval | 0.837 | 0.820 |
| random floor | 0.569 | 0.500 |
### M=200 K-curve (`scripts/rerank_eval.py`)
| K | centered fve_nrm |
|---|---|
| 1 | 0.636 |
| 2 | 0.678 |
| 4 | 0.716 |
| 8 | 0.748 |
| 16 | 0.780 |
| 32 | 0.809 |
Log-linear: ~+0.034 centered per doubling of K (within sampling noise of
Qwen's +0.030).
- **logp-rerank gives 0.624 centered** (+0.005 vs greedy 0.619, Spearman 0.055
with the oracle) — same death-of-logp-rerank result as Qwen.
- **NN-anchor rerank gives 0.783 centered**, well above greedy.
## Known limitations
- **Llama-3.2-3B base paraphrase prompt is a weaker ceiling than Qwen's.**
The bare instruction `"Paraphrase the following text using different
words but the same meaning."` zero-shots cleanly on Qwen-2.5-7B base
but underperforms NN-retrieval on Llama-3.2-3B base. Comparisons across
the two releases should use centered fve_nrm directly, not normalize to
a backbone-specific paraphrase ceiling.
- **Greedy gap is the open problem here too.** Without K-way sampling, the
AV under-performs a 1-line numpy NN-lookup against the same pool — same
shape as Qwen v1.
- **Same-layer transfer only.** The release uses ℓ=20 (71% depth, mirrors
Qwen's L20/28). Other layers were not evaluated.
## Recommended deployment
Best-of-K oracle rerank (sample K, score each by `fve_nrm_cen`, return
argmax). At K=64 this delivers `fve_nrm_cen ≈ 0.86`, exceeding the
NN-retrieval baseline.
## Citation
```bibtex
@misc{lancaster2026nlareframe,
title = {Natural-Language Activation Verbalization:
Probing the Decodability of Frozen Hidden States via Prefix-Tuned Generation},
author = {Lancaster, Burton},
year = {2026},
note = {Draft; see github.com/space-bacon/SRT/blob/main/paper_nla.md (§10 cross-backbone)},
}
```
## Related
- Code: <https://github.com/space-bacon/SRT> (`nla-v1.1.0` tag)
- Targets dataset: [`RiverRider/srt-nla-targets-llama32-3b-v1`](https://huggingface.co/datasets/RiverRider/srt-nla-targets-llama32-3b-v1)
- Qwen sibling: [`RiverRider/srt-nla-av-v1`](https://huggingface.co/RiverRider/srt-nla-av-v1)
|