File size: 11,708 Bytes
719af52 1272654 719af52 1272654 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | ---
license: cc-by-4.0
language:
- en
tags:
- research
- tiny-networks
- interpretability
- safetensors
- pytorch
datasets:
- roneneldan/TinyStories
---
# Sleep-form rescue count: 80 tiny research networks
Author: Ronald Lee Hampton
This repository holds 80 tiny research networks from one measured test, and the code to re-measure them. They are research
instruments, not usable language models: each holds 633,074 numbers, and its held-out loss is about 4.6 nats per token.
## The result
On 40 fresh seeds, the sleeping form ended with 1 switchboard against the plain form's 7 on the same seeds: 7 seeds rescued and 1
harmed, exact one-sided sign test p 0.0352. That passes a bar frozen before the run, on a thin margin (see "What this does not show").
## What was measured
**The network.** A tiny next-word network trained on short synthetic stories at a vocabulary of 4,096 takes the last two words in. A
router sends each word to one of 48 experts, each a small two-layer block, with a sharing pull on the router's choice; a shared head
guesses the next word. A reasoning core is read through a small integer part with ternary weights, which writes a gain on the
experts' output, zero at the start. Per network: 595,568 numbers in the routed base network, 12,416 in the reasoning core and 25,090 in
the integer part.
**The two forms.** Both train 10,400 steps a run, with a first stage of 10,000 steps.
- ST-0, the plain form.
- S-SLEEP, the sleep form: through that first stage, the integer part's write weights keep updating on the language loss at 1/200 of
the active rate, with the reasoning core plugged in and held fixed.
**The measure: the shuffle cost.** Each network is run on 256 held-out windows (16,384 positions), then run again with the reasoning
core's output shuffled across positions, everything else held fixed. The shuffle cost is the mean increase in held-out loss, in nats.
A core whose output can be shuffled at almost no cost acts as a fixed switchboard, a constant gain on each feature that carries no work
word by word. A core whose shuffle costs more is used position by position, as context.
**The line and the bar,** both frozen before any of these networks trained, with predictions written and sealed before the freeze
(the frozen file's sha256 is 814aef7d8e6fe3ad7ec52777ae532dfbf29917067623baa644fc6556d8e6de94; the bars restated in plain words are in
`results/BARS_frozen-before-the-run.txt`):
- A core is a **switchboard** if its shuffle cost is below 0.025 nats, otherwise a **context worker**.
- A **rescue** is a seed whose plain core is a switchboard and whose sleeping core is a context worker. A **harm** is the reverse.
- The bar: the sleep form ends with fewer switchboards than the plain form, AND the rescues beat the harms by the exact one-sided sign
test on the discordant seeds at p at or below 0.05 (with fewer than 5 discordant seeds, not confirmed).
**Measured** (every per-network check passed): plain form 7 switchboards of 40 (seeds 873, 878, 885, 886, 893, 894, 896); sleep form
1 of 40 (seed 883). 7 rescues, 1 harm, 8 discordant seeds, p = 9/256 = 0.0352. Confirmed.
## The 40 seeds
Shuffle cost in nats, rounded to 5 places (full precision in `results/measured_table.csv`).
| seed | ST-0 shuffle cost | ST-0 | S-SLEEP shuffle cost | S-SLEEP | outcome |
|---|---|---|---|---|---|
| 857 | 0.17191 | context worker | 0.21677 | context worker | |
| 858 | 0.26488 | context worker | 0.26176 | context worker | |
| 859 | 0.28441 | context worker | 0.36387 | context worker | |
| 860 | 0.20116 | context worker | 0.24776 | context worker | |
| 861 | 0.13320 | context worker | 0.34882 | context worker | |
| 862 | 0.20471 | context worker | 0.23471 | context worker | |
| 863 | 0.30946 | context worker | 0.30965 | context worker | |
| 864 | 0.21082 | context worker | 0.24767 | context worker | |
| 865 | 0.05376 | context worker | 0.15759 | context worker | |
| 866 | 0.19909 | context worker | 0.25653 | context worker | |
| 867 | 0.22104 | context worker | 0.27287 | context worker | |
| 868 | 0.15181 | context worker | 0.23933 | context worker | |
| 869 | 0.18681 | context worker | 0.28792 | context worker | |
| 870 | 0.15455 | context worker | 0.16191 | context worker | |
| 871 | 0.25835 | context worker | 0.32672 | context worker | |
| 872 | 0.32314 | context worker | 0.31415 | context worker | |
| 873 | 0.00008 | switchboard | 0.06655 | context worker | **rescue** |
| 874 | 0.30618 | context worker | 0.18058 | context worker | |
| 875 | 0.10390 | context worker | 0.20586 | context worker | |
| 876 | 0.20125 | context worker | 0.30537 | context worker | |
| 877 | 0.21909 | context worker | 0.23828 | context worker | |
| 878 | 0.00757 | switchboard | 0.05345 | context worker | **rescue** |
| 879 | 0.24069 | context worker | 0.27381 | context worker | |
| 880 | 0.35534 | context worker | 0.34479 | context worker | |
| 881 | 0.07280 | context worker | 0.10509 | context worker | |
| 882 | 0.23871 | context worker | 0.24113 | context worker | |
| 883 | 0.06976 | context worker | 0.01231 | switchboard | **harm** |
| 884 | 0.23074 | context worker | 0.20481 | context worker | |
| 885 | 0.01763 | switchboard | 0.11119 | context worker | **rescue** |
| 886 | 0.02389 | switchboard | 0.17428 | context worker | **rescue** |
| 887 | 0.25048 | context worker | 0.28333 | context worker | |
| 888 | 0.15390 | context worker | 0.24058 | context worker | |
| 889 | 0.24025 | context worker | 0.33816 | context worker | |
| 890 | 0.05059 | context worker | 0.26321 | context worker | |
| 891 | 0.13865 | context worker | 0.21745 | context worker | |
| 892 | 0.18379 | context worker | 0.29248 | context worker | |
| 893 | 0.00767 | switchboard | 0.06912 | context worker | **rescue** |
| 894 | 0.00038 | switchboard | 0.28474 | context worker | **rescue** |
| 895 | 0.10236 | context worker | 0.17191 | context worker | |
| 896 | 0.00161 | switchboard | 0.08419 | context worker | **rescue** |
## What this does not show
- **The margin is thin.** Plain seed 886 sat 0.0011 under the line (0.02389). Counted as a context worker, the result would be 6
rescues and 1 harm, p 0.0625, above the bar. Under six different shuffles it held its label (0.0221 to 0.0241); so did seed 885
(0.0176 on the scored shuffle).
- **The count depends on the instrument.** A second instrument, the spread of the core's output across positions (its line set on
earlier networks before any of these trained, no bar), calls 3 plain switchboards (873, 894, 896) and 0 sleeping ones. It agrees with
the shuffle line on 75 of 80 cores. Its direction is the same, fewer switchboards in sleep; the size of the switchboard group is not.
- **One bench, one length, one measure.** Tiny networks that see two words of context, trained at one length, read by one measure on a
cut line. It says nothing about larger networks or longer context.
- **Not a better network.** Held-out loss was not part of this bar. In earlier frozen tests on this bench, a lower end loss for the
sleep form was not confirmed.
- **Earlier seeds.** Pooled with 16 earlier seeds of the same bench (841 to 856, not in this release), 11 seeds rescued and 1 harmed.
- **Scored positions.** 40 target token ids were never a training target and are left out of the score: 16,288 of the 16,384
held-out positions are scored.
- **One step went off plan.** After training, the scored reader stopped on an error in a reporting line. It was re-run on the same
trained networks with that one line corrected. No network was retrained, and the line, the bar and the count code did not change.
## Re-check it yourself
Needs Python 3 with numpy, torch and safetensors. CPU only, one thread, about a minute. From this folder:
python -I reader/read_shuffle_cost.py --brains brains --data data --expect results/per_brain_record.csv
It prints only, nothing is written. It prints each network's shuffle cost and label, the two counts, the rescues and harms, the sign
test and the bar, then compares every network with the record. Expected: 7 of 40 and 1 of 40, the same 8 discordant seeds, CONFIRMED,
labels equal 80 of 80. The last digits of the costs can differ by machine and torch version. On the machine used to prepare this
release the largest difference from the record was 7.25e-08 nats, and on that machine the reader matched the run's own network code bit
for bit on all 80 networks (`results/reproduction_notes.txt`, raw output in `results/reproduction_output.txt`).
To check the files first: `sha256sum -c SHA256SUMS.txt` (prints OK per file).
## Files
- `brains/<form>_s<seed>_L10400_end.safetensors`: the 80 networks, one per form and seed, at the end of training. Tensor names keep the
run's own prefixes: `tiny.` the routed base network, `rc.` the reasoning core, `cc.` the small integer part; `y` holds the 48 experts' smoothed sizes that the router's pull reads. Metadata: the run's labels
(arm, charge, form, seed, steps, sleep_n) and the sha256 of the original checkpoint. One small two-output head of the integer part
(`cc.Wv`, `cc.bv`), which the measure does not use, was removed from every file before release; every other tensor is byte for byte
the trained one. `results/head_removed_record.csv` lists each file's hash with and without it, and the reader's results are the same
either way (7 of 40 and 1 of 40, all 80 labels equal).
- `reader/read_shuffle_cost.py`: the measure, forward pass only.
- `tools/convert_pt_to_safetensors.py`: how each checkpoint became a .safetensors file, with its exactness check.
- `data/heldout_windows_uint16.npy`, `data/excluded_target_ids.txt`, `data/NOTICE_data.txt`: the held-out positions and the 40
excluded target ids.
- `results/`: the 40-seed table, a per-network record with both hashes, the conversion log, the seed list, the bars, the reader's raw
output and the reproduction notes.
- The training script is not released.
## Training data
The networks trained on TinyStories by Ronen Eldan and Yuanzhi Li (2023), dataset `roneneldan/TinyStories`, the GPT-4 version: the
training file TinyStoriesV2-GPT4-train.txt (sha256 6418d412de72888f52b5142c761ac21a582f7d1166f0bfbdb5f03ccfdec90443) for training and
the validation file for the held-out windows. The dataset card describes it as synthetically generated short stories in a small
vocabulary, licensed CDLA-Sharing-1.0.
## References
- Ronen Eldan and Yuanzhi Li, TinyStories: How Small Can Language Models Be and Still Speak Coherent English? (2023),
[arXiv:2305.07759](https://arxiv.org/abs/2305.07759).
## Citation
If you use these networks or the measure, please cite:
```bibtex
@misc{hampton2026sleepformrescue,
author = {Hampton, Ronald Lee},
title = {Sleep-form rescue count: 80 tiny research networks},
year = {2026},
month = oct,
howpublished = {Hugging Face: https://huggingface.co/RonBuildsAI/sleep-form-rescue-count},
note = {Measured 2026-10-26; released 2026-10-27}
}
```
## Licence and patents
- Weights, this card, the results and the excluded-id list: CC BY 4.0 (`LICENSE_weights_CC-BY-4.0.txt`). That licence does not
license patent rights.
- Code: The Clear BSD License (`LICENSE_code_BSD-3-Clause-Clear.txt`), which grants no patent rights.
- The held-out windows are a changed excerpt of the dataset above and stay under CDLA-Sharing-1.0 (`data/NOTICE_data.txt`).
- Patent rights are reserved; provisional application filed 2026-10-27.
Drafted and fact-checked with an AI assistant from my own records, measurements and decisions. I read and edited every sentence and I am responsible for its contents.
|