Parallel Research Paths?

Hi All,

I’ve been following the Thousand brains Project and Monty closely, and I think the approach Numenta is taking iscareful and methodical. The work they are doing is important, mathematically rigorous, and always grounded in neuroscience. But I think in the back of everyone’s minds is the incredible implications of how important a fully complete model of the neocortex and a scalable neocortical intelligence is to the world. It’s something that makes this community unique, is they don’t allow hype to get in the way of good science.

But I want to suggest a complementary philosophy, inspired by how major engineering breakthroughs have often been achieved: **parallel paths**
If you look back in history, the Manhattan Project pursued multiple bomb designs in parallel, some of which never worked, but the redundancy gave confidence that at least one would succeed, and the effort fed back across teams. Operation Warp Speed funded multiple Covid-19 vaccine approaches simultaneously (mRNA, adenovirus, protein subunit) and several worked, but some didn’t. The “wasted” work wasn’t waste, it brought speed.

The pattern is clear, if the stakes are high and the design space is broad, it’s often best to run multiple research paths in parallel.

Path A: The Current Careful Approach
This is what Monty embodies today:

  • Metric SDRs, explicit overlap targets
  • Graph-based reference frames
  • Inspectability and mathematical clarity as first priorities. SDRs have been chosen not to be pursued even though it would simplify voting, because “they are inscrutable”, so one can’t tell if a desirable behavior of the system is attributed to the SDR encoding itself or the feature mapping built around it.
    This path builds confidence and makes the science legible to the broader community.

Path B: A Fast-Track Biological Approach

At the same time, we could empower volunteers to push a parallel path:

  • Hebbian SDRs with k-Winner Take All competition, phase attractor dynamics for allocentric modelling, direct feature ←→phase binding.
  • Less scrutible in the short run, but immediately scalable, closer to biology, and capable of emergent dynamics
  • The emphasis here would be: jump straight to scale and performance, accept the messiness, and learn by running it.

This doesn’t replace Path A. Instead it complements it:

  • Path B could generate surprising demos that reveal emergent capacity earlier. An impressive demo could lead to more funding and public interest
  • Path A provides the intellectual scaffolding to interpret, stabilize, and integrate those results.

The best part: It costs nothing

  • There’s already a growing following of motivated volunteers.
  • They can self organize around the fast path, while Numenta continues to lead the careful, slower paths.
  • Parallelism increases the chance that breakthroughs on one side cross-pollinate the other.

The Proposal
Let’s recognize two parallel design philosophies as equally legitimate and valuable:

  • Careful path (Path A): Stepwise, inspectable and mathematically rigorous
  • Fast path (Path B): Hebbian, Emergent, Scalable and Biologically plausible even in the areas currently being held back for scrutibility reasons

I’d love to hear people’s thoughts. I’m currently building a feature-phase Hebbian SDR binding
Here’s the current model I’m building for this LM:

Current LM Design I’m working on (Fast path)

The feature SDR would be represented as a vector of bits length D:

image

The Phase SDR would be generated as follows:
You would have an array of M grid modules. Internally: each grid module is an attractor network that tracks a 2-D phase point, phi_m. That phase is just two floats representing a point on a unit torus. Each one has a different orientation R_m, and scale S_m which is a property of the grid module.

image

Phi_m can be thought of where the bump of activity sits on a 2D torus. This is not yet a sparse vector. It’s the latent state of grid module g_m.

The next step is to convert phi_m into an SDR system by encoding it.

The phase SDR, g, is a binary array of length B. We can partition g into equal sections for each module. So if B=2048, and M=32 grid modules, we can partition it into 2048/32 = 64 bits per module. Each module “owns” a slice of the SDR vector.

Each bit in that slice has an associated center c_j=(cjx,c_jy). randomly or regularly spread across the unit torus. You can also give each bit a receptive field width sigma_j.

Then we score each phase vector using a scoring function:

image
Where d_T is the toroidal distance (wrap-around) so the bits near phi_m score high, and far bits score low.

We then pick top k_m highest scoring bits (say 40 out of 2048). Set those bits to 1, the rest to 0.

Now you have a sparse SDR for phase, if you repeat that for each slice

image

Motion

When the motor moves we update the phase modules with allocentric velocity v

image

R_m is a fixed rotation vector per grid module, randomly initialized and stays constant
S_m is a fixed scale vector per grid module, randomly initialized and stays constant
v delta t is the x,y translation (open to interpretation of what translation is, but specialized per LM)
modulo 1.0 to loop it around forming a toroidal graph

We can then apply the Phase SDR generation above to get g.

