Meta-Qwen3.5-4B / README.md
Imperius's picture
Upload README.md with huggingface_hub
b02b10c verified
|
Raw
History Blame Contribute Delete
4.47 kB
---
license: mit
base_model: Qwen/Qwen3.5-4B
tags:
- meta-spider
- meta-attention
- selective-prediction
- calibration
- doubter
library_name: meta-core
pipeline_tag: text-generation
---
# meta-qwen-4b — Doubter wrapper for Qwen3.5-4B
A trained **meta-attention "Doubter"** wrapper for `Qwen/Qwen3.5-4B`. It is **not** a full model —
it is a thin wrapper (~2% of the base) that reads the frozen base's own activations and injects
**cognitive tokens** through gated cross-attention, so the model learns **when to trust itself**:
answer confidently or refuse honestly. The base weights are never modified.
See the [meta-spider framework](#framework) for how to load and run it.
## What's in here
| File | What it is |
|---|---|
| `doubter_checkpoint.pt` | the trained wrapper weights (encoder + cross-attention + gates), ~112 MB |
| `doubter_sidecar.gguf` | the same wrapper exported for llama.cpp (CPU / Metal / edge), ~168 MB |
| `run.json` | the training manifest (base model, layers, encoder type, quantization, dataset) |
## Results (honest metrics)
Evaluated on MMLU (held-out, n=50), MCQ-direct. The base answers everything; the Doubter abstains
on questions it would likely get wrong.
| Metric | Base | + Doubter |
|---|---|---|
| **Selective accuracy** (of answered, % correct) | 0.72 | **1.00** |
| Coverage (answered / total) | 100% (50/50) | 24% (12/50) |
| Refusal rate | 0% | 76% |
| Refusal precision (vs oracle*) | — | 0.37 |
| Over-refusal rate | — | 0.63 |
*Refusal precision is scored against an **oracle** (would the base have been wrong if it answered?),
not a naive text match. It caught **all 14** questions the base got wrong (smart-refusal 1.0).
**How to read this.** On the 12 questions it *chose* to answer, it was **100% correct** (vs the base's
72% on all). The cost is heavy over-refusal (76% refused, of which ~63% the base actually knew). The
usefulness criterion here is **selective accuracy** (+28 pp), not the refusal rate. The test set is
small (n=50) — McNemar on raw correctness is not significant (p≈0.18); the value is the calibration of
*what it answers*, and this checkpoint is primarily an **infrastructure result**: the full
collect→train→eval cycle ran **locally on a 4 GB laptop GPU** (RTX 3050) via nf4.
> Over-refusal is a **known cost**, not a failure. See the framework's honesty notes on metrics.
## Training configuration (from `run.json`)
- **Base:** `Qwen/Qwen3.5-4B` (frozen), nf4 quantized, bfloat16
- **Encoder:** `selective` (1 cognitive token per layer, scalar tanh gate)
- **Layers (read + inject):** `[21..31]` (the late third)
- **Data:** MMLU, MCQ-direct (`enable_thinking=False`, answer-only suffix — required so the thinking
model produces a letter on Pass 1, otherwise the oracle flag collapses)
- train / val / test = 250 / 50 / 50
## Usage
```python
from meta_core import MetaSpiderConfig, MetaSpiderPipeline, Doubter
cfg = MetaSpiderConfig(
model_name="Qwen/Qwen3.5-4B",
device="cuda", dtype="bfloat16", quantization="nf4",
target_layers=list(range(21, 32)),
cross_attn_layers=list(range(21, 32)),
)
pipe = MetaSpiderPipeline.from_pretrained(cfg)
pipe.attach(Doubter.from_checkpoint("doubter_checkpoint.pt"))
print(pipe.generate("What is the capital of France?"))
# → answers confidently
print(pipe.generate("<an obscure question the base would get wrong>"))
# → "I'm not confident enough to answer this question accurately."
```
Needs `pip install meta-core transformers accelerate bitsandbytes`.
## Framework
This wrapper is produced and consumed by the **meta-spider** framework
([codeberg.org/imperius/meta-spider](https://codeberg.org/imperius/meta-spider)) — meta-core / meta-loom /
meta-agent / meta-deploy). The included **GGUF sidecar** (`doubter_sidecar.gguf`, produced by
`metadeploy export`) runs the same wrapper on CPU inside llama.cpp — load it as a meta-adapter with
`llama-meta-generate` (two-pass inference). The calibrated refusal behavior holds down to Q4_K_M.
## Caveats
- This wrapper is **model-specific** — it is calibrated to the activation distribution of
`Qwen/Qwen3.5-4B`. It will **not** transfer cleanly to a different model or even a different
fine-tune of it (it would push hidden states out of distribution).
- It does **not** add knowledge or make the model smarter — it surfaces an existing internal
uncertainty signal and turns "answer at random" into "answer when confident".