Upload docs/EVAL_COMPARISON_2026-09-02.md with huggingface_hub
Browse files
docs/EVAL_COMPARISON_2026-09-02.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Generative RULER / VAL / NIAH vs the NLL proxy β 2026-09-02
|
| 2 |
+
|
| 3 |
+
Model: 1.06B, YaRN-4, T=16384. 4 checkpoints x 5 tasks x N=100 at 16,360 tokens,
|
| 4 |
+
plus a context-length sweep at 1024/2048/4096/8192 (N=50, 2 tasks). Greedy
|
| 5 |
+
decoding, bf16, substring-match scoring. `T` held at 16384 throughout so the
|
| 6 |
+
YaRN RoPE cache is identical at every context length.
|
| 7 |
+
|
| 8 |
+
## 1. Headline: retrieval collapses with CONTEXT LENGTH, not with distance
|
| 9 |
+
|
| 10 |
+
`niah_single` (recall a random 7-digit number given its key; answer space 10^7):
|
| 11 |
+
|
| 12 |
+
| context | base | arm_a | arm_b | arm_c |
|
| 13 |
+
|---|---|---|---|---|
|
| 14 |
+
| 1,024 | **84.0** | 78.0 | 64.0 | 76.0 |
|
| 15 |
+
| 2,048 | **82.0** | 66.0 | 56.0 | 70.0 |
|
| 16 |
+
| 4,096 | **74.0** | 62.0 | 48.0 | 60.0 |
|
| 17 |
+
| 8,192 | 40.0 | 36.0 | 36.0 | 40.0 |
|
| 18 |
+
| 16,360 | **0.0** | 0.0 | 0.0 | 0.0 |
|
| 19 |
+
|
| 20 |
+
Graceful decline to 8k, then a cliff to zero. At 16,360 the model cannot copy a
|
| 21 |
+
number sitting ~30 tokens before the question (verified: the needle IS in the
|
| 22 |
+
prompt at 99.8% depth, no `<|endoftext|>` between needle and question). The same
|
| 23 |
+
harness, format and scorer HIT at 1024, so this is a capability limit, not a
|
| 24 |
+
harness artifact.
|
| 25 |
+
|
| 26 |
+
At 16,360: **2 hits in 2000** (base 0.40%, every arm 0.00%).
|
| 27 |
+
|
| 28 |
+
## 2. Forward retrieval works; backward retrieval does not
|
| 29 |
+
|
| 30 |
+
`val_backward` (name the key given its number; answer space 35 words):
|
| 31 |
+
|
| 32 |
+
| context | base | arm_a | arm_b | arm_c |
|
| 33 |
+
|---|---|---|---|---|
|
| 34 |
+
| 1,024 | 8.0 | 2.0 | 4.0 | 4.0 |
|
| 35 |
+
| 2,048β16,360 | 0β4 | 0β4 | 0β2 | 0β4 |
|
| 36 |
+
|
| 37 |
+
Near chance everywhere despite a 35-word answer space, while forward retrieval
|
| 38 |
+
of a 7-digit number hits 84%. This is the one VAL Probing axis implemented, and
|
| 39 |
+
it fails outright β the model resolves key->value but not value->key.
|
| 40 |
+
|
| 41 |
+
## 3. Model ranking: generative DISAGREES with NLL
|
| 42 |
+
|
| 43 |
+
`niah_single` pooled over 1024/2048/4096 (n=150/model, +-95% Wilson):
|
| 44 |
+
|
| 45 |
+
| model | generative | NLL reach @16k |
|
| 46 |
+
|---|---|---|
|
| 47 |
+
| base (run7, YaRN only) | **80.0% Β±6.4** | 6,047 |
|
| 48 |
+
| arm_a (plain text) | 68.7% Β±7.3 | 7,435 |
|
| 49 |
+
| arm_c (IN2, far needles) | 68.7% Β±7.3 | **12,976** |
|
| 50 |
+
| arm_b (close needles) | 56.0% Β±7.8 | 5,924 |
|
| 51 |
+
|
| 52 |
+
- generative best->worst: **base, arm_a = arm_c, arm_b**
|
| 53 |
+
- NLL reach best->worst: **arm_c, arm_a, base, arm_b**
|
| 54 |
+
|
| 55 |
+
They agree on one thing: **arm_b is worst in both.** They disagree at the top β
|
| 56 |
+
NLL puts arm_c first by 2.19x; generation puts the untrained base first, with
|
| 57 |
+
arm_c tied for second.
|
| 58 |
+
|
| 59 |
+
**Every form of arm training reduced generative retrieval relative to the base.**
|
| 60 |
+
Among the arms, IN2-style far needles (arm_c) and plain text (arm_a) are equal,
|
| 61 |
+
and close needles (arm_b) are clearly worst.
|
| 62 |
+
|
| 63 |
+
## 4. Depth curves: no U-shape, in either metric
|
| 64 |
+
|
| 65 |
+
Generative, `niah_single` pooled 1024/2048/4096 (n=30/cell):
|
| 66 |
+
|
| 67 |
+
| depth | base | arm_a | arm_b | arm_c |
|
| 68 |
+
|---|---|---|---|---|
|
| 69 |
+
| 0.00 | 56.7 | 30.0 | 26.7 | 30.0 |
|
| 70 |
+
| 0.25 | 73.3 | 66.7 | 43.3 | 50.0 |
|
| 71 |
+
| 0.50 | 86.7 | 80.0 | 50.0 | 90.0 |
|
| 72 |
+
| 0.75 | 90.0 | 86.7 | 80.0 | 80.0 |
|
| 73 |
+
| 1.00 | 93.3 | 80.0 | 80.0 | 93.3 |
|
| 74 |
+
|
| 75 |
+
Monotonically rising toward the question, no primacy bump at depth 0 β the same
|
| 76 |
+
qualitative shape the NLL margins showed. **Both metrics agree: pure recency, not
|
| 77 |
+
lost-in-the-middle.** This is the clearest point of agreement between them.
|
| 78 |
+
|
| 79 |
+
## 5. Pre-registered predictions
|
| 80 |
+
|
| 81 |
+
| prediction | threshold | result | verdict |
|
| 82 |
+
|---|---|---|---|
|
| 83 |
+
| 1. depth 0.0 β 0% | β€5% confirm / β₯15% refute | 0% at 16,360; **27-57% at 1-4k** | confirmed at 16k, refuted at 1-4k |
|
| 84 |
+
| 2. arm_c >> arm_b @0.25 | β₯20pp confirm / β€5pp refute | **+12.7pp, 2.3Ο** | INCONCLUSIVE |
|
| 85 |
+
| 3. arm_c depth 0.25 > 0.5 | β₯20pp confirm / β€5pp refute | **-40.0pp, -3.8Ο (reversed)** | refuted, effect reversed |
|
| 86 |
+
|
| 87 |
+
### Two flaws in my own thresholds, stated plainly
|
| 88 |
+
|
| 89 |
+
- **No power precondition.** At 16,360 every arm is at the floor, so
|
| 90 |
+
`|diff| <= 5pp` is satisfied automatically and the rule mechanically returns
|
| 91 |
+
"refuted" when the honest answer is "untestable". I should have required at
|
| 92 |
+
least one arm above ~10% before evaluating predictions 2 and 3.
|
| 93 |
+
- **No sign handling.** Prediction 3 came out -40pp at -3.8Ο β a significant
|
| 94 |
+
reversal β which my "else -> inconclusive" branch mislabels. A significant
|
| 95 |
+
effect in the opposite direction is a refutation, not an absence of evidence.
|
| 96 |
+
|
| 97 |
+
## 6. Verdict on the NLL proxy
|
| 98 |
+
|
| 99 |
+
**Valid as a weak directional signal; invalid as a magnitude or a ranking; and
|
| 100 |
+
over-sensitive at long context.**
|
| 101 |
+
|
| 102 |
+
- *Agrees:* depth ordering (pure recency, no U-shape) and arm_b being worst.
|
| 103 |
+
- *Overstates magnitude:* NLL gave arm_c a 2.19x reach advantage over arm_b at
|
| 104 |
+
~9.5Ο. Generation gives +12.7pp at 2.3Ο β real in direction, far smaller, and
|
| 105 |
+
short of the pre-registered 20pp bar.
|
| 106 |
+
- *Wrong at the top:* NLL ranked base 3rd of 4; generation ranks it 1st.
|
| 107 |
+
- *Over-sensitive:* at 16,360 tokens NLL reported reach of 5,924β12,976 tokens
|
| 108 |
+
while generative accuracy is 0.0-0.4%. The metric has signal in a regime where
|
| 109 |
+
the model cannot do the task at all.
|
| 110 |
+
- *The 6.87Ο anomaly does not reproduce.* arm_c's "better at depth 0.25 than
|
| 111 |
+
0.5" (1.0865 nats, 6.87Ο on 8 blocks) comes out **reversed** generatively
|
| 112 |
+
(-40pp, -3.8Ο).
|
| 113 |
+
|
| 114 |
+
## 7. The limitation that bounds all of the above
|
| 115 |
+
|
| 116 |
+
**The two metrics never overlap at a context length where both have signal.**
|
| 117 |
+
NLL was measured only at T=16,384, where generation is at the floor. The
|
| 118 |
+
generative depth curve comes from 1-4k, where NLL was never measured β and
|
| 119 |
+
measuring it there would require a different YaRN cache, so it would not be the
|
| 120 |
+
same model configuration. Every cross-metric statement above therefore compares
|
| 121 |
+
16k NLL against 1-4k generation and should be read accordingly.
|
| 122 |
+
|
| 123 |
+
Closing that gap is the obvious next experiment: run `needle_score.py` at
|
| 124 |
+
T=1024/2048/4096 (accepting the RoPE-cache change) or extend generation with a
|
| 125 |
+
KV cache so 16k becomes tractable enough to show non-zero signal.
|
| 126 |
+
|
| 127 |
+
## 8. Not covered
|
| 128 |
+
|
| 129 |
+
RULER's CWE / FWE / QA / multiquery; VAL's code and structured-data contexts and
|
| 130 |
+
bi-directional retrieval; `niah_multikey` / `niah_multivalue` / `vt` at 16k (all
|
| 131 |
+
at the floor there, and not run in the length sweep).
|
| 132 |
+
|
| 133 |
+
Caveat recorded: the flux haystack contains ~6 `<|endoftext|>` tokens per
|
| 134 |
+
16,360-token prompt (document separators a base model may treat as resets). Not
|
| 135 |
+
a factor for the depth-1.0 failure, and the NLL needles used the same filler, so
|
| 136 |
+
the two remain comparable on that axis.
|