Once we get SDRs g and f, we can make an associative matrix. A
There are two:
A_f→g maps feature SDR to phase, and A_g→f maps phase to feature.

At each timestep we update each feature to phase pair that co-ccurs using this hebbian update function:

image

where gamma is the decay (forget) rate
and nu is the learning rate.
if g is 2048, and f is 2048, this creates a 2048x2048 bit associative array. We would cap row weight updates so each feature bit only points to a few phase bits.

How recall works
if the agent sees f, then later sees f again,
We project the feature SDR through A to get the phase SDR, and count up the values by row to get a score for each phase bit.

image
Take the top-k candidate phase SDR ~g.

Blend ~g with current phase SDR g.

image
This will nudge youyr position toward where the feature expects you to be, enabled allocentric loop closure.

So in short:
Learning is done with hebbian update of feature→phase co-activations
Recall is using learned associations to propose phase bits of a given feature.
Loop closure occurs when the feature SDR recalls a phase different from your path-integrated estimate, blend it, drift is corrected and the map is realigned.

So far this is all speculative annd I have no idea if this design will work. And as a parent with two very young children and a full time job, I haven’t had a lot of time to actually build it. But I’m passionate and excited, and I will post updates once it’s built and I can start experimenting with it!

2 Likes

Hey @Spencer , I just wanted to comment at a high level, I totally agree about having parallel paths, and the power of the community to help with that. One of the things we have tried to do with Monty is make it very modular. That way, it should be possible for others to build custom SMs (e.g. for Lidar), or custom LMs (e.g. using grid-cell modules). The existing benchmarks are one way to evaluate new approaches, but another interesting area for work is creating new benchmarks - which may in turn reveal benefits of new SM/LM implementations.

It’s great to hear about your enthusiasm for the project you are working on, I hope it goes well. Two high-level comments: you might find the code used for the Lewis et al 2019 paper a useful starting point if you want to work with grid-cell modules. The second comment is that if you want to work with our existing benchmarks, it’s worth thinking about how you will represent 3D space in this scheme.

1 Like

Hi @nleadholm

Thanks for the reply and the helpful paper, I”ll check it out.
I have started to implement the scaffold for my SDR based learning module.

I was thinking about how best to represent 3D space and create 3D visualizations on this scheme.

The best way to do it to me is with counterfactuals. A “Counterfactual canvas”

First of all, in addition to A_fp, we would have 3 other associative arrays between SDRs

A_{FP} (feature → phase):

  • Rows = features, columns = phase cells. (a phase cell is a bit in the grid module’s slice of g_sdr)

  • Learned links tell you: “if this feature is active, which allocentric locations are likely?”

  • Used for landmark correction: features push bumps into the right place.

  1. A_{PF} (phase → feature):
    • Rows = phase cells, columns = features.

    • Learned links tell you: “if I’m at this allocentric spot, which features should be present?”

    • Used for completion/prediction: from location, hallucinate missing fragments.

  2. A_{PP} (phase → phase):
    • Rows = current phase cell, columns = next phase cell.

    • Captures continuity of motion: “if I’m here now, where do I usually move next?”

    • Used for path integration and drift control.

  3. A_{FF} (feature → feature):
    • Rows = one feature, columns = another feature.

    • Captures co-occurrence / composition: “these fragments usually appear together.”

    • Used for intercolumn voting

Used for binding features into object-like clusters.

Then we can start to put the pieces together to do 3D visualization.

  1. Memory as a factor graph
    • You already have feature–phase links A_fp, A_pf

    • Each phase cell corresponds to a position in allocentric 3D space.

    • Each feature can be rendered as a small prototype sprite/patch (texture, edge, shape).

  2. Inference (belief field)
    • From current features + transitions, infer a distribution over phase cells (where we think we are on the object).

    • This belief field = g^{\*}

  3. Counterfactual projection
    • For the top candidate phase cells in g^{\*}, pretend we are at that cell.

    • Project through A_pf​: what features would be seen here?

    • Render those features’ prototypes at the 3D coordinates tied to that cell.

  4. Visualization
    • Place sprites into a 3D canvas at the coordinates of their phase cell.

    • Blend them weighted by belief strength.

    • As the sim runs and more evidence arrives, the cloud of predictions sharpens — the partial object is literally drawn in front of you, piece by piece.

This demo would show a 3D ghost of the object being constructed from counterfactual expectations. As you move, the landmarks snap the ghost into place, filling in the hidden parts before they’re seen and confirming them when they appear.

I’ll post a demo once I get it working in a few months :slight_smile:

3 Likes

Nice, the visualization sounds like it a very neat demonstration. Looking forward to it!