File size: 5,514 Bytes
5352e16
 
 
 
 
 
 
 
 
 
 
 
 
97cb057
5352e16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97cb057
 
 
5352e16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
language:
- en
library_name: transformers
pipeline_tag: text-generation
tags:
- math
- arithmetic
- reasoning
- grpo
- small-language-model
- from-scratch
datasets:
- arpjw/microreason-math
- HuggingFaceTB/cosmopedia
---

# MicroReason-43M

Small decoder-only language models (42.7 M parameters) trained **from random initialization** to
do exact arithmetic and linear algebra with step-by-step work. They come from a research project
that asked whether a staged pipeline can teach a tiny model to reason within a small compute
budget. The pipeline is base pretraining β†’ math mid-training β†’ SFT β†’ RL. The total GPU spend was
about $23.

All three checkpoints share one architecture and tokenizer:

| Folder | Model | Held-out-shape test | In-distribution test | 4–5 digit extrapolation |
| --- | --- | ---: | ---: | ---: |
| [`sft-long/`](./sft-long) | SFT model (3.1 M supervised examples) | 81.4% | 87.1% | 10.2% |
| [`grpo/`](./grpo) | `sft-long` + GRPO (150 on-policy steps, outcome reward) | 82.0% | 87.8% | 10.1% |
| [`extra-sft/`](./extra-sft) | `sft-long` + continued SFT for the same GPU time as GRPO | 83.1% | 88.8% | 7.8% |

**How these numbers were measured:**
- **Decoding:** greedy, show-work format, exact final answer.
- **Suite sizes:** 6,000 / 7,000 / 7,000 problems.
- **Sealing:** the suites were frozen before training and opened once.

**Which to use:**
- **`extra-sft`** is the most accurate on in-range problems.
- **`grpo`** keeps its ability on numbers larger than any seen in training. Continued SFT erodes
  that ability, and the result replicated on a fresh test set.

## What the models do

**Expressions:** expressions with 1–5 operators over integers up to 999 (`+ βˆ’ Γ— Γ·`, parentheses),
with exact rational results.

**Equations:** linear equations such as `3(x + 4) βˆ’ 2 = 5x βˆ’ 10`.

**Output format:** each model writes numbered reduction steps, then an answer:

```
[steps]
1. Subtract: 12 - 5 = 7
2. Multiply: 7 * 3 = 21
3. Divide: 4 / 2 = 2
4. Add: 21 + 2 = 23
[/steps]
[answer]23[/answer][eos]
```

**Accuracy falls with depth:** about 98% with 1 operator, 76% with 3 and 60% with 5. Linear
equations are about 99%.

## Usage

The architecture is custom: RMSNorm, RoPE, SwiGLU, and 12 layers Γ— 512 dimensions. Load it with
`trust_remote_code=True`; the code is in `modeling_microreason.py` and needs only `torch` and
`transformers`.

```python
import torch
from transformers import AutoModelForCausalLM, PreTrainedTokenizerFast
from huggingface_hub import snapshot_download

path = snapshot_download("arpjw/microreason-43m", allow_patterns=["grpo/*"]) + "/grpo"
tok = PreTrainedTokenizerFast(tokenizer_file=f"{path}/tokenizer.json")
model = AutoModelForCausalLM.from_pretrained(path, trust_remote_code=True).eval()

prompt = "[bos][user]Compute: (12 - 5) * 3 + 4 / 2 Show your work.[eos][assistant]"
ids = torch.tensor([tok(prompt, add_special_tokens=False)["input_ids"]])
eos = tok.convert_tokens_to_ids("[eos]")
with torch.no_grad():
    for _ in range(320):
        nxt = model(ids).logits[0, -1].argmax().item()
        ids = torch.cat([ids, torch.tensor([[nxt]])], dim=1)
        if nxt == eos:
            break
print(tok.decode(ids[0]))
```

**Prompt formats** (the special markers are single tokens):
- **Show work:** `[bos][user]{problem} Show your work.[eos][assistant]`
- **Answer only:** `[bos][user]{problem} Give only the answer.[eos][assistant]` (much less
  accurate: about 35%)

**Problem phrasing** follows the training data, for example `Compute: …` or
`Solve for x: …`.

## Training

| Stage | Data | Notes |
| --- | --- | --- |
| Base pretraining | 1.0 B tokens: 70% general text (Cosmopedia), 30% synthetic math | from random init |
| Math mid-training | 200 M tokens, 85% math with an easy β†’ hard curriculum | |
| SFT | 100 k, then 3 M more verified worked solutions (75% show-work, 25% answer-only) | `sft-long` |
| GRPO | 150 steps Γ— 1,024 completions, group 16, binary exact-answer reward, pass-rate filter (2–14 of 16 correct), LR 3e-6, KL 1e-3, one update per batch | `grpo` |
| Continued SFT | about 2.2 M fresh worked solutions in the same 46 min of GPU time | `extra-sft` |

**Tokenizer:** an 8,192-token byte-level BPE that splits every number into single digits.
Splitting digits, and generating problems from random expression trees instead of fixed
templates, raised held-out accuracy from 0.2% to 70%.

**Synthetic math:** generated by a seeded expression-tree grammar. Every training problem is
checked against the frozen evaluation suites to exclude overlap. The evaluation suites and the
100k SFT set are published as
[arpjw/microreason-math](https://huggingface.co/datasets/arpjw/microreason-math).

## Findings

- **Math mid-training** improves accuracy (+5.3 points on test).
- **SFT** is what gives the answer format.
- **GRPO** gives a small but consistent gain over its SFT parent: +0.5 points, positive on all
  three seeds. Continued SFT on unlimited correct traces gains more at equal compute (+1.5).
- **Extrapolation:** GRPO preserves accuracy on 4–5 digit numbers, which continued SFT erodes.
  GRPO beats it there by +2.2 points, replicated on an independent frozen suite.

## Limitations

- Narrow domain: arithmetic and linear equations only, in the training phrasing. These are not
  general chat or general-purpose math models.
- Accuracy on numbers beyond 3 digits is low (about 10%).
- Small models trained on a narrow distribution; outputs should not be relied on without
  checking.