release 64 public checkpoints · every benchmark on this page reproduces from the repo github ↗

Remember, then rewrite.

PSSA is a 1.54M-parameter language model that is not a transformer. A fixed-size recurrent state carries the context. A bounded episodic memory looks it up. Closed-form consolidation folds experience back into the weights.

1,544,704 parameters 512 episodic slots linear in sequence length no attention map
pssa — checkpoint 64 / 64
$ pssa --checkpoint 64 --report

  model            pssa
  parameters       1,544,704                       baseline 1,541,120
  vocabulary       2,048 bpe
  latent width     256
  state            256 × 16 · 16 log-spaced time constants
  memory           512 slots · 32-d keys · 256-d values
  framework        none · linear algebra written directly
  held-out CE      3.997                           transformer 4.429
  held-out PPL     54.4                            transformer 83.8
  generation       ~12×                             226 ms vs 2,735 ms · 200 tokens
  ✓ grad check    max |∂batched − ∂scalar| = 2.98e−8
                   gate 3e−8
training · 64 checkpoints · CE 5.73 → 3.98

01 · Overview

Three ideas, one small block.

PSSA is built around a persistent state, an episodic memory with a hard size limit, and weights that absorb experience during training. Each mechanism is deliberately small enough to measure, ablate, and inspect.

It is a different accounting of context: carry a state, look things up, and consolidate what matters.

01

A state instead of a window

A selective diagonal state-space recurrence carries 256 × 16 values left to right. Every token updates that state once; no context window is re-read and no attention matrix is built.

ht = fθ(ht−1, xt)

02

Memory with a boundary

512 episodic slots hold keys in a Poincaré ball and values in Euclidean space. Reads are an exact softmax over every key; writes rotate round-robin, so the bank can never grow.

m = Σs wsvs

03

Weights that move

A rank-16 adapter shapes every block output. At consolidation boundaries, a ridge solve folds accumulated statistics into a base matrix — a weight update with no second backward pass.

Abase ← Abase + ridge(H, ΔH)

Scope. PSSA is a 1.54M-parameter research prototype, trained once on a small corpus and measured against a size-matched baseline. Read the numbers as an existence proof, not a production claim. The method and the limits are part of the result.

02 · Architecture

One token, five moves.

Everything is computed once per token, left to right. No context window is re-read and no attention matrix is materialized. Step through the block below, or turn on narration and listen.

The equations are the actual operations, simplified only where the deep dive goes further: the memory read is a full scan by default, and consolidation runs at explicit boundaries.

Interactive walkthrough

Follow one token through the block.

Select a phase, hover a node, or use the narration control.

The block · one token 01 · project Phase 1 of 5: project
one pass · left to right state h · 256 × 16 cost linear in tokens

Phase 01 · project

A token becomes a vector.

The token ID indexes a 2,048-entry embedding table. The resulting 256-dimensional vector is the only thing the recurrent core sees; there is no context window to re-read and no positional attention to compute.

embedding

xt = E[tokt] ∈ ℝ256

2,048-entry vocabulary · 256 latent dimensions per token

Phase 02 · selective recurrence

The state is updated, not rebuilt.

A diagonal selective state-space layer carries the context. Its step size, input projection and output projection are read from the current token, so each channel can open slowly or close quickly from one step to the next. The update is elementwise, and total cost stays linear in sequence length.

selective SSM

δt = softplus(Wδxt) Āt = exp(δtA),  B̄t = δtBt ht = Āt ⊙ ht−1 + B̄t ⊙ xt

256 × 16 state persists between tokens · 16 log-spaced time constants, 1.5–200 tokens

Phase 03 · episodic read

Look up the past by distance.

The query mixes the current token with the recurrent output. It is projected inside a Poincaré ball, where distance grows toward the boundary and can encode hierarchy. The read scans every one of the 512 keys, scores them by hyperbolic distance, and mixes their Euclidean values.

full-scan read

qh = proj(Wqxxt + Wqhht) w = softmax(−dH(qh, ks)τmem) m = Σs wsvs

512 hyperbolic distances per read · optional top-k still scans all keys, then mixes only K values

Phase 04 · adaptation

Mix, adapt, consolidate.

A sigmoid gate decides how much of the memory read enters the block. A rank-16 adapter then makes a learned correction. At consolidation boundaries, accumulated statistics are solved rather than gradient-stepped: the base weights absorb a closed-form delta.

gate and adapter

g = sigmoid(wgate · xt) A(xt) = W2 silu(W1xt)
Abase ← Abase + (HTH + λI)−1HTΔH

rank-16 adapter · ridge consolidation folds accumulated input/output statistics into the base matrix

Phase 05 · prediction & write

Predict, then decide what to keep.

The adapted block output is projected to the 2,048-token vocabulary. After the step, the state summary becomes a candidate key and value. A round-robin target slot accepts the write only when the entry is novel enough and the slot has cleared its refractory window.

vocabulary projection

pt = softmax(Woutzt)

z is the adapted block output · writes require novelty above a threshold and a target slot outside its refractory window

01 / 05

Interactive schematic

Send a sentence through the block.

Type a few words. The page splits them into visible token chips, animates them through a schematic of the block, and shows a small slice of the state, the memory gate, and the slots that fire. Everything is deterministic and local; nothing is sent to the model. The four stages are a compact summary of the five walkthrough phases: the gate-and-adapt step is folded into Predict.

A schematic forward pass

Token by token · 8 state channels shown · 512-slot memory

schematic, not live inference
Token chipswords + punctuation · capped at 24
the#0184 river#0912 remembers#0761 its#1240 shape#0338
01

