Today an untrained Spatial Pooler gave me this:

And I was like, “That shouldn’t happen.”



Quick explanation:

  • Each red line is an active column.
  • The white space contains 1024 columns.
  • The exact column numbers are [381, 545, 559, 569, 579, 596, 599, 612, 615, 618, 623, 624, 634, 758, 761, 787, 788, 799, 804, 807, 808, 811, 816, 820, 825, 827, 830, 834, 838, 843, 844, 847, 848, 854, 858, 859, 861, 878, 883, 927]

An untrained spatial pooler should create randomly distributed SDRs. This is way too structured.

Inspect the synapses

When I saw the synapses, I was enlightened.



Quick explanation:

  • Every column represents an HTM column.
  • Every row represents an input bit.
  • A black dot indicates a synapse.

The connections aren’t random – they are bound by topology. A column can only connect to “nearby” input bits.

Here’s the 256-bit input that I gave the spatial pooler.

Let’s overlay the inputs and active columns onto the synapse graphic.

Focus on the black diagonal. Wherever there are lots of blue lines crossing the black, there are lots of red lines. Everywhere else, nothing.

Because connections are topological, and because inhibition is global, this spatial pooler tends to only detect patterns in a subset of the input.

The spatial pooler: Topological by default

This was news to me!

You can get rid of topology by changing potentialRadius from its default (16). Here I’ve changed it to 256.

Should I freak out?

Maybe, but only if you use the raw SpatialPooler.

When you use the Spatial Pooler via the network API, it quietly disables topology. So the CLAModel is fine. Hotgym is fine.