Table of Contents
We score every abliterated model on KL divergence over mlabonne/harmless_alpaca. Heretic, the most popular abliteration tool, trains against that exact dataset. So are we handing heretic-made models an unfairly low score? This post is the data behind the answer, across seven datasets, one to 32 tokens, two thinking modes, and three tools’ methods. Every number sits in the appendix, the text tells you what it means.
What we measure
KL divergence between the base model’s first-token distribution and the variant’s, over the same prompt.
KL(P || Q) = Σ P(x) · log( P(x) / Q(x) )
P is the base, Q is the variant. Always non-negative, zero only when identical. We make the base P, so it reads as how much the variant drifted from base. Low is good, the edit stayed surgical. High is collateral damage. The call is the Heretic v1.2.0 method:
F.kl_div(logprobs_variant, logprobs_base, reduction="batchmean", log_target=True)
batchmean, not mean. PyTorch’s default mean divides by the vocabulary axis too and under-counts by a factor of the vocab size.
Production scores for all 24 Gemma 4 E4B variants are in Appendix A , best to worst. Heretic-std and heretic sit at the top. Genuine surgery, or dataset memorisation?
The dataset does not matter
I ran eight representative variants, spanning the full range, on seven datasets: six general ones heretic has never seen, plus good_1000, Abliterix’s own curated eval set. The full one-token cross-table is in
Appendix B
. Absolutes swing wildly, obliteratus from 0.07 on GPQA to 1.24 on Dolly. The ranking barely moves.
The Spearman ρ against the production score is in
Appendix C
. Mean 0.90 at one token, 0.88 at 32, range 0.81 to 0.976. The weakest cells are good_1000 and TruthfulQA at depth, both 0.79, and both for a reason. good_1000 is the one dataset in existence built to flatter an Abliterix model, so it is the hardest test of the ranking. TruthfulQA is adversarial by design. Even there the order mostly holds.
Why the absolute level swings so much between datasets: it tracks the base model’s first-token entropy, shown in
Appendix D
and plotted below. good_1000 and GPQA make the base 99% confident of the first token, so there is almost no room for base and variant to disagree and KL is tiny everywhere. harmless_alpaca and Dolly are open-ended Alpaca-style prompts where the first token is genuinely uncertain, so any edit shows up loudly. Abliteration is a global low-rank weight edit, it does not memorise prompts, so the ranking is independent of this entropy effect. Heretic’s low score is real.
The boilerplate dip
Watch the KL accumulate token by token instead of taking just the first one, Appendix E , and every variant dips between N=1 and N=4, then climbs. Gemma 4 is a thinking model. Its first generated tokens are a near-deterministic reasoning opener, “Here’s a thinking process to arrive at the solution: 1. Analyse the Request”. Abliteration edits the refusal direction, not the reasoning scaffolding, so base and variant emit that opener identically. One-token KL on a thinking model is partly measuring a format token.
It is not a GPQA artifact. The dip shows up on every dataset, Appendix F . Six of seven dip then climb. GPQA is the exception, it already sits at the floor at N=1 because its prompts make the opener maximally deterministic, so there is nowhere to dip and it only rises. Where the bottom lands, N=2 to N=8, depends on how long the boilerplate opener runs before real content starts. The full per-variant trajectories behind that mean, all seven datasets, are in Appendix J .
Switch thinking off and the dip disappears, Appendix G .
The heavy end jumps. obliteratus goes from 0.59 at 32 tokens thinking on, to 1.30 thinking off. The boilerplate was diluting the real divergence. The ranking still holds, ρ of thinking-on versus thinking-off at 32 tokens is 0.976.
How the tools measure KL
Three open-source abliteration tools independently settled on forward KL(base || variant) over harmless prompt sets. They differ only in where the logits come from,
Appendix H
. Heretic’s only change across versions is the logits source: v1.0.1 to v1.3.0 use output_scores, v1.4.0 uses raw output_logits. We use v1.2.0.
I ran the methods I could reproduce faithfully on the same eight variants, Appendix I . Heretic v1.2.0 and v1.4.0 produce identical numbers to four decimals, ρ of 1.000. The raw-logits switch exists for minus-infinity artefacts that logits processors can introduce, and on clean harmless prompts those artefacts never appear. Apostate is the outlier only in scale, ~10× larger from averaging eight positions, and it still preserves the ranking at ρ 0.952.
A note on Abliterix, because its number will trip you up if you check the model card. The card reports KL 0.0006 for this model. We measure 0.0536. We can explain it. It is the dataset. Run our method on Abliterix’s good_1000 and abliterix scores 0.0017 mean, 0.0005 median, matching the card’s 0.0006. On harmless_alpaca the same model scores 0.0536. We ruled out the method, forward-pass logits and generate output_scores produce identical numbers on good_1000, and we ruled out top-100 truncation, which actually raises the KL. The gap is the entropy effect from the section above, good_1000 is low-entropy so KL reads low everywhere. Both numbers are honest. Ours is the one consistent across all 24 variants, which is why we use it.
One Gemma 4 caveat from Abliterix’s own scorer. “Sparse top-k sampler KL is known to read as exactly zero on Gemma 4 vLLM in-place runs even when refusal counts move.” We score through Hugging Face generate, not vLLM in-place editing, so we are unaffected. A suspicious zero from vLLM on Gemma 4 is stale sampler logprobs.
Limits
One base model so far, Gemma 4 E4B. A non-thinking base or different architecture could differ.
The middle cluster shuffles. nullpo, trevorjs, and huihui are genuinely close, so small method changes re-order near-ties. The excellent top and heavy bottom are rock solid across every knob.
No harmful dataset tested. Harmless prompts probe capability preservation, which is the point. A harmful set would show large divergence by construction, because removing refusal is exactly what abliteration does.
Takeaway
For relative comparison, which is all our reports use, the methodological choice barely matters. Seven datasets including one tool’s own optimised eval set, one to 32 tokens, thinking on and off, Heretic and Apostate’s methods. The best-to-worst order of variants stays the same. ρ averages 0.90 at one token and never drops below 0.79.
Heretic’s low score is not a dataset artefact. It is the most surgical abliteration in the set. obliteratus and bendernina really have drifted that far. The one real insight is the boilerplate dip. One-token KL on a thinking model partly measures near-deterministic reasoning openers. The fix is to go deeper than one token or measure with thinking off.
Appendix A: Production scores
All 24 Gemma 4 E4B variants, best to worst. Lower is better.
| variant | KL | rating |
|---|---|---|
| heretic-std | 0.0012 | excellent |
| sdft | 0.0017 | excellent |
| coder3101 | 0.0021 | excellent |
| heretic | 0.0021 | excellent |
| heresy | 0.0024 | excellent |
| apostate | 0.0036 | excellent |
| nullpo | 0.0054 | excellent |
| mythos | 0.0068 | excellent |
| trevorjs | 0.0145 | very good |
| infinimind | 0.0146 | very good |
| sdft-runpod-vllm | 0.0190 | very good |
| treadon | 0.0205 | very good |
| deckard | 0.0220 | very good |
| huihui | 0.0266 | very good |
| wwt | 0.0315 | very good |
| distill | 0.0420 | very good |
| deckard-expresso | 0.0516 | very good |
| abliterix | 0.0536 | very good |
| claude-distill | 0.0743 | very good |
| treadon-combo | 0.2683 | moderate |
| treadon-disin | 0.2958 | moderate |
| bendernina | 0.9232 | significant |
| physshell | 0.9232 | significant |
| obliteratus | 1.1015 | heavy |
Appendix B: One-token KL across datasets
Eight representative variants under each dataset, sorted by the production score. Bold is the lowest KL in each column.
| variant | alpaca | Dolly | GPQA | GSM8K | no_robots | TruthfulQA | MMLU-Pro | good_1000 |
|---|---|---|---|---|---|---|---|---|
| heretic | 0.0021 | 0.0038 | 0.0005 | 0.0033 | 0.0020 | 0.0191 | 0.0043 | 0.0009 |
| nullpo | 0.0054 | 0.0169 | 0.0014 | 0.0061 | 0.0058 | 0.0292 | 0.0041 | 0.0030 |
| trevorjs | 0.0145 | 0.0148 | 0.0006 | 0.0050 | 0.0030 | 0.0394 | 0.0044 | 0.0007 |
| huihui | 0.0266 | 0.0201 | 0.0003 | 0.0104 | 0.0079 | 0.0193 | 0.0027 | 0.0031 |
| abliterix | 0.0536 | 0.0553 | 0.0015 | 0.0098 | 0.0309 | 0.0641 | 0.0122 | 0.0017 |
| treadon-combo | 0.2683 | 0.2165 | 0.0144 | 0.0503 | 0.0933 | 0.1677 | 0.0859 | 0.0226 |
| bendernina | 0.9232 | 1.0006 | 0.0317 | 0.1674 | 0.3722 | 0.5348 | 0.3323 | 0.1324 |
| obliteratus | 1.1015 | 1.2435 | 0.0750 | 0.6072 | 0.3935 | 0.6016 | 0.2893 | 0.0699 |
Appendix C: Rank correlation vs production
Spearman ρ of each dataset against the production score, higher is better.
| dataset | ρ at 1 tok | ρ at 32 tok |
|---|---|---|
| Dolly-15k | 0.976 | 0.905 |
| GPQA Diamond | 0.833 | 0.929 |
| GSM8K | 0.952 | 0.929 |
| no_robots | 0.976 | 0.881 |
| TruthfulQA | 0.929 | 0.786 |
| MMLU-Pro | 0.810 | 0.976 |
| good_1000 (Abliterix’s own) | 0.810 | 0.786 |
| mean | 0.898 | 0.884 |
| range | 0.810 to 0.976 | 0.786 to 0.976 |
Appendix D: Base entropy vs mean KL
The absolute KL a dataset produces tracks the base model’s first-token entropy. Low-entropy datasets cap the KL, high-entropy datasets amplify it. Sorted by entropy.
| dataset | base entropy (nats) | mean KL |
|---|---|---|
| GSM8K | 0.339 | 0.107 |
| Dolly | 0.292 | 0.321 |
| harmless_alpaca | 0.287 | 0.299 |
| TruthfulQA | 0.159 | 0.184 |
| MMLU-Pro | 0.149 | 0.092 |
| no_robots | 0.124 | 0.114 |
| good_1000 | 0.050 | 0.029 |
| GPQA | 0.019 | 0.016 |
Appendix E: Trajectory, thinking on
Cumulative mean KL over the first N generated tokens, GPQA, thinking on, sorted by the 32-token column.
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| trevorjs | 0.0168 | 0.0085 | 0.0046 | 0.0138 | 0.0151 | 0.0180 |
| heretic | 0.0177 | 0.0089 | 0.0053 | 0.0288 | 0.0273 | 0.0212 |
| nullpo | 0.0406 | 0.0203 | 0.0108 | 0.0244 | 0.0260 | 0.0224 |
| huihui | 0.0735 | 0.0369 | 0.0186 | 0.0177 | 0.0247 | 0.0375 |
| abliterix | 0.0528 | 0.0266 | 0.0137 | 0.0274 | 0.0343 | 0.0723 |
| treadon-combo | 0.2801 | 0.1413 | 0.0794 | 0.1971 | 0.2056 | 0.3060 |
| bendernina | 0.6192 | 0.3100 | 0.1647 | 0.1697 | 0.2801 | 0.4640 |
| obliteratus | 0.2925 | 0.1469 | 0.0815 | 0.1279 | 0.2118 | 0.5894 |
Appendix F: Trajectory by dataset
Mean over the eight variants under each dataset, dip bottom bold.
| dataset | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| Dolly | 0.3215 | 0.1689 | 0.1439 | 0.0876 | 0.1034 | 0.1423 |
| GPQA | 0.0155 | 0.0187 | 0.0657 | 0.0580 | 0.1114 | 0.1720 |
| GSM8K | 0.1080 | 0.0558 | 0.0332 | 0.0373 | 0.0349 | 0.1322 |
| no_robots | 0.1160 | 0.0721 | 0.0624 | 0.0545 | 0.0983 | 0.1433 |
| TruthfulQA | 0.1844 | 0.0923 | 0.1122 | 0.0626 | 0.1078 | 0.1455 |
| MMLU-Pro | 0.0938 | 0.0717 | 0.1670 | 0.1063 | 0.1359 | 0.1701 |
| good_1000 | 0.0306 | 0.0166 | 0.0154 | 0.0184 | 0.0768 | 0.1186 |
Appendix G: Trajectory, thinking off
Same as Appendix E with thinking off. The dip disappears.
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| trevorjs | 0.0253 | 0.0200 | 0.0322 | 0.0275 | 0.0275 | 0.0216 |
| heretic | 0.0200 | 0.0203 | 0.0300 | 0.0263 | 0.0270 | 0.0208 |
| nullpo | 0.1336 | 0.0858 | 0.0738 | 0.0481 | 0.0368 | 0.0279 |
| huihui | 0.0406 | 0.0379 | 0.0717 | 0.0857 | 0.0948 | 0.0824 |
| abliterix | 0.0424 | 0.0756 | 0.1534 | 0.1231 | 0.1308 | 0.1208 |
| treadon-combo | 1.4638 | 0.9193 | 0.7364 | 0.5846 | 0.5370 | 0.4402 |
| bendernina | 1.9464 | 1.1634 | 1.0002 | 0.9235 | 0.9776 | 0.9666 |
| obliteratus | 4.3137 | 2.5412 | 1.8273 | 1.4482 | 1.3484 | 1.2957 |
Appendix H: How the tools measure KL
| Heretic v1.2.0, ours | Abliterix | Apostate | |
|---|---|---|---|
| logits source | HF generate, output_scores | vLLM top-100 sampler logprobs | direct forward pass |
| minus-infinity fix | none | nan_to_num clamp | avoided entirely |
| token positions | 1 | 1 to 3 | 8 |
| eval set | harmless_alpaca test[:100] | harmless_alpaca default, good_1000 on E4B | harmless_alpaca, 48 prompts |
| backend | Hugging Face | vLLM | Hugging Face |
Appendix I: Tool methods, per-variant
Three methods reproduced on full-vocabulary HF logits over harmless_alpaca. Bold ρ is the best.
| variant | production v1.2.0 | Heretic v1.4.0 | Apostate |
|---|---|---|---|
| heretic | 0.0021 | 0.0021 | 0.1198 |
| nullpo | 0.0054 | 0.0054 | 0.1860 |
| trevorjs | 0.0145 | 0.0145 | 0.1812 |
| huihui | 0.0266 | 0.0266 | 0.2197 |
| abliterix | 0.0536 | 0.0536 | 0.8265 |
| treadon-combo | 0.2683 | 0.2683 | 3.3888 |
| bendernina | 0.9232 | 0.9232 | 9.6935 |
| obliteratus | 1.1015 | 1.1015 | 9.3280 |
| ρ vs production | 1.000 | 0.952 |
Appendix J: Full trajectories by dataset
Per-variant cumulative mean KL over the first N generated tokens, thinking on. Rows sorted by production KL and line up across all seven tables.
Dolly-15k
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0036 | 0.0018 | 0.0158 | 0.0101 | 0.0238 | 0.0184 |
| nullpo | 0.0169 | 0.0084 | 0.0159 | 0.0119 | 0.0271 | 0.0239 |
| trevorjs | 0.0139 | 0.0070 | 0.0275 | 0.0159 | 0.0203 | 0.0223 |
| huihui | 0.0199 | 0.0100 | 0.0141 | 0.0078 | 0.0111 | 0.0202 |
| abliterix | 0.0540 | 0.0274 | 0.0718 | 0.0439 | 0.0493 | 0.0806 |
| treadon-combo | 0.2141 | 0.1084 | 0.1128 | 0.0667 | 0.1502 | 0.1939 |
| bendernina | 0.9935 | 0.5224 | 0.3331 | 0.2084 | 0.2219 | 0.3329 |
| obliteratus | 1.2565 | 0.6659 | 0.5599 | 0.3363 | 0.3237 | 0.4461 |
GPQA Diamond
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0005 | 0.0002 | 0.0050 | 0.0045 | 0.0291 | 0.0215 |
| nullpo | 0.0014 | 0.0007 | 0.0118 | 0.0084 | 0.0294 | 0.0235 |
| trevorjs | 0.0006 | 0.0003 | 0.0050 | 0.0045 | 0.0179 | 0.0190 |
| huihui | 0.0003 | 0.0002 | 0.0169 | 0.0102 | 0.0265 | 0.0363 |
| abliterix | 0.0014 | 0.0007 | 0.0141 | 0.0099 | 0.0379 | 0.0648 |
| treadon-combo | 0.0141 | 0.0070 | 0.0792 | 0.1281 | 0.2204 | 0.2986 |
| bendernina | 0.0313 | 0.1028 | 0.2356 | 0.1800 | 0.2963 | 0.3961 |
| obliteratus | 0.0743 | 0.0374 | 0.1581 | 0.1187 | 0.2338 | 0.5160 |
GSM8K
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0033 | 0.0016 | 0.0017 | 0.0021 | 0.0046 | 0.0077 |
| nullpo | 0.0058 | 0.0029 | 0.0026 | 0.0103 | 0.0070 | 0.0098 |
| trevorjs | 0.0047 | 0.0023 | 0.0021 | 0.0023 | 0.0022 | 0.0062 |
| huihui | 0.0099 | 0.0049 | 0.0042 | 0.0046 | 0.0078 | 0.0213 |
| abliterix | 0.0094 | 0.0047 | 0.0056 | 0.0219 | 0.0154 | 0.0459 |
| treadon-combo | 0.0489 | 0.0245 | 0.0143 | 0.0367 | 0.0805 | 0.1987 |
| bendernina | 0.1660 | 0.0962 | 0.0620 | 0.0675 | 0.0641 | 0.2950 |
| obliteratus | 0.6161 | 0.3095 | 0.1728 | 0.1532 | 0.0975 | 0.4729 |
no_robots
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0018 | 0.0009 | 0.0061 | 0.0085 | 0.0273 | 0.0203 |
| nullpo | 0.0060 | 0.0030 | 0.0064 | 0.0114 | 0.0326 | 0.0272 |
| trevorjs | 0.0039 | 0.0020 | 0.0085 | 0.0102 | 0.0177 | 0.0198 |
| huihui | 0.0077 | 0.0039 | 0.0048 | 0.0064 | 0.0109 | 0.0218 |
| abliterix | 0.0308 | 0.0164 | 0.0299 | 0.0258 | 0.0433 | 0.0704 |
| treadon-combo | 0.0959 | 0.0518 | 0.0520 | 0.0664 | 0.1473 | 0.2105 |
| bendernina | 0.3817 | 0.2913 | 0.1878 | 0.1329 | 0.1989 | 0.3267 |
| obliteratus | 0.4003 | 0.2076 | 0.2035 | 0.1744 | 0.3088 | 0.4499 |
TruthfulQA
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0203 | 0.0102 | 0.0485 | 0.0256 | 0.0660 | 0.0434 |
| nullpo | 0.0304 | 0.0152 | 0.0286 | 0.0154 | 0.0662 | 0.0461 |
| trevorjs | 0.0397 | 0.0199 | 0.0773 | 0.0400 | 0.0577 | 0.0414 |
| huihui | 0.0196 | 0.0098 | 0.0295 | 0.0153 | 0.0227 | 0.0260 |
| abliterix | 0.0623 | 0.0311 | 0.1281 | 0.0662 | 0.0803 | 0.0851 |
| treadon-combo | 0.1669 | 0.0835 | 0.1035 | 0.0563 | 0.1721 | 0.2408 |
| bendernina | 0.5393 | 0.2705 | 0.2019 | 0.1212 | 0.1781 | 0.2797 |
| obliteratus | 0.5966 | 0.2986 | 0.2803 | 0.1610 | 0.2192 | 0.4012 |
MMLU-Pro
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0047 | 0.0023 | 0.0203 | 0.0120 | 0.0165 | 0.0119 |
| nullpo | 0.0042 | 0.0021 | 0.0146 | 0.0185 | 0.0206 | 0.0149 |
| trevorjs | 0.0049 | 0.0024 | 0.0150 | 0.0210 | 0.0189 | 0.0145 |
| huihui | 0.0027 | 0.0014 | 0.0449 | 0.0244 | 0.0243 | 0.0321 |
| abliterix | 0.0123 | 0.0061 | 0.0844 | 0.0838 | 0.0678 | 0.0679 |
| treadon-combo | 0.0876 | 0.0438 | 0.1569 | 0.1098 | 0.1943 | 0.2378 |
| bendernina | 0.3364 | 0.3651 | 0.4227 | 0.2429 | 0.3352 | 0.4336 |
| obliteratus | 0.2979 | 0.1505 | 0.5774 | 0.3382 | 0.4100 | 0.5482 |
good_1000
| variant | 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|---|
| heretic | 0.0009 | 0.0005 | 0.0034 | 0.0043 | 0.0309 | 0.0238 |
| nullpo | 0.0030 | 0.0015 | 0.0022 | 0.0041 | 0.0492 | 0.0362 |
| trevorjs | 0.0008 | 0.0004 | 0.0018 | 0.0060 | 0.0254 | 0.0235 |
| huihui | 0.0030 | 0.0015 | 0.0011 | 0.0021 | 0.0073 | 0.0176 |
| abliterix | 0.0019 | 0.0009 | 0.0066 | 0.0103 | 0.0324 | 0.0481 |
| treadon-combo | 0.0231 | 0.0115 | 0.0227 | 0.0370 | 0.1471 | 0.1909 |
| bendernina | 0.1406 | 0.0769 | 0.0481 | 0.0402 | 0.1367 | 0.2540 |
| obliteratus | 0.0717 | 0.0393 | 0.0374 | 0.0430 | 0.1854 | 0.3550 |
Resources
- Abliterlitics on GitHub , the toolkit and all the raw data
- Full Gemma 4 E4B report , all 24 variants across benchmarks, safety, KL, and weight forensics
- KL divergence methodology , how we measure and interpret the score
- Heretic , v1.2.0 method we adopted, current v1.4.0
- Abliterix , Heretic fork with vLLM backend
- Apostate , forward-pass 8-position method
- Kullback-Leibler divergence on Wikipedia
- mlabonne/harmless_alpaca , the eval dataset