Project

embedding · 256 dims

idle
02

Recur

selective update

idle
03

Read

full 512-key scan

idle
04

Predict

logits + write gate

idle
State8 of 256 channels
Gatesigmoid
0.50

How much of the memory read enters the block at this step.

Memory512 slots · full scan
run a sentence to fire slots
Idle · run a sentence to animate the block. no network · deterministic illustration

03 · Evidence

Small scale. Real measurements.

One seed. 12.7M cleaned WikiText-103 tokens. A 1.54M-parameter PSSA and a parameter-matched transformer trained under the same 30,000-update cosine horizon, then evaluated on 198,939 held-out tokens neither model saw.

The comparison is deliberately narrow. Every number below is reproducible from the repository; the method and its limits are written down in the technical deep dive.

Held-out perplexity

54.4PPL

Against 83.8 for the parameter-matched transformer.

Held-out cross-entropy gap

0.43nats

3.997 for PSSA, 4.429 for the baseline.

CPU training throughput

4.13×

1,716 vs 415 tokens per second on matched work.

Generation speed

12.1× faster

226 ms vs 2,735 ms for 200 generated tokens.

Training loss, checkpoint by checkpoint

Cross-entropy on supervised target tokens across 64 links. The series is embedded from the training log; hover, tap, or focus the plot to inspect a point.

checkpoint 64 / 64 3.982 ≈12.7M tokens seen · train CE

checkpoint · ≈199k training tokens each

The run ends slightly above its checkpoint-56 low (3.887 → 3.982): per-link variance on a single seed, not divergence. The full 64-point series ships in loss.csv.

Inspect the sampled data table
The chart plots 14 sampled checkpoints of the 64 saved; the table samples nine points from loss.csv.
CheckpointTraining lossApprox. tokens seen
15.7330.2M
84.4471.6M
164.1873.2M
244.0884.8M
323.9886.4M
403.9738.0M
483.9379.5M
563.88711.1M
643.98212.7M
hover · tap · ←→ inspect single seed · 64 checkpoints · loss.csv

Head-to-head, same budget

PSSA against a parameter-matched transformer. Bars are drawn from the measured values and normalized per row; the numbers are the result, not the bars.

PSSA versus a parameter-matched transformer across training, held-out evaluation, throughput, and generation.
Measure PSSA Transformer Gap Relative scale
Training cross-entropyfinal checkpoint · nats / token · lower is better 3.98 4.43 −0.45
Held-out cross-entropy198,939 unseen tokens · nats / token 3.997 4.429 −0.43
Held-out perplexityper-token perplexity · lower is better 54.4 83.8 −29.4
Next-token accuracytop-1 on the held-out slice · higher is better 24.1% 18.0% +6.1 pts
CPU training throughput2 vCPU · matched fixed work · higher is better 1,716tok/s 415tok/s 4.13×
Generation latency200 generated tokens · lower is better 226ms 2,735ms 12.1× faster
Bars are normalized per metric, so lengths are not comparable across rows. Loss, perplexity, and latency are lower-is-better. Scope: single seed · CPU training pair on matched 2-vCPU machines · a T4 GPU probe reached 1,699 tok/s for PSSA only, with no matched transformer run.

What this does not prove

The limitations are part of the result, not a footnote. Read them before generalizing from any number on this page.

  • Scale. Both models are 1.5M-parameter prototypes. Text quality is poor at this size, for PSSA and the baseline alike.
  • Evidence. One seed, one cleaned corpus slice. There is no memory-bank ablation yet and no measured skill-retention test after a corpus switch.
  • Hardware. Training rates are not all hardware-matched. The table labels the CPU pair; the T4 probe has no transformer counterpart.
  • Dreaming. The experimental consolidation mode is off by default and is not part of the headline results.
  • Novelty. The selective state-space layer is established machinery. The specific claims are the state-conditioned hyperbolic read, the novelty and refractory write gates, and ridge consolidation.

04 · Under the hood

The build, in numbers.

Every figure here is taken from the repository configuration and logs. Nothing is rounded up to sound bigger.

Parameters
1,544,7041,541,120 in the matched transformer
Latent width
256
State channels
16256 × 16 recurrent state
Vocabulary
2,048 BPE
Episodic slots
51232-d keys · 256-d values
Training corpus
12.7M tokensWikiText-103, cleaned
Horizon
30,000 updatescosine schedule
Held-out eval
198,939 tokens
Hardware
One Tesla T4
Implementation
Pure Rustno ML framework

Questions people actually ask

Why no attention?

Attention costs grow with context length. PSSA carries a fixed-size state, reads a bounded memory with an exact full scan, and writes with a round-robin slot policy, so per-token cost stays flat no matter how far the context reaches back.

Is this a transformer replacement?

No. It is a different accounting of context, tested at prototype scale against a parameter-matched baseline. The comparison is deliberately narrow and the limits are written down.

What can it not do?

At 1.5M parameters, text quality is poor for both PSSA and the baseline. One seed, one corpus, no memory-bank ablation yet. Those are the honest edges of the result.

Where do the numbers come from?

From the repository: the training logs, the 64-checkpoint loss series in loss.csv, and the evaluation scripts that produced the held-out figures. Re-run them and you get the same table.

05 · Get it

Code, weights, and a place to argue.

The repository is the artifact: model code, data preparation, loss logs, evaluation scripts, and release notes. The weights are public. If a number here does not reproduce, open an issue.

Discord

Questions, reproductions, and counterexamples are welcome.

Join the Discord
Support PSSA SOL tips, Ko-fi, and the free ways to help live on one page.
Open support page