suchirsalhan's picture
Add H-Net dynamic-chunking artefacts
e1feecf verified
|
Raw History Blame Contribute Delete
3.07 kB
---
license: apache-2.0
library_name: pytorch
tags: [dynamic-chunking, tokenization, hnet, byte-level, interpretability]
---
# H-Net dynamic-chunking pilot models
31 byte-level H-Net checkpoints (22.5M params, 6000 steps) trained to study **what a
learned chunker discovers when it is free to choose its own computational granularity**.
Every run shares data, seed schedule and FLOP budget; only the chunker's objective varies.
## Runs
| family | n | what varies |
|---|---|---|
| `pilot_A_s{0,1,2}` | 3 | no parity loss — the natural chunker (baseline) |
| `pilot_B_s{0,1,2}` | 3 | parity loss, per-content-matched-sentence beta |
| `pilot_C_s{0,1,2}` | 3 | parity applied then removed (reversion arm) |
| `pilot_D_s{0,1,2}` | 3 | stronger equalisation |
| `pilot_E_s{0,1,2}` | 3 | entropy-matched variant |
| `pilot_Apc_s{0,1,2}` | 3 | per-codepoint control |
| `pilot_Bpc_s{0,1,2}` | 3 | parity loss, per-codepoint beta |
| `emactl_noema_s{0,1,2}` | 3 | EMA ablation control (built from A) |
| `emactl_genreg_s{0,1,2}` | 3 | generic-regularisation control, entropy-matched to B |
| `jitter_s{0,1,2}` | 3 | threshold-jitter training (tau ~ U[0.30, 0.75]) |
| `baseline_en` | 1 | English-only baseline |
## Format
Weights are `model.safetensors`; `config.json` carries `model_config`, the training config,
and a `tied_weights` map. `emb.weight` and `head.weight` are tied, so only `emb.weight` is
stored — restore with:
```python
from safetensors.torch import load_file
import json
sd = load_file("model.safetensors")
cfg = json.load(open("config.json"))
for dst, src in cfg["tied_weights"].items():
sd[dst] = sd[src] # head.weight <- emb.weight
```
Verified bit-exact against the original training checkpoints (`max|Δ| = 0.0`, 111 tensors).
`final.json` and `log.jsonl` are the trainer's own records.
## What these were used to find
- Segmentation crystallises **after** capability: the router lags BPB descent in 36/36
language-seed pairs at half of each clock's own change.
- Learned units are **not linguistic**. Morpheme F1 sits at or below a rate-matched random
baseline; gold word+morph features add ≤0.001 held-out AUROC over computational features
in 9/9 languages.
- Chunks are **not functionally localised**: aligned-minus-misaligned activation patching is
at the construction rate (0/28 cells above 2 across-seed SD), while killing the whole chunk
pathway costs +0.34 nats/byte. Information is additive and diffuse across chunks.
- The chunk-level main network is worth only **~0.07 BPB** at this scale.
Negative results are reported as results. See the companion
[results dataset](https://huggingface.co/datasets/AdaptiveChunking/hnet-chunking-results)
and [probe dataset](https://huggingface.co/datasets/AdaptiveChunking/hnet-chunking-probes).
## Limitations
16.2M/22.5M params, 6000 steps, one hierarchy stage, 3 seeds. Only the final step was
retained (`keep_ckpt: false`), so no intermediate weights exist. Third-party models used for
comparison (`allenai/Bolmo-1B`, BLT, ByT5) are **not** redistributed here.