HoloMind / README.md
zeechimp's picture
Update README.md
2d14b46 verified
|
Raw History Blame Contribute Delete
6.13 kB
---
license: apache-2.0
language:
- en
tags:
- holographic-reduced-representations
- vector-symbolic-architecture
- hyperdimensional-computing
- fhrr
- associative-memory
- educational
- research
- memory
- sequence-modeling
- binding
library_name: holomind
pipeline_tag: feature-extraction
---
# HoloMind — one holographic substrate, several memories
A single FHRR (Fourier Holographic Reduced Representation) substrate with
typed regions. Facts, episodes, multimodal associations, and sequences live
in the same role/value codebook. Retrieval is algebraic unbinding plus
nearest-neighbour classification. Writes are additive; eviction is
subtractive; capacity is measurable from the trace magnitude.
This is an **educational micro-model**, not a trained neural network. It
has no weights, no gradients, and no training loop. Its purpose is to expose
the primitive operations that a persistent LLM memory could be built from,
and to report where those operations hold and where they break.
Companion to *Twelve experiments probing the holographic substrate*.
---
## Results
All numbers below are from `holomind.py` at `D = 2048`, seed 0, on CPU.
### [1] Facts
```
capital of france -> paris (sim=0.181)
capital of japan -> tokyo (sim=0.187)
```
### [2] Multi-hop
```
france --capital_of--> paris --in_country--> france (sim=0.167)
```
### [3] Episodes (directed sequence)
```
walk from 'wake': ['wake', 'coffee', 'commute', 'work', 'lunch', 'work2']
walk from 'lunch': ['lunch', 'work2', 'commute2', 'dinner']
```
### [4] Multimodal (one concept, several addresses)
```
img_0 -> cat (sim=0.145)
aud_1 -> dog (sim=0.132)
```
### [5] Cross-region
```
capitals('france') -> paris (sim=0.214)
facts('paris', in_country) -> france (sim=0.167)
continents('france') -> europe (sim=0.282)
```
### [6] Capacity — one-stage vs two-stage read at the same load
| N | one-stage | two-stage | \|trace\| |
|---|-----------|-----------|-----------|
| 10 | 1.00 | 0.90 | 3.2 |
| 20 | 1.00 | 1.00 | 4.5 |
| 40 | 1.00 | 0.55 | 6.3 |
| 60 | 0.95 | 0.47 | 8.0 |
| 80 | 0.95 | 0.26 | 8.9 |
| 120 | 0.66 | 0.23 | 11.3 |
**Finding.** Retrieval accuracy at load K depends on the number of successive
unbindings in the query path, not on K alone. One unbind tolerates K ≈ 40–80
at D = 2048. Each additional unbind in the chain roughly halves the clean-load
ceiling. This is not a degradation of the substrate — it is the noise floor
compounding through successive algebraic operations.
### [7] Eviction (reversible additive memory)
```
before evict: key=e_2 -> e_2 (sim=0.224)
after evict: key=e_2 -> e_3 (sim=0.020) [expected noise]
after evict: key=e_0 -> e_0 (sim=0.232) [unaffected]
```
### [8] Confidence — \|trace\| vs. correctness
| region | n | \|trace\| | hit | verdict |
|--------|---|-----------|-----|---------|
| load1_10 | 10 | 3.2 | 1.00 | confident |
| load1_40 | 40 | 6.3 | 1.00 | confident |
| load1_80 | 80 | 8.9 | 0.95 | confident |
| load1_120 | 120 | 11.3 | 0.66 | confident |
**Finding.** \|trace\| rises monotonically with load while hit rate falls.
A threshold on \|trace\| is a cheap scalar confidence estimate. In this run the
verdict classifier is deliberately crude (thresholds at 0.20 and 0.25 of D);
the signal shape — monotone trace growth against monotone accuracy decline —
is the publishable part.
---
## What the substrate is
- **Dimensionality.** Each item is a complex vector of length D = 2048.
- **Binding.** `bind(a, b) = ifft(fft(a) · fft(b))`. Symmetric.
- **Directed binding.** `bind_dir(a, b) = ifft(fft(a) · roll(fft(b), 1))`.
Non-commutative. Removes the 2-cycle failure that symmetric binding
produces on sequences.
- **Item regions.** `S = Σᵢ bind(itemᵢ, itemᵢ)`. Query: unbind a partial key,
read fields by unbinding their roles.
- **Transition regions.** `S = Σᵢ bind_dir(sᵢ, sᵢ₊₁)`. Walk by unbinding the
current state.
- **Roles and values.** Named vectors generated from a stable hash. Shared
across all regions, which is what makes a retrieved vector a valid key
elsewhere.
## What the substrate is not
- Not a trained model. No weights, no gradients, no optimization.
- Not a replacement for attention or KV cache. It is a substrate those
mechanisms could be built on.
- Not production. Python loops, no batching, D = 2048 fixed in the demo.
Batch the FFT path with `einsum` before using it at scale.
## Failure modes and fixes
| Experiment | Failure | Fix |
|------------|---------|-----|
| Analogy (A:B::C:?) | Raw `bind(A,B)` has no recoverable relation. | Explicit relation role: `bind(rel, bind(A, B))`. Same class of bug: the operation must match the structure. |
| Nested binding | `bind(text, bind(color, tag))` is unaddressable. | Role-prefix every level: `bind(role_text, bind(role_color, ...))`. Equivalent to flat role summation. |
| Sequence retrieval | Symmetric binding produces a 2-cycle: `[0,1,2,3,2,3,...]`. | Directed binding via frequency roll. `bind_dir` is not commutative, so incoming transitions do not cancel coherently. |
The three failures are the same class: the operation did not match the
structure of the content.
## Novel claims
1. **One-stage vs two-stage capacity gap** at fixed D and fixed K.
2. **Directed binding via frequency roll** as a fix for the commutative
binding 2-cycle, with a working benchmark.
3. **\|trace\| as a confidence signal** tied to measured accuracy.
4. **Free role orthogonality at constant D** — adding modalities does not
cost retrieval capacity.
## Usage
No dependencies beyond NumPy. No file I/O. No external data.
```bash
python holomind.py
```
Expected runtime: ~4 s on a laptop.
## Files
- `holomind.py` — substrate and demo. Runnable as-is.
- `README.md` — this file.
## Citation
If you use this in academic work:
```bibtex
@misc{holomind2026,
title = {HoloMind: one holographic substrate, several memories},
author = {zeechimp},
year = {2026},
note = {Educational micro-model. FHRR substrate with item and transition regions.}
}
```
## License
Apache 2.0