unparallelled commited on
Commit
23f635e
Β·
verified Β·
1 Parent(s): b10776b

Upload docs/EVAL_COMPARISON_2026-09-02.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. docs/EVAL_COMPARISON_2026-09-02.md +136 -0
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.