symbolic-ai-001
One agent architecture trained across a heterogeneous task distribution through a single symbolic interaction protocol:
observation symbols → agent → action symbols → environment → reward + next observation symbols
A 13.97M-parameter decoder-only transformer that sees only symbolic observations and emits only symbolic actions, trained through one interface on web-corpus next-token prediction, a real supervised dataset, symbolic worlds, a Gymnasium MiniGrid task, reasoning environments and structured tool calls.
Note on framing. This checkpoint is the neural member of the project. It exists as the baseline against which non-neural, genuinely symbolic learning algorithms (rule/operator induction, program synthesis, variable-order symbolic prediction) are measured in the same framework. See the design note in
code/docs/.
Provenance
| source repository | symbolic-ai-001 (full snapshot included in code/) |
| source commit | 3b46de309a53f5afc2c5018a1116096de95fbf31 (3b46de3) |
| adapter version | 0.1.0 |
| corpus | HuggingFaceFW/fineweb-edu, config sample-10BT, revision 87f09149ef4734204d70ed1d046ddc9ca3f2b8f9, shard sample/10BT/000_00000.parquet |
| corpus split rule | sha256("symbolic-ai-001|" + doc_id) < 0.01 → validation (40,000,362 train / 400,482 validation tokens) |
| dataset | SetFit/sst2 (train for collection, validation for evaluation) |
| hardware | 1× NVIDIA GB10, CUDA 13.0, torch 2.13.0+cu130 (shared with an unrelated job) |
| training wall-clock | 16.0 min |
Files
| file | what it is |
|---|---|
model.pt |
the checkpoint (weights + GPTConfig + train config + full training record) |
tokenizer.json |
byte-level BPE, 8,192 merges, trained on FineWeb-Edu text plus serialized symbolic structures |
symbolic-ai-001.yaml |
the exact training mixture config |
train_info.json |
per-source step counts, token counts, losses, held-out perplexity |
matrix.json, matrix_sampled.json |
full evaluation matrices (greedy and stochastic decoding) |
lm_protocol_check.json |
the protocol-equivalence measurement described below |
code/ |
complete source snapshot at commit 3b46de3 |
Architecture
Decoder-only transformer — 6 layers, 6 heads, d_model 384, context 512, tied
embeddings — 13.97M parameters (13.77M non-embedding). 8,000 steps, batch
24 × 512, AdamW, cosine schedule, bf16.
The agent inspects the environment's declared symbol spaces (never the task)
and binds one of three internal encodings: stream (token-stream prediction),
score (enumerable action space), generate (structured/open action space,
free-decoded then parsed back into symbols).
Objective
One loss for every environment family — the weighted log-likelihood of the action segment of a symbolic step:
L(θ) = − Σᵢ wᵢ · log p_θ(aᵢ | oᵢ) / Σᵢ wᵢ·|aᵢ|
The update rule is a choice of w: w = 1 on a token stream is ordinary
next-token pretraining; w = exp((G − b)/β) on episodes is advantage-weighted
regression. Corpus and dataset components used w = 1; interactive components
used advantage weighting with β = 0.5.
Protocol equivalence (measured)
Running language modelling through Environment.step — action = predictive
distribution, reward = log p(x_{t+1}|x_{≤t}) — gives the same number as
ordinary batched cross-entropy over the same held-out positions:
| model | positions | Σ log p through the env loop | Σ log p batched | |Δ| |
|---|---|---|---|---|
| symbolic-ai-001 | 512 | −2398.2746 | −2398.2747 | 1.9·10⁻⁵ |
| baseline-lm-only | 512 | −2324.7483 | −2324.7480 | 2.3·10⁻⁴ |
Training mixture
| component | family | weight | steps | data | teacher |
|---|---|---|---|---|---|
| lm/fineweb-edu | HF corpus | 0.50 | 3961 | 40.0M tokens | — (max-likelihood) |
| gridworld | native | 0.10 | 807 | 500 eps / 7392 steps | best-first search |
| minigrid | Gymnasium | 0.08 | 650 | 800 eps / 8984 steps | relational rule policy |
| logic | native | 0.08 | 632 | 1200 eps / 1564 steps | forward-chaining rules |
| tool_call | native | 0.08 | 644 | 1200 eps / 2400 steps | tool rule policy |
| arithmetic | native | 0.06 | 505 | 600 eps / 2066 steps | best-first search |
| proof | native | 0.05 | 397 | 600 eps / 753 steps | best-first search |
| hf/sst2 | HF dataset | 0.05 | 404 | 1500 rows | label is the target |
Evaluation (50 held-out episodes per cell, seeds ≥ 10 000, sampled policy)
| environment | native metric | symbolic-ai-001 | best specialist | LM-only baseline | random |
|---|---|---|---|---|---|
| gridworld | success | 0.40 | 0.44 | 0.00 | 0.02 |
| MiniGrid-Empty-Random-5x5 | success | 0.70 | 0.70 | 0.28 | 0.40 |
| logic | solved | 0.60 | 0.94 | 0.44 | 0.56 |
| arithmetic | exact | 0.78 | 0.78 | 0.00 | 0.00 |
| proof | proved | 1.00 | 1.00 | 0.40 | 1.00 † |
| tool_call | solved | 0.98 | 1.00 | 0.00 | 0.00 |
| SST-2 (validation) | accuracy | 0.56 | 0.42 | 0.56 | 0.58 ‡ |
| scene_qa (family held out of training) | accuracy | 0.18 | 0.10 | 0.02 | 0.16 |
| FineWeb-Edu (held-out split) | perplexity | 89.1 | — | 51.9 | — |
† the proof environment is solved by the random policy, so that column carries
no signal. ‡ every arm is at chance on SST-2 at this scale; the reward column
(log p) is the honest one there: random −0.693, symbolic-ai-001 −0.683.
The companion baseline checkpoint is
jacob-valdez/symbolic-ai-001-lm-baseline-3b46de3.
Known failure modes
- Greedy deadlock. With arg-max decoding the policy can re-choose an illegal
move forever in a deterministic environment with a Markov observation
(gridworld 0.00 greedy → 0.40 sampled). Use
temperature=1.0. - No cross-family transfer. On a family absent from the mixture it is indistinguishable from random.
- Language-modelling cost. Step-matched training halves the corpus tokens seen; perplexity is 1.7× the LM-only baseline.
- LM pretraining barely transfers to these symbolic tasks at this scale: scratch-initialized specialists nearly match LM-initialized ones.
Use
git clone https://huggingface.co/jacob-valdez/symbolic-ai-001-3b46de3
cd symbolic-ai-001-3b46de3/code && uv pip install -e .
symbolic-agent run --env tool_call --agent autoregressive \
--agent-args checkpoint=../model.pt temperature=1.0 --show 4
# [0] act=calc(expr="28 * 4") r=+0.0800
# [1] act=answer(text=112) r=+0.9800 TERM
License
MIT (code and weights). Trained from random initialization; no pretrained weights were used.