I have an idea about how to solve this first problem…
I started by looking at Numenta’s 2-layer HTM circuit, in which Numenta assigns and holds constant the state of the output layer’s Spatial Pooler. The purpose of the output layer Spatial Pooler is to recognise sequences of activity in the input layer and assign a stable representation to them.
How can I determine if the output layer’s Spatial Pooler is forming representations of whole sequences? By training the circuit and then measuring the output layer spatial pooler mini-column overlap between all of the elements in the sequence and verifying that the overlap is significantly greater than the overlap between unrelated sequences. Hereafter I call this the sequence-overlap property.
Then I asked how I could change the output layer spatial pooler such it naturally has this sequence-overlap property. The best idea I have is to measure the sequence-overlap property and force it to be true by activating mini-columns when the overlap is less than some predetermined threshold. The output layer Spatial Pooler Mini-columns can then become activated in two ways: from proximal input via the regular method OR because the mini-column was previously used to represent an ongoing sequence and is now being selected to continue representing it.
HTMs are unsupervised algorithms. The sequences of input (encountered in the wild) are never clearly delineated; where one thing ends and the next begins is something the brain is supposed to figure out on its own. So I make the assumption that every two consecutive moments in time are part of the same sequence.
The output layer spatial pooler then:
- Measures the overlap between its current activations and the previous timesteps activations.
- If that overlap is less than a predetermined threshold (such as 50% overlap) then mini-columns which were previously active and are no longer active are activated in order to represent this sequence. Also, mini-columns are selected on the basis of how well they recognise their current input.
I have a proof of concept for this mechanism, it’s not tested on OPs dataset though:
Thank you for reading,