Greg Kochaniak, July 1, 2008
Contact: see Hyperionics Contacts page
I’m trying to go beyond a simple pyramidal structure of an HTM network and create something more complex, branching into different parts at some level. Eventually we will all need something like that for better accuracy of networks, and better performance on parallel computing platforms. Let me explain this graphically.
Here is a cross-section of Numenta’s 4-level Pictures network along X or Y axis:
Simple pyramid
Level
4: 48
categories
51054
coincidences
Accuracy 99.6% clean
73.3%
distorted
Level 3:
About 10,000
coinc/node
Level 2:
1566
coinc/node
Level 1:
173
coinc/node
As you can see above, the numbers of coincidences on each level grow in geometric progression, and so do the numbers of groups (not shown). The new algorithms released with NuPIC 1.6 help a little bit to limit that growth (as did the “prune” parameters in Zeta1 algorithms), but at a cost of accuracy of solution, and ultimately we cannot help the bigger complexity of the models that the higher level nodes build. Let’s say I’m satisfied with the performance and the numbers of coincidences and groups the first two levels provide, but would like to split my network above level 2 into something like this:
Branch A:
Branch B:
Level 4A: 24 categories Level 4B:
24 categories
27818 coincidences 22725
coincidences
Accuracy:
100% clean, Accuracy:
100% clean
79.1%
distorted 77.8%
distorted
Level 3A: Level 3B:
About
6200 coinc/node About
5200 coinc/node
Level 2:
1566 coinc/node
Level 1:
173
coinc/node
Of course, ultimately I would like to have any number of such branches, not only two of them, A and B as shown above. I see this split of nodes on levels 3 and 4 above as an analogy to the brain recruiting (or growing in the neurogenesis process) additional neurons to handle an increased amount of data.
I trained the nodes in Level 1 and Level 2 on all 48 categories of Pictures “clean” set, but here I stopped and trained separately the nodes in levels 3 and 4 of Branch A (blue) on the first 24 categories of the “clean” set, and the nodes in Branch B (red) on the second half of the “clean” set, categories 24 and above. It’s easy to guess that each of these branches tested against its own half of the training and test (distorted) set, achieved better accuracy than the original “pyramidal” network. Incidentally, they had slightly better accuracy than the simple “pyramidal” networks trained from the bottom to top on a half of the training set only: for the 1st 24 categories I got 77.9% accuracy for simple pyramidal network, and 79.1% for my “split” network, for the 2nd half it was 76.9% vs. 77.8%.
So far it looked promising, and the lower numbers of coincidences and groups in each branch should be a performance bonus as well, when executed on a parallel computing platform. But how would I know to which branch the processing should be directed, or from which branch should I read the final category for classifying unknown data?
One idea was to look at the level of “confidence” that the top level classifiers have in their recognition – I peaked at it quickly and decided that this would not tell me much and cause as many or more errors than the simple pyramid. The next idea I have is to look at the level of confidence of the spatial poolers in level 3 nodes. After all, if the final category should be in branch A (lower 24 Pictures categories), level 3 nodes should see something familiar there and be slightly more “certain” of their recognition or match to stored patterns, than nodes in branch B... Maybe I could take a vote of level 3 nodes? Or the normalized sum of their “confidence” in their top categories, and use that to direct the final processing to either branch A or B?
Any other ideas on this? Or on the more generic idea of “recruiting additional nodes” for processing larger amounts of data? If the above idea or its modification work, it would be a good way to extend the network capabilities to additional categories later as well. Say I want to add 20 categories more to the set, and have 68 of them instead of 48. I could keep my branches A and B already trained and intact, and connect a branch C to level 2 nodes, train it only on the new 20 categories...
Greg