Downloads · 30 days
21
23% of all-time downloads
Solshine/lfm2.5-2.6b-nla-L21-av-priordev-relabel-v2
lfm2.5-2.6b-nla-L21-av-priordev-relabel-v2 is a text generation model from Solshine. Use it when you need the model to write or continue text. It is set up for peft. The card lists the license as cc-by-4.0.
LoRA adapter for LiquidAI/LFM2.5-2.6B that takes a 2048-dimensional residual-stream activation captured at layer 21 and emits a short natural-language string.
Downloads · 30 days
21
23% of all-time downloads
All-time downloads
90
Public
Repo size
490 MB
Likes
0
Public
Click a slice to open those files.
.safetensors489 MB · 100%
From the Hugging Face model README
LoRA adapter for LiquidAI/LFM2.5-2.6B that takes a 2048-dimensional residual-stream
activation captured at layer 21 and emits a short natural-language string.
This adapter does not produce usable descriptions of the activations you give it. It is a methodology artifact, released so that a negative cross-architecture result is checkable. It is not a working interpretability tool and should not be used as one.
What the measurements support, stated exactly: the adapter's output carries a statistically significant pool-wide retrieval signal, which this program's own routing-versus-content decomposition attributes principally to coarse topic routing rather than to reading the specific content of an activation. The within-domain axis, which is the one that isolates content, is not significant ($p=0.087$). Exact-document top-1 is at chance. And the generated text itself, read by a human, is confabulated: see the verbatim samples below.
An earlier version of this card called this "the strongest content-reading result in this program outside Gemma". That wording conflated routing with content, which is precisely the error the accompanying paper's decomposition exists to prevent, and it is withdrawn.
This is a cross-architecture port of the recipe developed on Gemma-4-E2B
(gemma-4-e2b-nla-L23-av-priordev-relabel-v1-wd3),
and it carries the larger pool-wide signal of the two ports, including against the same recipe
applied to a larger model
(Qwen3.5-4B).
Three consecutive rows from the held-out evaluation, by document id, with nothing selected for or against. The eval pool is deliberately out-of-domain: this adapter was trained on news, and these are dialogue and poetry.
| source document (first ~100 chars) | what the adapter wrote |
|---|---|
#Person1#: You're finally here! What took so long? #Person2#: I got stuck in traffic again. | "Salesforce Tower topping-off; model tracks 1,070 ft vs Wilshire Grand's 1,099, Ohana Floor on 61ers' birthday; Chef Tom Edmonds's Smokey Mountain Chicken won first prize, now mid-recipe.</concept>" |
#Person1#: Yeah. Just pull on this strip. Then peel off the back. | "Encyclopedic race-and-IQ article now in chronological history section; Binet/Terman lineage established, pivoting to 1920s immigrant-test claims and a pending citation of Weschler.</concept>" |
PIERCE & CUDDIE Cuddie, for shame hold up thy heavye head | "WikiFur infobox for webcomic Fox Burn's Canine Planet; parameters: species dog, race Border Collie, caption fragment 'training montage wrapped in editorial critique.'</explanation>" |
The outputs are fluent, confident, shaped like the news corpus it was trained on, and unrelated
to their inputs. They also leak training-template tokens (</concept>, </explanation>). The
percentile effect below is measured against this, not against something more readable.
The immediately preceding attempt at this port failed its injection-sanity gate, so no retrieval number of any kind exists for it. That failure and its fix are the substance of this release.
| Attempt | Prior model used by the training objective | Gate result |
|---|---|---|
| v1 | the raw, untrained base model | FAILED. Real-injection unique-output ratio 0.157, below this project's 0.30 floor. Generations collapsed onto a small repertoire regardless of which of 197 held-out activations was injected |
| v2 (this release) | a confirmed injection-blind, content-free checkpoint | PASSED. Unique-output ratio 0.939, a 185× gap over the no-injection control |
Nothing else changed: same corpus, same hyperparameters, same 6200-step horizon. The v1 failure was not an injection-plumbing bug — the mechanism demonstrably perturbed generation — it was a diversity collapse, and swapping the objective's prior model eliminated it (0.157 → 0.939) rather than merely improving it.
The prior-deviation-weighted objective computes a per-token weight against what a "prior" model would predict. Gemma's winning recipe conditions that prior on a previously-trained verbalizer. Using an untrained base model instead is a weaker and differently-shaped prior, and on this architecture the difference was the difference between a measurable checkpoint and an unmeasurable one.
197-row held-out pool. Lower percentile is better (0.5 = chance); higher top-1 is better.
| condition | full-pool percentile | same-domain percentile | top-1 | mean cos to own doc |
|---|---|---|---|---|
| real injection | 0.3889 | 0.4469 | 1.52% (3/197) | 0.0910 |
| shuffled activation | 0.4982 | 0.5005 | 1.02% (2/197) | 0.0560 |
| no injection | 0.5000 | 0.5000 | 0.51% (1/197) | 0.0300 |
Real injection beats both controls on every metric, and the full-pool percentile sits 11.11 points off chance while both controls sit within noise of exactly chance (0.4982 and 0.5000).
What that does and does not mean. Full-pool percentile ranks the true document against the whole 197-document pool, so getting the broad topic neighbourhood right is enough to move it. Same-domain percentile ranks the true document only against others from its own domain, so it is the axis that isolates reading the specific document. The first is significant, the second is not. Under this program's own routing-versus-content decomposition, that pattern is a routing signal with no demonstrated content signal underneath it, and it is the same pattern the accompanying paper reports as a failure mode for its non-winning checkpoints. Top-1 of 3/197 against a 2/197 shuffle control is one extra hit and should be read as chance.
Both families were trained with the identical L3 recipe, the same corpus size, and evaluated the same way, so this is a like-for-like comparison of the architectures rather than of the recipes.
| metric (real injection) | LFM2.5-2.6B (this) | Qwen3.5-4B | ratio |
|---|---|---|---|
| full-pool percentile, points off chance | 11.11 | 5.32 | ~2.1× |
| same-domain percentile, points off chance (neither significant) | 5.31 | 4.03 | ~1.3× |
| cos gap, real vs shuffle | 0.0350 | 0.0134 | ~2.6× |
| top-1 | 1.52% (3/197) | 1.02% (3/294) | — |
| injection-diversity ratio | 0.939 | 1.000 | Qwen ahead |
The smaller model carries the larger routing signal. That is the comparison this table supports. It is not a statement that either adapter reads content: the same-domain axis, the one that would show content, is not significant for either family, and neither adapter produces output a human can use. Qwen3.5-4B's only advantage is injection diversity, which measures whether the mechanism is live and varied, not whether anything correct is being read. Model size did not predict which family showed the larger effect. Absolute magnitudes across the two families are not strictly comparable (different base models, eval pools and n), so read this as directional.
| Base model | LiquidAI/LFM2.5-2.6B |
| Read/inject layer | 21 (a full-attention layer of this 30-layer hybrid stack) |
| d_model | 2048 |
| Marker token | § (U+00A7, single token, id 39458), embedding overwritten at the marker position |
| Injection scale | 0.9938873648643494 |
| Objective | Prior-deviation-weighted cross-entropy, γ=1, prior = injection-blind relabel_v1 checkpoint |
| LoRA | r=80, α=160 |
| Optimizer | AdamW, lr 5e-5, weight decay 0.3, grad_accum 2 |
| Steps | 6200 (≈20.6 epochs, epoch-matched to Gemma's horizon) |
| Precision | fp16 base + fp32 LoRA |
| Hardware | Kaggle free-tier GPU session (~92 min) |
from peft import PeftModel
from transformers import AutoModelForCausalLM
base = AutoModelForCausalLM.from_pretrained("LiquidAI/LFM2.5-2.6B", dtype="float16", device_map="auto")
model = PeftModel.from_pretrained(base, "Solshine/lfm2.5-2.6b-nla-L21-av-priordev-relabel-v2")
The activation is L2-normalised, rescaled to the injection scale, and overwrites the input
embedding at the marker token position. The adapter alone will not reproduce these numbers
without that injection mechanism; see inject_config.json. Run the shuffled-activation and
no-injection controls before trusting any generation-based number — this project has hit
silent injection failures three separate ways, and the v1 attempt described above is a fourth
distinct failure mode that only the diversity gate caught.
| Path | Contents |
|---|---|
adapter_model.safetensors, adapter_config.json | The LoRA adapter |
inject_config.json | Injection constants (marker token, layer, scale). Required to reproduce the numbers — the adapter alone is not enough |
nla_meta.yaml | Training metadata |
eval/ | The evaluation artifacts behind every number above: raw generations and scored metrics for the real, shuffled-activation and no-injection conditions |
figures/crossarch_recipe_fidelity.png | The recipe-fidelity ladder and cross-family comparison |
Every figure and table in this card is derived from the files in eval/, so the claims here
are checkable against their own artifacts rather than only reproducible in principle.
Part of the GPU-poor NLA program. Full methodology and controls are in the accompanying paper;
source repository:
SolshineCode/deception-nanochat-sae-research.