8000 read: score held-out at the reading window, not the ceiling by gt50 · Pull Request #6 · gt50/mini-AGI · GitHub
[go: up one dir, main page]

Skip to content

read: score held-out at the reading window, not the ceiling - #6

Merged
gt50 merged 1 commit into
mainfrom
eval-at-window
Oct 5, 2026
Merged

gt50 merged 1 commit into
mainfrom
eval-at-window

Conversation

@gt50
@gt50 gt50 commented Oct 5, 2026
Copy link
Copy Markdown
Owner

Summary

train.py read scored held-out at the context ceiling rather than at the window the model is reading at, which is the opposite of what the comment above the evaluator says. It built its FolderEvaluator with cfg.block and never updated it. The stream command already sets evaluator.context as its window grows (train.py:254, 352); read didn't.

Measured on the large Strix profile at step 16,335 (window 2,367 of 8,192), scoring the same held-out text, 60 chunks per subject:

subject at the window (2,367) at the ceiling (8,192) diff
arithmetic 0.962 2.085 +1.123
chat 1.492 2.408 +0.916
chat_hermes 1.804 2.565 +0.760
chess 0.998 1.703 +0.704
code 1.585 2.342 +0.757
reasoning 1.425 2.337 +0.911
stories 1.344 2.294 +0.950
wikipedia 1.720 2.542 +0.822
all 1.416 ± 0.015 2.284 ± 0.028

What it affected:

  • The reported held-out score. It stayed flat for a whole night while training loss fell 1.57 → 1.29.
  • Growth's HONEST brake. It compares training with held-out (max_gap 0.4), so the inflated gap (0.55–0.94) likely held growth shut, and the pool sat at 135 experts. Other brakes could also have contributed; this one was firing.
  • The learning-rate controller (plasticity.py). It was steering on a number dominated by untrained positions. This time it was already at its 1.0 cap.

The bug was invisible on the released model, whose window had reached its 4,096 ceiling, where the two measurements are the same.

Change

The evaluator starts at the window the run resumes at (context_now, clamped like the reading window), and ev.context is set to the current window before every evaluation: before training, each sample round, and after. Runs whose window equals the ceiling score exactly as before.

Expect a one-time discontinuity: on runs below the ceiling, held-out drops by roughly 0.85 at the first evaluation after this change. Earlier before/after numbers and sample logs from such runs aren't comparable with later ones.

Test plan

  • Context comparison on the trained checkpoint (above)
  • CPU smoke test of train.py read with --held-out: before, after, save
  • pytest: 22/22
  • CI green

🤖 Generated with Claude Code

cmd_read built its FolderEvaluator with cfg.block and never moved it, so
held-out was read at the ceiling while the model read at its window - the
opposite of what the comment above it says it does. `stream` already
sets evaluator.context as its window grows.

Measured on the large Strix profile at step 16,335 (window 2,367 of
8,192), the same held-out text:
  at the window   1.4164 +/-0.0151
  at the ceiling  2.2843 +/-0.0280
every subject 0.70-1.12 nats worse at the ceiling. That flattened the
reported held-out for a whole night while training loss fell 1.57 ->
1.29, and since growth's HONEST brake compares train with held-out
(max_gap 0.4) it likely kept growth shut: the pool sat at 135 experts.

The evaluator now starts at the window the run resumes at and is set to
the current window before every evaluation - before, each sample round,
after. Runs whose window has reached its ceiling, the released model's
among them, score exactly as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gt50
gt50 merged commit 1716cbd into main Oct 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0