I’m still reasonably new to HTM, both the theory and implementation sides, but I have to say I’m already hooked! I think I have a fairly good grasp of what the Spatial Pooler is and what it’s trying to achieve. There’s one question nagging me though, which I’m hoping someone will be able to answer.
Why is permanence modelled as a scalar (floating point) value rather than a binary value?
For reference, I found a bit of discussion on a separate topic: Project to compare mraptor's bbHTM to biology.
I understand that in the theory synapses can become stronger as they learn to recognise the same pattern, which hints at scalar values being a more accurate model, but this question is more about whether in practice the extra resolution of a scalar value matters.
From an efficiency perspective a binary permanence array seems ideal, because the connections are then identified by simply ORing the input and permanence arrays for each column, rather than applying a threshold.
From a learning perspective, when you use scalar values and increment/decrement permanence values you’re effectively connecting/disconnecting a small number of connections. If the permanences were binary, this could be modelled by flipping a certain number of bits from 0 to 1 or 1 to 0, yielding very similar behaviour (assuming random permanences, which in my understanding is how they are initialised). Rate of learning/forgetting is then controlled by how many new connections are formed to the input array and how many existing connections are lost.
A potential downside to binary permanences is that strong connections can potentially be destroyed too easily, since instead of decrementing when they don’t match the input (and most likely staying connected), they would instead have a chance to disconnect. However, to be in a situation where a strong connection could be lost the column would have to be receiving a very similar input to the one it had learnt, in which case you could argue that there’s not much harm in it losing a connection or two since this just constitutes some additional noise. This noise is fine if the input and permanence arrays are sparse, since we know SDRs have a high noise tolerance, and is also fine if the input and permanence arrays are coarse, since the number of lost connections is likely just a small percentage of the total.
Perhaps the best way to find out the answer is to test it, but as I’m relatively new to HTM I’d like to make sure I’m not missing some important concept before going down that potentially long road.
Thoughts much appreciated!