Upload docs/EVAL_COMPARISON_2026-09-02.md with huggingface_hub
Browse files
docs/EVAL_COMPARISON_2026-09-02.md
CHANGED
|
@@ -134,3 +134,73 @@ 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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.
|
| 137 |
+
|
| 138 |
+
---
|
| 139 |
+
|
| 140 |
+
# ADDENDUM (same day, later) — a YaRN config bug, and why the numbers above are provisional
|
| 141 |
+
|
| 142 |
+
## The bug
|
| 143 |
+
|
| 144 |
+
`YARNOps.cpp:57` defaults `YARN_ORIG_MAXPOS` to **1024**, but the base model (run8)
|
| 145 |
+
trained at `context_length 4096`. So every run in this project — training, the NLL
|
| 146 |
+
probes, and all the generative numbers above — emitted:
|
| 147 |
+
|
| 148 |
+
```
|
| 149 |
+
[YaRN][warn] seq_len(16384) != scale(4.000)*orig_maxpos(1024.0)=4096.0
|
| 150 |
+
-- cache scaled for a different context than it is sized for
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
The YaRN interpolation ramp targeted 4096 positions while the cache was *sized* 16384.
|
| 154 |
+
Setting `YARN_ORIG_MAXPOS=4096` makes `scale x orig == seq_len` exactly and moves the
|
| 155 |
+
ramp from `low=7 high=25` to `low=14 high=32`.
|
| 156 |
+
|
| 157 |
+
## What the fix does — niah_single, buggy -> corrected
|
| 158 |
+
|
| 159 |
+
context base arm_a arm_b arm_c
|
| 160 |
+
1,024 84 -> 90 78 -> 86 64 -> 70 76 -> 82
|
| 161 |
+
2,048 82 -> 94 66 -> 78 56 -> 64 70 -> 80
|
| 162 |
+
4,096 74 -> 16 ! 62 -> 54 48 -> 42 60 -> 48
|
| 163 |
+
8,192 40 -> 36 36 -> 42 36 -> 32 40 -> 44
|
| 164 |
+
16,360 0 -> 17 0 -> 17 0 -> 4 0 -> 18
|
| 165 |
+
|
| 166 |
+
At 16,360 with N=100/cell the depth curve goes from flat zero to:
|
| 167 |
+
d0.50 0-5%, d0.75 20-30%, d1.00 55-65%. That is 0/100 -> 17/100, p<0.001.
|
| 168 |
+
|
| 169 |
+
So the cache bug was suppressing real ability **at every depth and every length**, not
|
| 170 |
+
only at 16k. Depth 0.0 (needle at the window start) improves too: base 75 -> 85%,
|
| 171 |
+
arm_a 35 -> 55% when pooled over 1k+2k.
|
| 172 |
+
|
| 173 |
+
## The unexplained 4,096 collapse
|
| 174 |
+
|
| 175 |
+
Every model drops at 4,096 under the corrected cache, and `base` falls **74% -> 16%**.
|
| 176 |
+
A 58-point collapse at one length for one model, while its neighbours at 2k and 8k both
|
| 177 |
+
improve, is not a smooth capability change. The suspicious coincidence: 4,096 is
|
| 178 |
+
exactly `orig_maxpos`, so the ramp hits a boundary case there.
|
| 179 |
+
|
| 180 |
+
**This has not been diagnosed, and it invalidates the corrected-cache reach column** —
|
| 181 |
+
`base`'s "best reach" appears to fall 3,482 -> 2,048 purely because that one row went
|
| 182 |
+
to zero. Isolation needed: re-run base at 4,096 with N=100 to confirm it reproduces
|
| 183 |
+
rather than being a 50-sample fluke, and bracket at 3,840 / 4,352 to see whether the
|
| 184 |
+
failure is pinned to exactly `orig_maxpos`.
|
| 185 |
+
|
| 186 |
+
## What this means for the main report above
|
| 187 |
+
|
| 188 |
+
- STILL HOLDS: no U-shape in either metric (pure recency, no primacy bump at depth 0)
|
| 189 |
+
under both cache parameterisations; arm_b worst in every measurement; forward
|
| 190 |
+
retrieval works and backward retrieval does not; the NLL/generative ranking
|
| 191 |
+
disagreement (NLL puts arm_c first, generation puts the untrained base first).
|
| 192 |
+
- NOW PROVISIONAL: every reach number, including the "saturates at 2,700-3,500
|
| 193 |
+
tokens" headline and the "NLL overstates 2-4.7x" factor. All of those were measured
|
| 194 |
+
under the buggy cache, and the corrected-cache column cannot replace them until the
|
| 195 |
+
4,096 anomaly is understood.
|
| 196 |
+
- PREMATURE: retraining with the corrected value. Training on a parameterisation that
|
| 197 |
+
has a pathological point would bake the pathology in.
|
| 198 |
+
|
| 199 |
+
## Correction to a claim in section 6 above
|
| 200 |
+
|
| 201 |
+
I wrote that reach and the p90 training-document length (2,721) are "the same number."
|
| 202 |
+
That is arithmetically true but I selected the percentile that matched — the mean
|
| 203 |
+
(1,340) and median (826) are both well below the measured reach. The defensible claim
|
| 204 |
+
is that reach lands in the **upper range** of the document-length distribution, not that
|
| 205 |
+
it equals p90. The mechanism (99.7% of documents end before 16k, so no gradient signal
|
| 206 |
+
for attending further) is unaffected.
|